#include
#include
#define DataPort P0 //定义数据端口 程序中遇到DataPort 则用P0 替换
#define uchar unsigned char
#define uint unsigned int
sbit buzz=P0^6;//蜂鸣器
sbit relay=P0^4;//继电器
// 0 1 2 3 4 5 6 7 8 9 - 消隐
unsigned char code DuanMa[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf,0xff}; //共阳
unsigned char code WeiMa[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};//分别对应相应的数码管点亮,即位码
uchar disData[8]={11,11,11,11,11,11,0,0};
uchar times=0;
uchar hour,minute,second;
//函数声明
void delay_50us(uint t);
void display(uchar *point);
void SEG_Latch(void); //段码锁存子程序
void BIT_Latch(void); //位码锁存子程序
void ULN2003_Latch(void);
//P2.7~P2.5=111段码锁存
//P2.7~P2.5=110位码锁存
main()
{
buzz=0;//关蜂鸣器
relay=0;//关继电器
ULN2003_Latch();
TMOD |=0x01;//T0 16位定时器
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
ET0=1;
TR0=1;
EA=1;
while(1)
{
if(second == 60 )
{
second = 0;
minute++;
if(minute == 60)
{
minute=0;
hour++;
if(hour==24)
{
hour=0;
}
}
}
disData[6]=second/10;
disData[7]=second%10;
disData[5]=10;
disData[3]=minute/10;
disData[4]=minute%10;
disData[2]=10;
disData[0]=hour/10;
disData[1]=hour%10;
display(disData);
}
}
void ISR_Timer0(void) interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
times++;
if (times == 20)
{
second++;
times=0;
}
}
void delay_50us(uint t) //50us 延时
{
uchar j;
for(;t>0;t--)
for(j=19;j>0;j--)
;
}
void SEG_Latch(void) //段码锁存子程序
{
P2 &= 0x1f;//清P2.7~P2.5
P2 |= 0xe0;//P2.7~P2.5=111,Y7=0,Y7C=1,即U7的LE=1,段码数据选通
_nop_();
P2 &= 0x1f;//P2.7~P2.5=000,Y7=1,Y7C=0,即U7的LE=0,段码数据被锁存
}
void BIT_Latch(void) //位码锁存子程序
{
P2 &= 0x1f;//清P2.7~P2.5
P2 |= 0xC0; //P2.7~P2.5=110,Y6=0,Y6C=1,即U8的LE=1,位码数据选通
_nop_();
P2 &= 0x1f; //P2.7~P2.5=000,Y6=1,Y6C=0,即U8的LE=0,位码数据被锁存
}
void display(uchar *point)
{
unsigned char i=0;
for(i=0;i<8;i++)
{
DataPort=WeiMa[i]; //取位码
BIT_Latch(); //数据锁存
DataPort=DuanMa[*(point+i)]; //取显示数据,段码
SEG_Latch(); //数据锁存
delay_50us(20); // 扫描间隙延时,时间太长会闪烁,太短不亮
DataPort=0xff; //关显示,消除重影
SEG_Latch(); //数据锁存
}
}
void ULN2003_Latch(void) // ULN2003锁存子程序
{
P2 &= 0x1f;//清P2.7~P2.5
P2 |= 0xa0;//P2.7~P2.5=101,Y5=0,Y5C=1,即U9的LE=1,数据选通
_nop_();
P2 &= 0x1f;//P2.7~P2.5=000,Y5=1,Y5C=0,即U9的LE=0,数据被锁存
}