杭州职业技术学院毕业设计(作品)(2010届)作品名称可调试数字电子时钟电路的设计系别信息电子系专业应用电子技术班级应电0842学号0803402038姓名吴丹指导教师张雪娟2010年5月8日一、作品原理图数字显示时钟的主要功能是用24进制显示一天的时间,在单片机的辅助下能通过对时间进行调试,在断电的情况下能准确的计时。电路如图1所示。在实际电路中主要运用的是ds1320涓流充电时钟芯片(u2)对时间进行24进制的计时,在通过atmega8l-8pi可编程8位控制器(u1)对在四位数码显示管上显示出真确的时间,s1,s2,s3是分别控制时钟调整时间的,在电路中还加入了一个蜂鸣器,当s1,s2,s3中的任何一个按下的时候就会发出声音,这是对以后能更好检查是哪个按钮失灵的好方法。u1单片机的10-14的管脚分别于四位数码显示管上的abcdefg、dp相连,2345的管脚分别和四位数码显示管上的1234,这样的连接就可以在四位数码显示管上真确的显示数字0-9十个数字了,在u2集成块上我们多加了一个电源vcc,在实际的电路中我们运用了一个3v的纽扣电池,在这种情况下即使单片机没有通电,集成块也能精确的记录没电时的时间,在下次通电的时候还是和现在的时间是一致的。1图1电路原理图二、程序设计在程序方面我们运用的是c语言的编程,在这个编程里,我们分别实现了对24进制时间的调整,在正确显示时钟的同时还防止了时钟错误显示的功能。//DefineFPUanddevicedefaults#include"config.h"#include
#include#include#include#include"LED47.h"#include"utils.h"#include"keys.h"#include"DS1302.h"2#include"buzzer.h"#defineUPDATE_INTERVAL60#defineBLINKING_CRYCLE3#defineKEY_REPEAT_LIMIT_SET1#defineKEY_REPEAT_LIMIT_SHIFT1#defineKEY_REPEAT_LIMIT_UP1#defineALARM_SECONDS60#defineALARM_STOP0#defineALARM_IN_ACTION1intmain(void){//byteInitVal[7]={dec2bcd(00),dec2bcd(00),dec2bcd(17),dec2bcd(8),dec2bcd(3),dec2bcd(6),dec2bcd(9)};//初始数秒,分,时,日,月,星期,年byteReadVal[7]={0x00,0x00,0x00,0x00,0x00,0x00,0x00};byteSaveSec,DispDot;wordDispNum=0;bytekey;//0:initializedstatus//1:pressedinnormalmode//2:releasedtoentersettingmode//3:pressedinsettingmodebyteSetStatus=0;booleanAlarmSettingMode=false;byteShiftStatus=0,UpStatus=0;byteTempDEC;byteSetCursor=3;byteBlinking=0;byteAlarmHour=12,AlarmMin=0;booleanAlarmFlag=false;byteAlarmStatus=ALARM_STOP;init_devices();//v_Set1302(InitVal);InitTube();InitKeys();//Disp4Digit(8888,1000,3,0);3DispCircle(2,60,1);DispCircle(2,60,0);while(true){//Soundonifalarmreachedandalarmisactiveif(AlarmFlag){if((bcd2dec(ReadVal[2])==AlarmHour)&&(bcd2dec(ReadVal[1])==AlarmMin)){//Stopinoddsecondif((bcd2dec(ReadVal[0]))%2){SoundOff();AlarmStatus=ALARM_STOP;}//Soundinevensecondelse{SoundOn();AlarmStatus=ALARM_IN_ACTION;}}else{if(AlarmStatus==ALARM_IN_ACTION)SoundOff();}}key=ReadKey();switch(key){//SETpressedcaseK_SET_PIN://Togglepressedstate//Normalmode,pressedif(SetStatus==0)SetStatus=1;//Settingmode,pressedelseif(SetStatus==2){Blinking=0;SetStatus=3;}4break;//SETpressedcaseK_SHIFT_PIN:if(ShiftStatus==0)ShiftStatus=1;break;caseK_UP_PIN://Togglepressedstateif(UpStatus==0)UpStatus=1;break;default://///----togglesettingandnormalstatus//Releasedtoentersettingmodeif(SetStatus==1){SetStatus=2;SetCursor=3;beep(10);}//Releasetoenternormalmodeelseif(SetStatus==3){if(!AlarmSettingMode){//Setsecondto0ReadVal[0]=0;//Adjustthetimev_Set1302(ReadVal);beep(20);//EnteralarmmodeAlarmSettingMode=true;//SetSetStatustoalarmsettingmodeSetStatus=1;SetCursor=1;Blinking=0;}//Toggleclockandalarmmodeelse{//EnternormalmodeAlarmSettingMode=false;5SetStatus=0;SetCursor=0;Blinkin...