打印

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

[复制链接]
3816|13
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
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需要较长的转换时间”时间应该很不长啊,那么你究竟需要多精确的时间啊

使用特权

评论回复
5
logokfu| | 2012-8-23 07:53 | 只看该作者
用定时器,到了定时的时间在干指定的事情。

使用特权

评论回复
6
291355171| | 2012-8-23 08:31 | 只看该作者
就算转换需要很长时间,你是用1602显示的,又不会闪。你担心什么?

使用特权

评论回复
7
zhuanghaiyang| | 2012-8-23 14:50 | 只看该作者
过段时间扫一次就可以了,别每次都扫

使用特权

评论回复
8
darlin520|  楼主 | 2012-8-23 21:59 | 只看该作者
谢谢各位的回答,但得到的答案不是很满意,我还是等几天再结帖吧,尤其谢谢版主,每次光临赐教。。

使用特权

评论回复
9
jtl206| | 2012-8-23 22:30 | 只看该作者
本帖最后由 jtl206 于 2012-8-23 22:46 编辑

分步骤,一次测温有几个步骤,每个步骤占用的时间不多(一个步骤顶多几个毫秒),每次执行一个步骤,测温开始后查询忙标志,转换没结束时做其他的事,查询到转换结束了再去读
void DS18B20_Read_Temp()
{         
         switch (step)
         {
                        case 0 :        if(DS18B20_Init())              step=0;  else  step=1;         break;//Init
                        case 1 :        DS18B20_Write_Cmd(0XCC);                                        step=2;         break;//Skip Rom
                        case 2 :        DS18B20_Write_Cmd(0X44);                                         step=3;         break;//Convert
                        case 3 :        if(!DS18B20_Busy())      step=3;        else        step=4;         break;//Read Busy
                        case 4 :        if(DS18B20_Init())              step=4;        else         step=5;         break;//Init
                        case 5 :        DS18B20_Write_Cmd(0XCC);                step=6;         break;//Skip Rom
                        case 6 :        DS18B20_Write_Cmd(0XBE);                step=7;         break;//Read Data
                        case 7 :        TEMP.LSB=DS18B20_Read_Data();                             step=8;         break;//LSB
                        case 8 :        TEMP.MSB=DS18B20_Read_Data();           step=0;         break;//MSB
                        default :        step=0;        break;         
         }

使用特权

评论回复
10
airwill| | 2012-8-23 22:38 | 只看该作者
看起来复杂了一些, 但是没有什么高实时要求的事情要做.
让几个功能函数轮番执行就行了.

使用特权

评论回复
11
siuhiong| | 2012-8-24 20:29 | 只看该作者
本帖最后由 siuhiong 于 2012-8-24 20:30 编辑

采用时间片轮转法。

使用特权

评论回复
12
dlyt_test001| | 2012-8-25 08:05 | 只看该作者
不用多任务。用定时器就可以搞定!

使用特权

评论回复
13
songhere| | 2012-8-25 09:10 | 只看该作者
分几个时间片,对任务就行优先级的轮询。。。。

使用特权

评论回复
14
joyme| | 2012-8-25 09:30 | 只看该作者
这个帖子以前有提过

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

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

107

帖子

0

粉丝