51单片机50ms定时

51单片机50ms定时,第1张

12MHz 的晶振,那么一个周期就是 1 us,所以需要计数 50ms / 1us = 50000,可以选择定时器工作方式 1。

由上述计算:

TH1 = (65536 - 50000) / 256;

TL1 = (65536 - 50000) % 256;

方式一,所以:

TMOD = 0x10;

运行 TR1 = 1,所以:

TCON = 0x40;

允许中断 ET1 = 1,EA = 1,所以:

IE = 0x88;

综合可以编写如下程序(汇编我不会,不知道你要的是汇编还是C):

#include <reg52h>

void timer1_int() interrupt 3

{

TH1 = (65536 - 50000) / 256;

TL1 = (65536 - 50000) % 256;

}

void timer1_init()

{

TH1 = (65536 - 50000) / 256;

TL1 = (65536 - 50000) % 256;

TMOD = 0x10;

IE = 0x88;

TCON = 0x40;

}

void main()

{

timer1_init();

while(1);

}

你好!

如果你要求是比较准确的延时程序,是一定要用定时器中断的,如果是大约的时间,是要知道你的晶振大小,然后用

while(a)

{

a--;

}

就可以了

如果对你有帮助,望采纳。

1、实现中断响应和中断返回

当CPU收到中断请求后,能根据具体情况决定是否响应中断,如果CPU没有更急、更重要的工作,则在执行完当前指令后响应这一中断请求。CPU中断响应过程如下:首先,将断点处的PC值(即下一条应执行指令的地址)推入堆栈保留下来,这称为保护断点,由硬件自动执行。然后,将有关的寄存器内容和标志位状态推入堆栈保留下来,这称为保护现场,由用户自己编程完成。保护断点和现场后即可执行中断服务程序,执行完毕,CPU由中断服务程序返回主程序,中断返回过程如下:首先恢复原保留寄存器的内容和标志位的状态,这称为恢复现场,由用户编程完成。然后,再加返回指令RETI,RETI指令的功能是恢复PC值,使CPU返回断点,这称为恢复断点。恢复现场和断点后,CPU将继续执行原主程序,中断响应过程到此为止。

2、实现优先权排队

通常,系统中有多个中断源,当有多个中断源同时发出中断请求时,要求计算机能确定哪个中断更紧迫,以便首先响应。为此,计算机给每个中断源规定了优先级别,称为优先权。这样,当多个中断源同时发出中断请求时,优先权高的中断能先被响应,只有优先权高的中断处理结束后才能响应优先权低的中断。计算机按中断源优先权高低逐次响应的过程称优先权排队,这个过程可通过硬件电路来实现,亦可通过软件查询来实现。

3、实现中断嵌套

当CPU响应某一中断时,若有优先权高的中断源发出中断请求,则CPU能中断正在进行的中断服务程序,并保留这个程序的断点(类似于子程序嵌套),响应高级中断,高级中断处理结束以后,再继续进行被中断的中断服务程序,这个过程称为中断嵌套。如果发出新的中断请求的中断源的优先权级别与正在处理的中断源同级或更低时,CPU不会响应这个中断请求,直至正在处理的中断服务程序执行完以后才能去处理新的中断请求。

不是必须要用中断的,中断是为了使主程序暂停中断的内容立即执行而设置的,如果主程序很小主程序的扫描周期可以忽略不计,那么用不用中断无所谓了,相反如果主程序很大,扫描周期很长,要执行通讯的话必须等待本次扫描周期完成才能执行,那么通讯的内容就会有延迟,为了避免这种延迟提高通讯速度或使某些必须立即执行的内容马上响应而使用中断程序,所以说用不用中断要看你的具体要求。个人见解,希望有用。

中断程序中不能再写另一个中断程序。为啥会想到这种写法?两个中断程序都必须是独立的。怎么,两个独立的中断程序就不能实现你的要求吗?不可能的,是你没想好方法。

再说了,做倒计时,用一个定时器就够了,对秒计数就行了,几秒都可以啦。即不用外部中断,也不用中断程序中再写一个断程序。本来很简单的事情,怎么想的那么复杂呢?

不受程序中断和关机影响,那数据肯定不能只保存在内存中。如果数据少的话,可以写文件,保存在文件中,程序启动加载文件。也可以把数据保存在数据库中。启动的时候从数据库读取。方法很多,关键是要把数据固化到硬盘。

不用中断,常规的方法就是查询,查询中断标志是否被置位,如果被置位,下面步骤就是:1清标志,2。add your code。 效率上说进入中断服务程序比较好,查询法如果主程序有延时程序,那么所对应中断程序也跟着延时。

以上就是关于51单片机50ms定时全部的内容,包括:51单片机50ms定时、怎么用c语言定义一个1ms的延时程序;只用while、 for 等,不用定时器和中断、如果不想在C程序中产生中断该怎么办等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

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

原文地址: http://outofmemory.cn/zz/9704722.html

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

发表评论

登录后才能评论

评论列表(0条)

保存