完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
当要写一个实际应用的程序,delay 几ms 这些基本是不能用的。详细参考 从单片机初学者迈向单片机工程师 ,百度文库可以搜到。
平时的实验,都是单一的,所以delay多少ms都能实现到功能,但是如果一个程序涉及很多,就拿最简单的按键控制数码管显示时钟来说,数码管的20ms内刷新一次人不会感觉有闪烁,但是如果再按键部分使用了delay函数延时了几个ms,数码管本身的动态显示又带了delay函数,那数码管将不会正常显示。51开发板的按键和数码管显示都是带delay函数的,大概都是delay(5ms)。这些只是给新手入门用,简化程序。。。当我们学到一定的阶段,就不能总是依赖delay函数来帮忙。在实时操作系统UCOSII等的情况就另当别论了。 初学,无论怎样都要写一些轮询系统。这些基本都是从《从单片机初学者迈向单片机工程师 》里面学来的,真的非常感谢这个文章的作者!让我这个新手了解到单片机的系统是怎样来写的。写得实在太好了。如果没有看过,可能我现在还是连个门都入不了。当时看到也是在电子发烧友的论坛的转帖,现在想起来都特别激动 使用定时器代替,大概原理用程序说: void tiM3_IRQHandler(void) //TIM3ÖÐ¶Ï { static u32 count=0; static u8 ledTask=0; if (TIM3->SR&0X0001)//这句可忽略 { count++; if(ledTask==0)//任务的计时 { g_switchLed=TRUE;//执行任务的标志,在主程序中清0 ledTask=ledTaskTime;//led的任务计时器赋值(自己根据情况设置) } else ledTask--; } TIM3->SR&=~(1<<0);//清中断标志 } ------------------在main中-------------------------------- while(1) { if(g_switchLed==TRUE) { led_task();//执行LED任务的转换,不能使用while(1)哦 g_switchLed=FALE; } } ---------------------------------------------- 这些写法其实是最简单的,有更简单的,搜 Protothread ,这个编程框架非常适合用于51那种特别小RAM ROM的单片机。 像我们用的这块活动的开发板,那么大的容量,根据教程移植UCOSII都完全没问题。。UCOSII的好处简单概括为:程序都可以写成while(1),按键写成一个while(1){按键检测},数码管显示写成一个while(1),delay照用。。。 这个轮询系统,下次会加入按键检测。。现在暂时是这样。。。后面有时间还会尝试一下移植UCOSII |
|
相关推荐
3 个讨论
|
|
学习了,很受用啊
|
|
|
|
|
|
为什么大家都在LED啊?
|
|
|
|
|
|
#在这里快速回复#很好啊!技术支持,谢谢分享,学习了!
|
|
|
|
|
|
只有小组成员才能发言,加入小组>>
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-27 14:19 , Processed in 0.651319 second(s), Total 77, Slave 57 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号