电子日历时钟程序
- 格式:doc
- 大小:41.50 KB
- 文档页数:7
ORG 0SJMP ONEORG 0003HLJMP ELEVENORG 000BHLJMP NINEORG 001BHLJMP TEN//数据初始化ONE:LED1 EQU 30H ;数码管12显示缓存LED3 EQU 31H ;数码管34显示缓存LED5 EQU 32H ;数码管56显示缓存COUNT EQU 33H ;定时器T0(用来走时)计数值存储器(计数中断20次到1秒)COUNTS EQU 34H ;定时器T1(用来预置)计数值存储器(计数中断15次到预置值加一)HOUR EQU 40H ;以下为时间,日期,闹铃时间,生日的存储地址MIN EQU 41HSECOND EQU 22HYEAR EQU 50HMONTH EQU 23HDAY EQU 52HRH EQU 60H ;闹铃小时RM EQU 61H ;闹铃分RE EQU 62H ;闹铃使能RHH EQU 63H ;闹铃小时RMM EQU 64H ;闹铃分REE EQU 65H ;闹铃使能MOV LED1,#0MOV LED3,#0MOV LED5,#0MOV COUNT,#0MOV COUNTS,#0MOV HOUR,#0MOV MIN,#0MOV SECOND,#0MOV YEAR,#0 //附初值MOV MONTH,#1MOV DAY,#1MOV RH,#0MOV RM,#0MOV RE,#0 //闹铃1初值MOV RHH,#0MOV RMM,#0MOV REE,#0 //闹铃 2 初值SS BIT 01H ;set symbol预置信号(按下中断预置为1,便开始闪烁和预置)GS BIT 02H ;glistensymbol闪烁标志CLR SSCLR GSMOV IP,#02H;中断优先级:T0>INT0>T1MOV TMOD,#11HMOV IE,#8BHSETB IT0MOV TH0,#3CH ;50msMOV TL0,#0B0HSETB TR0MOV R1,#50 ;显示延时用MOV R0,#0 ;显示延时用;**************************************************************TWO检测开关号TWO :MOV P0,#0FFHJB P0.5,TWO1MOV RE,#00H ;00表示闹铃1无效MOV REE,#00H ;00表示闹铃2无效SJMP TWO2TWO1:MOV RE,#01HMOV REE,#01HTWO2:JB P0.0,TWO4 //推上S0时显示闹铃1JB P0.1,TWO3 //推上S1时显示日期JB P0.7,TWO5 //推上S7时显示闹铃2MOV LED1,HOUR //不推是显示时间MOV LED3,MINMOV LED5,SECONDSJMP THREETWO3:MOV LED1,YEAR //数码管显示年月日MOV LED3,MONTHMOV LED5,DAYSJMP THREETWO4:MOV LED1,RHMOV LED3,RM //数码管显示定时时间MOV LED5,RESJMP THREETWO5:MOV LED1,RHHMOV LED3,RMM //数码管显示第二个定时MOV LED5,REESJMP THREE;************************************** THREE显示主程序(同时包含了闹铃,预置闪烁,闹铃功能)THREE:MOV P1,#0SETB P1.6SETB P1.7MOV P0,#0FFHMOV DPTR,#TAB3 //调用段选JNB SS,THREEB ;判断预置信号是否有效,预置有效则转入判断闪烁显示模块,否则转入正常显示模SJMP THREE0THREEB:LJMP THREE11 ;THREE11是正常显示并判断整点报时及闹铃模块THREE0:JNB P0.3,THREE1 ;开始是判断闪烁显示,这句判断是否预置分/月/闹铃分JNB GS,THREE1 ;是否闪烁?GS=0转移LCALL TWELVE ;闪烁则调用延时不显示LED34SJMP THREE4THREE1:MOV A,LED3ANL A,#0FHMOVC A,@A+DPTRMOV P2,ATHREE2:SETB P1.3NOPDJNZ R0,THREE2CLR P1.3MOV A,LED3SWAP AANL A,#0FHMOVC A,@A+DPTRMOV P2,ATHREE3:SETB P1.2NOPDJNZ R0,THREE3CLR P1.2JNB P0.2,THREE4 ;判断是否预置小时/年/闹铃的小时JNB GS,THREE4 ;是否显示小时/年/闹铃的小时LCALL TWELVESJMP THREE7THREE4:MOV A,LED1ANL A,#0FHMOVC A,@A+DPTRMOV P2,ATHREE5:SETB P1.1NOPDJNZ R0,THREE5CLR P1.1MOV A,LED1SW AP AANL A,#0FHMOVC A,@A+DPTRMOV P2,ATHREE6:SETB P1.0;P1.0置1,点亮数码管NOPDJNZ R0,THREE6;让数码管亮的时间长一些CLR P1.0JB P0.0,THREE7;P0.0=1,键S0打开(看定时),转移JB P0.7,THREE7;P0.7=1,键S7打开(看定时),转移JNB P0.1,THREE7;P0.1=0,键S1闭合,可调时间,P0.1=1键S1打开可调日期JB P0.3,THREE7JNB P0.4,THREE7JNB GS,THREE7LCALL TWELVE;程序顺序执行时,调用12延时程序SJMP THREE10THREE7:MOV A,LED5ANL A,#0FHMOVC A,@A+DPTRMOV P2,ATHREE8:SETB P1.5NOPDJNZ R0,THREE8CLR P1.5MOV A,LED5SW AP AANL A,#0FHMOVC A,@A+DPTRMOV P2,ATHREE9:SETB P1.4NOPDJNZ R0,THREE9CLR P1.4THREE10:DJNZ R1,TWOASJMP TWOBTWOA: LJMP TWOTWOB: MOV R1,#50 ;判断闪烁一次是否完成CPL GS ;取反闪烁标志,用于控制闪烁的亮和灭LJMP TWO ;一轮显示完后再判断开关号;**************************正常显示THREE11:LCALL EIGHT ;判断是否取反P1.6即输出闹铃或整点报时,以下每次显示都要调用一次LCALL EIGHMOV A,LED3 ;开始正常显示时间及判断闹铃输出ANL A,#0FHMOVC A,@A+DPTRMOV P2,ATHREE13:SETB P1.3NOPDJNZ R0,THREE13CLR P1.3MOV A,LED3SW AP A;高四位与低四位互换ANL A,#0FH;取低四位MOVC A,@A+DPTRMOV P2,ATHREE14:SETB P1.2NOPDJNZ R0,THREE14CLR P1.2LCALL EIGHTLCALL EIGHMOV A,LED1ANL A,#0FHMOVC A,@A+DPTRMOV P2,ATHREE15:SETB P1.1NOPDJNZ R0,THREE15 //减一条件指令CLR P1.1MOV A,LED1swap aANL A,#0FHMOVC A,@A+DPTRMOV P2,A;把段码值送P2THREE16:SETB P1.0NOPDJNZ R0,THREE16CLR P1.0LCALL EIGHTLCALL EIGHMOV A,LED5ANL A,#0FHMOVC A,@A+DPTRMOV P2,ATHREE17:SETB P1.5NOPDJNZ R0,THREE17CLR P1.5MOV A,LED5SW AP AANL A,#0FHMOVC A,@A+DPTRMOV P2,ATHREE18:SETB P1.4NOPDJNZ R0,THREE18CLR P1.4LJMP TWO ;一轮显示完后判开关TAB3: db0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,83H,0C0H,0C0H,0C0H;0.1.2.3.4.5.6.7.8.9;******************************************************************EIGHT判断是否闹铃子程序EIGHT:MOV A,RECJNE A,#01H,EIGHT1MOV A,MINCJNE A,RM,EIGHT1MOV A,HOURCJNE A,RH,EIGHT1SJMP EIGHT0 ;闹铃时间到则CPLP1.6一次EIGHT0:CPL P1.6EIGHT1: RETEIGH:MOV A,REECJNE A,#01H,EIGH1MOV A,MINCJNE A,RMM,EIGH1MOV A,HOURCJNE A,RHH,EIGH1SJMP EIGH0 ;闹铃时间到则CPLP1.7一次EIGH0:CPL P1.7EIGH1: RET;******** NINE中断(T0)计时程序(包含了秒-分-时-日-月-年间的进位及判断大小月,平闰年)NINE:MOV TH0,#3CH ;开定时器MOV TL0,#0B0HSETB TR0INC COUNTMOV A,COUNTCJNE A,#20,INEAA //相等不转移SJMP AAAINEAA:LJMP NINE1//时钟走时设计程序AAA:MOVCOUNT,#0 ; 计时MOV A,SECONDADD A,#01DA A ;换成bcd码以方便显示MOV SECOND,ACJNE A,#60H,INEAAMOV SECOND,#0MOV A,MINADD A,#01DA AMOV MIN,ACJNE A,#60H,INEAAMOV MIN,#0MOV A,HOURADD A,#01DA AMOV HOUR,ACJNE A,#24H,INEAAMOV HOUR,#0MOV A,DAYADD A,#01DA AMOV DAY,A ;************************判断平闰年及大小月MOV A,MONTHCJNE A,#02H,TEN6AMOV A,YEAR ;把年由BCD码换成二进制码ANL A,#0F0HSW AP AMOV B,#10MUL ABMOV 24H,AMOV A,YEARANL A,#0FHADD A,24HJB ACC.0,TEN5A ;二进制码后两位为00表示为闰年JB ACC.1,TEN5AMOV 24H,#01MOV A,DAYCJNE A,#30H,NINE1MOV DAY,#1SJMP NINE0TEN5A:MOV A,DAYCJNE A,#29H,NINE1MOV DAY,#1SJMP NINE0;**判断大小月;大于等于8月时双月为大月,小于8月时单月为大月,大月31天小月30天TEN6A:MOV A,MONTHCJNE A,#08H,TEN7ATEN7A:JC TEN9AJB 18H,TEN8AMOV A,DAYCJNE A,#32H,NINE1MOV DAY,#1SJMP NINE0TEN8A:MOV A,DAYCJNE A,#31H,NINE1MOV DAY,#1SJMP NINE0TEN9A:JNB 18H,TEN10AMOV A,DAYCJNE A,#32H,NINE1MOV DAY,#1SJMP NINE0TEN10A:MOV A,DAYCJNE A,#31H,NINE1MOV DAY,#1;*******************NINE0:MOV A,MONTHADD A,#01DA AMOV MONTH,ASETB 05HCJNE A,#13H,NINE1MOV MONTH,#1MOV A,YEARADD A,#01DA AMOV YEAR,ANINE1:RETI;*****************************************TEN中断(T1)预置加一程序由INT0控制其的开启与关闭;*******************判断预置项目TEN:MOV TH1,#3CHMOV TL1,#0B0HSETB TR1INC COUNTSMOV A,COUNTSCJNE A,#15,TENEMOV COUNTS,#0JB P0.0,RBRBJB P0.7,QQ //0.7为1转移JB P0.1,DATSJMP TIMEDAT: LJMP DATERBRB:LJMP RTIMEQQ: LJMP RTIMEETENE:RETI;**********************预置时间TIME: JNB P0.3,TEN1 //0转移MOV A,MINADD A,#01DA AMOV MIN,ACJNE A,#60H,TENA //分加判60反回MOV MIN,#0SJMP TENATEN1:JNB P0.2,TENAMOV A,HOURADD A,#01 //十加判24返回DA AMOV HOUR,ACJNE A,#24H,TENAMOV HOUR,#0TENA:RETI;******************预置日期DATE:JNB P0.3,TEN3MOV A,MONTHADD A,#01DA AMOV MONTH,ACJNE A,#13H,TENB//12个月MOV MONTH,#1SJMP TENB //返回TEN3:JNB P0.2,TEN4MOV A,YEARADD A,#01DA AMOV YEAR,ASJMP TENBTEN4:JNB P0.4,TENBMOV A,DAYADD A,#01DA AMOV DAY,A;***************判断平闰年MOV A,MONTHCJNE A,#02H,TEN6 //相等不转移//2月的判断MOV A,YEARANL A,#0F0HSW AP AMOV B,#10MUL ABMOV 24H,AMOV A,YEARANL A,#0FHADD A,24HJB ACC.0,TEN5JB ACC.1,TEN5MOV A,DAYCJNE A,#30H,TENBMOV DAY,#1SJMP TENBTEN5:MOV A,DAYCJNE A,#29H,TENBMOV DAY,#1SJMP TENB;**************判断大小月TEN6:CJNE A,#08H,TEN7TEN7:JC TEN9JB 18H,TEN8MOV A,DAYCJNE A,#32H,TENBMOV DAY,#1SJMP TENBTEN8:MOV A,DAYCJNE A,#31H,TENBMOV DAY,#1SJMP TENBTEN9:JNB 18H,TEN10MOV A,DAYCJNE A,#32H,TENBMOV DAY,#1SJMP TENBTEN10:MOV A,DAYCJNE A,#31H,TENBMOV DAY,#1TENB: RETI;**************************预置闹铃时间RTIME:JNB P0.3,TEN12;P0.3=0时转移MOV A,RMADD A,#01DA AMOV RM,ACJNE A,#60H,TENCMOV RM,#0SJMP TENCTEN12:JNB P0.2,TENCMOV A,RHADD A,#01DA AMOV RH,ACJNE A,#24H,TENCMOV RH,#0TENC:RETIRTIMEE:JNB P0.3,TEN121MOV A,RMMADD A,#01DA AMOV RMM,ACJNE A,#60H,TENC1MOV RMM,#0SJMP TENC1TEN121:JNB P0.2,TENC1MOV A,RHHADD A,#01DA AMOV RHH,ACJNE A,#24H,TENC1MOV RH,#0TENC1:RETI;*******************************ELEVEN中断(INT0)控制了预置的开\关的清除ELEVEN: JNBSS,ELEVEN2 ;预置有效时按一次INT0关预置CLR SSCLR TR1SJMP ELEVEN3ELEVEN2:SETB SS ;都无效则令预置有效MOV TH1,#3CHMOV TL1,#0B0HSETB TR1ELEVEN3:RETI;*******************************TWELVE 延时小程序TWELVE:MOV P1,#0MOV P2,#0DJNZ R0,TWELVETWELVE1:MOV P1,#0MOV P2,#0DJNZ R0,TWELVE1RETEND。
该程序为51单片机c语言电子万年历#include"reg52.h"//#include<stdio.h>#define uchar unsigned char#define uint unsigned intsbit lcden=P3^4;sbit lcdrs=P3^5;sbit DATA=P0^7;sbit RST=P0^5;sbit SCLK=P0^6;sbit menu=P3^0; //菜单sbit add=P3^1; //加一sbit dec=P3^7; //减一sbit led0=P1^0;sbit led1=P1^1;sbit led2=P1^2;sbit led3=P1^3;sbit ds=P3^2;//sbit beep=P3^3;uint temp;float f_temp;uint warn_l1=270;uint warn_l2=250;uint warn_h1=300;uint warn_h2=320;uint get_temp();void delayms(uint x);void write_com(uchar com);void write_data(uchar date);void init();void dis_temp(uint t);void Write1302(uchar dat);void WriteSet1302(uchar Cmd,uchar dat);uchar Read1302(void);uchar ReadSet1302(uchar Cmd);void Init_DS1302(void);void DisplaySecond(uchar x);void DisplayMinute(uchar x);void DisplayHour(uchar x);void DisplayDay(uchar x);void DisplayMonth(uchar x);void DisplayYear(uchar x);void DisplayWeek(uchar x);void dis_temp(uint t);void read_date(void);void turn_val(char newval,uchar flag,uchar newaddr,uchar s1num);void key_scan(void);char code table[]="0123456789" ;uchar code table2[]= "TUEWESTHUFRISATSUNMON"; uchar second,minute,hour,day,month,year,week,count=0; uchar ReadValue,num,time;void delayms(uint x){uint i,j;for(i=x;i>0;i--)for(j=110;j>0;j--);}////////////////////////////////////////////////////////////void write_com(uchar com){lcdrs=0;P2=com;delayms(5);lcden=1;delayms(5);lcden=0;}void write_data(uchar date){lcdrs=1;P2=date;delayms(5);lcden=1;delayms(5);lcden=0;}void init(){lcden=0;write_com(0x38);write_com(0x0c);write_com(0x06);write_com(0x01);}/////////////////////////////////////////////////////////////////void Write1302(uchar dat){uchar i;SCLK=0; //拉低SCLK,为脉冲上升沿写入数据做好准备 delayms(2); //稍微等待,使硬件做好准备for(i=0;i<8;i++) //连续写8个二进制位数据DATA=dat&0x01; //取出dat的第0位数据写入1302delayms(2); //稍微等待,使硬件做好准备SCLK=1; //上升沿写入数据delayms(2); //稍微等待,使硬件做好准备SCLK=0; //重新拉低SCLK,形成脉冲dat>>=1; //将dat的各数据位右移1位,准备写入下一个数据位 }}void WriteSet1302(uchar Cmd,uchar dat){RST=0; //禁止数据传递SCLK=0; //确保写数居前SCLK被拉低RST=1; //启动数据传输delayms(2); //稍微等待,使硬件做好准备Write1302(Cmd); //写入命令字Write1302(dat); //写数据SCLK=1; //将时钟电平置于已知状态RST=0; //禁止数据传递}uchar Read1302(void){uchar i,dat;delayms(2); //稍微等待,使硬件做好准备for(i=0;i<8;i++) //连续读8个二进制位数据dat>>=1; //将dat的各数据位右移1位,因为先读出的是字节的最低位if(DATA==1) //如果读出的数据是1dat|=0x80; //将1取出,写在dat的最高位SCLK=1; //将SCLK置于高电平,为下降沿读出delayms(2); //稍微等待SCLK=0; //拉低SCLK,形成脉冲下降沿delayms(2); //稍微等待}return dat; //将读出的数据返回}uchar ReadSet1302(uchar Cmd){uchar dat;RST=0; //拉低RSTSCLK=0; //确保写数居前SCLK被拉低RST=1; //启动数据传输Write1302(Cmd); //写入命令字dat=Read1302(); //读出数据SCLK=1; //将时钟电平置于已知状态RST=0; //禁止数据传递return dat; //将读出的数据返回}void Init_DS1302(void){WriteSet1302(0x8E,0x00); //根据写状态寄存器命令字,写入不保护指令WriteSet1302(0x80,((0/10)<<4|(0%10))); //根据写秒寄存器命令字,写入秒的初始值WriteSet1302(0x82,((59/10)<<4|(59%10))); //根据写分寄存器命令字,写入分的初始值WriteSet1302(0x84,((23/10)<<4|(23%10))); //根据写小时寄存器命令字,写入小时的初始值WriteSet1302(0x86,((28/10)<<4|(28%10))); //根据写日寄存器命令字,写入日的初始值 WriteSet1302(0x88,((2/10)<<4|(2%10))); //根据写月寄存器命令字,写入月的初始值WriteSet1302(0x8c,((14/10)<<4|(14%10))); //nian//WriteSet1302(0x8a,((4/10)<<4|(4%10)));}/////////////////////////////////////////////////////////////////void DisplaySecond(uchar x){uchar i,j;i=x/10;j=x%10;write_com(0x80+0x46);write_data(i+0x30);write_com(0x80+0x47);write_data(j+0x30);write_com(0x80+0x48);write_data(' ');dis_temp(get_temp());}void DisSecond(uchar x){uchar i,j;ReadValue = ReadSet1302(0x81);second=((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);i=x/10;j=x%10;write_com(0x80+0x46);write_data(i+0x30);write_com(0x80+0x47);write_data(j+0x30);}void DisplayMinute(uchar x) {uchar i,j;i=x/10;j=x%10;write_com(0x80+0x43);write_data(i+0x30);write_com(0x80+0x44);write_data(j+0x30);write_com(0x80+0x45);write_data(':');}void DisplayHour(uchar x){uchar i,j;i=x/10;j=x%10;write_com(0x80+0x40);write_data(i+0x30);write_com(0x80+0x41);write_data(j+0x30);write_com(0x80+0x42);write_data(':');}void DisplayDay(uchar x) {uchar i,j;i=x/10;j=x%10;write_com(0x89);write_data(i+0x30);write_com(0x8a);write_data(j+0x30); }void DisplayMonth(uchar x) {uchar i,j;i=x/10;j=x%10;write_com(0x86);write_data(i+0x30); write_com(0x87);write_data(j+0x30);write_com(0x88);write_data('/');}void DisplayYear(uchar x) {uchar i,j;i=x/10;j=x%10;write_com(0x81);write_data(2+0x30);write_com(0x82);write_data(0+0x30);write_com(0x83);write_data(i+0x30);write_com(0x84);write_data(j+0x30);write_com(0x85);write_data('/');}void DisplayWeek(uchar x){ uchar i;x=x*3;// write_com(0x8c);write_data(table2[x]);// write_com(0x8d);write_data(table2[x+1]);// write_com(0x8e);write_data(table2[x+2]);write_com(0x8c);for(i=0;i<3;i++){write_data(table2[x]);x++;}}void read_date(void){ReadValue = ReadSet1302(0x81);second=((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F); ReadValue = ReadSet1302(0x83);minute=((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);ReadValue = ReadSet1302(0x85);hour=((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);ReadValue = ReadSet1302(0x87);day=((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);ReadValue = ReadSet1302(0x89);month=((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);ReadValue = ReadSet1302(0x8d);year=((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);ReadValue=ReadSet1302(0x8b); //读星期week=ReadValue&0x07;DisplayYear(year);DisplayMonth(month);DisplayDay(day);DisplayWeek(week);DisplayHour(hour);DisplayMinute(minute);DisplaySecond(second);dis_temp(get_temp()); ///温度显示key_scan(); ///按键检测}void turn_val(char newval,uchar flag,uchar newaddr,uchar s1num){newval=ReadSet1302(newaddr); //读取当前时间newval=((newval&0x70)>>4)*10+(newval&0x0f); //将bcd码转换成十进制 if(flag) //判断是加一还是减一{newval++;switch(s1num){ case 1: if(newval>99) newval=0;DisplayYear(newval);break;case 2: if(newval>12) newval=1;DisplayMonth(newval);break;case 3: if(newval>31) newval=1;DisplayDay(newval);break;case 4: if(newval>6) newval=0;DisplayWeek(newval);break;case 5: if(newval>23) newval=0;DisplayHour(newval);break;case 6: if(newval>59) newval=0;DisplayMinute(newval);break;case 7: if(newval>59) newval=0;DisplaySecond(newval);break;default:break;}}else{newval--;switch(s1num){ case 1: if(newval==0) newval=99;DisplayYear(newval);break;case 2: if(newval==0) newval=12;DisplayMonth(newval);break;case 3: if(newval==0) newval=31;DisplayDay(newval);break;case 4: if(newval<0) newval=6;DisplayWeek(newval);break;case 5: if(newval<0) newval=23;DisplayHour(newval);break;case 6: if(newval<0) newval=59;DisplayMinute(newval);break;case 7: if(newval<0) newval=59;DisplaySecond(newval);break;default:break;}}WriteSet1302((newaddr-1),((newval/10)<<4)|(newval%10)); //将新数据写入寄存器}//////////////////////////////////////void dsreset(void){uint i;ds=0;i=103;while(i>0)i=4;while(i>0)i--;}bit tempreadbit(void){uint i;bit dat;ds=0;i++;ds=1;i++;i++;dat=ds;i=8;while(i>0)i--;return(dat);}uchar tempread(void){uchar i,j,dat;dat=0;for(i=1;i<=8;i++){j=tempreadbit();dat=(j<<7)|(dat>>1); }return(dat);}void tempwritebyte(uchar dat) {bit testb;for(j=1;j<=8;j++){testb=dat&0x01;dat=dat>>1;if(testb){ds=0;i++;i++;ds=1;i=8;while(i>0)i--;}else{ds=0;i=8;while(i>0)i--;ds=1;i++;i++;}}}void tempchange(void) {dsreset();delayms(1);tempwritebyte(0xcc);tempwritebyte(0x44);key_scan(); //////按键函数}uint get_temp(){uchar a,b;tempchange(); //////温度函数dsreset();delayms(1);tempwritebyte(0xcc);tempwritebyte(0xbe);a=tempread();b=tempread();temp=b;temp<<=8;temp=temp|a;f_temp=temp*0.0625;temp=f_temp*10+0.5;f_temp=f_temp+0.05;return temp;}//////void dis_temp(uint t){uchar n1,n2,n3;n1=t/100;n2=t%100/10;n3=t%100%10;DisSecond(second); ///秒显示 write_com(0x80+0x49);write_data(table[n1]);//delayms(5);write_com(0x80+0x4a);write_data(table[n2]);//delayms(5);write_com(0x80+0x4b);write_data('.');// delayms(5);write_com(0x80+0x4c);write_data(table[n3]);//delayms(5);write_com(0x80+0x4d);write_data('^');//delayms(5);write_com(0x80+0x4e);write_data('C');//delayms(5);DisSecond(second); ////秒显示}/*********************液晶显示*****************/ void warn(uint s,uchar led){uchar i;i=s;// beep=0;P1=~(led);while(i--){dis_temp(get_temp());}// beep=1;P1=0xff;i=s;while(i--){dis_temp(get_temp());}}void deal(uint t){uchar i;if((t>warn_l2)&&(t<=warn_l1)){warn(40,0x01);}else if(t<=warn_l2){warn(10,0x03);}else if((t<warn_h2)&&(t>=warn_h1)) {warn(40,0x04);}else if(t>=warn_h2){warn(10,0x0c);}else{i=40;while(i--){dis_temp(get_temp());DisSecond(second);}}}///////////////////////////////////////void main(){init();Init_DS1302();while(1){tempchange();read_date();deal(temp);key_scan();}}////******************************************* void key_scan(void){// uchar miao,s1num=0;uchar s1num=0;if(menu==0){delayms(5);if(menu==0){while(!menu);s1num++;while(1){if(menu==0){delayms(5);if(menu==0){while(!menu);s1num++;}}// miao=ReadSet1302(0x81);// second=miao;// WriteSet1302(0x80,miao|0x80);write_com(0x0f);//光标闪射if(s1num==1){ //year=ReadSet1302(0x8d);write_com(0x80+4); //年光标if(add==0){delayms(3);if(add==0){ while(!add);turn_val(year,1,0x8d,1);}}if(dec==0){delayms(3);if(dec==0){ while(!dec);turn_val(year,0,0x8d,1);}}}if(s1num==2){//month=ReadSet1302(0x89);write_com(0x80+7); //月光标if(add==0){delayms(3);if(add==0){ while(!add);turn_val(month,1,0x89,2);}}if(dec==0){delayms(3);if(dec==0){ while(!dec);turn_val(month,0,0x89,2);}}}if(s1num==3){ //day=ReadSet1302(0x87);write_com(0x80+10);//日光标{delayms(3);if(add==0){ while(!add);turn_val(day,1,0x87,3);}}if(dec==0){delayms(3);if(dec==0){ while(!dec);turn_val(day,0,0x87,3); //写入日寄存器 }}}if(s1num==4){ //week=ReadSet1302(0x8b);write_com(0x80+14); //星期光标if(add==0){delayms(3);if(add==0){ while(!add);turn_val(week,1,0x8b,4);}}if(dec==0){delayms(3);{ while(!dec);turn_val(week,0,0x8b,4);}}}if(s1num==5){// hour=ReadSet1302(0x85)write_com(0x80+0x40+1); //时光标if(add==0){delayms(3);if(add==0){ while(!add);turn_val(hour,1,0x85,5);}}if(dec==0){delayms(3);if(dec==0){ while(!dec);turn_val(hour,0,0x85,5);}}}if(s1num==6)//调时间分{ // minute=ReadSet1302(0x83);write_com(0x80+0x40+4);if(add==0){delayms(5);if(add==0){ while(!add);turn_val(minute,1,0x83,6); //写入分寄存器}}if(dec==0){delayms(3);if(dec==0){ while(!dec);turn_val(minute,0,0x83,6); //写入分寄存器}}}if(s1num==7)//调时间秒{// second=ReadSet1302(0x81);write_com(0x80+0x40+7);//秒光标if(add==0){delayms(3);if(add==0){ while(!add);if(second==0x60)second=0x00;turn_val(second,1,0x81,7);}}if(dec==0){delayms(3);if(dec==0){ while(!dec);turn_val(second,0,0x81,7);}}}if(s1num==8){// miao=ReadSet1302(0x81);// second=miao;// WriteSet1302(0x80,second&0x7f);s1num=0;//s1num清零//write_com(0x0c);//光标不闪烁//break;}}}}}。
Flash制作电子日历时钟Flash制作电子日历时钟Flash MX中新增加了不少对象,如:Stage、System、Microphone、Camera、NetStream、Video等。
现在,Button、TextField、TextFormat对象也可以被当作基本对象使用了。
即影片剪辑、按钮和文本字段可以作为对象来使用。
可以在属性"面板"中给它们设置一个实例名称。
TextField和TextFormat对象可以设置、更改文本字段及其内容并设定其格式。
Flash MX支持Listener(监听对象)技术,如:FStyleFormat、Key、Mouse、Selection、Stage和TextField,这些对象可以通过addListener支持Listener。
今天我们来做一个电子日历和时间的实例。
效果简介:该实例是一个很普遍的电子日历效果。
因为许多效果都需要使用到时间,时间效果也是大家最喜欢和最想要学习的。
所以笔者就用这个效果来作为"攻克"对象的突破口。
制作要点:其实大部分对象并没有大家想得那么难掌握。
通过学习这个电子日历效果的制作,读者们不仅可以学到Date(时间)对象的使用方法,还可以对整个对象产生一个具体的认识。
制作步骤:设置场景的大小为240px×160px,背景色为黑色,帧频为15fps。
1.按快捷键Ctrl+F8,然后创建一个"背景"图形元件。
在"背景"的场景中按快捷键Ctrl+R打开"导入"面板导入一幅背景图。
如图7-2所示。
图片的大小应该和场景的大小一致。
图 22.把主场景中的"图层1"改名为"背景"层,打开库,把"背景"元件从库中拖拽到"背景"层中。
现在教大家一个调整背景图片和场景快速重叠的技巧。
摘要万年历的功能可实现年、月、日、时、分、秒和星期的显示。
随着社会的发展日历的功能越来越强大,精确度越来越高。
本次设计的日历采用DS1302时钟芯片,该芯片精确度高,性能可靠。
用LCD12864液晶屏,既可以显示数字又可以显示汉字,方便了人们的生活。
本设计总体分为硬件部分和软件部分。
硬件部分可分为:时钟芯片DS1302、AT89C51和LCD12864等。
本设计非常适合家庭使用。
电源采用+5V电压供电。
走时精确,是现代家庭必备的设备之一。
关键词:单片机,万年历, DS1302,时钟芯片1引言可调式电子日历与时钟小巧便于携带,界面清爽,一目了然,方便的知晓当前时间,并可对时间做出修改,实在是居家旅行日常生活之必备用品。
在现今的可调式电子日历与时钟具有性能稳定、精确度高、成本低、易于产品化,以及方便、实用等特点。
2.总体设计2.1基本原理硬件主要涉及到:AT89C51、DS1302、LCD12864等。
软件通过框图编写出程序。
AT89C51主要功能是存储程序、根据程序的内容对各个端口进行判断并做出相应的处理。
LCD12864主要的功能是实现年、月、日、时、分、秒的显示效果。
实时时钟DS1302可提供秒、分、时、日、星期、月和年,一个月小与31天时可以自动调整,且具有闰年补偿功能。
2.2系统总体框图及设计思路3.详细设计3.1 硬件设计3.1.1 DS1302芯片及原理介绍DS1302是美国DALLAS公司推出的一种高性能、低功耗的实时时钟芯片,附加31字节静态RAM,采用SPI三线接口与CPU进行同步通信,并可采用突发方式一次传送多个字节的时钟信号和RAM数据。
实时时钟可提供秒、分、时、日、星期、月和年,一个月小与31天时可以自动调整,且具有闰年补偿功能。
工作电压宽达2.5~5.5V。
采用双电源供电(主电源和备用电源),可设置备用电源充电方式,提供了对后背电源进行涓细电流充电的能力。
DS1302用于数据记录,特别是对某些具有特殊意义的数据点的记录上,能实现数据与出现该数据的时间同时记录,因此广泛应用于测量系统中。
#include<reg51.h>//#include"DS18B20_3.H"#define uint unsigned int#define uchar unsigned charuchar a,miao,shi,fen,ri,yue,nian,week,flag,key1n,temp,key4n;//sheding 为调节打铃时间时显示//flag用于读取头文件中的温度值,和显示温度值uchar codeSeg[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf}; unsigned int s_1,s_2,s_3,s_4,s_5,s_6;#define yh 0x80 //LCD第一行的初始位置,因为LCD1602字符地址首位D7恒定为1(100000000=80)#define er 0x80+0x40 //LCD第二行初始位置(因为第二行第一个字符位置地址是0x40)uchar flag_xs=0,flag_m,flag_m1,flag_f,flag_f1,flag_s,flag_s1;uchar flag_n,flag_n1,flag_y,flag_y1,flag_r,flag_r1,flag_mb;uint numt;//液晶屏的与C51之间的引脚连接定义(显示数据线接C51的P0口)//DS1302时钟芯片与C51之间的引脚连接定义sbit IO=P1^1;sbit SCLK=P1^0;sbit RST=P1^2;sbit ACC0=ACC^0;sbit ACC7=ACC^7;sbit nyr=P3^1;sbit sfm=P3^0;/************************************************************ACC累加器=AACC.0=E0HACC.0就是ACC的第0位。
计算机科学与技术学院硬件课程设计报告姓名:学号:专业:计算机科学与技术班级:设计题目:电子时钟万年历成员:指导教师:王凯职称:副教授2013年10月19 徐州课程设计指导教师评阅书指导教师评语:成绩:指导教师签字:年月日摘要计时精确的电子时钟日历在我们生活中能处处能见到。
钟表的数字化给人们生产生活带来了极大的方便,而且大大地扩展了钟表原先的报时功能。
本次课程设计我们做的是电子时钟日历,通过使用LCD液晶显示屏显示时间,脉冲是通过可编程8253芯片来提供的,其时间是通过8255来控制显示的,4*4数字键盘将要修改的时间提供给8255芯片,然后8255芯片控制LCD液晶显示屏修改显示的时间。
流程报告中有以下几个方面:任务设计与要求、总体方案、硬件设计、软件设计、结论及试验体会。
目录1 设计任务与要求 (2)1.1 提出问题 (2)1.1.1分析问题 (2)1.2.2解决问题 (2)2 总体方案 (2)2.1 总体方案概述 (3)2.2 8255芯片简介 (5)2.3 8253芯片简介 (8)2.4 液晶屏LCD简介 (14)3硬件设计 (10)3.1实物连接图 (17)3.2硬件电路图连接 (11)4 软件设计 (17)4.1原理框图 (17)4.2软件设计模块 (20)4.3 软件设计问题分析 (20)4.4体流程图 (20)4.5程序清单与注释 (21)4.6验结果 (43)5结论 (45)6体会 (45)7参考文献 (46)1 设计任务与要求1.1提出问题电子时钟日历是采用数字电路实现对年、月、日,时、分、秒、星期,数字显示的计时装置,由于数字集成电路的发展和石英晶体振荡器的广泛应用,使得数字钟的精度,远远超过老式钟表, 钟表的数字化给人们生产生活带来了极大的方便,而且大大地扩展了钟表原先报时功能。
诸如定时自动报警、按时自动打铃、时间程序自动控制、实时广播、自动起闭路灯、定时开关烘箱、通断动力设备、甚至各种定时电气的自动启用等,所有这些,都是以钟表数字化为基础的。
基于单片机的电子钟设计目录第一章电子时钟设计--—--—----————-—-—-—----—-—-——-——21.1 设计原理简介--————-—----—---——---———-----——-—-—-—21.2 设计功能-——--—-—————-———-—----————---——--——-——---—3第二章主要电路元器件介绍-—-———-———-—------———---32。
1 STC89C52 单片机简介—--—--—-—-—-—-—-—---—-——-———32。
1.1 单片机简介--——--——--——---—-—--————----—————--——-—-32。
1.2 主要特性---——-------—---—-—---————-—--—--———-—-—-—32.1.3 管脚功能说明—---———-———-———-——---—-————-—-—-—-————42.1。
4 LCD1602-—------——---—--—-——--———--——------——-—-—5第三章单元电路的硬件设计—-----————————————————--63.1 硬件原理框图—-———--—--——---—--—-—---------—--———-—-63。
2 单片机 STC89C52 系统的设计-—-—-—-—-————-—————-—----63。
3 时钟电路—————-----———-—---—-——---—--—-—-—-—--————--73.4 复位电路-----——-——--———-————-———-—----———---—--—-—-------—-—--—-——---—-—————-—---——--73。
5 键盘接口电路--—---—-———--—--——--——--——----———---——-83.6 LCD1602显示——---——————--—-—-——--——----—----———-————8第四章设计总原理图—-—-—---——-----—-———-9 第五章心得体会---—-------—————--——-—-——9第六章源程序---—-—-——-—-------———---—-——————-——----10前言:摘要数字钟已成为人们日常生活中必不可少的必需品,广泛用于个人家庭以及办公室等公共场所,给人们的生活、学习、工作、娱乐带来极大的方便.由于数字集成电路技术的发展和采用了先进的石英技术,使数字钟具有走时准确、性能稳定、携带方便等优点,它还用于计时、自动报时及自动控制等各个领域。
一、题目:电子实时时钟/万年日历系统二、功能要求:1.基本要求:⑴显示准确的北京时间(时、分、秒),可用24小时制式;⑵随时可以调校时间。
2.发挥要求:⑴增加公历日期显示功能(年、月、日),年号只显示最后两位;⑵随时可以调校年、月、日;⑶允许通过转换功能键转换显示时间或日期。
三、方案考虑:1、硬件方案:⑴显示器采用6位LED数码管(共阳),可分别显示时间或日期。
⑵显示器的驱动采用动态扫描电路形式,以达到简化电路的目的。
但要注意所需的驱动电流比静态驱动时要大,因此要增加驱动电路。
可采用74LS244或者晶体管;其中74ls244是用来驱动段选码,晶体管是驱动位选码。
⑶采用“一键多用方案”,以减少按键数目。
本方案采用了4按键。
⑷整体上要考虑:结构简单、布局美观、操作方便、成本低廉。
2、设计电路图如下:3、元件清单:(我们使用的是TX-1C开发板)⑴ 89C52 1个⑵IC座(40脚) 3个(其中1个用于接插89C51、2个用于接插LED段数码管)。
⑶ 74LS244 1个(用于驱动6个共阳的LED段数码管)。
⑷ IC座(20脚) 1个(用于接插74LS244)。
(5)显示器:LED_8段数码管(共阳型)6个三极管:(6)PNP(8550)6个(用于驱动6个共阳型LED段数码管)。
(7)微型开关:3个(其中1个用于复位电路、其它用于键盘)。
(8)晶体振荡器(12MHz):1个(用于振荡电路)。
(9)电阻器:⑴ 3KΩ 1个(用于系统复位电路)。
⑵ 1KΩ 6个(用作PNP三极管基极电阻)。
⑶ 100Ω 7个(驱动器用作74LS244输出限流电阻)。
(10)电容器:⑴ 10μF1个(用于系统复位电路)。
⑵ 30 pF 2个(用于系统振荡电路)。
(11)其它:⑴万能电路板(10×15):1块⑵焊锡条: 2米⑶带插头、座的电源端子: 1条⑷各种颜色外皮的导线:各1米(12)工具:1.电烙铁:1把2.剪钳:1把3.镊子:1把4.万用表:1个(13)设备:编程器(MEP300或TOP851)6个4、软件方案:(1)使用全汇编编写(2)时钟基准时间由单片机内部定时中断来提供,定时时间应该乘以一个整数得到,且不宜太长或太短,最长不能超过16位定时器的最长定时时间,最短不能少于定时中断服务程序的执行时间。
摘要围绕电子钟系统的设计与开发工作进行研究和实践,详细介绍了电子钟系统的整体结构、硬件设计、软件设计,系统方案以及其的开发和具体实现。
介绍一种基于在系统可编程技术和C51编译器配有集成开发的新型电子钟的设计方法,阐述了其工作原理和软硬件设计。
在硬件上,用KEIL公司的C51大规模集成芯片对其外围电路进行集成,用1片8051实现了几十片分离元件才能实现的功能,几乎将整个系统下载于同一芯片中,实现了所谓的片上系统,从而大大简化了系统结构,增强了系统的可靠性和性价比。
该电子钟特别适用于家庭、办公大楼、公共场所等。
关键词电子钟;单片机;硬件设计;软件设计ABSTRACTAround the electronic clock system design and development of the study and practice, details the electronic clock system overall, hardware design, software design, system solutions as well as the development and implementation. Introduction of a new technology based on in-system programming and C51 compiler equipped with an integrated development of new electronic clock design method, explains how it works and software and hardware design. In the hardware companies with KEIL C51 large-scale integrated circuit chip on its surrounding, to integrate 1 tablet 8051 implementation of scores of tablets separation components to implement functionality, almost the entire system for download on the same chip, implementation of the so-called SOC, thereby greatly simplifies system structure, enhances system reliability and high performance/price ratio. The electronic clock is particularly relevant for home, office buildings and public place, etc.Key words electronic clock; single-chip; hardware; software design目录1 系统总体设计方案 (4)1.1 设计课题任务 (4)1.2 功能要求说明 (4)1.3 总体方案介绍及工作原理 (4)2 硬件系统的设计 (6)2.1 系统各功能模块介绍 (6)2.2 系统电路图 (7)2.3 系统元器件清单 (7)3 软件系统的设计 (8)3.1设计使用单片机资源介绍 (8)3.2 软件系统各功能模块介绍 (8)3.3 软件系统程序流程框图 (9)3.4 软件系统的程序 (10)4 系统的仿真分析及结论 (11)4.1 系统设计的使用说明 (11)4.2 系统设计的仿真结果 (11)4.3 系统的误差分析 (12)4.4 设计体会 (12)4.5 教学建议 (13)参考文献 (14)致谢 (15)附录(1) (16)附录(2) (17)1 系统总体设计方案1.1 设计课题任务设计一个具有特定功能的电子钟。
C语言电子日历程序设计一、项目要求设计一款电子日历,通过选择,实现如下5项功能:选择操作:1选择操作:2选择操作:3,根据输入的年-月,显示月历。
选择操作:4,根据输入年,显示年历。
部分年历如下图所示。
选择操作:5二、编译环境 Visuall C++6.0 + EasyX(Visual C++ 6.0),采用C++程序。
1. 创建工程在Visual C++6.0中,选择“文件”—>“新建”,弹出如下界面。
先创建工程,选择“Win32 Console Application”工程,给出存储位置和工程名,点“确定”按钮。
后面选择默认,即可。
2. 在工程中创建C++文件在Visual C++6.0中,选择“文件”—>“新建”,弹出如下界面。
刚才创建工程名给出文件名,不要给扩展名,默认创建C++文件,扩展名为cpp 点“确定”按钮,完成C++文件创建。
界面效果如下图所示。
3. 添加类库因为C语言中的图形库头文件graphics.h是Dos环境下的,只能使用TurboC进行编译调试,TurboC2.0环境不是图形化可视界面,调试程序不如VC++6.0。
但在Visual C++6.0中,原有C语言中的图形库头文件graphics.h不可用,有些人员开发了DLL文件,让Visual C++6.0能识别C语言的graphics.h,方便利用C语言进行图形化的设计。
即,要进行图形化设计,需要安装EasyX,添加类库。
安装过程如下:(1)双击EasyX中的Setup文件,效果如下图所示。
单击“下一步”,选择你的开发平台,安装类库。
这里选择Visual C++6.0即可,点击“安装”,弹出安装成功,“关闭”即可。
三、相关知识1. 本项目涉及到的头文件#include <stdio.h>#include <stdlib.h>#include <graphics.h>#include <conio.h>#include <math.h>(1) graphics.h是TC里面的图形库,分为:像素函数、直线和线型函数、多边形函数、填充函数等。
源程序代码XTAL218XTAL119ALE 30EA31PSEN 29RST9P0.0/AD039P0.1/AD138P0.2/AD237P0.3/AD336P0.4/AD435P0.5/AD534P0.6/AD633P0.7/AD732P1.01P1.12P1.23P1.34P1.45P1.56P1.67P1.78P3.0/RXD 10P3.1/TXD 11P3.2/INT012P3.3/INT113P3.4/T014P3.7/RD17P3.6/WR 16P3.5/T115P2.7/A1528P2.0/A821P2.1/A922P2.2/A1023P2.3/A1124P2.4/A1225P2.5/A1326P2.6/A1427U1AT89C51D 714D 613D 512D 411D 310D 29D 18D 07E 6R W 5R S 4V S S1V D D 2V E E3LCD1LM016LR11k R21k R31k R41k R51k R61k R71k R81kR91kQ12N5088R10100LS1SPEAKERR111kK1K2X1CRYSTALC1220pC2220p电气04-404010104赵化正/******************************************************************************* *;按K1键,依次进入闹钟功能,闹钟时间,年,月,日和时,分,秒模式,直致退出设置状态* ;按K2键,调整是否起用闹钟和调节闹钟时,分,秒,年,月,日,时间的时,分,秒的数字*;闹钟响时,按K2 即可停止闹钟的声响*;K2和K1需要配合使用;设置状态,LCD 上排最前面显示"P",下排最前面设置闹钟时显示"alarm:",其他显示"time:" * ;闹钟启用时,在LCD 下排中间显示一小喇叭,闹钟禁用时,无此小喇叭*;年代变化2000--2099,星期自动转换*;**************变量的定义*****************RS BIT P2.0 ;LCD 数据/命令选择端(H/L)RW BIT P2.1 ;LCD读/写选择端(H/L)EP BIT P2.2 ;LCD 使能控制PRE BIT P1.7 ;调整键(K1)ADJ BIT P1.6 ;调整键(K2)SPK BIT P3.7 ;闹钟声音输出口YEAR DATA 18H ;年,月,日变量MONTH DATA 19HDATE DATA 1AHWEEK DATA 1BHHOUR DATA 1CH ;时,分,秒,百分之一秒变量MIN DATA 1DHSEC DATA 1EHSEC100 DATA 1FHHOUR_ARM DA TA 20H ;闹钟时,分,秒,变量MIN_ARM DA TA 21HSEC_ARM DATA 22HSTA TE DATA 23HALARM BIT STA TE.0 ;闹钟是否启用标志1--启用,0--禁止LEAP BIT STATE.1 ;是否闰年标志1--闰年,0--平年KEY_S DATA 24H ;当前扫描键值KEY_V DATA 25H ;上次扫描键值DIS_BUF_U0 DATA 26H ;LCD 上排显示缓冲区DIS_BUF_U1 DATA 27HDIS_BUF_U2 DATA 28HDIS_BUF_U3 DATA 29HDIS_BUF_U4 DATA 2AHDIS_BUF_U5 DATA 2BHDIS_BUF_U6 DATA 2CHDIS_BUF_U7 DATA 2DHDIS_BUF_U8 DATA 2EHDIS_BUF_U9 DATA 2FHDIS_BUF_U10 DA TA 30HDIS_BUF_U11 DA TA 31HDIS_BUF_U12 DA TA 32HDIS_BUF_U13 DA TA 33HDIS_BUF_U14 DA TA 34HDIS_BUF_U15 DA TA 35HDIS_BUF_L0 DATA 36H ;LCD 下排显示缓冲区DIS_BUF_L1 DATA 37HDIS_BUF_L2 DATA 38HDIS_BUF_L3 DATA 39HDIS_BUF_L4 DATA 3AHDIS_BUF_L5 DATA 3BHDIS_BUF_L6 DATA 3CHDIS_BUF_L7 DATA 3DHDIS_BUF_L8 DATA 3EHDIS_BUF_L9 DATA 3FHDIS_BUF_L10 DATA 40HDIS_BUF_L11 DA TA 41HDIS_BUF_L12 DATA 42HDIS_BUF_L13 DATA 43HDIS_BUF_L14 DATA 44HDIS_BUF_L15 DATA 45HFLAG DATA 46H ;标识调整状态0-闹钟功能,1-闹钟时,2-闹钟分,3-闹钟秒;4-年,5-月,6-日,7-时,8-分,9-秒,10-退出调整。
课程设计任务书成绩评定表目录1设计目的及要求 (5)1.1课程设计目的 (5)1.2设计内容、技术条件和要求 (5)1.2.1设计内容···························· (5)1.2.2设计要求 (5)2系统的组成及工作原理 (5)2.1 系统组成 (5)2.2 工作原理概述 (6)2.3 Protues简介 (6)2.4 Keil C51简介 (6)3器件的功能和作用 (7)3.1 AT89C51简介 (7)3.2 DS1302简介 (9)3.3 LCD1602简介 (9)4系统硬件设计 (11)4.1控制模块 (12)4.2显示模块 (12)4.3按键模块 (13)5系统软件设计 (13)5.1程序流程图 (13)5.2 程序清单及程序功能注释 (1)46 系统仿真调试 (28)6.1程序调试过程 (28)6.2仿真调试过程 (31)7 结果分析 (32)8体会与感想···························· (32)9参考文献 (33)1、设计目的及要求1.1课程设计目的1.培养学生文献检索的能力,如何利用Internet检索需要的文献资料。
2.培养学生综合分析问题、发现问题和解决问题的能力。
3.培养学生综合运用知识的能力和项目设计的能力。
CHANGZHOU INSTITUTE OF TECHNOLOGY科研实践项目名称:电子万年历设计二级学院:电子信息与电气工程学院专业:电气工程及其自动化班级: 10 电二学生姓名:祝学东学号: 10020442 指导教师:庄志红职称:副教授起止时间: 2013年12月9日—2013年12月20日摘要本设计是电子万年历。
具备三个功能:能显示:年、月、日、时、分、秒、星期,并具有可调整日期和时间功能。
该电子万年历使用12MHZ晶振与单片机AT89C52相连接,通过软件编程的方法实现了以24小时为一个周期,同时显示小时、分钟和秒的要求。
利用单片机定时器及计数器产生定时效果通过编程形成数字钟效果,再利用数码管动态扫描显示单片机内部处理的数据。
同时通过端口读入当前外部控制状态来改变程序的不同状态,实现不同功能。
电子万年历设计与制作可采用数字电路实现,也可以采用单片机来完成。
若用数字电路完成,所设计的电路相当复杂,大概需要十几片数字集成块,其功能也主要依赖于数字电路的各功能模块的组合来实现,焊接的过程比较复杂,成本也非常高。
若用单片机来设计制作完成,由于其功能的实现主要通过软件编程来完成,这样一来就降低了硬件电路的复杂性,从而使得其成本降低,更适合我们大学生自主研发。
AT89C52是一个低电压,高性能CMOS 8位单片机,片内含8k bytes的可反复擦写的Flash只读程序存储器和256 bytes的随机存取数据存储器(RAM),器件采用ATMEL公司的高密度、非易失性存储技术生产,兼容标准MCS-51指令系统,片内置通用8位中央处理器和Flash存储单元,AT89C52单片机在电子行业中有着广泛的应用。
关键词:单片机数字显示动态扫描时间日期可调目录第一章设计论证及要求 (1)1.1设计应用意义 (1)1.2设计方案论证 (1)1.2.1 单片机芯片选择 (1)1.2.2显示模块选择 (1)1.2.3时钟芯片选择 (2)1.3设计流程 (2)第二章系统硬件电路设计 (3)2.1 CPU时钟 (3)2.2 主控芯片AT89C52模块 (3)2.3 显示控制电路的设计及原理 (4)2.4 按键电路设计 (6)第三章系统软件设计 (7)3.1 软件主流程 (7)3.2初始化程序及宏定义 (9)3.3主程序 (10)3.4显示子程序 (12)3.5 按键子程序 (15)3.6 延时子程序 (16)第四章系统调试与分析 (17)第五章设计总结 (20)第六章参考文献 (21)附一元件清单 (22)附二仿真原理图 (23)附三程序清单 (24)附四实物图 (35)第一章设计论证及要求1.1设计应用意义二十一世纪是数字化技术高速发展的时代,而单片机在数字化高速发展的时代扮演着极为重要的角色。
目录一、设计任务二、设计方案三、硬件及电路设计四、程序设计及流程图五、设计体会一、设计任务利用单片机及外围接口电路(键盘接口和显示接口电路)设计制作一个电子日历时钟系统。
使用液晶显示器将日期,时间实时显示出来,并且能够通过按钮修改日期,完成实时操作并具有闹铃功能。
二、设计方案硬件选择:单片机AT89C51,DS1302时钟芯片,SED1520液晶控制器接口芯片:74LS138,74LS373,片选CS0三、硬件及电路设计(一)实验所用芯片简要介绍1、主控芯片采用单片机AT89C51AT89C51是一种带4K字节FLASH存储器(FPEROM—Flash Programmable and Erasable Read Only Memory)的低电压、高性能CMOS 8位微处理器,俗称单片机,与AT80C51引脚和指令系统完全兼容,可擦除只读存储器可以反复擦除1000次。
AT89C51共有128×8位内部RAM ,32可编程I/O线,两个16位定时器/计数器,5个中断源,采用全静态工作,三级程序存储器锁定和可编程串行通道,工作频率为0Hz-24MHz。
另外片内内置振荡器和时钟电路,低功耗的闲置和掉电模式。
2、实时时钟部分采用DS1302DS1302 是美国DALLAS公司推出的一种高性能、低功耗、带RAM 的实时时钟电路,它可以对年、月、日、周日、时、分、秒进行计时,具有闰年补偿功能,工作电压为 2.5V~5.5V。
采用三线接口与CPU 进行同步通信,并可采用突发方式一次传送多个字节的时钟信号或RAM数据。
DS1302内部有一个31×8的用于临时性存放数据的RAM寄存器。
DS1302是DS1202的升级产品,与DS1202兼容,但增加了主电源/后备电源双电源引脚,同时提供了对后备电源进行涓细电流充电的能力。
3、SED1520液晶控制器SED1520液晶显示驱动器是一种点阵图形式液晶显示驱动器,它可直接与8位微处理器相连,集行、列驱动器于一体,因此使用起来十分方便,作为内藏式控制器被广泛应用于点阵数较少的液晶显示模块,内置显示RAM区RAM容量为2560位,RAM中的1位数据控制液晶屏上一个点的亮灭状态:“1”表示亮,“0”表示暗,具有16个行驱动口和16个列驱动口,可直接与80系列微处理器相连,亦可直接与68系列微处理器相连。
//程序功能:日历,时钟,温度显示(测温代码暂没加上,加上后程序将超过4k,注意芯片型号选用),温度传感器采用18B20// 日历与时钟,温度分时切换显示,采用8位共阳数码管// 数据输出P1, 位码驱动P2// 也可以采用12864LCD显示,该程序暂时没写.#include <reg52.H>#include <STDIO.H>#define unchar unsigned char#define unint unsigned intunchar codedispcode[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0Xbf,0x9c,0xc6,0x7f,0xff}; //数码管字形表,0-9,-,o,C,.,灭unchar coderili1997code[]={0x2,0x5,0x5,0x1,0x3,0x6,0x1,0x4,0x0,0x2,0X5,0x0}; // 1996年12个月的月份星期校正码unchar timecnt="19"; //定时中断计数器unchar timeadd1=0; //时间加1判断unchar newday="0"; //日期加1判断unchar week; //星期unchar data date[]={9,12,9};unchar data time[]={11,59,55};unchar data wendu[]={14,19,116}; //wendu[0]=10为负,显示-;wendu[0] =14为正,符号位不显示, 原理参考数码管字形表//wendu[1]是整数温度值,wendu[2]/10是"°"显示,wendu[2]/10+1显示C,wendu[2]%110是小数点后的温度值unchar t="150"; //延时常数unchar cnt="0"; //显示控制计数器//#define SSL 0x7f //秒低位段码地址//#define SSH 0XBF //秒高位段码地址//#define _L 0XDF //8位数码管显示,分钟与秒之间的-分隔符//#define MML 0XEF //以下同//#define MMH 0XF7//#define _H 0XFB //8位数码管显示,小时与分钟之间的-分隔符//#define HHL 0XFD//#define HHH 0XFEsbit timeset="P3"^2; //时间调整键sbit dateset="P3"^3; //日历调整键sbit add="P3"^4; //加调整sbit dec="P3"^5; //减调整//日期加1函数//当日期有进位时调用,判断年,月,日的最大值void dateadd1(unchar i){{ unchar j="0";switch(i){ case 0:if(date[0]==99) //年采用低2位表示date[0]=0;elsedate[0]++;break;case 1:if(date[1]==12)date[1]=1;elsedate[1]++;break;case 2:switch(date[1]){case 4: //4,6,9,11月的最大天数是30case 6:case 9:case 11:if(date[2]==30){date[2]=1;j++; //j++表示月份加1,以下同}else{date[2]++; }break;case 1: //1,3,5,7,8,10,12月的最大天数是31case 3:case 5:case 7:case 8:case 10:case 12: if(date[2]==31){date[2]=1; j++; }elsedate[2]++; break;case 2:if(date[0]%400==0) //2月份需要判断是否是闰年{if(date[2]==29) //能被400整除的世纪年是闰年{date[2]=1; j++; } //闰年2月29天,月份加1 elsedate[2]++;break;}else{if(date[0]%4==0) //非世纪年,能被4整除是闰年{if(date[2]==29){date[2]=1;j++; }elsedate[2]++; break;}else{if(date[2]==28) //非闰年2月28天{date[2]=1;j++;}elsedate[2]++; break;}}default:break;}if(j){ if(date[1]==12) //如果进位的月份是12月,置月份date[1]为1 date[1]=1;elsedate[1]++;}} }}void datedec1(unchar i){ unchar j="0";switch(i){ case 0: if(date[0]==0)date[0]=99;elsedate[0]--;break;case 1:if(date[1]==0)date[1]=12;elsedate[1]--;break;case 2:switch(date[1]){ case 4: //4,6,9,11月的最大天数是30case 6:case 9:case 11:if(date[2]==0)date[2]=30;elsedate[2]--;break;case 1: //1,3,5,7,8,10,12月的最大天数是31case 3:case 5:case 7:case 8:case 10:case 12: if(date[2]==0)date[2]=31;elsedate[2]--; break;case 2:if(date[0]%400==0) //2月份需要判断是否是闰年{if(date[2]==0) //能被400整除的世纪年是闰年date[2]=29; //闰年2月29天,月份进位elsedate[2]--;break;}else{if(date[0]%4==0) //非世纪年,能被4整除是闰年{if(date[2]==0)date[2]=29;elsedate[2]--; break;}else{if(date[2]==0) //非闰年2月28天date[2]=28;elsedate[2]--; break;}}default:break;}}}void add1(unchar i) //时间加1函数{if(i){timeadd1--;if(time[2]==59) //秒加1{time[2]=0;time[1]++;if(time[1]==60) //分加1{time[1]=0;time[0]++;if(time[0]==24) //小时加1{ time[0]=0;newday++;}}}elsetime[2]++;}//if(newday)// {// dateadd1(newday);// }}//延时函数void delay(unchar x){unsigned char i="0";while(i<x)i++;}//显示函数://(1)显示时间,格式:HH(2位)-(1位)MM(2位)(空1位) SS(2位)(共8位), //(2)显示日历,格式:月(2位)-(1位)日(2位)(空2位) 星期(1位),//(3)显示日期(只在调整日期时出现),格式:年-月日//(4)显示温度//(5)显示过程:30秒的前25秒显示时间,后5秒显示日历void display(unchar x,unchar y,unchar z,unchar r,unchar k) { unchar a="150";cnt++;if(cnt==300)cnt="0"; //函数使用说明:if(((r!=5)&&(r!=2))||(cnt>a)||(r==6)) //显示函数x,y,z参数,分别对应显示时间的时,分,秒,或显示日期的年,月,日{if(r==6)P1=dispcode[z/10+1];elseP1 =dispcode[z%10]; //或显示日历的,月,日,星期,或温度的正负,温度,oC.P2 =0x7f;//SSL; //k:星期控制参数,当显示日历时,k=1,星期显示一位数,k为其他值时,不影响其他显示方式delay(t); //r:显示控制参数,当r取不同值时,闪动显示待调整项,只有闪动项才可以用键盘调整其值.if( k!=1) //当r分别取0,1,2,时,对应的hh,mm,ss将闪动,进入调整.r为3,4,5时,分别对应年,月,日闪动调整{P1=dispcode[z/10]; //r=6时,为显示温度时,特有的方式P2=0xbf;//SSH; //delay(t);}}if(((r!=4)&&(r!=1))||(cnt>a)||(r==6)){ if(r==6)P1=dispcode[y%10]-0x80; //用于显示小数点elseP1 =dispcode[y%10];P2=0xef;//MML; //delay(t);if(r==6) //当温度的高位是0时,不显示if(y/10==0)P1=dispcode[14];P1=dispcode[y/10];P2=0xf7;//MMH; //delay(t);}if((r==6)||((r!=3)&&(r!=0))||(cnt>a)){if(r==6)P1=0XFF;elseP1 =dispcode[x%10];P2=0xfd;//HHL;delay(t);if(r==6)P1=0XFF;elseP1=dispcode[x/10];P2=0xfe;//HHH;delay(t);}if((r==6)||(cnt>a)) //r=6可用于温度测量显示控制 {if(r==6)P1=dispcode[wendu[0]];elseP1 =dispcode[10];//dispcode[y%10];P2=0xfb;//_H;delay(t);}if(r==6){P1=dispcode[wendu[2]%110];P2=0xdf;delay(t);}}void keyscan() //键盘扫描函数,用于扫描P3.2(timeset),P3.3(dateset),P3.4(add),P3.5(dec)键是否按下{ unchar i="0",j=0;if(dateset==0){display(date[0],date[1],date[2],8,0); //延时if(dateset==0)while(i<3){ display(date[0],date[1],date[2],i,0);if(add==0){display(date[0],date[1],date[2],i,0);if(add==0)dateadd1(i);display(date[0],date[1],date[2],i,0);display(date[0],date[1],date[2],i,0);display(date[0],date[1],date[2],i,0);display(date[0],date[1],date[2],i,0);}if(dec==0){display(date[0],date[1],date[2],i,0);if(dec==0)datedec1(i);display(date[0],date[1],date[2],i,0);display(date[0],date[1],date[2],i,0);display(date[0],date[1],date[2],i,0);display(date[0],date[1],date[2],i,0);}if(dateset==0){display(date[0],date[1],date[2],i,0); if(dateset==0)i++;display(date[0],date[1],date[2],i,0);display(date[0],date[1],date[2],i,0);display(date[0],date[1],date[2],i,0);display(date[0],date[1],date[2],i,0);}}}if(timeset==0){delay(100); //短暂延时if(timeset==0)delay(100);while(j<3){ display(time[0],time[1],time[2],j,0); if(add==0){delay(200);if(add==0){ //delay(200);switch(j){case 0:if(time[0]==24)time[0]=0;elsetime[0]++;break;display(time[0],time[1],time[2],j,0); case 1:case 2:if(time[j]==60)time[j]=0;elsetime[j]++;default:break;} //delay(100);// display(time[0],time[1],time[2],j,0); }}if(dec==0){delay(200);if(dec==0)switch(j){case 0:if(time[0]==0)time[0]=23;elsetime[0]--;break;display(time[0],time[1],time[2],j,0);case 1:case 2:if(time[j]==0)time[j]=59;elsetime[j]--;display(time[0],time[1],time[2],j,0);default:break;} delay(100);}if(timeset==0){display(time[0],time[1],time[2],j,0);//display(time[0],time[1],time[2],j,0);if(timeset==0)j++;}}}}void datetoweek(unchar x,unchar y,unchar z,unchar p) //计算指定日期是星期几,x,y,z参数分别为年,月,日;{if(p){ int year;year="1997"+x+3;dateadd1(2);newday--;if((year%400)==0) //p为是否执行该函数条件,即变量newday(由hh进位产生),{if(y<3) //当hh没有进位时,newday=0,不执行该函数{unchar i,j; //日期加1,要进行日历调整j=rili1997code[y-1];i=(((year-1997)/4+(year-1997)+j)-1);week=(z+i+1)%7; //}else{unchar i,j;j="rili1997co"de[y-1];i=(((year-1997)/4+(year-1997)+j));week=(z+i+1)%7;}}else{ if(year%4==0){if(y<3){unchar i,j;j="rili1997co"de[y-1];i=(((year-1997)/4+(year-1997)+j)-1);week=(z+i+1)%7;}else{unchar i,j;j="rili1997co"de[y-1];i=(((year-1997)/4+(year-1997)+j));week=(z+i+1)%7;}}else{ unchar i,j;j="rili1997co"de[y-1];i=(((year-1997)/4+(year-1997)+j));week=(z+i+1)%7;}}}}void displaycontrol() //显示控制函数{if(time[2]%30<=20) //30秒的前25秒显示时间,后5秒显示日历display(time[0],time[1],time[2],7,0);//if((time[2]%30<=25)&&(time[2]%30>20))elseif(time[2]%30<=25)display(date[1],date[2],week,8,1);// if((time[2]%30<=30)&&(time[2]%30>25))elsedisplay(wendu[0],wendu[1],wendu[2],6,0);}void main(void) // 主函数{TMOD="0x01";TH0=((65535-50000)/256); //定时器赋初值TL0=((65535-50000)%256);ET0=1;EA="1";TR0=1;while(1){keyscan(); //键盘扫描add1(timeadd1); //加1datetoweek(date[0],date[1],date[2],newday);displaycontrol(); //时间,日历,温度等显示控制 }}void t0 (void)interrupt 1 using 0 //定时中断函数{TH0+=((65536-50000)/256);TL0+=((65536-50000)%256);timecnt--;if(timecnt==0){ timecnt="19";timeadd1++;}}。
#include <reg51.h>typedef unsigned char BYTE; //自定义字节类型#define Set_Bit(BIT) (BIT = 1) //定义置1函数#define Clear_Bit(BIT) (BIT = 0) //定义清0函数/*7279指令*/#define HD7279_TEST 0xbf //测试#define HD7279_RLC 0xa3 //循环左移#define HD7279_RRC 0xa2 //循环右移#define HD7279_RL 0xa1 //左移#define HD7279_RR 0xa0 //右移#define DECODE0 0x80 //译码方式0#define HD7279_DECODE1 0xc8 //译码方式1#define UNDECODE 0x90 //译码方式2: 不译码#define HD7279_HIDE 0x98 //消隐#define HD7279_FLASH 0x88 //闪烁#define HD7279_SEGON 0xe0 //段亮#define HD7279_SEGOFF 0xc0 //段灭#define CMD_READ 0x15 //读键盘指令/*函数定义*/void write7279(BYTE,BYTE); //定义HD7279写函数BYTE read7279(BYTE); //定义HD7279读函数void Send_Byte(BYTE); //定义HD7279发送字节函数BYTE Receive_Byte(void); //定义HD7279接收字节函数void Short_Delay(void); //定义短延时函数void Long_Delay(void); //定义长延时函数void Mcu_Init(void); //定义MCU初始化函数void distime(void); //显示时间void discalendar(void); //显示日历void HD7279key(void); //按键控制BYTE Key_number; //定义键值变量unsigned char second=0,minute=40,hour=9,F; //秒、分、时变量unsigned int day=10,month=6,year=2014,mark=0,i,j,clock,wait=0;//年月日等变量sbit key=P1^4; //定义HD7279中断硬件连接--->INT1 sbit HD7279_Clk=P1^2; //定义HD7279时钟硬件连接sbit HD7279_Data=P1^3; //定义HD7279数据硬件连接sbit HD7279_CS=P1^1; //片选/*主函数*/void main(void){Mcu_Init();F=1;while(1){ while(!key){ HD7279key();}if(clock>19){ clock=0;second++;} //一秒计时if(second>59){second=0;minute++;} //分进位if(minute>59){minute=0;hour++;} //时进位if(hour>23){hour=0; //日进位day++;}if(((month%2)==0&&month<=6)||month==9||month==11)//2,4,6,9,11月{if(month==2)if(month==2){if(day==29) //非闰年的进位{if(year%4==0&&year%100!=0||year%400==0)mark=1; //mark闰年标志位else mark=2;}if(mark==2) //2月为28天的{day=1;month++;if(month==13){month=1;year++; }}else //2月为29天的{if(day==30){day=1;month++; }if(month==13){month=1;year++; }}}if (day==31){ day=1;month++;}if (month==13){ month=1;year++;}}if(((month+1)%2==0&&month<8)||month==8||month==10||month==12)//1,3,5,7,8,10,12月大{if (day==32){ day=1;month++;}if (month==13){ month=1;year++;}}if(F==0) //显示日历{discalendar(); }if(F==1) //显示时间{distime();}}}/*MCU初始化函数*/void Mcu_Init(void){Set_Bit(ET0); //定时器Set_Bit(TR0);Set_Bit(EA); //中断使能TMOD=0x01; //工作在方式一TH0=0x3C; //晶振=12MHZ,定时时间50msTL0=0xb0;HD7279_CS=0;Send_Byte(0xa4); //HD7279复位指令}/*按键操作*/void HD7279key(void){Key_number=read7279(CMD_READ); //读取键盘的值while(key==0) ;if(F==0){switch(Key_number){case 0x04: write7279(HD7279_FLASH,0xfc);write7279(DECODE0, (day+=1)%10); write7279(DECODE0+1, day/10);break; //调节日case 0x05: write7279(HD7279_FLASH,0xf3);write7279(DECODE0+2,(month+=1)%10);write7279(DECODE0+3,month/10);break; //调节月case 0x06: write7279(HD7279_FLASH,0xf0);write7279(DECODE0+4, (year+=1)%10); write7279(DECODE0+5, year/10);break; //调节年case 0x0C: write7279(HD7279_FLASH,0xfc);write7279(DECODE0, (day-=1)%10); write7279(DECODE0+1, day/10);break; //调节日case 0x0D: write7279(HD7279_FLASH,0xf3);write7279(DECODE0+2,(month-=1)%10);write7279(DECODE0+3,month/10);break; //调节月case 0x0E: write7279(HD7279_FLASH,0xf0);write7279(DECODE0+4, (year-=1)%10); write7279(DECODE0+5, year/10);break; //调节年case 0x07: F=1; break;case 0x0f: write7279(HD7279_FLASH,0xff);break;default : break;}if(month==13) month=1;if(month==0) month=12;if((((month+1)%2==0&&month<8)||month==8||month==10||month==12)&&day==0)//1,3,5,7,8,10,12月day=31;if(((month%2)==0&&month<=6)||month==9||month==11)//2,4,6,9,11月{if(month==2){if(mark=1&&day==0) day=29;//闰年if(mark=2&&day==0) day=28;}else if(day==0) day=30;}}else{switch(Key_number){case 0x04: write7279(HD7279_FLASH,0xfc);write7279(DECODE0,(second+=1)%10);write7279(DECODE 0+1,second/10);break; //调节秒case 0x05: write7279(HD7279_FLASH,0xe7);write7279(DECODE0+3,(minute+=1)%10);write7279(DECO DE0+4,minute/10);break; //调节分case 0x06: write7279(HD7279_FLASH,0x3f);write7279(DECODE0+6,(hour+=1)%10);write7279(DECODE 0+7,hour/10);break; //调节时case 0x0C: write7279(HD7279_FLASH,0xfc);write7279(DECODE0,(second-=1)%10);write7279(DECODE 0+1,second/10);break; //调节秒case 0x0D: write7279(HD7279_FLASH,0xe7);write7279(DECODE0+3,(minute-=1)%10);write7279(DECO DE0+4,minute/10);break; //调节分case 0x0E: write7279(HD7279_FLASH,0x3f);write7279(DECODE0+6,(hour-=1)%10);write7279(DECODE 0+7,hour/10);break; //调节时case 0x07: F=0;break;case 0x0f: write7279(HD7279_FLASH,0xff);break;default : break;}}}/*定时中断0函数*/void int_HD7279key(void) interrupt 1{ TH0=0x4C;TL0=0x00;clock++;}void Short_Delay(void) /*短延时函数*/{BYTE i;for(i=0;i<0x08;i++);}void Long_Delay(void) /*长延时函数*/{BYTE i;for(i=0;i<0x30;i++);}void write7279(BYTE Command,BYTE Data) /*HD7279写函数*/{Send_Byte(Command);Send_Byte(Data);}BYTE read7279(BYTE Command) /*HD7279读函数*/{Send_Byte(Command);return(Receive_Byte());}/*HD7279发送字节函数*/void Send_Byte(BYTE Data_Out){BYTE i;Long_Delay();for(i=0;i<8;i++){if(Data_Out&0x80)Set_Bit(HD7279_Data);else Clear_Bit(HD7279_Data);Set_Bit(HD7279_Clk);Short_Delay();Clear_Bit(HD7279_Clk);Short_Delay();Data_Out=Data_Out<<1;}Clear_Bit(HD7279_Data);}BYTE Receive_Byte(void) /*HD7279接收字节函数*/ {BYTE i,Data_In;Set_Bit(HD7279_Data);Long_Delay();for(i=0;i<8;i++){Set_Bit(HD7279_Clk);Short_Delay();Data_In=Data_In<<1;if(HD7279_Data)Data_In=Data_In|0x01;Clear_Bit(HD7279_Clk);Short_Delay();}Clear_Bit(HD7279_Data);return(Data_In);}/*日期显示*/void discalendar(void){write7279(DECODE0,day%10); write7279(DECODE0+1,day/10);write7279(DECODE0+2,month%10); write7279(DECODE0+3,month/10);write7279(DECODE0+4,year%10); write7279(DECODE0+5,(year/10)%10); write7279(DECODE0+6,(year/100)%10); write7279(DECODE0+7,year/1000);}/*时间显示*/void distime(void){write7279(DECODE0, second%10); write7279(DECODE0+1,second/10);write7279(UNDECODE+2,0x01);write7279(DECODE0+3,minute%10); write7279(DECODE0+4,minute/10);write7279(UNDECODE+5,0x01);write7279(DECODE0+6,hour%10); write7279(DECODE0+7,hour/10);}。