📄 02-定时器.c
字号:
// 02-定时器.c
// 很经典的一个程式,主要利用定时器0;
// 将每秒累加的数目显示在数码管上;
// 29-09-09 akuei2;
#include "reg52.h"
#define uchar unsigned char
//定义数码管码
uchar code Led_Code[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff};
//定义位选码
//0b111101111,0b11111011,0b11111101,0b11111110
uchar code Led_Select[]={0xf7,0xfb,0xfd,0xfe};
//定义变量
int Sec,t0;
//50微秒延迟函数
void Delay_50us(int t)
{
uchar j;
t--;
for(;t>0;t--)
for(j=19;j>0;j--);
}
//数码管显示函数
void Display(void)
{
int Digit[4],i;
Digit[3]=Sec/1000; //第一个数码管取千位
Digit[2]=Sec%1000/100; //第二个数码管取百位
Digit[1]=Sec%100/10; //第三个数码管取十位
Digit[0]=Sec%10; //第四个数码管取个位
for(i=0;i<4;i++)
{
P0=Led_Code[Digit[3-i]]; //送数码管码
P2=Led_Select[i]; //送位选码
Delay_50us(20); //延迟1微秒
P0=P2=0xff; //消影
}
}
//初始化函数
void Init(void)
{
TMOD=0x01; //定时0,工作模式1
TH0=(65536-(50000))/256; //定时器0,高四位赋值
TL0=(65536-(50000))%256; //定时器0,第四位赋值,时间大约是50毫秒
EA=1; //全能中断使能
ET0=1; //定时器0中断使能
TR0=1; //定时0启动
}
//主函数
void main(void)
{
Init(); //初始化函数
while(1)
{
Display(); //显示函数
}
}
//定时器0 中断函数
void Ir_t0(void) interrupt 1
{
TH0=(65536-(50000))/256; //重新赋值
TL0=(65536-(50000))%256; //重新赋值
t0++;
if(t0>=20) //大约1秒
{
t0=0; Sec++; //Sec增值
if(Sec>=10000) Sec=0; //当Sec大于等于10000,Sec重新赋值
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -