基于51单片机,电子显示时钟带闹钟、整点报时、日期、星期
基于51单片机的电子时钟

1、电子闹钟的硬件系统框架:设计出电子闹钟的基本整体框架。
2、电子闹钟的电源设计:采用交直流供电电源。
电子钟一般采用数码管等显示介质,因而必须以交流供电为主,以直流电源为后备辅助电源。
3、电子闹钟的主机电路设计:主要有1)系统时钟电路设计:对时间要求不是很高,只要能使系统可靠起振并稳定运行就行。
2)系统复位电路设计:本系统采用的是RC复位方式3)按键与按钮电路设计:按键与按钮电路设计中关键要考虑的就是按键的去抖动问题。
本系统采用软件去抖。
考虑到对时和设定闹铃时间操作的使用频率不高,为了精简系统和降低成本,本系统只设置两个按键。
a)SET键,对应系统的不同工作状态,具有3个功能:在复位后的待机状态下,用于启动设定时间参数(对时或定闹);在设定时间参数状态而且不是设定最低位(即分个位)的状态下,用于结束当前位的设定,当前设定位下移;在设定最低位(分个位)的状态下,用于结束本次时间设定。
b)+1键,用于对当前设定位进行加1操作。
4)闹铃声光指示电路设计:本系统采用声音指示,关键元件是蜂鸣器。
4、电子闹钟的显示电路设计:设计一个由LED数码管组成的显示电路,显示采用共阳极数码管,其目的是为了简化限流电路的设计和实现亮度可调的要求。
一功能模、设计指标:1. 显示时、分、秒。
2. 可以24小时制或12小时制。
3. 具有校时功能,可以对小时和分单独校时,对分校时的时候,停止分向小时进位。
校时时钟源可以手动输入或借用电路中的时钟。
4. 具有正点报时功能,正点前10秒开始,蜂鸣器1秒响1秒停地响5次。
5. 为了保证计时准确、稳定,由晶体振荡器提供标准时间的基准信号。
二、设计要求:1. 画出总体设计框图,以说明数字钟由哪些相对独立的块组成,标出各个模块之间互相联系,时钟信号传输路径、方向和频率变化。
并以文字对原理作辅助说明。
2. 设计各个功能模块的电路图,加上原理说明。
3. 选择合适的元器件,在面包上接线验证、调试各个功能模块的电路,在接线验证时设计、选择合适的输入信号和输出方式,在充分电路正确性同时,输入信号和输出方式要便于电路的测试和故障排除。
基于51单片机电子闹钟或万年历的课程设计说明书

课程设计基于51单片机电子闹钟或万年历的设计目录目录 (1)1.项目背景 (3)1.1 项目研究的目的和意义 (3)1.2课题研究的容 (3)2.方案的选择和和论证 (4)2.1 单片机型号的选择 (4)2.2 按键的选择 (4)2.3 显示器的选择 (4)2.4 计时部分的选择 (5)2.5 发音部分的设计 (5)2.6电路设计最终方案 (5)3. AT89C52单片机简介 (6)3.1单片机基本特性 (6)3.2单片机部结构图 (6)3.3 单片机I/O引脚结构 (6)3.3.1 P0口 (6)3.3.2 P1口 (7)3.3.3 P2口 (7)3.3.4 P3口 (7)3.4单片机最小系统板 (8)4. 数字电子钟的设计原理和方法 (9)4.1 设计原理 (9)4.2 硬件电路的设计 (9)4.2.1 DS1302时钟芯片 (9)4.2.2 1602 液晶简介 (11)4.2.3 蜂鸣器驱动电路 (12)4.2.4 独立键盘电路 (13)5.软件部分的设计 (14)5.1程序流程图 (14)5.1.1 系统总流程图 (14)5.1.2 DS1302时钟程序流程图 (15)5.1.3 LCD显示程序流程图 (16)5.2程序的设计 (17)5.2.1 DS1302读写程序 (17)5.2.2液晶显示程序 (17)7.心得体会 (20)参考文献 (21)附录一系统原理图 (22)附录二系统程序 (23)1.项目背景1.1 项目研究的目的和意义20世纪末,电子技术获得了飞速的发展,在其推动下,现代电子产品几乎渗透了社会的各个领域,有力地推动了社会生产力的发展和社会信息化程度的提高,同时也使现代电子产品性能进一步提高,产品更新换代的节奏也越来越快。
时间对人们来说总是那么宝贵,工作的忙碌性和繁杂性容易使人忘记当前的时间。
忘记了要做的事情,当事情不是很重要的时候,这种遗忘无伤大雅。
但是,一旦重要事情,一时的耽误可能酿成大祸。
51单片机c语言电子钟(已加入调时、闹铃、整点报时功能)

51单片机c语言电子钟(已加入调时、闹铃、整点报时功能)效果图:程序如下://51单片机c语言电子钟(已加入调时、闹铃、整点报时功能)#include<reg51.h>#include<absacc.h>#define uchar unsigned char#define uint unsigned int/*七段共阴管显示定义*///此表为LED 的字模,共阴数码管0-9 -uchar code dispcode[] ={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40}; //段码控制/*定义并初始化变量*/uchar seconde=0;//秒uchar minite=0;//分uchar hour=12; //时uchar shi=0;//闹铃功能uchar fen=0;uchar bjcs;//报警次数sbit P1_0=P1^0; //second 调整定义sbit P1_1=P1^1; //minite调整定义sbit P1_2=P1^2; //hour调整定义sbit P1_5=P1^5; //整点报时sbit P1_3=P1^3; //闹铃功能,调整时间sbit P1_6=P1^6; //调整时sbit P1_7=P1^7; //调整分sbit P1_4=P1^4; //关闭闹铃/*函数声明*/void delay(uint k ); //延时子程序void time_pro( ); //时间处理子程序void display( ); //显示子程序void keyscan( ); //键盘扫描子程序/*xx子程序*/void delay (uint k){uchar j;while((k--)!=0){for(j=0;j<125;j++){;}}}/*时间处理子程序*/void time_pro(void){if(seconde==60){seconde=0;minite++;if(minite==60){minite=0;hour++;if(hour==24){hour=0;}}}}/*显示子程序*/void display(void){if(P1_3==1){P2=0XFE; P0=dispcode[seconde%10];//秒个位delay(1);P2=0XFD;P0=dispcode[seconde/10];//秒十位delay(1);P2=0XFB;P0=dispcode[10];//间隔符-delay(1);P2=0XF7;P0=dispcode[minite%10];//分个位delay(1);P2=0XEF;P0=dispcode[minite/10];//分十位delay(1);P2=0XDF;P0=dispcode[10];//间隔符-delay(1);P2=0XBF;P0=dispcode[hour%10];//时个位delay(1);P2=0X7F;P0=dispcode[hour/10];//时十位delay(1);}}/*键盘扫描子程序*/void keyscan(void){if(P1_0==0)//秒位的调整{delay (30);if(P1_0==0){seconde++;if(seconde==60){seconde=0;}}delay(250);}if(P1_1==0)//分位的调整{delay(30);if(P1_1==0){minite++;if(minite==60){minite=0;}}delay(250);}if(P1_2==0)//时位的调整{delay(30);if(P1_2==0){hour++;if(hour==24){hour=0;}}delay(250);}}/*整点报警*/void zhengdian (void){if((seconde==0)&(minite==0))//整点报时{P1_5=0;delay(1000);P1_5=1;}}/*定时闹钟*/void dingshi(void){if(P1_3==0)//按住P1_3BU不松,显示闹铃设置界面,分别按P1_6、P1_7设置闹铃时间。
基于c51功能最全的电子钟程序(lcd1602)

功能最全的电子钟【单片机】c51数字时钟(带年月日显示)摘要:本设计以单片机为核心,lcd1602显示。
采用独立键盘输入能任意修改当前时间日期和设定闹钟时间。
具有显示年月日(区分闰年和二月),闹钟报警和整点报时功能主程序:/********************************************************************************************************************************************************************************* ****************************************** lcd1602电子钟********************************************************************************************************************************** *************************************************************************************************** ********************/# include <reg52.h># include "lcd16024.h"sbit key1 = P2^0; //调整sbit key2 = P2^1; //加1sbit key3 = P2^2; //减1sbit speaker = P2^3; //蜂鸣器sbit key4 = P2^4; //闹钟设计bit cal_year = 1; //进入判断闰年标志位bit leap_year; //闰年标志位bit calculate = 0; //日加一标记bit run = 0; //闹钟标志bit beep = 0; //整点报时标志//uint8 num = 0; //调整是给的脉冲uint8 code str1[] = "D: ";uint8 code str2[] = "T: ";uint8 code str3[] = "Wek";uint8 daystr[]="2013-07-29 "; //年月日格式uint8 timestr[]="21:30:59 N"; //时分秒格式uint8 daystr1[]="2013-07-29 "; //闹钟年月日格式uint8 timestr1[]="21:30:59 N"; //闹钟时分秒格式uint8 numweek = 0; //星期加1标记char week = 1; //星期char sec = 53; //秒char min = 50; //分char hour = 23; //时uint8 day = 30; // 日uint8 month = 9; //月uint16 year = 2013; //年char week1 = 1; //闹钟星期char sec1 = 58; //闹钟秒char min1 = 50; //闹钟分char hour1 = 23; //闹钟时uint8 day1 = 30; //闹钟日uint8 month1 = 9; //闹钟月uint16 year1 = 2013; //闹钟年uint8 WeekData1; //闹钟星期标记uint8 number = 0; //定时uint8 WeekData; //星期标记uint8 speaker_num; //整点报时次数uint8 scan_key(void); //函数声名/****************************************************************************** ***************************** 更新LCD时间分离读取******************************************************************************************************************* *******/void TimeChange(){//时分秒timestr[7] = sec%10+'0';timestr[6] = sec/10+'0';timestr[4] = min%10+'0';timestr[3] = min/10+'0';timestr[1] = hour%10+'0';timestr[0] = hour/10+'0';//年月日daystr[9] = day%10+'0';daystr[8] = day/10+'0';daystr[6] = month%10+'0';daystr[5] = month/10+'0';daystr[3] = year%10+'0';daystr[2] = year/10%10+'0';daystr[1] = year/100%10+'0';daystr[0] = year/1000+'0';//星期WeekData = week+'0';}/****************************************************************************** ***************************** 闹钟更新LCD时间分离读取******************************************************************************************************************* *******/void TimeChange1(){//时分秒timestr1[7] = sec1%10+'0';timestr1[6] = sec1/10+'0';timestr1[4] = min1%10+'0';timestr1[3] = min1/10+'0';timestr1[1] = hour1%10+'0';timestr1[0] = hour1/10+'0';//年月日daystr1[9] = day1%10+'0';daystr1[8] = day1/10+'0';daystr1[6] = month1%10+'0';daystr1[5] = month1/10+'0';daystr1[3] = year1%10+'0';daystr1[2] = year1/10%10+'0';daystr1[1] = year1/100%10+'0';daystr1[0] = year1/1000+'0';//星期WeekData1 = week1+'0';}/****************************************************************************** ***************************** 初始化系统定时器0 ******************************************************************************************************************* *******/void systimer0_init(void){TMOD |=0x01;//设置为1时用或(|)TMOD &=0xfd;//设置为0时用与(&)TH0 = 0xDC; // 定时10msTL0 = 0x00;EA = 1;ET0=1;TR0=1;EX0 = 1;}/****************************************************************************** ***************************** 闹钟时间设置*************************************************************************************************************** *******/void naozhong(){uint8 number = 1;uint8 a = 0;uint8 b = 0;if(0 == key4){Delay1Ms(5);if(0 == key4){a = 1;LCD_write_command(0xc0+9);LCD_write_command(0x0f);}while(!key4);}while(a){if(0 == key4){Delay1Ms(5);if(0 == key4){a = 0;run = ~run;while(!key4);}}if(run){timestr[9] = 'Y';}else{timestr[9] = 'N';}if(0 == key1){Delay1Ms(5);if(0 == key1){b = 1;}while(!key1);}while(b){if(0 == key1){Delay1Ms(5);if(0 == key1){number++;if(4 == number)b = 0;}while(!key1);if(number == 1){LCD_write_command(0xc0+9);LCD_write_command(0x0f);}if(number == 2){LCD_write_command(0xc0+6);LCD_write_command(0x0f);}if(number == 3){LCD_write_command(0xc0+3);LCD_write_command(0x0f);}}}switch(number){case 1:if(0 == key2) //闹钟秒加1的设置{Delay1Ms(5);if(0 == key2){sec1++;if(60 == sec1){sec1 = 0;}while(!key2);timestr1[7] = sec1%10+'0';timestr1[6] = sec1/10+'0';LCD_write_char(8,1,timestr1[6]);LCD_write_char(9,1,timestr1[7]);LCD_write_command(0xc0+9);}}if(0 == key3) //闹钟秒减1的设置Delay1Ms(5);if(0 == key3){sec1--;if(sec1 < 0){sec1 = 59;}while(!key3);timestr1[7] = sec1%10+'0';timestr1[6] = sec1/10+'0';LCD_write_char(8,1,timestr1[6]);LCD_write_char(9,1,timestr1[7]);LCD_write_command(0xc0+9);}}break;case 2:if(0 == key2) //闹钟分加1的设置{Delay1Ms(5);if(0 == key2){min1++;if(60 == min1){min1 = 0;}while(!key2);timestr1[4] = min1%10+'0';timestr1[3] = min1/10+'0';;LCD_write_char(5,1,timestr1[3]);LCD_write_char(6,1,timestr1[4]);LCD_write_command(0xc0+6);}}if(0 == key3) //闹钟分减1的设置{Delay1Ms(5);if(0 == key3){min1--;if(min1 < 0){min1 = 59;}while(!key3);timestr1[4] = min1%10+'0';timestr1[3] = min1/10+'0';;LCD_write_char(5,1,timestr1[3]);LCD_write_char(6,1,timestr1[4]);LCD_write_command(0xc0+6);}}break;case 3:if(0 == key2) //闹钟时加1的设置{Delay1Ms(5);if(0 == key2){hour1++;if(24 == hour1){hour1 = 0;}while(!key2);timestr1[1] = hour1%10+'0';timestr1[0] = hour1/10+'0';LCD_write_char(2,1,timestr1[0]);LCD_write_char(3,1,timestr1[1]);LCD_write_command(0xc0+3);}}if(0 == key3) //闹钟时减1的设置{Delay1Ms(5);if(0 == key3){hour1--;if(hour1 < 0){hour1 = 23;}while(!key3);timestr1[1] = hour1%10+'0';timestr1[0] = hour1/10+'0';LCD_write_char(2,1,timestr1[0]);LCD_write_char(3,1,timestr1[1]);LCD_write_command(0xc0+3);}}break;case 4:b = 0;LCD_write_command(0x0c);break;}}}LCD_write_command(0x0c);while(!key4);}/****************************************************************************** ***************************** 判断按键进入时间调整*************************************************************************************************************** *******/uint8 scan_key(void){uint8 number = 1;uint8 a = 0;if(0 == key1){Delay1Ms(5);if(0 == key1){while(!key1);a = 1;LCD_write_command(0xc0+9);LCD_write_command(0x0f);}}while(a){if(0 == key1){Delay1Ms(5);if(0 == key1){number++;while(!key1);TR0 = 0;if(number == 2){LCD_write_command(0xc0+6);LCD_write_command(0x0f);}if(number == 3){LCD_write_command(0xc0+3);LCD_write_command(0x0f);}if(number == 4){LCD_write_command(0x80+11);LCD_write_command(0x0f);}if(number == 5){LCD_write_command(0x80+8);LCD_write_command(0x0f);}if(number == 6){LCD_write_command(0x80+5);LCD_write_command(0x0f);}if(number == 7){LCD_write_command(0xc0+14);LCD_write_command(0x0f);}if(8 == number){LCD_write_command(0x0c);a = 0;number = 0;}}}switch(number){case 1:if(0 == key2) //秒加1的设置{Delay1Ms(5);if(0 == key2){sec++;if(60 == sec){sec = 0;}timestr[7] = sec%10+'0';timestr[6] = sec/10+'0';LCD_write_char(8,1,timestr[6]);LCD_write_char(9,1,timestr[7]);LCD_write_command(0xc0+9);while(!key2);}}if(0 == key3) //秒减1的设置{Delay1Ms(5);if(0 == key3){sec--;if(sec < 0){sec = 59;}timestr[7] = sec%10+'0';timestr[6] = sec/10+'0';LCD_write_char(8,1,timestr[6]);LCD_write_char(9,1,timestr[7]);LCD_write_command(0xc0+9);while(!key3);}}break;case 2:if(0 == key2) //分加1的设置{Delay1Ms(5);if(0 == key2){min++;if(60 == min){min = 0;}timestr[4] = min%10+'0';timestr[3] = min/10+'0';;LCD_write_char(5,1,timestr[3]);LCD_write_char(6,1,timestr[4]);LCD_write_command(0xc0+6);while(!key2);}}if(0 == key3) //分减1的设置{Delay1Ms(5);if(0 == key3){min--;if(min < 0){min = 59;}timestr[4] = min%10+'0';timestr[3] = min/10+'0';LCD_write_char(5,1,timestr[3]);LCD_write_char(6,1,timestr[4]);LCD_write_command(0xc0+6);while(!key3);}}break;case 3:if(0 == key2) //时加1的设置{Delay1Ms(5);if(0 == key2){hour++;while(!key2);if(24 == hour){hour = 0;}timestr[1] = hour%10+'0';timestr[0] = hour/10+'0';LCD_write_char(2,1,timestr[0]);LCD_write_char(3,1,timestr[1]);LCD_write_command(0xc0+3);}}if(0 == key3) //时减1的设置{Delay1Ms(5);if(0 == key3){while(!key3);hour--;if(hour < 0){hour = 23;}timestr[1] = hour%10+'0';timestr[0] = hour/10+'0';LCD_write_char(2,1,timestr[0]);LCD_write_char(3,1,timestr[1]);LCD_write_command(0xc0+3);}}break;case 4:if(0 == key2) //日加1的设置{Delay1Ms(5);if(0 == key2){while(!key2);calculate = 1;if(calculate == 1){if(month==1|month==3|month==5|month==7|month==8|month==10|month==12){day++;if(day > 31){day=1;}}if(month==4|month==6|month==9|month==11){day++;if(day > 30){day=1;}}if(month == 2){cal_year = 1;while(cal_year == 1){leap_year = ((year % 4 == 0 && year % 100 != 0)||(year % 400 == 0));cal_year = 0;}if(leap_year==1){day++;if(day > 30){day=1;}}else{day++;if(day > 29){day=1;}}}calculate = 0;}daystr[9] = day%10+'0';daystr[8] = day/10+'0';LCD_write_char(10,0,daystr[8]);LCD_write_char(11,0,daystr[9]);LCD_write_command(0x80+11);}}if(0 == key3) //日减1的设置{Delay1Ms(5);if(0 == key3){while(!key3);calculate = 1;if(calculate == 1){if(month==1|month==3|month==5|month==7|month==8|month==10|month==12){day--;if(day == 0){day=31;}}if(month==4|month==6|month==9|month==11){day--;if(day == 0){day=30;}}if(month == 2){cal_year = 1;while(cal_year == 1){leap_year = ((year % 4 == 0 && year % 100 != 0)||(year % 400 == 0));cal_year = 0;}if(leap_year==1){day--;if(day == 0){day=30;}}else{day--;if(day == 0){day=29;}}}calculate = 0;}daystr[9] = day%10+'0';daystr[8] = day/10+'0';LCD_write_char(10,0,daystr[8]);LCD_write_char(11,0,daystr[9]);LCD_write_command(0x80+11);}}break;case 5:if(0 == key2) //月加1的设置{Delay1Ms(5);if(0 == key2){while(!key2);month++;if(13 == month){month = 1;}daystr[6] = month%10+'0';daystr[5] = month/10+'0';LCD_write_char(7,0,daystr[5]);LCD_write_char(8,0,daystr[6]);LCD_write_command(0x80+8);}}if(0 == key3) //月减1的设置{Delay1Ms(5);if(0 == key3){while(!key3);month--;if(month == 0){month = 12;}daystr[6] = month%10+'0';daystr[5] = month/10+'0';LCD_write_char(7,0,daystr[5]);LCD_write_char(8,0,daystr[6]);LCD_write_command(0x80+8);}}break;case 6:if(0 == key2) //年加1的设置{Delay1Ms(5);if(0 == key2){while(!key2);year++;}daystr[3] = year%10+'0';daystr[2] = year/10%10+'0';daystr[1] = year/100%10+'0';daystr[0] = year/1000+'0';LCD_write_char(2,0,daystr[0]);LCD_write_char(3,0,daystr[1]);LCD_write_char(4,0,daystr[2]);LCD_write_char(5,0,daystr[3]);LCD_write_command(0x80+5);}if (0 == key3) //年减1的设置{Delay1Ms(5);if(0 == key3){while(!key3);year--;if(year == 0){year = 2020;}daystr[3] = year%10+'0';daystr[2] = year/10%10+'0';daystr[1] = year/100%10+'0';daystr[0] = year/1000+'0';LCD_write_char(2,0,daystr[0]);LCD_write_char(3,0,daystr[1]);LCD_write_char(4,0,daystr[2]);LCD_write_char(5,0,daystr[3]);LCD_write_command(0x80+5);}}break;case 7:if(0 == key2) //星期加1的设置{Delay1Ms(5);if(0 == key2){while(!key2);week++;if(7 == week){week = 0;}LCD_write_char(14,1,week+'0');LCD_write_command(0xc0+14);}}if (0 == key3) //星期减1的设置{Delay1Ms(5);if(0 == key3){while(!key3);week--;if(week < 0){week = 6;}LCD_write_char(14,1,week+'0');LCD_write_command(0xc0+14);}}break;case 8:TR0 = 1;break;}}}/****************************************************************************** ***************************** 主函数******************************************************************************************************************* *******/void main(void){systimer0_init();LCD_init();LCD_write_str(0,0,str1);LCD_write_str(0,1,str2);LCD_write_str(13,0,str3);speaker = 0;while (1){TimeChange();scan_key();naozhong();LCD_write_str(2,0,daystr);LCD_write_str(2,1,timestr);LCD_write_char(14,1,WeekData);if(1 == run){if(sec==sec1 & month==month1 & hour==hour){speaker_num =30;beep = 1;}}else{speaker_num =0;beep = 0;}}}/****************************************************************************** ***************************** 定时中断0 ******************************************************************************************************************* *******/void time_0() interrupt 1{TH0 = 0xDC; // 定时10msTL0 = 0x00;number++;if(number ==100){sec++;if(beep){speaker=!speaker;speaker_num--;if(speaker_num == 0){beep=0;speaker = 0;}}if(sec == 60){sec = 0;min++;if(min == 60){min = 0;hour++; //小时加1speaker_num = hour%12; //蜂鸣器响的次数beep = 1;if(hour == 24){hour = 0;calculate = 1;if(calculate == 1) //判断这个月有多少天{if(month==1|month==3|month==5|month==7|month==8|month==10|month==12){day++;if(month==7|month==12){week++;if(7 == week){week = 0;}}else{if(day <= 31){week++;if(7 == week){week = 0;}}}if(day > 31){if(month==7|month==12){day = 1;}else{day=0;}month++;if(month > 12){month=1;year++;cal_year=1;}}}if(month==4|month==6|month==9|month==11) {day++;week++;if(7 == week){week = 0;}if(day > 30){day=1;month++;if(month > 12){month=1;year++;cal_year=1;}}}if(month == 2){while(cal_year == 1){leap_year = ((year % 4 == 0 && year % 100 != 0)||(year % 400 == 0));cal_year = 0;}if(leap_year==1){day++;if(day <= 30){week++;if(7 == week){week = 0;}}if(day > 30){day=1;month++;if(month > 12){month=1;year++;cal_year=1;}}}else{day++;week++;if(7 == week){week = 0;}if(day > 29){day=1;month++;if(month > 12){month=1;year++;cal_year=1;}}}}}calculate=0;}}}}}////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// Lcd1602.c子程序:////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// /****************************************************************************** ***************************** lcd1602低层函数********************************************************************************************************************* *******/# include <reg52.h># include <intrins.h># include "lcd16024.h"# define LCD_DATA P0 //LCD1602的数据口定义sbit LCD_RS = P0^0; //LCD1602控制线的定义,4位控制方式sbit LCD_RW = P0^1;sbit LCD_EN = P0^2;/****************************************************************************** ***************************** 延时1MS********************************************************************************************************************* *******/void Delay1Us(uint16 n){for(;n>0;n--){_nop_();}}/****************************************************************************** ***************************** 延时1MS********************************************************************************************************************* *******/void Delay1Ms(uint16 n){while(n--){Delay1Us(1000);}}/****************************************************************************** ***************************** 延时1MS********************************************************************************************************************* *******/void LCD_en_write(void){LCD_EN=0;LCD_EN=1;Delay1Us(1);LCD_EN=0;}/****************************************************************************** ************************ LCD写一个字节命令函数************************************************************************************************************ *******/void LCD_write_command(uint8 command){Delay1Us(16);LCD_RS=0;LCD_RW=0;LCD_DATA&=0x0f;LCD_DATA|=command&0xf0;LCD_en_write();command=command<<4;LCD_DATA&=0x0f;LCD_DATA|=command&0xf0;LCD_en_write();}/****************************************************************************** ********************** LCD写一个字节数据函数*************************************************************************************************************** *******/void LCD_write_data(uint8 Data){Delay1Us(16);LCD_RS=1;LCD_RW=0;LCD_DATA&=0x0f;LCD_DATA|=Data&0xf0;LCD_en_write();Data=Data<<4;LCD_DATA&=0x0f;LCD_DATA|=Data&0xf0;LCD_en_write();}/****************************************************************************** ***************************** LCD1602光标定位函数************************************************ x--列0~15;y--行0~1********************************************************************************************************* *******/void LCD_set_xy(uint8 x,uint8 y){uint8 address;if(y==0)address=0x80+x;else address=0xc0+x;LCD_write_command(address);}/***************************************************************************************************** LCD1602 初始化函数,四位显示方式******************************************************************************************************* *******/void LCD_init(){LCD_write_command(0x28);// Delay1Us(40);LCD_write_command(0x28);LCD_write_command(0x0c);LCD_write_command(0x01);LCD_write_command(0x06);Delay1Ms(2);}/****************************************************************************** ***************************** LCD写字符串函数******************************************************* x--列0~15;y--行0~1******************************************************* s指向字符串数组**************************************************************************************************************** *******/void LCD_write_str(uint8 x,uint8 y,uint8 *s){LCD_set_xy(x,y);while(*s){LCD_write_data(*s);s++;}}/****************************************************************************** ***************************** LCD写一个字符函数******************************************************* x--列0~15;y--行0~1******************************************************* d--字符的ASCII码**************************************************************************************************************** *******/void LCD_write_char(uint8 x,uint8 y,uint8 d){LCD_set_xy(x,y);LCD_write_data(d);}/*////////////////////////////////////////////////////////////////// 等待繁忙标志/////////////////////////////////////////////////////////////////void LCD_wait(void){P0 = 0xFF;do{LCD_RS = 0;LCD_RW = 1;LCD_EN = 0;LCD_EN = 1;}while (BUSY == 1);LCD_EN = 0;}*//****************************************************************************** ***************************** LCD1602左移********************************************************************************************************************* *******void LCD_youyi(uint8 y,uint8 *s){LCD_write_str(17,y,s);for(a=0;a<16;a++){LCD_write_command(0x1c); //左移LCD_write_command(0x1c); 为右移Delay1Ms(6);}}*///LCD_write_command(0x0d);//光标闪烁//LCD_write_command(0x0e);//光标显示不闪烁//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// Lcd1602.h头文件////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// #ifndef _LCD16024_H_#define _LCD16024_H_typedef unsigned char uint8;typedef unsigned int uint16;typedef unsigned long uint32;void Delay1Us(uint16 n);void Delay1Ms(uint16 n);void LCD_write_data(uint8 dat);void LCD_write_command(uint8 com); //BuysC为0时忽略忙检测void LCD_set_xy(uint8 x,uint8 y);void LCD_en_write(void);void LCD_write_char(uint8 x, uint8 y, uint8 Data1);void LCD_write_str(uint8 x, uint8 y,uint8 *s);void LCD_init();//void LCD_wait(void);//void LCD_youyi(uint8 y,uint8 *s);#endif。
(完整word版)基于51单片机多功能电子时钟报告

单片机课程设计报告多功能电子数字钟姓名:学号:班级:指导教师:目录一课程设计题目—-—-———--—--—-—--------—-——---—- 3二电路设计--------——-——---—--——---——--————-——--—- 4三程序总体设计思路概述——-------———-——--——5四各模块程序设计及流程图——--—---------——6五程序及程序说明见附录-—-——————-—-—---—-- **六课程设计心得及体会-----————-————--——--—- 11七参考资料—-—-—---—--———-———--————-—-----—----—-—12一题目及要求本次单片机课程设计在Proteus软件仿真平台下实现,完成电路设计连接,编程、调试,仿真出实验结果。
具体要如下:用8051单片机设计扩展6位数码管的静态或动态显示电路,再连接几个按键和一个蜂鸣器报警电路,设计出一个多功能电子钟,实现以下功能: (1)走时(能实现时分秒,年月日的计时)(2)显示(分屏切换显示时分秒和年月日,修改时能定位闪烁显示)(3)校时(能用按键修改和校准时钟)(4)定时报警(能定点报时)本次课程设计要求每个学生使用Proteus仿真软件独立设计制作出电路图、完成程序设计和系统仿真调试,验收时能操作演示.最后验收检查结果,评定成绩分为:(1)完成“走时+显示+秒闪”功能—-——及格(2)完成“校时修改”功能---—中等(3)完成“校时修改位闪"---—良好(4)完成“定点报警”功能,且使用资源少----优秀二电路设计(电路设计图见附件电路图)(1)采用89C51型号单片机(2)采用8位共阴数码管(3)因为单片机输出高电平时输出的电流不足以驱动数码管,所以在P0口与8位数码管之间加74LS373来驱动数码管(4)P2口与数码管选择位直接加74LS138译码器(5)蜂鸣器接P3。
7口。
51单片机c语言电子钟已加入调时闹铃整点报时功能

51 单片机 c 语言电子钟(已加入调时、闹铃、整点报时功能)效果图:程序如下://51 单片机c 语言电子钟(已加入调时、闹铃、整点报时功能)#include<reg51.h>#include<absacc.h>#define uchar unsigned char #define uint unsigned int /* 七段共阴管显示定义*/ // 此表为LED 的字模,共阴数码管0-9 - uchar code dispcode[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40}; // 段码控制/* 定义并初始化变量*/ uchar seconde=0;// 秒uchar minite=0;// 分uchar hour=12; // 时uchar shi=0;// 闹铃功能uchar fen=0;uchar bjcs;// 报警次数sbit P1_0=P1A0; //second 调整定义sbit P1_仁P1A1;//minite 调整定义sbit P1_2二PM2; //hour 调整定义sbitP1_5=P1A5; //整点报时sbit P1_3=P1A3; //闹铃功能,调整时间sbit P1_6=P1A6; //调整时sbit P1_7=P1A7; //调整分sbit P1_4=P1A4; //关闭闹铃/* 函数声明*/void delay(uint k ); // 延时子程序void time_pro( ); // 时间处理子程序void display( ); // 显示子程序void keyscan( ); // 键盘扫描子程序/*xx 子程序*/void delay (uint k){uchar j;while((k--)!=0){for(j=0;j<125;j++){;}}}/* 时间处理子程序*/void time_pro(void){if(seconde==60){seconde=0; minite++;if(minite==60){minite=0;hour++;if(hour==24){hour=0;}}}}/* 显示子程序*/void display(void){if(P1_3==1){P2=0XFE;PO=dispcode[seco nde%10];/秒个位delay(1);P2=0XFD;P0=dispcode[seco nde/10];〃秒十位delay(1);P2=0XFB;P0=dispcode[10];// 间隔符-delay(1);P2=0XF7;P0=dispcode[mi nite%10];〃分个位delay(1);P2=0XEF;P0=dispcode[minite/10];// 分十位delay(1);P2=0XDF;P0二dispcode[10];〃间隔符-delay(1);P2=0XBF;P0=dispcode[hour%10];〃时个位delay(1);P2=0X7F;P0=dispcode[hour/10];// 时十位delay(1);}}/* 键盘扫描子程序*/void keyscan(void){if(P1_0==0)//秒位的调整{delay (30);if(P1_0==0){seconde++;if(seconde==60){seconde=0;}}delay(250);}if(P1_仁=0)//分位的调整{delay(30);if(P1_1==0){minite++;if(minite==60){minite=0;}}delay(250);}if(P1_2==0)// 时位的调整{delay(30);if(P1_2==0){hour++;if(hour==24){hour=0;}}delay(250);}}/* 整点报警*/void zhengdian (void){if((seconde==0)&(minite==0))〃整点报时{P1_5=0;delay(1000);P1_5=1;}}/* 定时闹钟*/void dingshi(void){if(P1_3==0)〃按住P1_3BU不松,显示闹铃设置界面,分别按P1_6、P1_7设置闹铃时间。
基于51单片机的日历时钟显示

SCLK BIT P1.0 ;DS1302时钟口P1.
IO BIT P1.1 ;DS1302数据口P1.1
RST BIT P1.2 ;DS1302片选口P1.2
NOP ;延时等待
NOP
SETB RST ;使能片选
NOP ;延时等待
NOP
CALL DS1302_WriteByte ;写地址
BUSY:
PUSH ACC
CLR RS
SETB RW
TT0: SETB E
MOV A,P0
CLR E
ANL A,#80H
JNZ TT0
DJNZ R4,$
DJNZ R3,D2
RET
EE:
MOV A,@R0
ANL A,#0FH ;先转换低位
MOV @R1,A
INC R1 ;转换高位
MOV A,@R0
ANL A,#0F0H
SWAP A
MOV @R1,A
INC R0
RET
DS1302_WriteData:
CLR RST ;拉低片选
NOP ;延时等待
NOP
CLR SCLK ;时钟线拉低
LCALL BUSY
LCALL WRTC
MOV R5,#0BH
MOV R1,#6AH
LCALL DELAY
LCALL WRTD
MOV A,#0C0H ;显示开及光标设置
MOV A,#01H ;清屏
LCALL BUSY
LCALL WRTC
MOV A,#06H ;显示光标移动设置
LCALL BUSY
基于51单片机多功能数字时钟任务书

第八~九周
第十周
收集资料并对课题做深入的了解,撰写开题报告;
学习单片机AT89S52、时钟芯片DS1302的相关知识;
完成基于AT89S52和DS1302设计的研究总体方案设计;
完成系统软件各模块设计,并且购买元器件;
对电路板进行焊接,仿真和烧写,并进行整体调试;
翻译资料,并撰写毕业设计论文;
修改毕业论文,为毕业论文答辩作准备。
毕业设计任务书
题目
(包括副标题)
电子万年历设计与制作
教师姓名
XXX
职称
XXX
系别
XXX
学生姓名
XXX
学号
XXX
班级
XXX
成果形式
A论文B设计说明书C实物D软件E作品
■□■□□
任务下达时间
2006年11月
1.毕业设计课题任务的内容和要求:
1、毕业设计的主要内容:
1)设计并制作电子万年历
2)完成相关的技术文档和毕业设计论文பைடு நூலகம்
2、毕业设计的主要技术指标
1)显示阳历年、月、日、时、分、秒、星期及阴历年、月、日,能标明是否闰月
2) 用液晶进行显示,用按键进行调整
3) 实现闹铃功能
3、毕业设计的基本要求:
1)完成电子系统的方案设计,技术调试,硬件实现
2.毕业设计工作进度计划:
周 次
工作内容
早进入阶段
第一周
第二周
第三~五周
第六~七周
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
uchar StrTab[32];
char minute=01,hour=13,second=00; //正常时钟秒,分,时定义
char minute1=12,hour1=24; //闹钟时钟秒,分,时定义
delay(1); //显示延时
P0=0xff;
} }
if(a==1)//闹钟调整显示
{ for(i=8;i<16;i++)
{ if(c==8) c=0;
P2=weikong_code[c];
c++;
j=w[i];
P0=tab[j];
delay(1);
P0=0xff;
} }
if(a==2) //日期调整显示
{ if(KEY2==0)
{ delay(10);
if(KEY2==0)
{ hour1++;if(hour1==25)hour1=0; } //闹钟时间小时加1
while(!KEY2)alarm(); }
if(KEY3==0)
{ delay(10);
if(KEY3==0)
{ hour1--;if(hour1==-1)hour1=24; } //闹钟时间小时减
void keycan()
{
if(KEY1==0) //按一次,正常显示,按第二次,时调整,按第三次,分调这整,
{ delay(10); //按键1去抖以及动作
if(KEY1==0) //确认按键是否按下
{flag++;}//切换标志
if(flag==10)
flag=0;
a=0;
if((flag==4)|(flag==5))
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
sbit KEY1=P3^0; //切换键
sbit KEY3=P3^1; //minute ,hour调整加1定义
sbit KEY2=P3^7; //minute ,hour调整减1定义
StrTab[11]=minute1%10; //分十位
StrTab[13]=10; //间隔符-
StrTab[15]=hour1/10; //时个位
StrTab[14]=hour1%10; //时十位
display(StrTab);
}
/***********************显示日期数组子程序***********************/
{
StrTab[25]=10; //闹钟秒个位
StrTab[24]=10; //秒十位9
StrTab[26]=10; //间隔符-
StrTab[28]=week/10; //分个位
StrTab[27]=week%10; //分十位
StrTab[29]=10; //间隔符-
StrTab[31]=10; //时个位
sbit bear=P3^4; //闹铃
uchar a=0; //时间显示和闹钟时间显示切换
code unsigned char tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf,0xc8,0x8e,0xff,0x21}; //段码控制
StrTab[23]=year/1000; //时个位
StrTab[22]=(year/100)%10; //时十位
display(StrTab);
}
/***********************显示星期数组子程序***********************/
void week1() //星期显示
uint year=2014;
char month=12,day=10; //日期年,月,日定义
char week=3,v=1; //星期
char err=3;//误差用很重要、、、、!!
//P0口流水灯
char pp[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f,
while(!KEY3)alarm();
} alarm(); keycan(); }
while(flag==5)
for(y=0;y<110;y++);
}
/*******************蜂鸣器子程序****************************/
void beng()
{
bear=~bear;
delay(10);
bear=1;
}
/**********************显示函数***************************/
while(flag==2)
{if(KEY2==0) //按键去抖以及动作
{ delay(10);
if(KEY2==0)
{ minute++;if(minute==60)minute=0;} //分加1
while(!KEY2)display(StrTab); }
if(KEY3==0)
{ delay(10);
{ for(i=24;i<32;i++)
{ if(c==8) c=0;
P2=weikong_code[c];
c++;
j=w[i];
P0=tab[j];
delay(1);
P0=0xff;
} }
}
/***********************显示时钟数组子程序***********************/
if(KEY3==0)
{minute--;if(minute==-1)minute=59;}
while(!KEY3)display(StrTab);
} display(StrTab);keycan();
}
while(flag==3) //秒表的加1
{ if(KEY3==0)
{ delay(10);
if(KEY3==0)
uchar flag=0; //切换标志
uint count=0; //定时器计数,定时50ms,count满20,秒加1
/**********************延时子程序*****************************/
void delay(uint z)
{ uint x,y;
for(x=0;x<z;x++)
0x7e,0x7d,0x7b,0x77,0x6f,0x5f,0x3f,
0x3e,0x3d,0x3b,0x37,0x2f,0x1f,
0x1e,0x1d,0x1b,0x17,0x0f,
0x0e,0x0d,0x0b,0x07,
0x06,0x05,0x03,
0x02,0x01,
0x00
};
char w=0;
{ for(i=16;i<24;i++) //取w内容显示
{ if(c==8) c=0;//控制位选1
P2=weikong_code[c]; //控制位选2
c++;//控制位选3
j=w[i];//取w内容
P0=tab[j]; //取w内容查表
delay(1);
P0=0xff;
} }
if(a==3) //星期调整显示
void xianshishuzu()
{ StrTab[1]=second/10; //秒十位
StrTab[0]=second%10; //秒个位
StrTab[2]=10; //间隔符-
StrTab[4]=minute/10; //分十位
StrTab[3]=minute%10; //分个位
StrTab[5]=10; //间隔符-
StrTab[30]=10; //时十位
display(StrTab);
}
/***********************日期走程序***********************/
void godata()
{
if((hour==0)&(minute==0)&(second==err))/*****根据晶振误差调整误差((慢了70秒)/24=2.8935)如果改了整点日期判断!!*******************/
void display(uchar w[32])
{ unsigned int i,j,c=0;
if(a==0)//正时间显示
{ for(i=0;i<8;i++) //依次将数组w中八个数取出,并显示
{ P2=weikong_code[i]; //位选
j=w[i]; //取出要显示的数码
P0=tab[j]; //取出段选编码
{if(day==30); //闰年29天
{day=1; month++;
if(month==13)
{month=1; year++;
if(year==10000)
year=0;}}}
else if(day==29)//平年28天
{day=1; month++;
if(month==13)
{month=1; year++;
StrTab[7]=hour/10; //时十位
StrTab[6]=hour%10; //时个位