- 1、本文档共8页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
的一些特征技巧可供利用时间的模糊性在大多数情况下时间是具有模糊性的象秒分钟小时从长的时间角度即使你计秒的时间被退后秒在大多数情况下都是允许的包括一些显示还有象扫描键盘你可在去抖也可在时间去抖这个时间范围是有一定弹性的又如闪烁要求你可在去刷新下次在只要保证长的周期定时是准确的个别时间是可推迟的这样的情形会在许多地方发生这就给设计多任务程序提供了一个基础消息的周期循环性消息指系统函数定时类的模块之间有状态变化模块内部有状态请求而相应产生的标志数据或变量数据它的特点是它的遍历整个模块直到有模块接收它后
C51的一些特征技巧可供利用:??1.时间的模糊性.????在大多数情况下,时间是具有模糊性的.象秒,分钟,小时..,从长的时间角度,即使你计秒的时间被退后0.5秒,在大多数情况下都是允许的,包括一些显示.还有象扫描键盘,你可在20MS去抖,也可在30,30MS时间去抖,这个时间范围是有一定弹性的.又如闪烁要求400MS,你可在410MS去刷新,下次在2*400MS,只要保证长的周期定时是准确的,个别时间是可推迟的。这样的情形会在许多地方发生,这就给设计多任务程序提供了一个基础.??2.消息的周期循环性.????消息指系统函数(定时类的),模块之间有状态变化,模块内部有状态请求而相应产生的标志数据或变量数据,它的特点是它的遍历整个模块,直到有模块接收它后让它消失,没有模块接收时,循环一周被自身消失.???举个例,有T0计数器0.1MS产生一个中断,让其他所有模块都知道,模块不能消灭它,它只能被自己消灭:????void?timer0(void)?interrupt?1?/*T0中断*/????{?????fSYS_100us=1;???}bit?fSYS_TimeNow;#define?Timer0_MainLoop()?{fSYS_TimeNow=0;if(fSYS_100us){fSYS_TimeNow=1;fSYS_100us=0;}}unsigned?char?uCount;main(){?init();?uCount=100;?while(1){???Time0_MainLoop();???Task0();???if(fSYS_TimeNow)Task1();???Task2();???if(fSYS_TimeNow){??????uCount--;??????if(uCount==0){????????uCount=100;????????Task3();??????}???}?}}这样消息具有自我生成消失发布的能力,而且使模块具有独立性(Time0_MainLoop();可放在WHILE中的任何地方而不影响它的作用).而象键盘之类产生的消息,常常是每个模块接收到它后,就使它消失,避免其他模块也接收.消息在多任务程序中的作用:相当与桥梁,使模块间既相互独立又相互连接。比如说,有个按键产生的消息,打开设置画面显示:nSetScreenOn,让其它的模块中相应程序运行,这是连接。如果你的程序没写到设置画面显示部分,完全不影响整个程序,照常运行正确,这是独立性。消息通常用队列存储,一如按键缓冲队列,一般包括函数:NewsPush(unsigned?char?nData)压入消息,unsigned?char?NewsPop()弹出消息,NewsRead()宏定义的读队列中最前端的消息,fNewsEnable表示有消息需要各个模块接收,gNewsNum消息个数。一个模块接收后执行NewsPop();fNewsEnable=0消灭消息。现在举个例,P1.0键盘扫描模块作为多任务模块,并产生消息nKeyPush按键按下,nKeyPop松开。nKeyPush时P1.1=1,nKeyPop时P1.1=0./**********************************/void?timer0(void)?interrupt?1?/*T0中断*/{??fSYS_1ms=1;}bit?fSYS_TimeNow;????/*1MS时间到消息*/#define?Timer0_MainLoop()?{fSYS_TimeNow=0;if(fSYS_1ms){fSYS_TimeNow=1;fSYS_1ms=0;}}main(){??init();??while(1){????Timer0_MainLoop();????/*系统时间循环*/?????/*----------------------------------*/?????if(fSYS_TimeNow)???/*如果有1MS到的消息产生*/???????Key_MainLoop();????/*按键检查循环*/?????}?????/*----------------------------------*/???????Work_MainLoop();????/*按键的任务循环*/?????/*----------------------------------*/?????/*消息处理中心,可写成宏较直观*/?????fNewsEnable=0;?????if(gNewsNum)fNewsEnable=1;???/*有消息,通知*/??}}/*按键检查循环模块*/un
文档评论(0)