深入浅出玩转51单片机——学习笔记:数码管简易时钟
0赞
发表于 5/16/2014 5:50:37 PM
阅读(3131)
/**********************************************
实现功能:数码管简易时钟
硬件平台:基于MGMC-V1.0实验板
晶振频率:11.0592Mhz
时间:2014年5月16日
***********************************************/
#include<reg52.h>
typedef unsigned char uint8;
typedef unsigned int uint16;
sbit We_En = P1^6;
sbit Du_En = P1^7;
uint8 Bit_Tab[8] = {0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe}; //数码管位选
uint8 SEG_Tab[10] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f}; //数码管段选
uint8 time[3];
uint8 Dis_Buff[6];
uint8 We_Cnt = 0;
uint8 time_2ms_ok = 0;
uint8 time_1s_ok = 0;
uint16 i = 0;
void initial_myself(); //上电初始化
void initial_peripheral(); //外围设备初始化
void Dleay_Ms(uint16 z);
void Dis_Buffer(); //时间分离函数
void SEG_Display(); //数码管刷新函数
void Time_Service(); //时间计时函数
void main()
{
initial_myself();
Dleay_Ms(10);
initial_peripheral();
time[0] = 56;
time[1] = 34;
time[2] = 12;
while(1)
{
Dis_Buffer();
SEG_Display();
Time_Service();
}
}
void Time_Service() //时间计时函数
{
if(1 == time_1s_ok)
{
time_1s_ok = 0;
if(++time[0] >= 60)
{
time[0] = 0;
if(++time[1] >= 60)
{
time[1] = 0;
if(++time[2] >= 24)
{
time[2] = 0;
}
}
}
}
}
void SEG_Display() //数码管刷新函数
{
if(1 == time_2ms_ok)
{
time_2ms_ok = 0;
switch(We_Cnt)
{
case 0: //刷新第一个数码管
Du_En = 1; P0 = 0x00; Du_En = 0;
We_En = 1; P0 = Bit_Tab[We_Cnt]; We_En = 0;
P0 = 0x00;
Du_En = 1; P0 = SEG_Tab[Dis_Buff[0]]; Du_En = 0;
We_Cnt++;
break;
case 1: //刷新第二个数码管
Du_En = 1; P0 = 0x00; Du_En = 0;
We_En = 1; P0 = Bit_Tab[We_Cnt]; We_En = 0;
P0 = 0x00;
Du_En = 1; P0 = SEG_Tab[Dis_Buff[1]]; Du_En = 0;
We_Cnt++;
break;
case 2: //刷新第三个数码管
Du_En = 1; P0 = 0x00; Du_En = 0;
We_En = 1; P0 = Bit_Tab[We_Cnt]; We_En = 0;
P0 = 0x00;
Du_En = 1; P0 = 0x40; Du_En = 0;
We_Cnt++;
break;
case 3: //刷新第四个数码管
Du_En = 1; P0 = 0x00; Du_En = 0;
We_En = 1; P0 = Bit_Tab[We_Cnt]; We_En = 0;
P0 = 0x00;
Du_En = 1; P0 = SEG_Tab[Dis_Buff[2]]; Du_En = 0;
We_Cnt++;
break;
case 4: //刷新第五个数码管
Du_En = 1; P0 = 0x00; Du_En = 0;
We_En = 1; P0 = Bit_Tab[We_Cnt]; We_En = 0;
P0 = 0x00;
Du_En = 1; P0 = SEG_Tab[Dis_Buff[3]]; Du_En = 0;
We_Cnt++;
break;
case 5: //刷新第六个数码管
Du_En = 1; P0 = 0x00; Du_En = 0;
We_En = 1; P0 = Bit_Tab[We_Cnt]; We_En = 0;
P0 = 0x00;
Du_En = 1; P0 = 0x40; Du_En = 0;
We_Cnt++;
break;
case 6: //刷新第七个数码管
Du_En = 1; P0 = 0x00; Du_En = 0;
We_En = 1; P0 = Bit_Tab[We_Cnt]; We_En = 0;
P0 = 0x00;
Du_En = 1; P0 = SEG_Tab[Dis_Buff[4]]; Du_En = 0;
We_Cnt++;
break;
case 7: //刷新第八个数码管
Du_En = 1; P0 = 0x00; Du_En = 0;
We_En = 1; P0 = Bit_Tab[We_Cnt]; We_En = 0;
P0 = 0x00;
Du_En = 1; P0 = SEG_Tab[Dis_Buff[5]]; Du_En = 0;
We_Cnt = 0;
break;
}
}
}
void Dis_Buffer() //时间分离函数
{
Dis_Buff[0] = time[0]%10;
Dis_Buff[1] = time[0]/10;
Dis_Buff[2] = time[1]%10;
Dis_Buff[3] = time[1]/10;
Dis_Buff[4] = time[2]%10;
Dis_Buff[5] = time[2]/10;
}
void initial_myself() //上电初始化
{
P0 = 0xff;
We_En = 0;
Du_En = 0;
TMOD &= 0xf0;
TMOD |= 0x01;
TH0 = 0xf8;
TL0 = 0xcd;
}
void initial_peripheral() //外围设备初始化
{
EA = 1; //开总中断
ET0 = 1; //使能T0中断
TR0 = 1; //使能T0
}
void T0_interrupt() interrupt 1 //中断服务函数
{
TF0 = 0;
TH0 = 0xf8;
TL0 = 0xcd;
time_2ms_ok = 1; //2ms时间到
if(++i >= 500)
{
i = 0;
time_1s_ok = 1; //1s时间到
}
}
void Dleay_Ms(uint16 z)
{
uint16 x,y;
for(x = 0; x < z; x++)
for(y = 0; y < 100; y++);
}
