动态数码管(定时器中断)
原理
利用定时器0,定时5ms,中断溢出200次即为1s,1s数码管显示的数字加1,一直加到250后归0。
全部代码
#include <reg52.h> //头文件
#define uint unsigned int //宏定义
#define uchar unsigned char
uchar time; //定义变量
uchar number;
uint y;
void delay(uint x); //延时函数声明
void init(); //初始化函数声明
void display_init(); //显示初始化函数声明
void display(uchar z); //显示函数声明
void timer0_init(); //定时器中断函数声明
//共阴极数码管编码表:0,1,2,3,4,5,6,7,8,9
uchar code shumaguan[]= {
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f};
sbit s0=P1^0; //数码管位选:百位
sbit s1=P1^1; //数码管位选:十位
sbit s2=P1^2; //数码管位选:个位
void main() //主函数
{
init(); //初始化
timer0_init(); //定时器中断初始化
display_init(); //显示初始化
while(1) //死循环,不断显示
{
display(number);
}
}
void delay(uint x) //延时函数定义
{
uint m,n;
for(m=x;m>0;m--)
{
for(n=110;n>0;n--);
}
}
void init() //初始化函数定义
{
y = 95;
time = 0;
number = 0;
}
void display_init() //显示初始化函数定义
{
s0=0; //百位显示0
P0=0x3f;
s1=1;
s2=1;
delay(5);
s1=0; //十位显示0
P0=0x3f;
s0=1;
s2=1;
delay(5);
s2=0; //个位显示0
P0=0x3f;
s0=1;
s1=1;
delay(5);
}
void display(uchar z) //显示函数定义
{
s0=0; //打开百位位选
s1=1;
s2=1;
P0=shumaguan[z/100]; //显示百位数值
delay(5);
s1=0; //打开十位位选
s0=1;
s2=1;
P0=shumaguan[z%100/10]; //显示十位数值
delay(5);
s2=0; //打开个位位选
s0=1;
s1=1;
P0=shumaguan[z%10]; //显示个位数值
delay(5);
}
void timer0_init() //定时器中断初始化定义
{
EA=1; //开总中断
TMOD |= 0x01; //定时器0选择工作方式1
TH0 = (65536-5000)/256; //初值5ms
TL0 = (65536-5000)%256;
ET0 = 1; //开定时器中断
TR0 = 1; //开定时器
}
void timer0_irq() interrupt 1 //定时0中断
{
TH0 = (65536-5000)/256; //重装初值5ms
TL0 = (65536-5000)%256;
time++; //每 5ms+1
if(time == 200) //达到20次,即1s
{
number++; //数码管显示数字+1
if(number>250) //最大显示250
{
number = 0;
}
}
}