一、任务
设计制作一个24小时制多功能数字钟。示意图如下(仅供参考):
二、要求
1.基本要求
(1)具有时间设置(小时和分钟)、闹钟时间设置、闹钟开、闹钟关功能。
(2)数字显示小时、分钟,有AM、PM指示器,闹钟就绪灯,蜂鸣器。
(3)220V供电。
这是我帮别人做的一个比赛。因为只用了一个下午,所以就只实现了基本要求的1和2;
电路图 单片机.DSN.txt 这是用proteus画的。
源程序如下:
自己写的一个头文件“sbit.h”
- sbit RS = P0^0;
- sbit RW = P0^1;
- sbit E = P0^2;
- sbit AM_led = P3^0;
- sbit PM_led = P3^1;
- sbit CLOCK_led = P3^2;
- sbit BUZZER = P3^7;
- sbit set_time = P1^0;
- sbit set_clock = P1^1;
- sbit set_hour = P1^2;
- sbit set_min = P1^3;
- sbit on_clock = P1^4;
- sbit off_clock = P1^5;
主程序如下:
- #include<reg51.h>
- #include <intrins.h>
- #include "sbit.h"
- #define uchar unsigned char
- uchar flag_hour = 0; //0表示AM,1表示PM
- uchar flag_clock = 1; //0表示开闹钟,1表示关
- uchar hour[] = "00"; //时钟小时
- uchar min[] = "00"; //时钟分钟
- uchar clock_hour[] = "00"; // 闹钟小时
- uchar clock_min[] = "00"; //闹钟分钟
- int num; //计时
- /*******************************************************************/
- /* */
- /* 延时子程序,延时ms毫秒 */
- /* */
- /*******************************************************************/
- void delay(int ms)
- {
- int i,j;
- for(i = 0; i < ms; i++)
- for(j = 0; j < 110; j++);
- }
- /*******************************************************************/
- /* */
- /*写指令数据到LCD */
- /*RS=L,RW=L,E=高脉冲,D0-D7=指令码。 */
- /* */
- /*******************************************************************/
- void write_com(uchar com)
- {
- RS = 0;
- P2 = com;
- delay(5);
- E = 1;
- delay(5);
- E = 0;
- }
- /*******************************************************************/
- /* */
- /*写显示数据到LCD */
- /*RS=H,RW=L,E=高脉冲,D0-D7=数据。 */
- /* */
- /*******************************************************************/
- void write_data(uchar date)
- {
- RS = 1;
- P2=date;
- delay(5);
- E = 1;
- delay(5);
- E = 0;
- }
- /*******************************************************************/
- /* */
- /* LCD初始化设定 */
- /* */
- /*******************************************************************/
- void lcd_init()
- {
- E = 0;
- RW = 0;
- write_com(0x38); //16*2显示,5*7点阵,8位数据
- delay(5);
- write_com(0x0c); //显示开,关光标
- delay(5);
- write_com(0x06); //写一个字符后地址指针加1
- delay(5);
- write_com(0x01); //清除LCD的显示内容
- delay(5);
- }
- /*******************************************************************/
- /* */
- /* LCD显示 */
- /* */
- /*******************************************************************/
- void display(char *h, char *m)
- {
- write_com(0x80);
- write_data(h[0]);
- delay(5);
- write_data(h[1]);
- delay(5);
- write_data(':');
- delay(5);
- write_data(m[0]);
- delay(5);
- write_data(m[1]);
- delay(5);
- }
- /*******************************************************************/
- /* */
- /* 按键初始化设定 */
- /* */
- /*******************************************************************/
- key_init()
- {
- set_time = 1;
- set_clock = 1;
- set_hour = 1;
- set_min = 1;
- on_clock = 1;
- off_clock = 1;
- }
- /*******************************************************************/
- /* */
- /* 初始化T0定时器 */
- /* */
- /*******************************************************************/
- void T0_init()
- {
- TMOD = 0x01; //设置定时器0工作方式为1
- TH0 = (65536 - 46080)/256; //定时50ms
- TL0 = (65536 - 46080)%256;
- EA = 1; //开总中断
- ET0 = 1; //开定时器0中断
- }
- /*******************************************************************/
- /* */
- /* 初始化设定 */
- /* */
- /*******************************************************************/
- void init()
- {
- AM_led = 0;
- PM_led = 1;
- CLOCK_led = 1;
- BUZZER = 1;
- lcd_init(); //初始化液晶
- key_init(); //初始化按键
- T0_init();
- }
- /*******************************************************************/
- /* */
- /* 时间设定 */
- /* */
- /*******************************************************************/
- void SET_time()
- {
- while(1)
- {
- if(set_hour == 0) //设置小时
- {
- delay(10);
- if(set_hour == 0)
- {
- hour[1] ++;
- if(hour[0] == '1'&& hour[1] == '2' )
- {
- hour[0] = hour[1] = '0';
- AM_led = ~AM_led;
- PM_led = ~PM_led;
- }
- if(hour[0] == '0'&&hour[1] > '9')
- { hour[0] = '1';
- hour[1] = '0';
- }
- display(hour,min);
- while(!set_hour);
- }
- }
- if(set_min == 0) //设置分钟
- {
- delay(10);
- if(set_min == 0)
- {
- min[1]++;
- if(min[0] == '5' && min[1] > '9')
- min[0] = min[1] = '0';
- if(min[0] < '5' && min[1] > '9')
- {min[0]++; min[1] = '0';}
- display(hour,min);
- while(!set_min);
- }
- }
-
- if(set_time == 0)
- {
- delay(10);
- if(set_time == 0)
- {
- T0_init();
- TR0 = ~TR0;
- break;
- }
- }
-
- }
- }
- /*******************************************************************/
- /* */
- /* 闹钟设定 */
- /* */
- /*******************************************************************/
- void SET_clock()
- {
- while(1)
- {
- if(set_hour == 0) //设置小时
- {
- delay(10);
- if(set_hour == 0)
- {
- clock_hour[1] ++;
- if(clock_hour[0] == '1'&& clock_hour[1] == '2' )
- clock_hour[0] = clock_hour[1] = '0';
- if(clock_hour[0] == '0'&&clock_hour[1] > '9')
- { clock_hour[0] = '1';
- clock_hour[1] = '0';
- }
- display(clock_hour,clock_min);
- while(!set_hour);
- }
- }
- if(set_min == 0) //设置分钟
- {
- delay(10);
- if(set_min == 0)
- {
- clock_min[1]++;
- if(clock_min[0] == '5' && clock_min[1] > '9')
- clock_min[0] = clock_min[1] = '0';
- if(clock_min[0] < '5' && clock_min[1] > '9')
- {clock_min[0]++; clock_min[1] = '0';}
- display(clock_hour,clock_min);
- while(!set_min);
- }
- }
-
- if(set_time == 0)
- {
- delay(10);
- if(set_time == 0)
- {
- display(hour,min);
- break;
- }
- }
-
- }
- }
- /*******************************************************************/
- /* */
- /* 主程序 */
- /* */
- /*******************************************************************/
- void main()
- {
- init();
- TR0 = 0;
- while(1)
- {
- display(hour,min);
-
- if (flag_clock == 0) //查看是否到达闹钟时间
- {
- if(hour[0] == clock_hour[0] && hour[1] == clock_hour[1] && min[0] == clock_min[0] && min[1] == clock_min[1] )
- {
- BUZZER = 1; //蜂鸣器响
- delay(10);
- BUZZER = 0;
- }
- else
- BUZZER = 1;
- }
- else
- BUZZER = 1;
-
- if(on_clock == 0) //开闹钟
- {
- delay(10);
- if(on_clock == 0)
- {
- flag_clock=0; //开闹钟
- CLOCK_led = 0;
- }
- }
- if(off_clock == 0) //关闹钟
- {
- delay(10);
- if(off_clock == 0)
- {
- flag_clock = 1; //关闹钟
- CLOCK_led = 1;
- }
- }
- if(set_time == 0) //设置时间
- {
- delay(10);
- if(set_time == 0)
- {
- TR0 = ~TR0;
- while(!set_time);
- }
- }
- if(TR0 == 0)
- {
- SET_time();
- }
- if(set_clock == 0) //设置闹钟
- {
- delay(10);
- if(set_clock == 0)
- {
- display(clock_hour,clock_min); //显示闹钟时间
- SET_clock();
- while(!set_clock);
- }
- }
- }
- }
- /*******************************************************************/
- /* */
- /* 中断处理子程序 */
- /* */
- /*******************************************************************/
- void T0_timer() interrupt 1
- {
- TH0 = (65536 - 46080)/256; //定时50ms
- TL0 = (65536 - 46080)%256;
- num ++;
-
- if(num == 1200) //1分钟
- {
- num = 0;
- min[1]++;
- if(min[1] > '9')
- {
- min[1] = '0';
- min[0] ++;
- if (min[0] == '6')
- {
- min[0] = '0';
- hour[1]++;
- if(hour[0] == '1'&& hour[1] == '2' )
- {
- hour[0] = hour[1] = '0';
- AM_led = ~AM_led;
- PM_led = ~PM_led;
- }
- if(hour[0] == '0'&&hour[1] > '9')
- { hour[0] = '1';
- hour[1] = '0';
- }
- }
- }
- }
- }
阅读(1893) | 评论(0) | 转发(0) |