· 1.本设计采用STC89C51/52或AT89C51/52或AT89S51/52单片机做为主控制器; · 2.采用74HC573驱动数码管显示; · 3.功能:六位数码管显示时分秒,整点半点报时,夜间只有灯光提醒 · 4.采用二十四小时制 · 5.到整点时长鸣1次,LED闪烁10次 · 6.到半点时短促鸣响1次,LED闪烁5次
使用方法: 三个按键一个是小时加,一个是分加,一个是秒清零。 开机数码管显示12.30.00是12点30分0秒的意思。
制作出来的实物图如下:
- /************************************************************
- 作品名字:简易声光报时时钟
- 功能:六位数码管显示时分秒,整点半点报时 ,夜间只有灯光提醒
- 二十四小时制
- 到整点时长鸣1次,LED闪烁10次
- 到半点时短促鸣响1次,LED闪烁5次
- 制作说明:P0接数码管段选,P2低6位接数码管位
-
- **************************************************************/
- #include<reg52.h> //头文件
- #define uc unsigned char //宏定义
- #define ui unsigned int //宏定义
- sbit LED=P3^3;//定义LED
- sbit key1=P3^4;//定义调小时
- sbit key2=P3^5;//定义调分钟
- sbit key3=P3^6;//定义秒清零
- sbit beep=P3^7;//设蜂鸣器
- uc min,hour,sec,led,num; //无符号字符型变量
- bit bdata hourLED,halfLED,hourbeep,halfbeep; //位变量
- uc code tab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};/*0,1,2,3,4,5,6,7,8,9,.*///共阴极编码
- void delay(ui x)//1ms延时函数
- {
- ui i,j;
- for(i=0;i<x;i++)
- for(j=0;j<121;j++);
- }
- void display()//扫描显示函数,高位到低位
- {
- P0=tab[hour/10];//给小时的十位送形
- P2=0xdf;//11011111 //位选
- delay(1); //延时动态扫描
- P2=0xff; //关闭位选
- P0=(tab[hour%10])|0x80;//给第二位后加“点
- P2=0xef;//11101111
- delay(1);
- P2=0xff;
- P0=tab[min/10];
- P2=0xf7;//11110111
- delay(1);
- P2=0xff;
- P0=(tab[min%10])|0x80;//给第四位后加“点”
- P2=0xfb;//11111011
- delay(1);
- P2=0xff;
- P0=tab[sec/10];
- P2=0xfd;//11111101
- delay(1);
- P2=0xff;
- P0=tab[sec%10];
- P2=0xfe;//11111110
- delay(1);
- P2=0xff;
- }
- void keyscan()//键盘扫描,开关接地
- {
- if(key1==0) //如果小时加按键按下
- {
- delay(5); //延时去抖
- if(key1==0) //确定是否按键
- {
- hour++; //小时加一
- if(hour==24) //如果小时等于24
- hour=0; //小时归零
- }
- while(!key1) display();//判断是否松开
- }
- if(key2==0) //如果分钟加按键按下
- {
- delay(5); //延时去抖
- if(key2==0) //确定是否按键
- {
- min++; //分钟加一
- if(min==60)// 如果分钟等于60
- min=0; //分钟归零
- }
- while(!key2) display();//判断是否松开
- }
- if(key3==0)//判断调整秒按键
- {
- delay(5); //延时去抖
- if(key3==0) //确定是否按键
- {sec=0;} //秒清零
- while(!key3) display();//判断是否松开
- }
- }
- void strike()//报时函数
- {
- if((hour>6)&&(hour<22))//判断大于6点并且小于22点
- {
- if(sec==0)//以下判断是否整点
- {
- if(min==0)//如果秒和分都等于0
- {
- hourbeep=1; //那么蜂鸣器和小灯位开启
- hourLED=1;
- }
- else if(min==30)//如果分钟等于30
- {
- if(num<10) //闪5下响一声
- halfbeep=1;
- halfLED=1;
- }
- }
- }
- else //小于6点和大于22点的时候
- {
- if(sec==0)//以下判断是否整点
- {
- if(min==0)//如果分钟等于0
- hourLED=1; //led位开
- else if(min==30)//如果分钟=0
- halfLED=1;//进行半点报时
- }
- }
- }
- void init()//初始化函数
- {
- sec=0;//一通电,显示12:30:00,蜂鸣器响一下
- min=30;
- hour=12;
- TMOD=0x01;//设置定时器为定时器0工作方式为1
- TH0=(65536-50000)/256; //赋初值
- TL0=(65536-50000)%256; //赋初值
- EA=1; //开总中断
- ET0=1; //开定时器0中断
- TR0=1; //启动定时器0
- }
- void main()//主函数
- {
- init();//初始化
- while(1) //主循环
- {
- display(); //显示
- keyscan();//扫描是否有键按下
- strike();//报时函数
- }
- }
- void time0() interrupt 1 //定时器中断
- {
- TH0=(65536-50000)/256;//重赋初值
- TL0=(65536-50000)%256;//重赋初值
- num++;
- if((num%10==0)&&(hourLED==1)) //整点报时
- {
- led++;
- LED=~LED;//取反实现闪烁
- if(led==20) //闪10次
- {
- led=0; //之后关闭闪烁
- LED=1;
- hourLED=0;
- }
- }
- else if((num%10==0)&&(halfLED==1))//半点报时
- {
- led++;
- LED=~LED; //取反实现闪烁
- if(led==10)//闪5次
- {
- led=0; //关闭闪烁
- LED=1;
- halfLED=0;
- }
- }
- if(hourbeep==1) //蜂鸣器响标志位
- {
- if(num==1)
- beep=0;
- if(num==20) //长响次之后
- {
- beep=1; //关闭
- hourbeep=0;
- }
- }
- else if(halfbeep==1) //蜂鸣器响标志位
- {
- if(num<10)
- beep=0;
- if(num==10) //短响之后
- {
- beep=1; //关闭
- halfbeep=0;
- }
- }
- if(num==20) //计时20次为1s时间
- {
- num=0;
- sec++; //秒加一
- if(sec==60)//如果秒等于60
- {
- sec=0; //秒归零
- min++; //分钟加一
- if(min==60)//如果分钟等于60
- {
- min=0; //分钟归零
- hour++; //小时加一
- if(hour==24) //如果小时等于24
- {hour=0;}//小时归零
- }
- }
- }
- }
复制代码
全部资料51hei下载地址:
时分秒时钟.7z
(8.5 MB, 下载次数: 23)
|