OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 16027|回复: 10

做一个OS上跑DS18B20的问题,任务跑不动了,每次复位的时候,又能测出准确的温度?难道OS上不能用delay_ms()这些延时吗?

[复制链接]
头像被屏蔽

95

主题

159

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
442
金钱
442
注册时间
2011-3-22
在线时间
6 小时
发表于 2011-7-24 22:50:36 | 显示全部楼层 |阅读模式
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2011-7-25 00:37:03 | 显示全部楼层
新移植的可以.
你的不能用delay,因为他和os共用了systick.
你调用delay会打乱systick.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

头像被屏蔽

95

主题

159

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
442
金钱
442
注册时间
2011-3-22
在线时间
6 小时
 楼主| 发表于 2011-7-25 08:42:06 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2011-7-25 08:59:52 | 显示全部楼层
这样的:
#include <stm32f10x_lib.h>
#include "delay.h"
#include "sys.h"
//如果使用ucos,则包括下面的头文件即可.如果未使用,注释掉即可.
#include "includes.h"//ucos 使用
//////////////////////////////////////////////////////////////////////////////////  
//本程序只供学习使用,未经作者许可,不得用于其它任何用途
//Mini STM32开发板
//使用SysTick的普通计数模式对延迟进行管理
//包括delay_us,delay_ms
//正点原子@ALIENTEK
//技术论坛:www.openedv.com
//修改日期:2011/5/11
//版本:V1.3
//版权所有,盗版必究。
//Copyright(C) 正点原子 2009-2019
//All rights reserved
//********************************************************************************
//V1.2修改说明
//修正了中断中调用出现死循环的错误
//防止延时不准确,采用do while结构!

//V1.3修改说明
//增加了对UCOSII延时的支持.
//如果使用ucosII,delay_init会自动设置SYSTICK的值,使之与ucos的TICKS_PER_SEC对应.
//delay_ms和delay_us也进行了针对ucos的改造.
//delay_us可以在ucos下使用,而且准确度很高,更重要的是没有占用额外的定时器.
//delay_ms在ucos下,可以当成OSTimeDly来用,在未启动ucos时,它采用delay_us实现,从而准确延时
//可以用来初始化外设,在启动了ucos之后delay_ms根据延时的长短,选择OSTimeDly实现或者delay_us实现.
//////////////////////////////////////////////////////////////////////////////////   

static u8  fac_us=0;//us延时倍乘数    
static u16 fac_ms=0;//ms延时倍乘数,在ucos下,代表每个节拍的ms数

#ifdef OS_TICKS_PER_SEC   //如果时钟节拍数定义了,说明要使用ucosII了.
//systick中断服务函数,使用ucos时用到
void SysTick_Handler(void)
{    
OSIntEnter(); //进入中断
    OSTimeTick();       //调用ucos的时钟服务程序               
    OSIntExit();        //触发任务切换软中断
}
#endif

//初始化延迟函数
//当使用ucos的时候,此函数会初始化ucos的时钟节拍
//SYSTICK的时钟固定为HCLK时钟的1/8
//SYSCLK:系统时钟
void delay_init(u8 SYSCLK)
{
#ifdef OS_TICKS_PER_SEC   //如果时钟节拍数定义了,说明要使用ucosII了.
u32 reload;
#endif
  SysTick->CTRL&=~(1<<2); //SYSTICK使用外部时钟源  
fac_us=SYSCLK/8; //不论是否使用ucos,fac_us都需要使用
    
#ifdef OS_TICKS_PER_SEC   //如果时钟节拍数定义了,说明要使用ucosII了.
reload=SYSCLK/8; //每秒钟的计数次数 单位为K    
reload*=1000000/OS_TICKS_PER_SEC;//根据OS_TICKS_PER_SEC设定溢出时间
//reload为24位寄存器,最大值:16777216,在72M下,约合1.86s左右
fac_ms=1000/OS_TICKS_PER_SEC;//代表ucos可以延时的最少单位    
SysTick->CTRL|=1<<1;    //开启SYSTICK中断
SysTick->LOAD=reload;  //每1/OS_TICKS_PER_SEC秒中断一次
SysTick->CTRL|=1<<0;    //开启SYSTICK    
#else
fac_ms=(u16)fac_us*1000;//非ucos下,代表每个ms需要的systick时钟数   
#endif
}     

#ifdef OS_TICKS_PER_SEC //使用了ucos
//延时nus
//nus为要延时的us数.         
void delay_us(u32 nus)
{
u32 ticks;
u32 told,tnow,tcnt=0;
u32 reload=SysTick->LOAD; //LOAD的值       
ticks=nus*fac_us;  //需要的节拍数     
tcnt=0;
told=SysTick->VAL;         //刚进入时的计数器值
while(1)
{
tnow=SysTick->VAL;
if(tnow!=told)
{     
if(tnow<told)tcnt+=told-tnow;//这里注意一下SYSTICK是一个递减的计数器就可以了.
else tcnt+=reload-tnow+told;     
told=tnow;
if(tcnt>=ticks)break;//时间超过/等于要延迟的时间,则退出.
}  
};      
}
//延时nms
//nms:要延时的ms数
void delay_ms(u16 nms)
{
if(OSRunning==TRUE&&(nms>=fac_ms))//如果os已经在跑了,并且延时的时间大于ucos的最少时间周期      
{   
    OSTimeDly(nms/fac_ms); //ucos延时
nms%=fac_ms; //ucos已经无法提供这么小的延时了,采用普通方式延时    
}
OS_ENTER_CRITICAL();
delay_us((u32)(nms*1000)); //普通方式延时,此时ucos无法启动调度.
OS_EXIT_CRITICAL();
}
#else//不用ucos时
//延时nus
//nus为要延时的us数.         
void delay_us(u32 nus)
{
u32 temp;       
SysTick->LOAD=nus*fac_us; //时间加载     
SysTick->VAL=0x00;        //清空计数器
SysTick->CTRL=0x01 ;      //开始倒数   
do
{
temp=SysTick->CTRL;
}
while(temp&0x01&&!(temp&(1<<16)));//等待时间到达   
SysTick->CTRL=0x00;       //关闭计数器
SysTick->VAL =0X00;       //清空计数器  
}
//延时nms
//注意nms的范围
//SysTick->LOAD为24位寄存器,所以,最大延时为:
//nms<=0xffffff*8*1000/SYSCLK
//SYSCLK单位为Hz,nms单位为ms
//对72M条件下,nms<=1864 
void delay_ms(u16 nms)
{        
u32 temp;    
SysTick->LOAD=(u32)nms*fac_ms;//时间加载(SysTick->LOAD为24bit)
SysTick->VAL =0x00;           //清空计数器
SysTick->CTRL=0x01 ;          //开始倒数  
do
{
temp=SysTick->CTRL;
}
while(temp&0x01&&!(temp&(1<<16)));//等待时间到达   
SysTick->CTRL=0x00;       //关闭计数器
SysTick->VAL =0X00;       //清空计数器        

#endif
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

头像被屏蔽

95

主题

159

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
442
金钱
442
注册时间
2011-3-22
在线时间
6 小时
 楼主| 发表于 2011-7-25 11:37:58 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复 支持 反对

使用道具 举报

头像被屏蔽

95

主题

159

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
442
金钱
442
注册时间
2011-3-22
在线时间
6 小时
 楼主| 发表于 2011-7-25 11:39:05 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2011-7-25 12:30:38 | 显示全部楼层
用定时器和用systick一样的效果的.
V1.3版本的还没发布.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

0

主题

5

帖子

0

精华

新手上路

积分
25
金钱
25
注册时间
2012-11-4
在线时间
0 小时
发表于 2012-11-4 16:28:24 | 显示全部楼层
 请教原子大哥,这个ds18b20的延时在freertos下怎么搞呢?
回复 支持 反对

使用道具 举报

0

主题

2

帖子

0

精华

新手入门

积分
22
金钱
22
注册时间
2014-5-28
在线时间
0 小时
发表于 2014-5-29 20:53:00 | 显示全部楼层
原子大哥  可以把这个程序发一下吗?调试不出来  
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-5-29 22:37:10 | 显示全部楼层
 回复【9楼】 mengxiang :
---------------------------------
早就发了.
http://www.openedv.com/posts/list/13912.htm?fromAll=0
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

4

主题

54

帖子

0

精华

初级会员

Rank: 2

积分
145
金钱
145
注册时间
2015-4-18
在线时间
17 小时
发表于 2015-12-8 19:43:08 | 显示全部楼层
回复【10楼】正点原子:
---------------------------------
原子哥,我在UCOSIII上添加了DS18B20程序,用仿真器跟踪每一步都可以执行,但就是DS18B20的值为0.
也就是“mtemperature=DS18B20_Get_Temp(); ”这一步,mtemperature的值一直是0,换了传感器依然是0,但如果裸机跑的话,18B20工作正常
#include "led.h"
#include "delay.h"
#include "sys.h"
#include "usart.h"
#include "includes.h"
#include "can.h"
#include "beep.h"
#include "lcd.h"
#include "ds18b20.h"
#include "dht11.h"
#include "key.h"

/************************************************
 ALIENTEK????STM32??·?°?UCOS???é
 ??4-1 UCOSIII UCOSIII????
 ?????§????www.openedv.com
 ??±??ê????http://eboard.taobao.com 
 ??×????????????¨????????"??????×?"????·?????STM32×?????
 ?????????í??×?????????????  
 ×÷??????????×? @ALIENTEK
************************************************/

//UCOSIII???????????????§???ò??????????ALIENTEK
//????????????·???????UCOSIII??5??????????????
//??????0??????·???·??????í???? OS_IntQTask()
//??????1???±?????????? OS_TickTask()
//??????2???¨?±???? OS_TmrTask()
//??????OS_CFG_PRIO_MAX-2?????????? OS_StatTask()
//??????OS_CFG_PRIO_MAX-1?????????? OS_IdleTask()
//?????§????www.openedv.com
//??±??ê????http://eboard.taobao.com  
//?????????í??×?????????????  
//×÷??????????×? @ALIENTEK

//????±???
short Stemp; //DS18B20??????
//short temperature;       //DHT11??????
u8 Shumidity;  //DHT11??????



//??????????
#define START_TASK_PRIO 3
//?????????ó??
#define START_STK_SIZE  512
//?????????é
OS_TCB StartTaskTCB;
//????????
CPU_STK START_TASK_STK[START_STK_SIZE];
//????????
void start_task(void *p_arg);

//??????????
#define CAN_TASK_PRIO 4
//?????????ó??
#define CAN_STK_SIZE  256
//?????????é
OS_TCB CANTaskTCB;
//????????
CPU_STK CAN_TASK_STK[CAN_STK_SIZE];
void CAN_task(void *p_arg);

//??????????
#define WARING_TASK_PRIO 5
//?????????ó??
#define WARING_STK_SIZE  128
//?????????é
OS_TCB WARINGTaskTCB;
//????????
CPU_STK WARING_TASK_STK[WARING_STK_SIZE];
//????????
void WARING_task(void *p_arg);

////??????????
//#define FLOAT_TASK_PRIO 6
////?????????ó??
//#define FLOAT_STK_SIZE 128
////?????????é
//OS_TCB FloatTaskTCB;
////????????
//__align(8) CPU_STK FLOAT_TASK_STK[FLOAT_STK_SIZE];
////????????
//void float_task(void *p_arg);

int main(void)
{
OS_ERR err;
CPU_SR_ALLOC();

delay_init();       //???±??????????   
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//?è????????????·?×é??×é2??2??????????????2???ì????????
uart_init(115200);   //????????????115200
LED_Init();    //????????LED??????????????
LCD_Init();     //??????LCD
KEY_Init();  //°??ü??????
BEEP_Init(); //·??ù?÷??????  
   //??????CAN?¤×÷????
CAN_Mode_Init(CAN_SJW_1tq,CAN_BS2_8tq,CAN_BS1_9tq,4,CAN_Mode_LoopBack);//CAN???????·??????,?¨????500Kbps    

OSInit(&err); //??????UCOSIII
OS_CRITICAL_ENTER();//??????????
//???¨????????
OSTaskCreate((OS_TCB  * )&StartTaskTCB, //?????????é
 (CPU_CHAR * )"start task",  //??????×?
                 (OS_TASK_PTR )start_task,  //????????
                 (void * )0, //????????????????????
                 (OS_PRIO   )START_TASK_PRIO,     //??????????
                 (CPU_STK   * )&START_TASK_STK[0], //?????????ù???·
                 (CPU_STK_SIZE)START_STK_SIZE/10, //????????????????
                 (CPU_STK_SIZE)START_STK_SIZE, //?????????ó??
                 (OS_MSG_QTY  )0, //??????????????????????????×??ó????????,??0?±????????????
                 (OS_TICK   )0, //?±?????±??????×??±???±?????¤??????0?±???????¤????
                 (void    * )0, //???§????????????
                 (OS_OPT      )OS_OPT_TASK_STK_CHK|OS_OPT_TASK_STK_CLR, //????????
                 (OS_ERR  * )&err); //??·????????í?ó?±??·?????
OS_CRITICAL_EXIT(); //??????????  
OSStart(&err);  //????UCOSIII
while(1);
}

//????????????
void start_task(void *p_arg)
{
OS_ERR err;
CPU_SR_ALLOC();
p_arg = p_arg;

CPU_Init();
#if OS_CFG_STAT_TASK_EN > 0u
   OSStatTaskCPUUsageInit(&err);   //????????                
#endif

#ifdef CPU_CFG_INT_DIS_MEAS_EN //????????????????????±??±??
    CPU_IntDisMeasMaxCurReset();
#endif

#if OS_CFG_SCHED_ROUND_ROBIN_EN  //?±?????±??????×????±?ò
 //?????±??????×??÷??????,?±?????¤????1???????±??????????1*5=5ms
OSSchedRoundRobinCfg(DEF_ENABLED,1,&err);  
#endif

OS_CRITICAL_ENTER(); //??????????
//???¨LED0????
OSTaskCreate((OS_TCB  * )&CANTaskTCB,
 (CPU_CHAR * )"CAN task", 
                 (OS_TASK_PTR )CAN_task, 
                 (void * )0,
                 (OS_PRIO   )CAN_TASK_PRIO,     
                 (CPU_STK   * )&CAN_TASK_STK[0],
                 (CPU_STK_SIZE)CAN_STK_SIZE/10,
                 (CPU_STK_SIZE)CAN_STK_SIZE,
                 (OS_MSG_QTY  )0,
                 (OS_TICK   )0,
                 (void    * )0,
                 (OS_OPT      )OS_OPT_TASK_STK_CHK|OS_OPT_TASK_STK_CLR,
                 (OS_ERR  * )&err);
 
//???¨WARING????
OSTaskCreate((OS_TCB  * )&WARINGTaskTCB,
 (CPU_CHAR * )"WARING task", 
                 (OS_TASK_PTR )WARING_task, 
                 (void * )0,
                 (OS_PRIO   )WARING_TASK_PRIO,     
                 (CPU_STK   * )&WARING_TASK_STK[0],
                 (CPU_STK_SIZE)WARING_STK_SIZE/10,
                 (CPU_STK_SIZE)WARING_STK_SIZE,
                 (OS_MSG_QTY  )0,
                 (OS_TICK   )0,
                 (void    * )0,
                 (OS_OPT      )OS_OPT_TASK_STK_CHK|OS_OPT_TASK_STK_CLR, 
                 (OS_ERR  * )&err);
 
// //???¨????????????
// OSTaskCreate((OS_TCB  * )&FloatTaskTCB,
//  (CPU_CHAR * )"float test task", 
//                 (OS_TASK_PTR )float_task, 
//                 (void * )0,
//                 (OS_PRIO   )FLOAT_TASK_PRIO,     
//                 (CPU_STK   * )&FLOAT_TASK_STK[0],
//                 (CPU_STK_SIZE)FLOAT_STK_SIZE/10,
//                 (CPU_STK_SIZE)FLOAT_STK_SIZE,
//                 (OS_MSG_QTY  )0,
//                 (OS_TICK   )0,
//                 (void    * )0,
//                 (OS_OPT      )OS_OPT_TASK_STK_CHK|OS_OPT_TASK_STK_CLR, 
//                 (OS_ERR  * )&err);  
OS_TaskSuspend((OS_TCB*)&StartTaskTCB,&err); //????????????  
OS_CRITICAL_EXIT(); //??????????
}

//CAN????????
void CAN_task(void *p_arg)
{
OS_ERR err;
short mtemperature;
u8 key;
short temperature;       
u8 humidity; 
u8 define;
u8 snum=0;
u8 rnum=0;
u8 t=0;
u8 cnt=0;
u8 canbuf[8];
u8 res;
u8 mode=CAN_Mode_LoopBack;//CAN?¤×÷????;CAN_Mode_Normal(0)?????¨??????CAN_Mode_LoopBack(1)???·??????



  POINT_COLOR=DARKBLUE;//?è??×??????ì?? 
LCD_ShowString(30,30,200,16,16,"CAN AND DS18B20");
LCD_ShowString(30,50,200,16,16,"KEY0:Send WK_UP:Mode");//?????á??????   
LCD_ShowString(30,90,200,16,16,"Send Data Count:"); //?á??·???????,?°·???????
LCD_ShowString(30,110,200,16,16,"DS18B20:    . C"); //·???????????
POINT_COLOR=BLACK;
LCD_ShowString(30,170,200,16,16,"Receive Data Count:"); //?á??????????????,?°????????
LCD_ShowString(30,190,200,16,16,"Receive DS18b20:    . C");
LCD_ShowString(30,230,200,16,16,"Receive DHT11:   C");
LCD_ShowString(30,250,200,16,16,"Receive DHT11:   %");

POINT_COLOR=RED;
//DS18B20??????
while(DS18B20_Init())
{
LCD_ShowString(30,70,200,16,16,"DS18B20 Check Error");
delay_ms(200);
LCD_Fill(92,10,239,10+16,WHITE);
  delay_ms(200);
}

LCD_ShowString(30,70,200,16,16,"DS18B20 Check OK");

  while(1)
{
key=KEY_Scan(0);
//DS18B20????????
if(t%10==0) //??100ms????????
{
POINT_COLOR=GREEN;   
mtemperature=DS18B20_Get_Temp();

if(mtemperature<0)
{
LCD_ShowChar(30+8*8,110,'-',16,0); //????????
mtemperature=-mtemperature; //×???????
}else LCD_ShowChar(30+8*8,110,' ',16,0); //????????
LCD_ShowNum(30+9*8,110,mtemperature/10,2,16); //??????????·?     
    LCD_ShowNum(30+9*8+32,110,mtemperature%10,1,16); //??????????·?     
}
//·??????? key==KEY0_PRESS
if(cnt==40)//KEY0°???,·???????????
{
cnt=0;
POINT_COLOR=LBBLUE;
snum+=1;
LCD_ShowNum(30+16*8,90,snum,3,16);
canbuf[1]=mtemperature;//????·?????????
  canbuf[0]=1; //??±????? 1 is DS18B20,2 is DHT11
canbuf[2]=0;
res=Can_Send_Msg(canbuf,3);//·???8??×??? 
POINT_COLOR= BRRED;
if(res)LCD_ShowString(30,130,200,16,16,"DS18B20 Send Data Err"); //?á??·????§°?
else LCD_ShowString(30,130,200,16,16,"DS18B20 Send Data Ok");   //?á??·???????
}

//????CAN?¤×÷????
 if(key==KEYUP_PRESS)//WK_UP°???????±?CAN???¤×÷????
{    
mode=!mode;
   CAN_Mode_Init(CAN_SJW_1tq,CAN_BS2_8tq,CAN_BS1_9tq,4,mode);//CAN???¨??????????, ?¨????500Kbps 
POINT_COLOR=RED;//?è??×??????ì?? 
if(mode==0)//???¨???????è??2????·?°?
{
LCD_ShowString(60,10,200,16,16,"Nnormal Mode ");     
}else //???·????,??????·?°?????????????.
{
  LCD_ShowString(60,10,200,16,16,"LoopBack Mode");
}
   
}  
//????????
key=Can_Receive_Msg(canbuf);
if(key)//????????????
{
POINT_COLOR=BLUE;//?è??×?????????
rnum+=1;
LCD_ShowNum(30+19*8,170,rnum,3,16);
temperature=canbuf[1];
define=canbuf[0];
humidity=canbuf[2];
POINT_COLOR=GREEN;
//??????DS18B20????
if(define==1)
{
LCD_ShowString(30,210,200,16,16,"DS18B20 Receive Data ok");
LCD_Fill(30+16*8,190,30+16*8+3*8,190+16,WHITE);//???????°??????
if(temperature<0)
{
LCD_ShowChar(30+16*8,190,'-',16,0); //????????
temperature=-temperature; //×???????
}else LCD_ShowChar(30+16*8,190,' ',16,0); //????????
LCD_ShowNum(30+17*8,190,temperature/10,2,16); //??????????·?     
    LCD_ShowNum(30+17*8+32,190,temperature%10,1,16); //??????????·? 
LCD_ShowString(30,270,200,16,16,"DHT111     is      Lost ");
LCD_ShowNum(30+14*8,230,000,3,16); //????????        
LCD_ShowNum(30+14*8,250,000,3,16); //????????

}
//??????DHT11????
  else if(define==2)
{
POINT_COLOR=BROWN;

LCD_ShowString(30,270,200,16,16,"DHT11  Receive  Data  ok ");
    
LCD_ShowNum(30+14*8,230,temperature,3,16); //????????        
LCD_ShowNum(30+14*8,250,humidity,3,16); //????????
LCD_ShowNum(30+17*8,190,000,2,16); //??????????·?     
    LCD_ShowNum(30+17*8+32,190,000,1,16); //??????????·?

 LCD_ShowString(30,210,200,16,16,"DS18B20     is      Lost      ");
}
}
t++; 
OSTimeDlyHMSM(0,0,0,10,OS_OPT_TIME_HMSM_STRICT,&err); //???±10ms
if(t==20)
{
LED0=!LED0;//?á??????????????
t=0;
cnt++;

}    
}
}

////WARING????????
void WARING_task(void *p_arg)
{
OS_ERR err;
p_arg = p_arg;
while(1)
{
//DS18B20?????ó??23??,·??ù?÷±¨??
if(Stemp/10>25)
{
OSTimeDlyHMSM(0,0,0,800,OS_OPT_TIME_HMSM_STRICT,&err); //???±800ms
BEEP=1;
OSTimeDlyHMSM(0,0,0,100,OS_OPT_TIME_HMSM_STRICT,&err); //???±100ms
BEEP=0;
}else BEEP=0;
// ????????DHT11???????ó??73%??LED1????±¨??
if(Shumidity>73)
{
OSTimeDlyHMSM(0,0,0,700,OS_OPT_TIME_HMSM_STRICT,&err); //???±700ms
LED1=0;
OSTimeDlyHMSM(0,0,0,100,OS_OPT_TIME_HMSM_STRICT,&err); //???±100ms
LED1=1;
}else LED1=1;
OSTimeDlyHMSM(0,0,0,500,OS_OPT_TIME_HMSM_STRICT,&err); //???±500ms
}
}
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-21 01:34

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表