可调电子时钟程序
- 格式:doc
- 大小:43.00 KB
- 文档页数:13
长沙民政职业技术学院《C51程序设计》课程设计报告书题目: ds1302可调液晶显示时钟班级:自动化0935学号: 0931903352姓名:刘飞成绩:课程设计报告格式一、绪言(一)设计任务(简要说明设计题目的目的、意义、内容等)(二)提出方案及方案论证(这两个部分可分开也可合并,主要是就自己的课程设计题目提出一个或几个解决方案,并就不同的方案加以论证,从中精选出最佳的一个方案)(三)原理说明:根据方案论证的结果,简述设计原理,最好能给出较为明了的框图来说明整个设计思路。
二、系统设计(一)电路设计(二)程序流程图(三)C51程序设计,重要的代码要有注释。
三、仿真验证(一)系统仿真调试步骤及方法,写程序或设计电路时,不可避免的会出现这样或那样的错误,这部分主要简述一下自己在整个设计过程中采用的仿真调试步骤及方法,重点阐述对出现的问题的解决方法;四、总结书写格式:1、一级标题为宋体,三号,加粗;二级标题为宋体,小三,加粗;报告正文内容为宋体,小四;1.5倍行间距;一. 绪言1.在信息显示技术中,人们发现了信息数字化的重要作用和意义。
数字化的信息更加准确,同一性,更易传输和识别。
很多信息可以直接由数字表示,从而数字化信息显示又成为信息显示的又一个重要内容。
又从数字化显示发展到字符显示,它把人类特有的语言文字用于显示,这种显示与数字显示合在一起用途更广用量更大。
在这同时,人们还希望用图形和图像进行显示,且显示的内容为五彩缤纷,并且可以实时活动和具有三维立体效果。
这些在二十世纪尾声时都已经陆续实现。
LCD 的计算机器,半导体发光数码管显示(LED )的汽车计价器,商场的大屏幕广告。
这零零总总的各类显示正为你做着各种各样的服务,相信在不久的将来显示技术的发展将会为人类做出更大的贡献。
Ds1302时钟芯片现在流行的串行时钟电路很多,如DS1302、 DS1307、PCF8485等。
这些电路的接口简单、价格低廉、使用方便,被广泛地采用。
单片机电子闹钟程序(亲自编写-可用)————————————————————————————————作者:————————————————————————————————日期:学校电子钟,有闹钟功能,按键可调时间,可调打铃时间,打铃时间长短显示,每个模块有功能注释。
其中正常时间显示和闹钟时间显示可用一个开关来调整。
芯片选择STC89C52程序:#include<reg51.h>#include<intrins.h>#define uchar unsigned char#define uint unsigned int//定义显示段码uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00};uchar codebbtime[]={0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; uchar clock[]={0,0,0,0};uchar clock1[]={12,30,0};uchar weikong[6];uchar bbduration=4;uchar lingtime=9;//学校打铃时间组uchar shangwu1[]={8,30};uchar shangwu2[]={10,0};uchar shangwu3[]={10,20};uchar shangwu4[]={11,50};uchar xiawu1[]={13,30};uchar xiawu2[]={15,00};uchar xiawu3[]={15,15};uchar xiawu4[]={16,45};//按键定义sbit mode=P1^7;sbit sec_clr=P1^0;sbit min_set_add=P1^3;sbit min_set_sub=P1^4;sbit hour_set_add=P1^1;sbit hour_set_sub=P1^2;sbit bb_set_add=P1^5;sbit bb_set_sub=P1^6;sbit speaker=P2^6;//延时函数void delay(unsigned int t){while(t--);//时钟进位函数void clockjinwei(){clock[0]++;if(clock[0]==20){clock[1]++;clock[0]=0;if(clock[1]==60){clock[2]++;clock[1]=0;if(clock[2]==60){clock[3]++;clock[2]=0;if(clock[3]==24)clock[3]=0;}}}}//定时器0中断服务函数void timer0(void) interrupt 1 using 1 {TMOD=0x01;TH0=0x3c;TL0=0xb0;clockjinwei();}//时钟分位显示函数void fenwei(){weikong[0]=clock[3]/10;weikong[1]=clock[3]%10;weikong[2]=clock[2]/10;weikong[3]=clock[2]%10;weikong[4]=clock[1]/10;weikong[5]=clock[1]%10;}//闹钟分位显示函数void naofen(){weikong[0]=clock1[0]/10;weikong[1]=clock1[0]%10;weikong[2]=clock1[1]/10;weikong[3]=clock1[1]%10;weikong[4]=clock1[2]/10;weikong[5]=clock1[2]%10; }//闹钟定时显示函数void naozhongdisplay(){uchar z,s;uchar x=0x01;naofen();for(z=0;z<6;z++){P2=0;P0=table[weikong[z]];P2=x;x=_crol_(x,1);for(s=0;s<255;s++);}}//时钟显示函数void display(){uchar i,j;uchar x=0x01;fenwei();for(i=0;i<6;i++){P2=0;P0=table[weikong[i]];P2=x;x=_crol_(x,1);for(j=0;j<255;j++);}}//总显示函数void zhongxian(){if(mode==1)delay(100);if(mode==1)display();if(mode==0)delay(100);if(mode==0)naozhongdisplay();}//按键处理程序void key_set(){zhongxian();P1=0xff;if(min_set_add==0){delay(100);if(min_set_add==0){if(mode==1){clock[2]++;if(clock[2]==60){clock[2]=0;}while(min_set_add==0)zhongxian();}}if(mode==0){clock1[1]++;if(clock1[1]==60){clock1[1]=0;}while(min_set_add==0)zhongxian();}}//if(min_set_sub==0){delay(100);if(min_set_sub==0){if(mode==1){clock[2]--;if(clock[2]==0)clock[2]=59;}while(min_set_sub==0)zhongxian();if(mode==0){clock1[1]--;if(clock1[1]==0)clock1[1]=59;}while(min_set_sub==0)zhongxian();}}//if(hour_set_add==0){delay(100);if(hour_set_add==0){if(mode==1){clock[3]++;if(clock[3]==24){clock[3]=0;}while(hour_set_add==0)zhongxian();}if(mode==0){clock1[0]++;if(clock1[0]==24){clock1[0]=0;}while(hour_set_add==0)zhongxian();}}}//if(hour_set_sub==0){delay(100);if(hour_set_sub==0){if(mode==1){clock[3]--;if(clock[3]==0)clock[3]=23;}while(hour_set_sub==0)zhongxian();if(mode==0){clock1[0]--;if(clock1[0]==0)clock1[0]=23;}while(hour_set_sub==0)zhongxian();}}//if(sec_clr==0){delay(100);if(sec_clr==0){clock[1]=0;}while(sec_clr==0)zhongxian();}}//闹钟响铃函数void bb(){if(clock[1]<=bbduration){speaker=1;delay(100);speaker=0;}else speaker=0;}//打铃函数void daling(){if(clock[1]<=lingtime){speaker=1;delay(100);speaker=0;}else speaker=0;}//时间比较函数void bijiao(){if(clock[3]==shangwu1[0]){if(clock[2]==shangwu1[1])daling();}if(clock[3]==shangwu2[0]){if(clock[2]==shangwu2[1])daling();}if(clock[3]==shangwu3[0]){if(clock[2]==shangwu3[1])daling();}if(clock[3]==shangwu4[0]){if(clock[2]==shangwu4[1])daling();}if(clock[3]==xiawu1[0]){if(clock[2]==xiawu1[1])daling();}if(clock[3]==xiawu2[0]){if(clock[2]==xiawu2[1])daling();}if(clock[3]==xiawu3[0]){if(clock[2]==xiawu3[1])daling();}if(clock[3]==xiawu4[0]){if(clock[2]==xiawu4[1])daling();}}//闹钟比较void naobijiao(){if(clock[3]==clock1[0]){if(clock[2]==clock1[1]||clock[2]==clock1[1]+1||clock[2]==clock1[1]+2) bb();}}//响铃时长显示函数void bbtimeshow(){P3=bbtime[bbduration];if(bbduration>15)bbduration=0;}//响铃按键处理函数void bbtime_set(){bbtimeshow();if(bb_set_add==0){delay(100);if(bb_set_add==0)bbduration++;while(bb_set_add==0)bbtimeshow();}if(bb_set_sub==0){delay(100);if(bb_set_sub==0)bbduration--;while(bb_set_sub==0)bbtimeshow();}}//主程序void main(){EA=1;ET0=1;TR0=1;while(1){key_set();bijiao();bbtime_set();naobijiao();}}电路图:分四部分显示:如果在学习这个程序过程中有什么问题,可以发邮件到询问。
/*-----------------------------------------------名称:DS1302时钟数码管显示论坛:编写:shifang日期:2009.5修改:无内容:DS1302实时时钟数码管显示,只显示时间。
并通过4个按键加减小时、分钟,其他参数调节自行添加------------------------------------------------*/#include "ds1302.h"#include "18b20.h"#include "delay.h"#include "1602.h"sbit key0=P3^0;sbit key1=P3^1;sbit key2=P3^2;sbit key3=P3^3;#define KeyPort P1 //定义按键端口#define DataPort P0 //定义数据端口程序中遇到DataPort 则用P0 替换//sbit c_select=P1^4;//调整键sbit c_up=P1^5;//sbit c_down=P1^6;//调下unsigned char ReadTimeFlag;//定义读时间标志unsigned char key00,pos,set;unsigned char flag;//显示模式标志位unsigned char num;unsigned int TempH,TempL,temp;//读取温度的临时变量unsigned int timer1;unsigned char position=0;unsigned char add=1;unsigned char TimeData[8]={1,1,1,1,1,1,1}; //存储显示时间(时分秒)的全局变量unsigned char DateData[8]; //存储显示时间(年月日)的全局变量unsigned char TempData[8]={0x30,0x30,'.',0x30,0x30,0xdf,'C'}; //存储显示温度的全局变量unsigned char pos1Data[3]={5,8,11};unsigned char pos2Data[3]={8,11,14};unsigned char MaxData[6]={100,13,32,24,60,60};void Display(unsigned char FirstBit,unsigned char Num);//数码管显示函数void keyadd (uchar,uchar);//加一void keydec (uchar,uchar);//减一unsigned char KeyScan(void);//键盘扫描void Init_Timer0(void);//定时器初始化void int0_init();//中断0初始化void int1_init();//int1初始化void time_change();/*------------------------------------------------主函数------------------------------------------------*/void main (void){flag=0;key00=0;add=1;pos=0;timer1=200;LcdReset();DelayMs(2000);Ds1302_Write_Time();Ds1302_Init();//Ds1302_Write_Time();if(Init_DS18B20()){ePutstr(9,1,"ERROR");}ePutstr(3,0,"20");ePutstr(0,1,TempData);ReadTimeFlag=0;temp=0;Init_Timer0();//int0_init();//中断初始化//int1_init();while (1) //主循环{if (key00==0){key0=1;if(!key0){ //按下相应的按键,数码管显示相应的码值DelayMs(20);if(!key0){key00=1;set=0;while (key0==0);}}Ds1302_Read_Time();DateData[0]=time_buf1[0]/10+0x30; //时DateData[1]=time_buf1[0]%10+0x30;DateData[2]='-'; //加入"-"DateData[3]=time_buf1[1]/10+0x30; //分DateData[4]=time_buf1[1]%10+0x30;DateData[5]='-';DateData[6]=time_buf1[2]/10+0x30; //秒DateData[7]=time_buf1[2]%10+0x30;TimeData[0]=time_buf1[3]/10+0x30; //时TimeData[1]=time_buf1[3]%10+0x30;TimeData[2]=':'; //加入"-"TimeData[3]=time_buf1[4]/10+0x30; //分TimeData[4]=time_buf1[4]%10+0x30;TimeData[5]=':';TimeData[6]=time_buf1[5]/10+0x30; //秒TimeData[7]=time_buf1[5]%10+0x30;if(ReadTimeFlag==1){ReadTimeFlag=0;temp=ReadTemperature();if(temp>6000) temp=0;TempData[0]=(temp/1000)+0x30;TempData[1]=(temp%1000)/100+0x30;TempData[2]='.';TempData[3]=(temp%100)/10+0x30;TempData[4]=temp%10+0x30;TempData[5]=0xdf;TempData[6]='C';}ePutstr(5,0,DateData);ePutstr(8,1,TimeData);ePutstr(0,1,TempData);}if (key00==1){key0=1;if(!key0){ //按下相应的按键,数码管显示相应的码值DelayMs(20);if(!key0){key00=0;pos=0;while (key0==0);}}key1=1;if(!key1){ //按下相应的按键,数码管显示相应的码值DelayMs(20);if(!key1){pos=pos+1;if(pos==6){pos=0;}while (key1==0);}}if(set==0){timer1--;DateData[0]=time_buf1[0]/10+0x30; //时DateData[1]=time_buf1[0]%10+0x30;DateData[2]='-'; //加入"-"DateData[3]=time_buf1[1]/10+0x30; //分DateData[4]=time_buf1[1]%10+0x30;DateData[5]='-';DateData[6]=time_buf1[2]/10+0x30; //秒DateData[7]=time_buf1[2]%10+0x30;TimeData[0]=time_buf1[3]/10+0x30; //时TimeData[1]=time_buf1[3]%10+0x30;TimeData[2]=':'; //加入"-"TimeData[3]=time_buf1[4]/10+0x30; //分TimeData[4]=time_buf1[4]%10+0x30;TimeData[5]=':';TimeData[6]=time_buf1[5]/10+0x30; //秒TimeData[7]=time_buf1[5]%10+0x30;ePutstr(5,0,DateData);ePutstr(8,1,TimeData);if (timer1==0){set=1;timer1=300;}}if(set==1){if(pos<3){ePutstr(pos1Data[pos],0," ");timer1--;}else{ePutstr(pos2Data[pos-3],1," ");timer1--;}if (timer1==0){set=0;timer1=300;}}key2=1;if(!key2){ //按下相应的按键,数码管显示相应的码值DelayMs(20);if(!key2){time_buf1[pos]=time_buf1[pos]+1;if (MaxData[pos]==time_buf1[pos]) time_buf1[pos]=0;time_buf[pos]=time_buf1[pos];Ds1302_Write_Time();while (key2==0);}}key3=1;if(!key3){ //按下相应的按键,数码管显示相应的码值DelayMs(20);if(!key3){if (time_buf1[pos]==0) time_buf1[pos]=MaxData[pos]-1;else time_buf1[pos]=time_buf1[pos]-1;time_buf[pos]=time_buf1[pos];Ds1302_Write_Time();while (key3==0);}}/*if(ReadTimeFlag==1){ReadTimeFlag=0;temp=ReadTemperature();if(temp>6000) temp=0;TempData[0]=(temp/1000)+0x30;TempData[1]=(temp%1000)/100+0x30;TempData[2]='.';TempData[3]=(temp%100)/10+0x30;TempData[4]=temp%10+0x30;TempData[5]=0xdf;TempData[6]='C';ePutstr(0,1,TempData);} */}}}/******************时间调整函数***************************//*********************************************/void int0_init()//int0初始化{IT0=1;EX0=1;EA=1;}/*********************************************/void int1_init()//int1初始化{IT1=1;EX1=1;EA=1;}/*------------------------------------------------显示函数,用于动态扫描数码管输入参数FirstBit 表示需要显示的第一位,如赋值2表示从第三个数码管开始显示如输入0表示从第一个显示。
ORG 0000HAJMP MAINORG 001BHLJMP SERVEMAIN:mov p1,#0ffhMOV TMOD,#10H ;设置中断MOV 20H,#14HCLR AMOV 30H,AMOV 31H,AMOV 32H,ASETB ET1SETB EAMOV TH1,#3CHMOV TL1,#0B0HSETB TR1LCALL XIANSHI: LCALL JIANPAN ;调用键盘ACALL XIAN ;调用显示SJMP SHI;显示程序XIAN: MOV P0,#0FFH ;显示初始化MOV P2,#0FFHMOV R0,#30HMOV R1,#33HHUAN: MOV A,@R0 ;缓存程序SW AP AANL A,#0FHMOV @R1,AINC R1MOV A,@R0ANL A,#0FHMOV @R1,AINC R0INC R1CJNE R0,#33H,HUANMOV R0,#33HMOV A,#0dFHL1: MOV P2,A ;显示程序MOV DPTR,#TABMOV A,@R0MOVC A,@A+DPTRACALL DIANMOV P0,AMOV A,P2RR AINC R0MOV R1,#0FfHDJNZ R1,$MOV R1,#0FFHDJNZ R1,$MOV R1,#0FFHDJNZ R1,$MOV R1,#0FFHDJNZ R1,$MOV P0,#0FFHMOV P2,#0FFHCJNE R0,#39H, L1mov r0,#00hRETDIAN: CJNE R0,#34H,L2 ;打点CLR ACC.7L2: CJNE R0,#36H,L3CLR ACC.7L3: RETTAB:DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,88h,83h,0c6h,0a1h,86h,8eh;键盘程序JIANPAN:LCALL KEY ;调用查询程序,对按键状态查询JNZ K1LCALL DELAYLJMP RETURNK1: LCALL DELAY ;延时确定按键是否真的被按下LCALL KEYJNZ K2LJMP RETURNK2: MOV R3,#0EFH ;扫描的初始列MOV R4,#00H ;列序号K3: MOV P3,R3 ;逐列扫描JB P3.3,L6mov A,#00HLJMP LKL6: JB P3.2,L4MOV A,#04HLJMP LKL4: JB P3.1,L5MOV A,#08HLJMP LKL5: JB P3.0,NEXTMOV A,#0CHLJMP LKNEXT: INC R4 ;修改列号JNB P3.7,RETURNMOV A,P3RL AMOV R3,ALJMP K3LK: ADD A,R4JnB TR1,ZM ;判断是不是进入设置状态CJNE A,#0FH,RETURN ;判断是否输入为设置键CPL TR1MOV R0,#33HK8: LCALL DELAY ;等待放开设置键mov 39h,r0lcall xian1mov r0,39hLCALL KEYJNZ K8ZM2: LCALL KEY ;调用查询程序,对按键状态查询JNZ K11LCALL DELAYmov 39h,r0lcall xian1mov r0,39hSJMP ZM2K11: L CALL DELAY ;延时确定按键是否真的被按下LCALL KEYJNZ K2SJMP ZM2ZM: CJNE A,#0FH,ZM1 ;设置是否结束,没输入设置键跳到zm1 ZM3: MOV R0,#30HMOV R1,#33HZM4: MOV A,@R1SW AP AINC R1ADD A,@R1MOV @r0,aINC R1INC R0CJNE R0,#33H,ZM4ljmp k4ZM1: MOV @R0,AINC R0K5: LCALL DELAYmov 39h,r0lcall xian1mov r0,39hLCALL KEYJNZ K5CJNE R0,#39H,ZM2LCALL ZM3K4: LCALL DELAYlcall xian1LCALL KEYJNZ K4CPL TR1LJMP RETURNRETURN:RETKEY: MOV P3,#0F0H ;查询是否有按键按下MOV A,P3CPL AANL A,#0f0HRETDELAY: MOV R6,#64HL7: MOV R7,#13HL8: NOPNOPNOPDJNZ R7,L8DJNZ R6,L7RETxian1: MOV R0,#33HMOV A,#0DFHL12: MOV P2,A ;显示程序MOV DPTR,#TABMOV A,@R0MOVC A,@A+DPTRACALL DIANMOV P0,AMOV A,P2RR AINC R0MOV R1,#0FFHDJNZ R1,$MOV R1,#0FFHDJNZ R1,$MOV R1,#0FFHDJNZ R1,$MOV R1,#0FFHDJNZ R1,$MOV P0,#0FFHMOV P2,#0FFHCJNE R0,#39H, L12RETSERVE:PUSH PSW ;中断程序PUSH ACCMOV TH1,#3CHMOV TL1,#0B0HDJNZ 20H,RETUNTMOV 20H,#14HMOV A,#01HADD A,32HDA AMOV 32H,ACJNE A,#60H,RETUNTMOV 32H,#00HMOV A,#01HADD A,31HDA AMOV 31H,ACJNE A,#60H,RETUNTMOV 31H,#00HMOV A,#01HADD A,30HDA AMOV 30H,ACJNE A,#24H,RETUNTMOV 30H,#00H RETUNT:POP ACCPOP PSWRETIEND。
//*******************基于51单片机的可调时电子时钟实验**********************////***电子时钟前两位为分钟,后两位为秒钟,逢38秒进1分***********************////***按下调时键第一次,秒钟闪烁,进入编辑状态******************************////***按下调时键第二次,分钟闪烁,进入编辑状态******************************////***按下调时键第三次,则确定**********************************************////***在编辑状态下,按下增/减按钮,闪烁位则进行加/减操作********************////***若在编辑状态下,按下增/减按钮时间超过1S,则闪烁位以0.5秒的速度自加1***//#include<reg51.h>#define uint unsigned int#define uchar unsigned charsbit wela1=P2^4;sbit wela2=P2^5;sbit wela3=P2^6;sbit wela4=P2^7;sbit key1=P1^5;sbit key2=P1^6;sbit key3=P1^7;//位定义uchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};uchar miao,fen,mode,modeflag;//模式标志位bit flag,flash,miao_long,fen_long;//*********延时子函数*************// void delay(uint z){uint x,y;for(x=z;x>0;x--)for(y=110;y>0;y--);}//********定时器T0和变量的初始化****// void T0_init(){miao=00;fen=00;mode=0;modeflag=0;flash=0;flag=0;P2=0x0f;//锁存允许接口全部置低电平TMOD=0x01;//选择定时器工作方式TH0=(65536-2000)/256;TL0=(65536-2000)%256;//赋初值EA=1;//开总中断ET0=1;//开定时器中断TR0=1;//启动定时器}//*******数码管显示子函数***********// void display(){if(flag==0)//闪烁标志位为0时不闪烁{wela1=1;P0=table[fen/10];wela1=0;wela2=1;P0=table[fen%10];wela2=0; //送数给分位显示wela3=1;P0=table[miao/10];wela3=0;wela4=1;P0=table[miao%10];wela4=0; //送数给秒位显示}else //闪烁标志位为1时闪烁{if(mode==1)//模式为1,即调秒{if(miao_long==0)//没有长按加、减按钮{if(flash==0)//当闪烁等于0时{wela3=1;P0=table[miao/10];wela3=0;wela4=1;P0=table[miao%10];wela4=0;}else//当闪烁等于1时{P0=0xff;wela3=0;wela4=1;P0=0xff;wela4=0;}}else//长按了加、减按钮{wela3=1;P0=table[miao/10];wela3=0;wela4=1;P0=table[miao%10];wela4=0;}}else//模式为2,即调分{wela3=1;P0=table[miao/10];wela3=0;wela4=1;P0=table[miao%10];wela4=0; //在秒位熄灭的那一刻,按下调时键时,要把秒位点亮if(fen_long==0)//没有长按加、减按钮{if(flash==0){P0=table[fen/10];wela1=0;wela2=1;P0=table[fen%10];wela2=0;}else{wela1=1;P0=0xff;wela1=0;wela2=1;P0=0xff;wela2=0;}}else//长按了加、减按钮{wela1=1;P0=table[fen/10];wela1=0;wela2=1;P0=table[fen%10];wela2=0;}}}}//*********key1按钮子程序**************//void key1_scan(){if(key1==0){delay(10);//消抖if(key1==0){modeflag++;//模式标志位自加1flag=1;//闪烁标志位打开mode++;//模式自加1if(mode==3)//只在模式1:调秒,模式2:调分中间选择mode=0;while(!key1);//松手检测}}else if(modeflag==3)//按键次数到了第三次{modeflag=0;flag=0;while(!key1);}}//************key2,key3子程序**************//void key23_scan(){if(key2==0)//加数的操作{delay(10);if(key2==0){if(mode==1)//如果是模式1的话,key2键对秒加1{miao++;if(miao==38)//38秒进1分miao=0;delay(1000);//若按下的时间超过了1S钟,则视为长按while(!key2){miao_long=1;miao++;if(miao==38)miao=0;delay(200);}miao_long=0;//跳出长按,恢复短按的状态}else if(mode==2)//如果是模式2的话,key2键对分加一{fen++;if(fen==60)//60分钟进1fen=0;delay(1000);//若按下的时间超过了1S钟,则视为长按while(!key2){fen_long=1;fen++;if(fen==60)fen=0;delay(200);}fen_long=0;//跳出长按,恢复短按的状态}}else if(key3==0)//减数的操作{delay(10);if(key3==0){if(mode==1)//如果是模式1的话,key3键对秒减一{miao--;if(miao==0)miao=37;delay(1000);//若按下的时间超过了1S钟,则视为长按while(!key3){miao_long=1;miao--;if(miao==0)miao=37;delay(200);}miao_long=0;//跳出长按,恢复短按的状态}else if(mode==2)//如果是模式2的话,key3键对分减一{fen--;if(fen==0)fen=59;delay(1000);//若按下的时间超过了1S钟,则视为长按while(!key3)fen_long=1;fen--;if(fen==0)fen=59;delay(200);}fen_long=0;//跳出长按,恢复短按的状态}}}}void main(){T0_init();while(1){key1_scan();key23_scan();}}void T0_time() interrupt 1{static uchar t=0;static uint i=0;TH0=(65536-50000)/256;TL0=(65536-50000)%256;if(flag==0)//时间显示调整{i++;if(i==20){i=0;miao++;if(miao==38){miao=0;fen++;if(fen==60){fen=0;}}}}t++;if(t==10){t=0;flash=~flash;//闪烁标志位取反}display();}。
用定时器做的可调电子钟#include <reg52.h>#include <51hei.h>#include <LCD1602.H>#define uchar unsigned charsbit neum=P3^2;sbit up=P3^6;sbit down=P3^7;uchar code table2[]="MON"; uchar code table3[]="TUE";uchar code table4[]="WED"; uchar code table5[]="THU"; uchar code table6[]="FRI";uchar code table7[]="SAT";uchar code table8[]="SUN";uchar count,neum_key,a,b;uchar miao,fen,shi,ri,yue,nian,zhou;void init_time(void){TMOD=0x01; //定时器0,工作方式1 TH0=(65536-50000)/256;TL0=(65536-50000)%256; //初值TR0=1;ET0=1;EA=1;}void write_sfm(uchar addr,uchar date) {uchar shi,ge;shi=date/10;ge=date%10;write_cmd(0x80+0x40+addr);write_dat(0x30+shi);write_dat(0x30+ge);}void write_nyr(uchar addr,uchar date1){uchar shi,ge;shi=date1/10;ge=date1%10;write_cmd(0x80+addr);write_dat(0x30+shi);write_dat(0x30+ge);}void keyscan(){if(neum==0){delay(5);if(neum==0){neum_key++;while(!neum);if(neum_key==1){TR0=0;write_cmd(0x80+0x40+11);write_cmd(0x0f);}}if(neum_key==2){write_cmd(0x80+0x40+8); write_cmd(0x0f);}if(neum_key==3){write_cmd(0x80+0x40+5); write_cmd(0x0f);}if(neum_key==4){write_cmd(0x80+13); write_cmd(0x0f);}if(neum_key==5){write_cmd(0x80+10); write_cmd(0x0f);}if(neum_key==6){write_cmd(0x80+7);write_cmd(0x0f);}if(neum_key==7){write_cmd(0x80+4);write_cmd(0x0f);}if(neum_key==8){neum_key=0;write_cmd(0x0c);TR0=1;}}///////////////////////////////////////////////////加减计算/////////////////////////////////////////秒if(neum_key==1){if(up==0){delay(5);if(up==0){while(!up);miao++;if(miao==60){miao=0;}write_sfm(10,miao);write_cmd(0x80+0x40+11); }}if(down==0){delay(5);if(down==0){while(!down);miao--;if(miao==(-1)){miao=59;}write_sfm(10,miao);write_cmd(0x80+0x40+11);}}}///////////////////////分//////////////////////////if(neum_key==2){if(up==0){delay(5);if(up==0){while(!up);fen++;if(fen==60){fen=0;}write_sfm(7,fen);write_cmd(0x80+0x40+8);}}if(down==0){delay(5);if(down==0){while(!down);fen--;if(fen==(-1)){fen=59;}write_sfm(7,fen);write_cmd(0x80+0x40+8);}}}///////////////////////////////////////////时if(neum_key==3){if(up==0){delay(5);if(up==0){while(!up);shi++;if(shi==24){shi=0;}write_sfm(4,shi);write_cmd(0x80+0x40+5);}}if(down==0){delay(5);if(down==0){while(!down);shi--;if(shi==(-1)){shi=23;}write_sfm(4,shi);write_cmd(0x80+0x40+5);}}}/////////////////////////////////////////// 星期if(neum_key==4){if(up==0){delay(5);if(up==0){a++;while(!up);if(a==1)write_cmd(0x80+13);for(b=0;b<3;b++){write_dat(table2[b]);}}}if(a==2){write_cmd(0x80+13);for(b=0;b<3;b++){write_dat(table3[b]); }}if(a==3){write_cmd(0x80+13);for(b=0;b<3;b++){write_dat(table4[b]);}if(a==4){write_cmd(0x80+13); for(b=0;b<3;b++){write_dat(table5[b]); }}if(a==5){write_cmd(0x80+13); for(b=0;b<3;b++){write_dat(table6[b]); }}if(a==6){write_cmd(0x80+13); for(b=0;b<3;b++)write_dat(table7[b]);}}if(a==7){a=0;write_cmd(0x80+13);for(b=0;b<3;b++){write_dat(table8[b]);}}}if(down==0) //减星期{delay(5);if(down==0){a++;while(!down);if(a==1)write_cmd(0x80+13);for(b=0;b<3;b++){write_dat(table8[b]);}}}if(a==2){write_cmd(0x80+13);for(b=0;b<3;b++){write_dat(table7[b]); }}if(a==3){write_cmd(0x80+13);for(b=0;b<3;b++){write_dat(table6[b]);}if(a==4){write_cmd(0x80+13); for(b=0;b<3;b++){write_dat(table5[b]); }}if(a==5){write_cmd(0x80+13); for(b=0;b<3;b++){write_dat(table4[b]); }}if(a==6){write_cmd(0x80+13); for(b=0;b<3;b++)write_dat(table3[b]);}}if(a==7){a=0;write_cmd(0x80+13);for(b=0;b<3;b++){write_dat(table2[b]);}}}}/////////////////////////////////////////// 日if(neum_key==5){if(up==0){delay(5);if(up==0){while(!up);ri++;if(ri==32){ri=0;}write_nyr(9,ri);write_cmd(0x80+10); }}if(down==0){delay(5);if(down==0){while(!down);ri--;if(ri==0){ri=31;}write_nyr(9,ri);write_cmd(0x80+10);}}}/////////////////////////////////////////// yue if(neum_key==6){if(up==0){delay(5);if(up==0){while(!up);yue++;if(yue==13){yue=1;}write_nyr(6,yue);write_cmd(0x80+7);}}if(down==0){delay(5);if(down==0){while(!down);yue--;if(yue==0){yue=12;}write_nyr(6,yue);write_cmd(0x80+7);}}}/////////////////////////////////////////// nian if(neum_key==7){if(up==0){delay(5);if(up==0){while(!up);nian++;if(nian==41){nian=13;}write_nyr(3,nian);write_cmd(0x80+4); }}if(down==0){delay(5);if(down==0){while(!down);nian--;if(nian==12){nian=41;}write_nyr(3,nian);write_cmd(0x80+4);}}}}void main(void){init_time();init_lcd();while(1){keyscan();if(count==20){count=0;miao++;if(miao==60){miao=0;fen++;if(fen==60){fen=0;shi++;if(shi==24) //周{shi=0;ri++;if(ri==32){ri=0;yue++;if(yue==13){yue=0;nian++;if(nian==99){nian=0;}write_nyr(4,nian);}write_nyr(7,yue);}write_nyr(10,ri);}write_sfm(4,shi);}write_sfm(7,fen);}write_sfm(10,miao);}}}void timer0() interrupt 1{TH0=(65536-50000)/256;TL0=(65536-50000)%256;count++;}/////////////////////////////////////////以下是lcd1602头文件////////////////////////////////#ifndef __LCD1602_H__#define __LCD1602_H__sbit rs=P3^5;sbit rw=P2^7;sbit en=P3^4;#define lcd_data P0unsigned char num;unsigned char code table[]=" 2013-12-30 SUN";unsigned char code table1[]=" 22:58:57 ";void delay(unsigned char z) //延时函数{unsigned char x,y;for(x=z;x>0;x--)for(y=110;y>0;y--);}void write_cmd(unsigned char cmd) {rs=0;rw=0;delay(2);lcd_data=cmd;delay(2);en=1;delay(2);en=0;}void write_dat(unsigned char dat) {rs=1;rw=0;delay(2);lcd_data=dat;delay(2);en=1;delay(2);en=0;void init_lcd(void){guanled();guandz();write_cmd(0x38);write_cmd(0x0c);write_cmd(0x06);write_cmd(0x01);write_cmd(0x80);for(num=0;num<16;num++) {write_dat(table[num]);}write_cmd(0x80+0x40);for(num=0;num<16;num++) {write_dat(table1[num]); }}#endif。
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设置闹铃时间。
#include<reg51.h>#define uint unsigned int#define uchar unsigned char#define LCD P0void init_1602(void);void check_busy(void);void write_com(uchar com);void write_dat(uchar dat);void keyscan(void);sbit s0=P2^0;sbit s1=P2^1;sbit s2=P2^2;sbit RS=P2^4;sbit RW=P2^5;sbit EN=P2^6;bit flag;uchar hour,minute,second,ge,shi,day,month,year,week;uchar code tab[]=" 2014/09/06 MON";uchar tab0[]=" 00:00:00";uchar code week1[]="SUN";uchar code week2[]="MON";uchar code week3[]="TUE";uchar code week4[]="WED";uchar code week5[]="THU";uchar code week6[]="FRI";uchar code week7[]="SAT";/********************延时z毫秒****************/void delayms(uint z){int i,j;for(i=z;i>0;i--)for(j=110;j>0;j--);}/********************1cd1602初始化******************/ void init_1602(void){delayms(15);write_com(0x38);delayms(5);write_com(0x0c);delayms(5);write_com(0x06);delayms(5);write_com(0x01);delayms(5);write_com(0x80);delayms(5);}/**********读忙*****************/ void check_busy(void){uchar x;x=0x80;while(x&0x80){RS=0;RW=1;EN=1;x=LCD;EN=0;delayms(5);}}/**************写指令**************/ void write_com(uchar com){check_busy();RS=0;RW=0;EN=1;LCD=com;EN=0;delayms(5);}/**************写数据**************/ void write_dat(uchar dat){check_busy();RS=1;RW=0;EN=1;LCD=dat;EN=0;delayms(5);}/**************定时器初始化*******/ void init_time(void){uint i;TMOD=0x01;TH0=(65536-5000)/256;TL0=(65536-5000)%256;TR0=1;ET0=1;EA=1;for(i=0;i<15;i++){write_dat(tab[i]);delayms(5);}write_com(0x80+0x40);for(i=0;i<16;i++){write_dat(tab0[i]);delayms(5);}}/*********时分秒转换**********/ void write_tran(uchar add,uchar dat) {shi=dat/10;ge=dat%10;write_com(0x80+0x40+add);write_dat(shi+0x30);write_dat(ge+0x30) ;}/*********年月日转换**********/ void write_nyr(uchar addd,uchar datt) {shi=datt/10;ge=datt%10;write_com(0x80+addd);write_dat(shi+0x30);write_dat(ge+0x30);}/*********写星期**********/ void write_week(uchar adttt){uchar i;write_com(0x80+12);switch(adttt){case 1: for(i=0;i<3;i++){write_dat(week1[i]);delayms(5);}break;case 2: for(i=0;i<3;i++){write_dat(week2[i]);delayms(5);}break;case 3: for(i=0;i<3;i++){write_dat(week3[i]);delayms(5);}break;case 4: for(i=0;i<3;i++){write_dat(week4[i]);delayms(5);}break;case 5: for(i=0;i<3;i++){write_dat(week5[i]);delayms(5);}break;case 6: for(i=0;i<3;i++){write_dat(week6[i]);delayms(5);}break;case 7: for(i=0;i<3;i++){write_dat(week7[i]);delayms(5);}break;}}/*********主函数**********/void main(){init_1602();init_time();write_com(0x80);while(1){keyscan();}}/*********按键扫描**********/void keyscan(){uchar num;if(s0==0){delayms(5);if(s0==0){num++;delayms(5);while(s0!=0);switch(num){case 1: TR0=0;write_com(0x80+0x40+11);delayms(180);write_com(0x0f); break;case 2: write_com(0x80+0x40+8);delayms(180); break;case 3: write_com(0x80+0x40+5);delayms(250); break;case 4: write_com(0x80+10);delayms(200); break;case 5: write_com(0x80+7);delayms(180); break;case 6: write_com(0x80+4);delayms(200); break;case 7: write_com(0x80+12);delayms(180); break;case 8: num=0;TR0=1;write_com(0x0c);delayms(200); break;}}}if(num!=0){if(s1==0){delayms(5);if(s1==0);{delayms(5);while(s1!=0);switch(num){case 1: second++;//write_com(0x10);delayms(180);if(second>=60){second=0;}write_tran(10,second);break;case 2: minute++;delayms(180);if(minute>=60)minute=0;write_tran(7,minute);break;case 3: hour++;delayms(180);if(hour>=24)hour=0;write_tran(4,hour);break;case 4: day++;delayms(180);if(day>31)day=1;write_nyr(9,day);break;case 5: month++;delayms(180);if(month>12)month=1;write_nyr(6,month);break;case 6: year++;delayms(180);if(year>99)year=0;write_nyr(3,year);break;case 7: week++;delayms(180);if(week>=8)week=1;write_week(week);break;}}}if(s2==0){delayms(5);if(s2==0);{delayms(5);while(s2!=0);switch(num){case 1: second--;delayms(180);if(second<=0)second=59;write_tran(10,second);break;case 2: minute--;delayms(180);if(minute<0)minute=59;write_tran(7,minute);break;case 3: hour--;delayms(180);if(hour<0)hour=23;write_tran(4,hour);break;case 4: day--;delayms(180);if(day<1)day=31;write_nyr(9,day);break;case 5: month--;delayms(180);if(month<1)month=12;write_nyr(6,month);break;case 6: year--;delayms(180);if(year<0)year=99;write_nyr(3,year);break;case 7: week--;delayms(180);if(week<1)week=7;write_week(week);break;}}}}}/*********定时器中断**********/void timer() interrupt 1{int num;TH0=(65536-50000)/256;TL0=(65536-50000)%256;num++;if(num==16){num=0;second++;if(second==60){second=0;minute++;if(minute==60){minute=0;hour++;if(hour==24){hour=0;day++;week++;if(week>=8)week=1;if(day==32){day=1;month++;if(month==13){month=1;year++;if(year>99)year=0;write_nyr(3,year);}write_nyr(6,month);}write_nyr(9,day);write_week(week);}write_tran(4,hour);}write_tran(7,minute);}write_tran(10,second);}}。
/*2键手动奏乐,3键储存报警时间,报警时间到奏乐1键修改秒的时间,4键修改分的时间,8键修改小时12键启动定时器开始计数*/#include <reg52.h>#include <absacc.h>//#include "SST89x5x4.h"#define uint unsigned int#define uchar unsigned charuchar scounter=20;uchar flag=0;uchar i;#define a8255 XBYTE[0x7F00] //8255端口地址定义control 7-LED#define b8255 XBYTE[0x7F01] //send a~g#define c8255 XBYTE[0x7F02] //#define con8255 XBYTE[0x7F03]//unsigned char code table[]={0xfc,0x60,0xda,0xf2,0x66,0xb6,0xbe,0xe0,0xfe,0xf6,0xee,0x3e,0x9c,0x7a,0x9e,0x8e}; //共阴数码管显示编码unsigned char code table[] = {0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07,0x7f, 0x6f, 0x77, 0x7c, 0x39, 0x5e, 0x79, 0x71};unsigned char b[] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00};ucharsecond=0,second_h=0,second_l=0,minute=0,minute_l=0,minute_h=0,hour=0,hour_h=0,hour_l=0; bit dp=0;unsigned char key_down=0;unsigned char key_value=0;unsigned char key_count=0;/////////////////////////////////////////////////sbit POUT = P3^0; //扬声器控制引脚//sbit POUT = P0^0; //扬声器控制引脚#define Clk 0x070000unsigned char data val_H; //计数器高字节unsigned char data val_L; //计数器低字节unsigned char data music_i; //计数器低字节unsigned int val;uchar Save_Second=61,Save_Minute=61,Save_Hour=25,Save_Flag=0,music_flag=0;//频率表unsigned int code freq_list[] = {371,495,495,495,624,556,495,556,624,495,495,624,742,833,833,833,742,624,624,495,556,495,556,624,495,416,416,371,495,833,742,624,624,495,556,495,556,833,742,624,624,742,833,990,742,624,624,495,556,495,556,624,495,416,416,371,495,0};//时间表unsigned char code time_list[]= {4, 6, 2, 4, 4, 6, 2, 4, 4, 6,2, 4, 4,12, 1, 3, 6, 2, 4, 4,6, 2, 4, 4, 6, 2, 4, 4,12, 4,6, 2, 4, 4, 6, 2, 4, 4, 6, 2,4, 4,12, 4, 6, 2, 4, 4, 6, 2,4, 4, 6, 2, 4, 4,12};void initTimer1(){TMOD|=0X10;TH1 = val_H; //重新装入计数值TL1 = val_L;EA=1;ET1=1;TR1=1;}void stopmusic(){TMOD&=0X01;EA=1;ET1=0;TR1=0;music_i=0;}void Delay_Music(unsigned char cnt) //单位延时{unsigned char i;unsigned int j;for(i=0; i<cnt; i++){for(j=0; j<0x3600; j++);}}void music(){val = Clk/(freq_list[music_i]);val = 0xFFFF - val; //计算计数值val_H = (val>>8)&0xff;val_L = val&0xff;Delay_Music(time_list[music_i]);music_i++;if(music_i==58){music_i=0;music_flag=0;}}void t1_isr() interrupt 3 using 2 //定时器1中断处理程序{POUT = ~POUT; //产生方波TH1 = val_H; //重新装入计数值TL1 = val_L;}void SaveTimer(){Save_Second=second;Save_Minute=minute;Save_Hour=hour;}/////////////////////////////////////////////////void display_value(){b[1]=second/10;b[0]=second%10;b[3]=minute/10;b[2]=minute%10;b[5]=hour/10;b[4]=hour%10;}void delay(uint i,uint j,uint k){for(;i>0;i--)for(;j>0;j--)for(;k>0;k--);}void initTimer0()TMOD|=0X01;TH0=(65536-50000)/256; //timer 50ms TL0=(65536-50000)%256;EA=1;ET0=1;TR0=1;}void CloseTimer(){EA=0;ET0=0;TR0=0;}void timer0(void) interrupt 1 using 1{TH0=(65536-50000)/256; //timer 50ms TL0=(65536-50000)%256;scounter--;if(scounter==0){flag=1; //timer 1s scounter=20;second++;if(second==60){second=0;minute++;if(minute==60){minute=0;hour++;if(hour==12){hour=0;}}}}}void init8255(){con8255=0x81;c8255=0x0ff;////////////////////////////////////////////////void display() //显示函数{unsigned char i, j = 0xDF;display_value(); //get display valuefor(i=0; i<6; i++){a8255 = 0xFF;b8255 = table[b[i]]; //查表输出显示a8255 = j;delay(1,2,200);j = (j>>1)|(j<<7);}}//////////////////////////////////////////////void keyscan() //按键扫描函数{unsigned char cc;a8255 = 0x00; //X1~X4置0cc = c8255; //得到Y1~Y4的值key_down = (~cc) & 0x0f;}/////////////////////////////////////////////////void getkey() //得到按键值{unsigned char value;unsigned char i, j = 0xFE;for(i=0; i<4; i++){a8255 = j;value = c8255; //read 8255 c portif(!(value & 0x01)) //行1{key_value = i + 1;return;}if(!(value & 0x02)) //行2{key_value = i + 4;return;}if(!(value & 0x04)) //行3{key_value = i + 8;return;}if(!(value & 0x08)) //行4{key_value = i + 12;return;}j <<= 1;}}void main(){initTimer0();init8255();key_count = 5;while(1){display(); //显示keyscan(); //按键扫描if(key_down) //判是否有键按下{delay(1000,1000,2000);keyscan();if(key_down){getkey(); //得到按键值key_down=0;}}/////////////////////////////////////////////modify time value,include second/minute/hourif(key_value){if(key_value==1) //modify second {key_value=0;CloseTimer();second++;if(second==60) second=0;}else if(key_value==4) //modify minute {key_value=0;CloseTimer();minute++;if(minute==60) minute=0;}else if(key_value==8) //modify hour {key_value=0;CloseTimer();hour++;if(hour==24) hour=0;}else if(key_value==12) //start timer{key_value=0;initTimer0();Save_Flag=1;}else if(key_value==2) //save value{music_flag=1;key_value=0;}else if(key_value==3) //save value{SaveTimer();Save_Flag=0;music_flag=0;}}if(Save_Flag==1){if((Save_Hour==hour)&&(Save_Minute==minute)&&(Save_Second==second)) {Save_Flag=0;music_flag=1;}}////////////////////////////////////////////按键模拟报警音乐if(music_flag) //start Music{initTimer1();music();}else{stopmusic();POUT=0;}}}。
51单片机24小时闹钟时钟可调简单程序#includeunsigned char seg[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; unsigned char con[6]={0x1,0x2,0x4,0x8,0x10,0x20};unsigned char mm=0;unsigned char ss=0;unsigned char hh=0;unsigned char count=100;unsigned char TH=01,TM=00,m;sbit S1=P3^3;sbit S2=P3^4;sbit S3=P3^5;sbit S4=P3^6;sbit S5=P3^7;sbit S6=P3^2;sbit bell=P3^0;main(){TMOD=1;TH0=-10000>>8;TL0=-10000; //10毫秒间隔EA=1;ET0=1;TR0=1;while(1);}void isr_time0() interrupt 1 //24小时{unsigned int i=0,j;unsigned char time[6];TH0=-10000>>8;TL0=-10000;count--;if(count==0){count=100;ss++;if(ss==60){ss=0;mm++;if(mm==60){mm=0;hh++;if(hh==24)hh=0;}}if(S5==0){TH++;} //闹钟调时if(S6==0){TM++;} //闹钟调分if(hh==TH){ unsigned int a,b,y;if(mm>=01){m=0;}if(mm==TM&&ss<10){if(m<10){do{m++;ss++; //ss确保闹钟时间继续for(a=0;a<1250;a++){bell=!bell;for(b=0;b<15;b++);} //取反for(y=0;y<1250;y++){bell=!bell;for(b=0;b<33;b++);}for(a=0;a<1250;a++){bell=!bell;for(b=0;b<15;b++);}for(a=0;a<1250;a++){bell=!bell;for(b=0;b<33;b++);}}while(m<10);}}}if(S1==0){hh++; //时钟加if(hh==24){hh=0;}}if(S2==0){mm++; //分钟加if(mm==60){ mm=0;hh++;}}if(S3==0&&hh>0){hh--; //时钟减if(hh==0){hh=23;}}if(S4==0&&mm>0){mm--; //分钟减if(mm==0){ mm=59;}}}time[3]=hh/10;time[2]=hh%10; //显示位time[1]=mm/10;time[0]=mm%10;for(i=0;i<6;i++){P2=con[i];if(i==1||i==2) //小数点P1=seg[time[i]]&0x7f;else P1=seg[time[i]];for(j=100;j>0;j--);}}。
可调时钟参考程序#include "intrins.h"#define ui unsigned int#define uc unsigned charvoid delay(ui t){while(t--);}sbit h0=P3^0;sbit h1=P3^1;sbit h2=P3^2;sbit l0=P3^4;sbit l1=P3^5;sbit l2=P3^6;sbit l3=P3^7;uc key; //键值void scan(){ui n;key=16;h0=0;h1=0;h2=0;if(l0==0||l1==0||l2==0||l3==0){n++;if(n==20){h0=0;h1=1;h2=1;if(l0==0)key=0;if(l1==0)key=1;if(l2==0)key=2;if(l3==0)key=3;h0=1;h1=0;h2=1;if(l0==0)key=4;if(l1==0)key=5;if(l2==0)key=6;if(l3==0)key=7;h0=1;h1=1;h2=0;if(l0==0)key=8;if(l1==0)key=9;if(l2==0)key=10;if(l3==0)key=11;}}else n=0;} sbit smcs1=P2^0;sbit smcs2=P2^1;sbit smwr=P2^2; uc w[8]={0,0,11,0,0,11,0,0},m[8]={0,0,11,0,0,11,0,0};uc code seg[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x 90,0xff,0xbf};void sm(){static uc i,px=0xfe;static ui n;n++;if(n==500)n=0;P0=seg[n<=250?w[i]:m[i]];smcs1=0;smwr=0;smwr=1;smcs1=1;P0=px;smcs2=0;smwr=0;smwr=1;smcs2=1;delay(200);P0=0xff;smwr=0;smwr=1;smcs1=1;px=_crol_(px,1);i++;if(i==8)i=0;}uc hh,mm,ss,mod=1,hms=0,gs=0;//hh时,mm分,ss秒,mod计时/调时,hms时/分/秒,gs个/十void set(){m[7]=w[7];m[6]=w[6];m[4]=w[4];m[3]=w[3];m[1]=w[1];m[0]=w[0];if(gs==0){switch(hms){case 0:mod=1;break;case 1:m[6]=10;break;case 2:m[3]=10;break;case 3:m[0]=10;;break;}}else{switch(hms){case 0:mod=1;gs=0;break;case 1:m[7]=10;break;case 2:m[4]=10;break;case 3:m[1]=10;;break;}}}void ts(){if(gs==0){switch(hms){case 1:if(w[7]*10+key<24)w[6]=key;break;case 2:if(w[4]*10+key<60)w[3]=key;break;case 3:if(w[1]*10+key<60)w[0]=key;;break;}}else{switch(hms){case 1:if(key*10+w[6]<24)w[7]=key;break;case 2:if(key*10+w[3]<60)w[4]=key;break;case 3:if(key*10+w[0]<60)w[1]=key;break;}}hh=w[7]*10+w[6];mm=w[4]*10+w[3];ss=w[1]*10+w[0];}void main(){TMOD=0x01;TH0=(65536-2000)/256;TL0=(65536-2000)%256;EA=1;ET0=1;TR0=1;while(1){scan();if(key==10){mod=0;hms++;if(hms==4)hms=0;set();}if(key==11&&mod==0){gs=!gs;set();}if(key<10&&mod==0)ts();}}void t0() interrupt 1{static ui n;TH0=(65536-2000)/256;TL0=(65536-2000)%256;if(mod)n++;if(n==500){n=0;ss++;if(ss==60){ss=0;mm++;if(mm==60){mm=0;hh++;if(hh==24)hh=0;}}w[7]=m[7]=hh/10;w[6]=m[6]=hh%10;w[4]=m[4]=mm/10;w[3]=m[3]=mm%10;w[1]=m[1]=ss/10;w[0]=m[0]=ss%10;}sm();}。
电子时钟设计DS++可调闹钟+程序清单本文主要介绍一种新型的电子时钟设计,名为DS++可调闹钟。
这种电子时钟不仅能够显示当前日期和时间,而且其可调节的闹钟功能也十分实用。
同时,我们还提供程序清单,供各位读者借鉴学习。
1. 电子时钟设计的背景和目标电子时钟已经成为人们日常生活中不可或缺的物品之一。
在市场上,人们可以买到各种各样的电子时钟,从简单的数字显示到智能语音交互。
然而,我们常常发现,在时钟设计中,用户体验常常被忽视。
比如,有的时钟功能繁杂,使用起来困难;有的时钟质量低劣,经常出现故障。
为了解决这些问题,我们决定设计一种更为智能且易用的电子时钟,就是DS++可调闹钟。
本次电子时钟设计的目标是:1)提供准确的时间显示和日期显示;2)提供可调闹钟功能和提示功能;3)简单易用,方便用户使用。
2. DS++可调闹钟设计方案2.1 电路原理图DS++可调闹钟的电路包括微处理器、振荡器、液晶显示模块、蜂鸣器、按键等部分。
主控芯片采用AT89S52(51系列微控制器),与液晶显示模块通过IIC总线通信。
振荡器采用32.768kHz的石英晶体振荡器,保证时钟的准确性。
2.2 功能模块设计液晶显示模块的设计是优化DS++可调闹钟的关键。
我们选用了1602A型液晶显示屏,显示内容包括日期、时间和闹钟状态。
闹钟模块是DS++可调闹钟的核心模块之一,它通过可调节的闹钟时间和闹钟提示音,方便用户设置并响铃提醒。
2.3 电路调试及测试在电路设计和焊接完成后,我们需要进行电路调试和测试。
在调试过程中,我们主要测试了电子时钟的时间显示、日期显示、闹钟设置等功能。
同时,我们还测试了与之相协调的同时供电设备,比如移动电源和插座电源。
3. 程序清单DS++可调闹钟的程序基于Keil/µVision IDE的汇编语言编写。
半个时钟周期内的指令流水线技术使得程序库在嵌入式微控制器上的表现达到质的提升,且运行速度更快。
DS++可调闹钟的程序清单如下:- 初始化电路;- 显示日期、时间;- 等待用户按键;-用户按键相应操作;- 播放闹钟提示音;- 关闭闹钟。
摘要随着单片机技术的飞速发展,在其推动下,现代的电子产品几乎渗透到了社会的各个领域,有力地推动了社会生产力的发展和社会信息化程度的提高,同时也使现代电子产品性能进一步提高。
时间就是金钱、时间就是生命、时间就是胜利……,准确的掌握时间和分配时间对人们来说至关重要,时钟是我们生活中必不可少的工具。
电子钟的设计方法有很多种,但是基于单片机并通过LCD显示的电子时钟具有编程灵活、精确度高、便于携带、显示直观等特点。
利用STC89C52单片机对DS1302时钟芯片进行读写操作并通过1602字符液晶显示实时时钟信息,这样便构成了一个单片机电子时钟。
关键词:单片机,电子时钟,STC89C52,蜂鸣器ABSTRACTWith the rapid development of microcomputer technology in its promotion, modern electronics into almost all areas of society, a strong impetus to the development of social productive forces and social improvement in the level of information, but also to further improve the performance of modern electronic products.Time is a money, time is life, time is victory…Accurate grasp of time and allocation of time is crucial to people, The clock is necessary in our life tools . Clock Design There are many ways, however, produced by single chip electronic clock is more flexible programming, and easy expansion of electronic capabilities, high accuracy, easy to carry, display visual and so on.In this paper, through the use of STC89C52 microcontroller by DS1302 clock chips for reading and writing operation and through 1602 character liquid crystal display real-time clock information so that forming a single chip electronic clock.Key Words: Microcontroller,STC89C52,Electronic clock,buzzer目录绪论---------------------------------------------------------------0概述---------------------------------------------0研究目的-----------------------------------------0第1章设计要求与方案论证--------------------------------01.1 设计要求-------------------------------------01.2 系统基本方案选择和论证-----------------------11.2.1 单片机芯片的选择方案和论证---------------------11.2.2 显示模块选择方案和论证—————————————---11.2.3 时钟芯片的选择方案和论证-----------------------21.3 电路设计最终方案决定----------------------------------2第2章主要元件介绍-----------------------------------------32.1 STC89C52以及最小系统介绍--------------------32.1.1 STC89C52主要功能及PDIP封装----------------------22.1.2 STC89C52引脚介绍-----------------------------------22.1.3 STC89C52最小系统-----------------------------------42.2 DS1302时钟芯片以及集成时钟模块介绍----------52.2.1 DS1302概述------------------------------------------62.2.2 DS1302引脚介绍-------------------------------------62.2.3 DS1302使用方法-------------------------------------62.2.4 时钟集成模块内部原理图以及实物图--------------8 2.3 1602字符液晶以及显示模块介绍-----------------错误!未定义书签。
#include<reg52.h>#include<intrins.h>#include <absacc.h>#define uint unsigned int#define uchar unsigned char#define lcd_date P0#define data 1000#define N 8#define second timebuf[0]#define minute timebuf[1]#define hour timebuf[2]#define day timebuf[3]#define yue timebuf[4]#define week timebuf[5]#define year timebuf[6]sbit LEDCLK=P3^4;sbit LEDDIN=P2^3;sbit Key_Input=P1^0;sbit lcd_en=P2^2;sbit lcd_rs=P2^4;sbit lcd_rw=P2^3;sbit ACC0=ACC^0;sbit ACC7=ACC^7;sbit DQ=P3^2;sbit SDA=P3^7;//串行数据/地址控制端sbit SCL=P3^6;//串行时钟sbit sound=P1^2;uchar idata disp[N];bit flag_wr;bit flag_wr_zhi;uchar keytemp=0;uchar keyval=0;uchar keyback;uint keynum;bit add_dec_flag;uchar time_change;uchar mod;uchar t_open;bit time_mod;uchar temper_mod;uchar set_mod;uchar yue_set,day_set,hour_set,minute_set;int time1_hour,time1_minute,time2_hour,time2_minute,time3_yue,time3_day; bit keyup;bit flag_num;uchar flag_control;uchar controlbuf;/*uchar time_rst; */uchar timebuf[8]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};uchar chun[8];bit flag7;uchar timebuf1[8]={0x00,0x00,0x00,0x01,0x01,0x01,0x13,0x00};/*uchar chu[8]={0x00,0x00,0x07,0x16,0x04,0x01,0x13,0x00}; */#define NOP3() _nop_();_nop_();_nop_()/**DS1302与MCU连接的各端口定义*****************/sbit DS_IO=P2^0;//DS1302数据口sbit DS_SCLK=P2^7;//DS1302串行时钟sbit DS_RST=P2^4;/**DS1302内部各个寄存器地址定义***********/#define DS1302_SECOND 0X80 // 秒#define DS1302_MINUTE 0X82 // 分#define DS1302_HOUR 0X84 // 时#define DS1302_DAY 0X86 // 日#define DS1302_MONTH 0X88 // 月#define DS1302_WEEK 0X8A // 星期#define DS1302_YEAR 0X8C // 年#define DS1302_CONTROL 0X8E //写保护控制位#define DS1302_RAM(X) (0XC0+(X)*2)//用于计算DS1302静态RAM地址void delayms(uint z){uint x;uchar y;for(x=z;x>0;x--)for(y=123;y>0;y--);}/**********************************************写入单个字节**********************************************/void DS1302WriteByte(uchar Wdate){uchar i;for(i=0;i<8;i++){DS_IO=(bit)(Wdate&0x01);DS_SCLK=1;DS_SCLK=0;NOP3();Wdate>>=1;}}/*********************************************** 读取一个字节*************************************************/ uchar DS1302ReadByte(void){uchar i,temp;temp=0;for(i=0;i<8;i++){temp>>=1;if(DS_IO==1){temp=temp|0x80;}DS_SCLK=1;NOP3();DS_SCLK=0;}return(temp);}/********************************************** 对单个地址写相应的数据***********************************************/ void Write1302(uchar addr,uchar DSdate){DS_RST=0;DS_SCLK=0;DS_RST=1;EA=0;DS1302WriteByte(addr); //地址DS1302WriteByte(DSdate); //数据DS_SCLK=1;DS_RST=0;EA=1;}/********************************************** 读相应地址的数据***********************************************/ uchar Read1302(uchar addr){uchar Rdate;DS_RST=0;DS_SCLK=0;DS_RST=1;EA=0;DS1302WriteByte(addr|0x01);Rdate=DS1302ReadByte();DS_SCLK=1;DS_RST=0;EA=1;return(Rdate);}void bell(){ uchar j;for(j=0;j<8;j++){ sound=~sound;delayms(1);}}void close_led(){uchar i;for(i=0;i<8;i++){LEDCLK=0;LEDDIN=1;_nop_();LEDCLK=1;}}void Read_Key() //**键值读取函数**//{keytemp<<=1;if(Key_Input==1){keytemp++;}}void keyscan() //键值确认函数{if(keytemp==0xff){ keyup=1; //按键已经放开keyback=0; //清除按键备份值keyval=0; //清除按键存放单元}else if(keytemp==keyback&&keyup==1) //两次的检测的值一样且按键已经放开{keyval=keytemp; //存放按键值keyup=0; //按下按键keyback=0; //清除按键备份值}else{ keyback=keytemp;}}void Key_job() //**键值工作程序**//{switch(keyval){case 0x7f: { time_mod= ~time_mod;flag_num=0;keynum=1;keyval=0;break;}case 0xbf: { if(flag7==0){set_mod ++;if(set_mod==4){set_mod=0;}}else{ time_change++;if(time_change==7){ time_change=0;}}flag_num=0;keynum=2;keyval=0;break;}case 0xdf: { if(flag7==0){if(add_dec_flag==0){if(set_mod==1){ time1_hour++;if(time1_hour==24){ time1_hour=0;}}if(set_mod==2){ time2_hour++;if(time2_hour==24){ time2_hour=0;}}if(set_mod==3){ time3_yue++;if(time3_yue==13){ time3_yue=1;}}}else{if(set_mod==1){ time1_hour--;if(time1_hour<0){ time1_hour=23;}}if(set_mod==2){ time2_hour--;if(time2_hour<0){ time2_hour=23;}}if(set_mod==3){ time3_yue--;if(time3_yue<1){ time3_yue=12;}}}}else{ if(add_dec_flag==0){ if(time_change<2){timebuf1[time_change]=timebuf1[time_change]+10;if(timebuf1[time_change]>59){ timebuf1[time_change]=0;}}{ timebuf1[time_change]=timebuf1[time_change]+10;if(timebuf1[time_change]>23){ timebuf1[time_change]=0;}}if(time_change==3){ timebuf1[time_change]=timebuf1[time_change]+10;if(timebuf1[time_change]>31){ timebuf1[time_change]=1;}}if(time_change==4){ timebuf1[time_change]=timebuf1[time_change]+10;if(timebuf1[time_change]>12){ timebuf1[time_change]=1;}}if(time_change==5){ timebuf1[time_change]=timebuf1[time_change]+10;if(timebuf1[time_change]>7){ timebuf1[time_change]=1;}}if(time_change==6){ timebuf1[time_change]=timebuf1[time_change]+10;if(timebuf1[time_change]>99){ timebuf1[time_change]=0;}}}else{ if(time_change<2){ timebuf1[time_change]=timebuf1[time_change]-10;if(timebuf1[time_change]<0){ timebuf1[time_change]=59;}}if(time_change==2){ timebuf1[time_change]=timebuf1[time_change]-10;if(timebuf1[time_change]<0){ timebuf1[time_change]=23;}}{ timebuf1[time_change]=timebuf1[time_change]-10;if(timebuf1[time_change]<1){ timebuf1[time_change]=31;}}if(time_change==4){ timebuf1[time_change]=timebuf1[time_change]-10;if(timebuf1[time_change]<1){ timebuf1[time_change]=12;}}}if(time_change==5){ timebuf1[time_change]=timebuf1[time_change]-10;if(timebuf1[time_change]<1){ timebuf1[time_change]=7;}}if(time_change==6){ timebuf1[time_change]=timebuf1[time_change]-10;if(timebuf1[time_change]<0){ timebuf1[time_change]=99;}}}flag_num=0;keynum=3;keyval=0;break;}case 0xef: { if(flag7==0){ if(add_dec_flag==0){ if(set_mod==1){ time1_minute++;if(time1_minute==60){ time1_minute=0;}}if(set_mod==2){ time2_minute++;if(time2_minute==60){ time2_minute=0;}}if(set_mod==3){ time3_day++;if(time3_day==32){ time3_day=1;}}}else{ if(set_mod==1){ time1_minute--;if(time1_minute<0){ time1_minute=59;}}if(set_mod==2){ time2_minute--;if(time2_minute<0){ time2_minute=59;}}if(set_mod==3){ time3_day--;if(time3_day<1){ time3_day=31;}}}}else{ if(add_dec_flag==0){ if(time_change<2){timebuf1[time_change]++;if(timebuf1[time_change]>59){ timebuf1[time_change]=0;}}if(time_change==2){ timebuf1[time_change]++;if(timebuf1[time_change]>23){ timebuf1[time_change]=0;}}if(time_change==3){ timebuf1[time_change]++;if(timebuf1[time_change]>31){ timebuf1[time_change]=1;}}if(time_change==4){ timebuf1[time_change]++;if(timebuf1[time_change]>12){ timebuf1[time_change]=1;}}if(time_change==5){ timebuf1[time_change]++;if(timebuf1[time_change]>7){ timebuf1[time_change]=1;}}if(time_change==6){ timebuf1[time_change]++;if(timebuf1[time_change]>99){ timebuf1[time_change]=0;}}}else{ timebuf1[time_change]--;}}flag_num=0;keynum=4;keyval=0;break;}case 0xf7: { t_open++;if(t_open==5){t_open=0;}flag_num=0;keynum=5;keyval=0;break;}case 0xfb: { add_dec_flag=~add_dec_flag;flag_num=0;keynum=6;keyval=0;break;}case 0xfd: { /* time_rst++;if(time_rst==3){time_rst=0;} */flag7=~flag7;flag_num=0;keynum=7;keyval=0;break;}case 0xfe:{ if(flag7==0){ flag_control++;if(flag_control==1){ controlbuf=t_open;t_open=0; }if(flag_control==2){ t_open=controlbuf; }if(flag_control==3){flag_control=0; }}else{ flag_wr_zhi=1;}flag_num=0;keynum=8;keyval=0;break;}default: if(keyup==1){keynum=0;}keyval=0;break;}}void Write_com(uchar com){lcd_rs=0;lcd_date=com;delayms(2);lcd_en=1;delayms(2);lcd_en=0;}void Write_dat(uchar dat){lcd_rs=1;lcd_date=dat;delayms(2);lcd_en=1;delayms(2);lcd_en=0;}void lcd_init(){lcd_rw=0;lcd_en=0;delayms(15);Write_com(0x38);delayms(5);Write_com(0x38);delayms(5);Write_com(0x38);//显示模式设置Write_com(0x08);//显示关闭Write_com(0X01);//清屏Write_com(0x06);//显示光标移动设置Write_com(0X0c);//显示开及光标设置}void display_key(){ Write_com(0x4b+0x80);Write_dat('K');Write_com(0x4c+0x80);Write_dat('E');Write_com(0x4d+0x80);Write_dat('Y');Write_com(0x4e+0x80);Write_dat(':');Write_com(0x4f+0x80);Write_dat('0'+keynum);}init_mcu(){TMOD=0x01;TH1=(65536-data)/256;TL1=(65536-data)%256;ET1=1;TR1=1;EA=1;}/********************************************DS1302初始化********************************************/void Init_DS1302(){DS_RST=0;DS_SCLK=0;DS_IO=0;}/******************************************设置时钟芯片时间*******************************************/void SET_DS1302(){Write1302(DS1302_CONTROL,0X00);///* Write1302_All(timebuf);*/Write1302(DS1302_SECOND,0X00);//Write1302(DS1302_MINUTE,0X0);//Write1302(DS1302_HOUR,0X07);//Write1302(DS1302_DAY,0X16);//Write1302(DS1302_MONTH,0X4);//Write1302(DS1302_YEAR,0X13);//Write1302(DS1302_WEEK,0x01);Write1302(DS1302_CONTROL,0X80);//}void write_gai(){Write1302(DS1302_CONTROL,0X00);//Write1302(DS1302_SECOND,(timebuf1[0]/10*16+timebuf1[0]%10));// Write1302(DS1302_MINUTE,(timebuf1[1]/10*16+timebuf1[1]%10));// Write1302(DS1302_HOUR,(timebuf1[2]/10*16+timebuf1[2]%10));//Write1302(DS1302_DAY,(timebuf1[3]/10*16+timebuf1[3]%10));//Write1302(DS1302_MONTH,(timebuf1[4]/10*16+timebuf1[4]%10));// Write1302(DS1302_YEAR,(timebuf1[6]/10*16+timebuf1[6]%10));//Write1302(DS1302_WEEK,(timebuf1[5]/10*16+timebuf1[5]%10));Write1302(DS1302_CONTROL,0X80);//}void display1_date(){ //uchar k;Write_com(0x00+0x80);Write_dat('2');Write_com(0x01+0x80);Write_dat('0');Write_com(0x02+0x80);Write_dat((timebuf[6]/16)+0x30);Write_com(0x03+0x80);Write_dat((timebuf[6]%16)+0x30);Write_com(0x04+0x80);Write_dat('-');Write_com(0x05+0x80);Write_dat((timebuf[4]/16)+0x30);Write_com(0x06+0x80);Write_dat((timebuf[4]%16)+0x30);Write_com(0x07+0x80);Write_dat('-');Write_com(0x08+0x80);Write_dat((timebuf[3]/16)+0x30);Write_com(0x09+0x80);Write_dat((timebuf[3]%16)+0x30);Write_com(0x0b+0x80);Write_dat((timebuf[5]%16)+0x30);Write_com(0x0c+0x80);Write_dat('t');Write_com(0x0d+0x80);Write_dat('h');Write_com(0x40+0x80);Write_dat((timebuf[2]/16)+0x30);Write_com(0x41+0x80);Write_dat((timebuf[2]%16)+0x30);Write_com(0x42+0x80);Write_dat(':');Write_com(0x43+0x80);Write_dat((timebuf[1]/16)+0x30);Write_com(0x44+0x80);Write_dat((timebuf[1]%16)+0x30);Write_com(0x45+0x80);Write_dat(':');Write_com(0x46+0x80);Write_dat((timebuf[0]/16)+0x30);Write_com(0x47+0x80);Write_dat((timebuf[0]%16)+0x30); }void display_gai(){ //uchar k;Write_com(0x00+0x80);Write_dat('2');Write_com(0x01+0x80);Write_dat('0');Write_com(0x02+0x80);Write_dat((timebuf1[6]/10)+0x30); Write_com(0x03+0x80);Write_dat((timebuf1[6]%10)+0x30); Write_com(0x04+0x80);Write_dat('-');Write_com(0x05+0x80);Write_dat((timebuf1[4]/10)+0x30); Write_com(0x06+0x80);Write_dat((timebuf1[4]%10)+0x30); Write_com(0x07+0x80);Write_dat('-');Write_com(0x08+0x80);Write_dat((timebuf1[3]/10)+0x30); Write_com(0x09+0x80);Write_dat((timebuf1[3]%10)+0x30); Write_com(0x0b+0x80);Write_dat((timebuf1[5]%10)+0x30); Write_com(0x0c+0x80);Write_dat('t');Write_com(0x0d+0x80);Write_dat('h');Write_com(0x0e+0x80);Write_dat(' ');Write_com(0x0f+0x80);Write_dat(' ');Write_com(0x40+0x80);Write_dat((timebuf1[2]/10)+0x30); Write_com(0x41+0x80);Write_dat((timebuf1[2]%10)+0x30); Write_com(0x42+0x80);Write_dat(':');Write_com(0x43+0x80);Write_dat((timebuf1[1]/10)+0x30); Write_com(0x44+0x80);Write_dat((timebuf1[1]%10)+0x30); Write_com(0x45+0x80);Write_dat(':');Write_com(0x46+0x80);Write_dat((timebuf1[0]/10)+0x30); Write_com(0x47+0x80);Write_dat((timebuf1[0]%10)+0x30);}void read1302_all(uchar addr,uchar *shu){ uchar i;DS_RST=0;DS_SCLK=0;DS_RST=1;EA=0;DS1302WriteByte(addr);for(i=0;i<N;i++){shu[i]=DS1302ReadByte();}DS_SCLK=1;DS_RST=0;EA=1;}void Write1302_All(uchar *p,uchar addr){uchar i;Write1302(DS1302_CONTROL,0X00);DS_RST=0;DS_SCLK=0;DS_RST=1;EA=0;DS1302WriteByte(addr); //地址for(i=0;i<N;i++){DS1302WriteByte(*(p+i));}DS_SCLK=1;DS_RST=0;EA=1;Write1302(DS1302_CONTROL,0X80);}/************************************************ 延时函数*功能: 可随意设置延时时间,延时时间为tt ms.晶振为12MHz *************************************************/ void delay1ms(unsigned int tms){unsigned char i;while(tms--)for(i=123;i>0;i--);}/****************************************** 读相应地址的数据******************************************/ void display_set_time(){ Write_com(0x00+0x80);Write_dat('T');Write_com(0x01+0x80);Write_dat('1');Write_com(0x02+0x80);Write_dat(':');Write_com(0x03+0x80);Write_dat((time1_hour/10)+0x30);Write_com(0x04+0x80);Write_dat((time1_hour%10)+0x30);Write_com(0x05+0x80);Write_dat(':');Write_com(0x06+0x80);Write_dat((time1_minute/10)+0x30);Write_com(0x07+0x80);Write_dat((time1_minute%10)+0x30);Write_com(0x09+0x80);Write_dat('D');Write_com(0x08+0x80);Write_dat(' ');Write_com(0x0a+0x80);Write_dat(':');Write_com(0x0b+0x80);Write_dat((time3_yue/10)+0x30);Write_com(0x0c+0x80);Write_dat((time3_yue%10)+0x30);Write_com(0x0d+0x80);Write_dat('-');Write_com(0x0e+0x80);Write_dat((time3_day/10)+0x30);Write_com(0x0f+0x80);Write_dat((time3_day%10)+0x30);Write_com(0x40+0x80);Write_dat('T');Write_com(0x41+0x80);Write_dat('2');Write_com(0x42+0x80);Write_dat(':');Write_com(0x43+0x80);Write_dat((time2_hour/10)+0x30);Write_com(0x44+0x80);Write_dat((time2_hour%10)+0x30);Write_com(0x45+0x80);Write_dat(':');Write_com(0x46+0x80);Write_dat((time2_minute/10)+0x30);Write_com(0x47+0x80);Write_dat((time2_minute%10)+0x30); }void time_compare(){ uchar k;yue_set=yue/16*10+yue%16;day_set=day/16*10+day%16;hour_set=hour/16*10+hour%16; minute_set=minute/16*10+minute%16; if(t_open==1){ if(hour_set>time1_hour){ for(k=0;k<3;k++){ Write_com(0x00+0x80+k);Write_dat(0xff);}bell();}if(hour_set==time1_hour){ if(minute_set>=time1_minute){ for(k=0;k<3;k++){ Write_com(0x00+0x80+k);Write_dat(0xff);}bell();}}}if(t_open==2){ if(hour_set>time2_hour){ for(k=0;k<3;k++){ Write_com(0x40+0x80+k);Write_dat(0xff);}bell();}if(hour_set==time2_hour){ if(minute_set>=time2_minute){ for(k=0;k<3;k++){ Write_com(0x40+0x80+k);Write_dat(0xff);bell();}}}if(t_open==3){ if(yue_set<time3_yue){ for(k=0;k<2;k++){ Write_com(0x09+0x80+k);Write_dat(0xff);}bell();}if(yue_set==time3_yue){ if(day_set<=time3_day){ for(k=0;k<2;k++){ Write_com(0x09+0x80+k);Write_dat(0xff);}bell();}else{ sound=1;}}if(yue_set>time3_yue){ sound=1;}}if(t_open==4){ if(yue_set<time3_yue){ for(k=0;k<2;k++){ Write_com(0x09+0x80+k);Write_dat(0xff);}bell();}if(yue_set==time3_yue){ if(day_set<=time3_day){ for(k=0;k<2;k++){ Write_com(0x09+0x80+k);Write_dat(0xff);}bell();else{ sound=1;}}if(yue_set>time3_yue){ sound=1;}if(hour_set>time2_hour){ for(k=0;k<3;k++){ Write_com(0x40+0x80+k);Write_dat(0xff);}bell();}if(hour_set==time2_hour){ if(minute_set>=time2_minute){ for(k=0;k<3;k++){ Write_com(0x40+0x80+k);Write_dat(0xff);}bell();}}if(hour_set>time1_hour){ for(k=0;k<3;k++){ Write_com(0x00+0x80+k);Write_dat(0xff);}bell();}if(hour_set==time1_hour){ if(minute_set>=time1_minute){ for(k=0;k<3;k++){ Write_com(0x00+0x80+k);Write_dat(0xff);}bell();}}}}main(){ lcd_init();close_led();init_mcu();Init_DS1302();SET_DS1302();time_mod=0;set_mod=0;time1_hour=7;time1_minute=30;time2_hour=23;time2_minute=30;time3_yue=4;time3_day=16;t_open=0;flag7=0;add_dec_flag=0;sound=1;flag_control=0;read1302_all(0xff,chun);Write1302_All(chun,0xbe);read1302_all(0xbf,timebuf);time_change=0;flag_wr=0;flag_wr_zhi=0;/* time_rst=0; */while(1){ uchar j;lcd_en=0;LEDCLK=0;LEDDIN=0;_nop_();LEDCLK=1;for(j=0;j<8;j++){ Read_Key();delayms(2);LEDCLK=0;LEDDIN=1;_nop_();LEDCLK=1;}keyscan();Key_job();lcd_en=0;LEDDIN=1;if(flag7==0){/* second=Read1302(DS1302_SECOND);minute=Read1302(DS1302_MINUTE);hour=Read1302(DS1302_HOUR);day=Read1302(DS1302_DAY);yue=Read1302(DS1302_MONTH);week=Read1302(DS1302_WEEK);year=Read1302(DS1302_YEAR); */ read1302_all(0xbf,timebuf);flag_wr=0;}else{if(flag_wr_zhi==1){ flag_wr_zhi=0;write_gai();}}Write1302_All(timebuf,0xfe);/* if(time_rst==0){second=Read1302(DS1302_SECOND);minute=Read1302(DS1302_MINUTE);hour=Read1302(DS1302_HOUR);day=Read1302(DS1302_DAY);yue=Read1302(DS1302_MONTH);week=Read1302(DS1302_WEEK);year=Read1302(DS1302_YEAR);Write1302_All(timebuf,0xfe);}if(time_rst==1){ read1302_all(0xff,chun);Write1302_All(chun,0xbe);read1302_all(0xff,timebuf);time_rst=0;} */lcd_rw=0;if(flag7==0){if(time_mod==0){display1_date();}else{ display_set_time();}}else{ display_gai();}display_key();LEDDIN=1;lcd_rw=0;time_compare();}}。