单片机延时怎么算

单片机延时怎么算,第1张

C程序中可使用不同类型的变量来进行延时设计。经实验测试,使用unsigned char类型具有比unsigned int更优化的代码,在使用时应该使用unsigned char作为延时变量。 以某晶振为12MHz的单片机 为例,晶振为12MHz即一个机器周期为1us。一. 500ms延时子程序程序: void delay500ms(void){unsigned char i,j,kfor(i=15i>0i--)for(j=202j>0j--)for(k=81k>0k--)}计算分析:程序共有三层循环一层循环n:R5*2 = 81*2 = 162us DJNZ 2us二层循环m:R6*(n+3) = 202*165 = 33330us DJNZ 2us + R5赋值 1us = 3us三层循环: R7*(m+3) = 15*33333 = 499995us DJNZ 2us + R6赋值 1us = 3us循环外: 5us 子程序调用 2us + 子程序返回 2us + R7赋值 1us = 5us延时总时间 = 三层循环 + 循环外 = 499995+5 = 500000us =500ms计算公式:延时时间=[(2*R5+3)*R6+3]*R7+5二. 200ms延时子程序程序:void delay200ms(void){unsigned char i,j,kfor(i=5i>0i--)for(j=132j>0j--)for(k=150k>0k--)}三. 10ms延时子程序程序:void delay10ms(void){unsigned char i,j,kfor(i=5i>0i--)for(j=4j>0j--)for(k=248k>0k--)}四. 1s延时子程序程序:void delay1s(void){unsigned char h,i,j,kfor(h=5h>0h--)

(网文)

如果用循环语句实现的循环,没法计算,但是可以通过软件仿真看到具体时间,但是一般精精确延时是没法用循环语句实现的。

如果想精确延时,一般需要用到定时器,延时时间与晶振有关系,单片机系统一般常选用11.059

2

mhz、12

mhz或6

mhz晶振。第一种更容易产生各种标准的波特率,后两种的一个机器周期分别为1

μs和2

μs,便于精确延时。本程序中假设使用频率为12

mhz的晶振。最长的延时时间可达216=65

536

μs。若定时器工作在方式2,则可实现极短时间的精确延时如使用其他定时方式,则要考虑重装定时初值的时间(重装定时器初值占用2个机器周期)。

这样 我很想帮你回答,但是你贴出来的程序都略去delay函数了。而且m也没有定义。

P1所谓都亮着 你总得贴出硬件图才能让我们告你吧。完善一下问题 ,很乐意帮你。

那个500 并不是具体的多长时间 ,应该是500*m个机器周期的时间,他是不能具体的。

在你这里并没有用到定时器。

再补充一点,刚才看你问数码管的问题,为什么不可以这样设置0x00 0x01 0x02用数字呢?

答曰:你要想想,单片机的一组八个口是分别接到七段数码管的7个灯和一个小数点的。倘若你的数码管是阴极连接,你想想0X00能点亮数码管的灯吗?0X01也只能点亮一个小横杠。

一个 “8.” 你观察一下数码管 是不是有7个小横杠,和一个小数点?

那么如果你硬件是数码管阴极连接,你想显示数字8. 是不是要写0XFF? 如果你想显示1. 那么你看看这里需要点亮三个东西,假设这三个灯对应的是你的P1口=00010011,那你是不是只能给P1口赋值0X13呢? 如果不理解。请追问。


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/yw/11107130.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-13
下一篇2023-05-13

发表评论

登录后才能评论

评论列表(0条)

    保存