#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit dis_bit1=P2^7;//定義數碼管控制口
sbit dis_bit2=P2^6;//定義數碼管控制口
sbit dis_bit3=P2^4;//定義數碼管控制口
sbit dis_bit4=P2^3;//定義數碼管控制口
sbit dis_bit5=P2^1;//定義數碼管控制口
sbit dis_bit6=P2^0;//定義數碼管控制口
sbit led1_bit=P2^2;//定時LED的控制口
sbit led2_bit=P2^5;//定時LED的控制口
#define smg_data P0//定義數碼管數據口
void delay_50us(uint t);
void display1(uchar dis_data);
void display2(uchar dis_data);
void display3(uchar dis_data);
void display4(uchar dis_data);
void display5(uchar dis_data);
void display6(uchar dis_data);
void init_t0();//定時器0初始化函數
void dis_led();//LED處理函數
//共陽數碼管斷碼表
const unsigned char tabl1[17]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,
// 0 1 2 3 4 5
0x82,0xf8,0x80,0x90,0x88,0x83,
//6 7 8 9 A B
0xc6,0xa1,0x86,0x8e,0xb6};
// C D E F 三
uchar t0_crycle;
uchar hour_count,minute_count,second_count,msecond_count;
uchar flag1;
//主程序
void main()
{
P3=0x00;
init_t0();
TR0=1;//
while(1)
{
display1(hour_count/10);
display2(hour_count%10);
display3(minute_count/10);
display4(minute_count%10);
display5(second_count/10);
display6(second_count%10);
dis_led();
}
}
void timer0() interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
t0_crycle++;
if(t0_crycle==2)// 0.1秒
{
t0_crycle=0;
msecond_count++;
if(msecond_count==10)//1秒
{
msecond_count=0;
second_count++;
if(second_count==60)
{
second_count=0;
minute_count++;
if(minute_count==60)
{
minute_count=0;
hour_count++;
if(hour_count==24)
{
hour_count=0;
}
}
}
}
}
}
//********************************************************************************************
void init_t0()
{
TMOD=0x01;//設定定時器工作方式1,定時器定時50毫秒
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=1;//開總中斷
ET0=1;//允許定時器0中斷
t0_crycle=0;//定時器中斷次數計數單元
}
//**************************************************
void dis_led()
{
if(msecond_count<5)
{
led1_bit=1;
led2_bit=1;
}
else
{
led1_bit=0;
led2_bit=0;
}
}
//***************************************************************
void display6(uchar dis_data)
{
smg_data=tabl1[dis_data];//送顯示斷碼
dis_bit6=0;//鎖存數據
delay_50us(40);
dis_bit6=1;
}
//***************************************************************
void display5(uchar dis_data)
{
smg_data=tabl1[dis_data];//送顯示斷碼
dis_bit5=0;//鎖存數據
delay_50us(40);
dis_bit5=1;
}
//***************************************************************
void display4(uchar dis_data)
{
smg_data=tabl1[dis_data];//送顯示斷碼
dis_bit4=0;//鎖存數據
delay_50us(40);
dis_bit4=1;
}//***************************************************************
void display3(uchar dis_data)
{
smg_data=tabl1[dis_data];//送顯示斷碼
dis_bit3=0;//鎖存數據
delay_50us(40);
dis_bit3=1;
}
//***************************************************************
void display1(uchar dis_data)
{
smg_data=tabl1[dis_data];//送顯示斷碼
dis_bit1=0;//鎖存數據
delay_50us(40);
dis_bit1=1;
}
//***************************************************************
void display2(uchar dis_data)
{
smg_data=tabl1[dis_data];//送顯示斷碼
dis_bit2=0;//鎖存數據
delay_50us(40);
dis_bit2=1;
}
//**************************************************************************************************
//函數名稱:void delay_50US(unsigned int t)
//功能: 延時50*t(us)
void delay_50us(uint t)
{
unsigned char j;
for(;t>0;t--)
{
for(j=19;j>0;j--);
}
}