利用定时器定时出秒表时间,通过共阴数码管将所定时的时间显示出来。
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
uchar code table [] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40};//共阴段码表
uchar code table_SMG [] = {0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07};//位选
//------------------------变量区------------------------
uchar count ;//计数变量
uchar Time_T,Time_f,Time_s;//承装时间变量
//------------------------函数区------------------------
void Delay(uint t);//延时函数
void Init_ET_0();//定时器初始话函数 50ms
void Display_SMG(uchar pos , uchar date);//单个数码管显示函数(位选,段选)
void Display_Time(); //时间显示函数
void Delay(uint t)//延时函数
{
while(t--);
}
void Init_ET_0()//定时器初始话函数 50ms
{
TMOD = 0x01;//定时器0 工作方式 1
EA = 1; //开总中断
ET0 = 1; //开定时器开关
TR0 = 1; //启动定时器
TH0 = (65536 - 50000)/256; //给高八位赋初值
TL0 = (65536 - 50000)%256; //给低八位赋初值
}
void Servoic_ET_0() interrupt 1 //定时器服务函数
{
TH0 = (65536 - 50000)/256; //重装高八位
TL0 = (65536 - 50000)%256; //重装低八位
count ++; //50ms加一次
if(count == 20)//加到20次为1秒
{
Time_s ++;//1秒钟加一次
count = 0;//释放变量值使其重新及时50ms
if(Time_s == 60) //当达到60S时,分加1
{
Time_f++; //分加1
Time_s = 0; //将s置零
if(Time_f == 60) //当达到60分时,时加1
{
Time_T++;//时加1
Time_f = 0;//将时置零
if(Time_T == 24)//达到24时,将时变量置零
{
Time_T = 0;//将时变量置零
}
}
}
}
}
void Display_SMG(uchar pos , uchar date)//单个数码管显示函数(位选,段选)
{
P2 = table_SMG [pos];//位选
P1 = date ;//段选
Delay(100);//延时一小段时间用于动态显示
}
void Display_Time() //时间显示函数
{
Display_SMG(7 , table [Time_s%10]);//显示秒的个位
Display_SMG(6 , table [Time_s/10]);//显示秒的十位 (下面递推)
Display_SMG(5 , table [10]);//分隔符
Display_SMG(4 , table [Time_f%10]);
Display_SMG(3 , table [Time_f/10]);
Display_SMG(2 , table [10]);//分隔符
Display_SMG(1 , table [Time_T%10]);
Display_SMG(0 , table [Time_T/10]);
}
void main()
{
Init_ET_0();//定时器0初始化
while(1)
{
Display_Time();//不断刷新显示时间
}
}
仿真图如下