数字时钟c语言程序

  • 格式:doc
  • 大小:44.50 KB
  • 文档页数:14

本人为单片机初学者,这是本人制作的
一个简单的数字时钟程序,程序比较繁琐,
只适合初学者学习参考使用,因为程序都是
一步步来的,没有跳跃。只要将此程序复制
到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,0x

7f}; //扫描
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>5
0)
{BEEP=!BEEP;

}
}
void naozhong()//闹钟七点半,就响30秒
{
if(hour==7&&minute==30&&second<30)
BEEP=!BEEP;
}

void main()//主函数
{
init();
while(1)
{
key_scan();
display();
naozhong();
zhengdianbaoshi();
}
}