51单片机定时功能如何实现?

51单片机定时功能如何实现?,第1张

#include"reg51h"
#define
uchar
unsigned
char
#define
uint
unsigned
int
/初始化程序/
void
initiation()
{
TMOD=0x11;
//设定计数方式等
TH0=-10000/256;
TL0=-10000%256;
//10MS定时初值(T0计时用)
TH1=-25000/256;
TL1=-25000%256;
//25MS定时初值(T1计时用)
ET0=1;
ET1=1;
TR0=1;
TR1=1;
EA=1;
}
/定时器0中断服务程序/
void
init_timer0(void)
interrupt
1
{
TH0=-10000/256;
TL0=-10000%256;
//10MS定时初值(T0计时用)
//下面写用户程序
}
/定时器1中断服务程序/
void
init_timer1(void)
interrupt
3
{
TH1=-25000/256;
TL1=-25000%256;
//50MS定时初值(T1计时用)
//下面写用户程序
}
/主程序/
main()
{
initiation();
while(1)
{
;
}
}

这是因为当T0中断函数中内容很多事势必会占用运行时间,从而影响了T0的定时时间,所以,如果是通过T0编程的时钟程序,要想准确,几乎没有赋值50000或其他别人确定的值而延时50MS的,都是自己经过一次次的校准才确定的值。

假设晶振为12MHz,不用中断时程序语句如下:
TMOD=0x01;//定时器0工作方式1
TH0=(65536-1000)/256;//装入初值
TL0=(65536-1000)%256;
TF0=0;//清溢出标志;
TR0=1;//启动定时器0
while(TF0==0);//等待定时时间到
TR0=0;
TF0=0;

#define uint unsigned int
#define uchar unsigned char
#include <reg52h>
uint i;
uchar code TAB[]=[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
void main(void)
{
TMOD=0x22; /定时器0设置为工作方式2,基准定时(256-6)/1M=025ms/
TH0 =6; //赋T0的预置值6,溢出4000次就是1秒钟
TL0 =6;
ET0=1; //打开定时器0中断
EA=1; //打开总中断
TR0=1; //启动定时器
while(1) //程序循环
{
P3=TAB[(i)];//p3送数
}
}
//定时器0中断
void timer0(void) interrupt 1 using 1
{
static uint t; //注意t的范围,这里涉及到C51变量取值范围这个知识点
t++;
if(t==4000) //T0的预置值6,溢出4000次就是1秒钟,晶振12MHz
{
t=0;
i++;
i=i%10;
}
}


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

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

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

发表评论

登录后才能评论

评论列表(0条)

保存