如何利用定时器T0的工作方式1实现1秒钟延时程序(单片机)?

如何利用定时器T0的工作方式1实现1秒钟延时程序(单片机)?,第1张

1、#include <reg52.h>

2、#define uchar unsigned char

3、#define uint unsigned int

4、sbit LED = P0^0uchar T_Count = 0void main(){TMOD = 0x01TH0  = (65535-50000)/256TL0  = (65535-50000)%256IE   = 0x82TR0  = 1while(1)}

5、void LED_Flash() interrupt 1{TH0  = (65535-50000)/256TL0  = (65535-50000)%256if(++T_Count == 20){LED = !LEDT_Count = 0}}

6、这个程序是1秒钟LED灯会亮与灭显示。

1单片机,拥有两个定时器,用来中断计数,分别是T0和T1。而52单片机和51单片机的定时器是一样的,只是52比51多了一个定时器/计数器T2,它们的设置都大同小异。

在Keil里仿真的话,在配置里把晶振调成12MHz,然后在调用delay函数的地方设置一个断点,开始调试程序,运行到断点处,注意程序左边有一个记录当前寄存器和一些状态的窗口,其中,里面有一个是专门记录当前运行了多少时间的变量,记下当前时间T1,然后按F10(不进入子函数)调试,再记录当前时间T2,则延时=T2-T1。多试几个A,差不多调到1s就够了。我一般都这么调。

你要想明白其中原理,想自己算的话,你就看看delay的汇编代码段自己算吧。

双重循环,共有循环 1000 × 1000 = 一百万遍。

每一遍,如果是1us,才能是延时约1s。

但是,晶振是12MHz,一条汇编的指令就至少是1us,C语言的语句,就要更多。

在编写延时函数之前,首先确认一下系统对晶振的分频系数,从而确定每个单周期指令执行所需的时间,一般的单片机都将指令执行周期设置为1us,这样就可以写一个比较接近1秒的延时函数了。


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

原文地址: http://outofmemory.cn/yw/7810555.html

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

发表评论

登录后才能评论

评论列表(0条)

保存