51单片机多任务的解决方法

[复制链接]
 楼主| darlin520 发表于 2012-8-22 21:47 | 显示全部楼层 |阅读模式
最近想写一个综合的代码,想把DS18B20的数据通过射频发送出去产,为了搞复杂一些,又加了一个DS1302和AT24C02的程序在里面,用1602显示出来。现在遇到的问题是DS18B20需要较长的转换时间,如果不用中断怎么解决多任务问题,可不可以先执行温度转换函数,然后执行其它函数,过了一定时间后再把18B20的数据显示出来。。想请高手指点一下思路。。
NE5532 发表于 2012-8-22 22:31 | 显示全部楼层
楼主的描述里面,没有哪个任务是实时的。提醒楼主一声,温度不会突变(客观的物理规律),1分钟测1次能解决问题的话,我想这个程序时间已经够充足的了。

评分

参与人数 1威望 +1 收起 理由
tuzihog + 1 温度不会突变(客观的物理规律) 说的很好 ...

查看全部评分

dong_abc 发表于 2012-8-22 22:59 | 显示全部楼层
为了搞复杂一些,xxxx ~~~;P
冲上云霄 发表于 2012-8-23 07:46 | 显示全部楼层
我有个疑问,“DS18B20需要较长的转换时间”时间应该很不长啊,那么你究竟需要多精确的时间啊
logokfu 发表于 2012-8-23 07:53 | 显示全部楼层
用定时器,到了定时的时间在干指定的事情。
291355171 发表于 2012-8-23 08:31 | 显示全部楼层
就算转换需要很长时间,你是用1602显示的,又不会闪。你担心什么?
zhuanghaiyang 发表于 2012-8-23 14:50 | 显示全部楼层
过段时间扫一次就可以了,别每次都扫
 楼主| darlin520 发表于 2012-8-23 21:59 | 显示全部楼层
谢谢各位的回答,但得到的答案不是很满意,我还是等几天再结帖吧,尤其谢谢版主,每次光临赐教。。
jtl206 发表于 2012-8-23 22:30 | 显示全部楼层
本帖最后由 jtl206 于 2012-8-23 22:46 编辑

分步骤,一次测温有几个步骤,每个步骤占用的时间不多(一个步骤顶多几个毫秒),每次执行一个步骤,测温开始后查询忙标志,转换没结束时做其他的事,查询到转换结束了再去读
  1. void DS18B20_Read_Temp()
  2. {         
  3.          switch (step)
  4.          {
  5.                         case 0 :        if(DS18B20_Init())              step=0;  else  step=1;         break;//Init
  6.                         case 1 :        DS18B20_Write_Cmd(0XCC);                                        step=2;         break;//Skip Rom
  7.                         case 2 :        DS18B20_Write_Cmd(0X44);                                         step=3;         break;//Convert
  8.                         case 3 :        if(!DS18B20_Busy())      step=3;        else        step=4;         break;//Read Busy
  9.                         case 4 :        if(DS18B20_Init())              step=4;        else         step=5;         break;//Init
  10.                         case 5 :        DS18B20_Write_Cmd(0XCC);                step=6;         break;//Skip Rom
  11.                         case 6 :        DS18B20_Write_Cmd(0XBE);                step=7;         break;//Read Data
  12.                         case 7 :        TEMP.LSB=DS18B20_Read_Data();                             step=8;         break;//LSB
  13.                         case 8 :        TEMP.MSB=DS18B20_Read_Data();           step=0;         break;//MSB
  14.                         default :        step=0;        break;         
  15.          }
airwill 发表于 2012-8-23 22:38 | 显示全部楼层
看起来复杂了一些, 但是没有什么高实时要求的事情要做.
让几个功能函数轮番执行就行了.
siuhiong 发表于 2012-8-24 20:29 | 显示全部楼层
本帖最后由 siuhiong 于 2012-8-24 20:30 编辑

采用时间片轮转法。
dlyt_test001 发表于 2012-8-25 08:05 | 显示全部楼层
不用多任务。用定时器就可以搞定!
songhere 发表于 2012-8-25 09:10 | 显示全部楼层
分几个时间片,对任务就行优先级的轮询。。。。
joyme 发表于 2012-8-25 09:30 | 显示全部楼层
这个帖子以前有提过

1、对温度的读取,0.1s扫描一次都算是快的了(没有那个温度变化象秒表似的吧,即使有人眼看变化这么快的没有意义),所以转换时间长不是问题
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

107

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部