
使用定时器,设置定时的时间为50ms,采用中断方式,每中断一次,计数一次,中断20次,就是1秒,再计秒,60秒为1分,再计分,计到10分就行。
其实,就是电子时钟的程序吗,要计秒,分,小时,这都可以实现的,何况你是10分。
因为这里最大循环到120,不超过255,所又定义UCHAR就行了。
这个MS延时子程序是检测过的,所以就这样设计了。
在1T单片机里这样写过。
void delayms(unsigned char ms)
// 延时子程序
{
unsigned int i;
while(ms--)
{
for(i = 0; i < 600; i++);
}
}
这里由于需要循环600次,uchar不够,所又定义为uint
keil程序扫描到延迟是停留在延迟那行还是一直扫描
1、硬件延时
优点:用到定时器/计数器,这种方法可以提高CPU的工作效率,也能做到精确延时;
缺点:往往在精度要求不是很高时,会使定时器/计数器大材小用,而且很极端时,定时器根本不够的。
2、软件延时
优点:节省硬件资源的同时,只要正确使用可接近要求的精度,这种方法主要采用循环体进行;
缺点:精度不高,对编程者经验要求甚高。
二、硬件延时
1、常用晶振:11059 2 MHz(容易产生各种标准的波特率)、12 MHz或6 MHz(机器周期
分别为1 μs和2 μs,便于精确延时)。
2、本程序中假设使用频率为12 MHz的晶振。最长的延时时间可达2的16次方=65 536 。若定时器工作在方式2,则可实现极短时间的精确延时;如使用其他定时方式,则要考
虑重装定时初值的时间(重装定时器初值占用2个机器周期)。
3、在实际应用中,定时常采用中断方式,如进行适当的循环可实现几秒甚至更长时间的延
时。使用定时器/计数器延时从程序的执行效率和稳定性两方面考虑都是最佳的方案。但应该注意,C51编写的中断服务程序编译后会自动加上PUSH ACC、PUSH PSW、POP PSW和POP ACC语句,执行时占用了4个机器周期;如程序中还有计数值加1语句,则又会占用1个机器周期。这些语句所消耗的时间在计算定时初值时要考虑进去,从初值中减去以达到最小误差的目的。
三、软件延时(通过调用延时函数)
1、调用延时函数三要素:
入口周期Te、返回周期Tr、内部代码执行周期Ti
则:该函数总执行周期Tf=Te+Tr+Ti;其中:Ti=循环次数循环周期N
是这样的,keil有自己的晶振,你在使用时要把keil的晶振调节成和硬件的晶振一样的大小,这样时间就一样了。
还有如果要精确的延时,最好是用程序自带的延时函数,
另外我要提醒的是,在主函数大循环中不要过多使用延时功能,建议用计数功能代替延时,这样比较省资源。
在Keil里仿真的话,在配置里把晶振调成12MHz,然后在调用delay函数的地方设置一个断点,开始调试程序,运行到断点处,注意程序左边有一个记录当前寄存器和一些状态的窗口,其中,里面有一个是专门记录当前运行了多少时间的变量,记下当前时间T1,然后按F10(不进入子函数)调试,再记录当前时间T2,则延时=T2-T1。多试几个A,差不多调到1s就够了。我一般都这么调。
你要想明白其中原理,想自己算的话,你就看看delay的汇编代码段自己算吧。
以上就是关于用KEIL编写51单片机延时10分钟程序全部的内容,包括:用KEIL编写51单片机延时10分钟程序、各位同仁:keil中延时子程序的参数为什么是char而不是、keil程序扫描到延迟是停留在延迟那行还是一直扫描等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)