本人为单片机初学者,这是本人制作的一个简单的数字时钟程序,程序比较繁琐,只适合初学者学习参考使用,因为程序都是一步步来的,没有跳跃。只要将此程序复制到keil,然后编译生成hex文件,连到单片机(实物)就可以直接显示了。希望对有些人有帮助
#include//头文件
#define uchar unsigned char
#define uint unsigned int//宏定义
uchar count;
uint hour,minute,second;
uint hour1=0,minute1=0;
sbit dula=P2^6;
sbit wela=P2^7;
sbit key1=P3^0;
sbit key2=P3^1;
sbit key3=P3^2;
sbit key4=P3^3;
sbit key5=P3^4;
sbit key6=P3^5;
sbit key7=P3^6;
sbit BEEP=P1^2;
uchar code duan[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40};//0-9,横杆
uchar code wei[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; //扫描
void delay(uint z)//延时函数
{
uchar x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void init()//初始化中断
{
TMOD=0x10; //定时器1以方式1定时
TH1=(65536-50000)/256;
TL1=(65536-50000)%256;
EA=1;//总中断打开
ET1=1;//打开定时中断
TR1=1;//打开定时器
}
void time1() interrupt 3
{
TH1=(65536-50000)/256;
TL1=(65536-50000)%256;
count++;
if(count==20)//1秒累加一次
{
count=0;
second++;
if(second==60)
{second=0;
minute++;
}
if(minute==60)
{minute=0;
hour++;
}
if(hour==24)
hour=0;
}
}
void display()
{
P0=0xff;//消影
wela=1;//位打开
P0=wei[0];//显示第一位
wela=0;//锁存
dula=1;//段打开
P0=duan[hour/10];//段赋值
dula=0;//段锁存
delay(10);
P0=0xff;
wela=1;
P0=wei[1];
wela=0;
dula=1;
P0=duan[hour%10];
dula=0;
delay(10);
P0=0xff;
wela=1;
P0=wei[2];
wela=0;
dula=1;
P0=0x40;
dula=0;
delay(10);
P0=0xff;
wela=1;
P0=wei[3];
wela=0;
dula=1;
P0=duan[minute/10];
dula=0;
delay(10);
P0=0xff;
wela=1;
P0=wei[4];
wela=0;
dula=1;
P0=duan[minute%10];
dula=0;
delay(10);
P0=0xff;
wela=1;
P0=wei[5];
wela=0;
dula=1;
P0=0x40;
dula=0;
delay(10);
P0=0xff;
wela=1;
P0=wei[6];
wela=0;
dula=1;
P0=duan[second/10];
dula=0;
delay(10);
P0=0xff;
wela=1;
P0=wei[7];
wela=0;
dula=1;
P0=duan[second%10];
dula=0;
delay(10);
}
void key_scan()//按键+和-
{
if(key1==0)
{
delay(10);
if(key1==0)
if(hour<23)
hour++;
else
hour=0;
while(!key1);
}
if(key3==0)
{
delay(10);
if(key3==0)
if(minute<59)
minute++;
else
minute=0;
while(!key3);
}
if(key5==0)
{
delay(10);
if(key5==0)
if(second<59)
second++;
else
second=0;
while(!key5);
}
if(key2==0)
{
delay(10);
if(key2==0)
if(hour>0)
hour--;
else
hour=23;
while(!key2);
}
if(key4==0)
{
delay(10);
if(key4==0)
if(minute>0)
minute--;
else
minute=59;
while(!key4);
}
if(key6==0)
{
delay(10);
if(key6==0)
if(second>0)
second--;
else
second=59;
while(!key6);
}
if(key7==0)//复位功能
{
delay(10);
if(key7==0)
{
hour=0;
minute=0;
second=0;
}
while(!key7);
}
}
void zhengdianbaoshi()//整点报时(从50秒开始)
{
if(hour==hour&&minute==59&&second>50)
{BEEP=!BEEP;
}
}
void naozhong()//闹钟七点半,就响30秒
{
if(hour==7&&minute==30&&second<30)
BEEP=!BEEP;
}
void main()//主函数
{
init();
while(1)
{
key_scan();
display();
naozhong();
zhengdianbaoshi();
}
}