您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 综合/其它 > 基于AT89C51单片机的电子时钟
电子时钟的设计专业:班级:姓名:学号:设计时间:目录一、设计目的……………………………………………………………………1二、具体要求……………………………………………………………………2三、方案论证……………………………………………………………………3四、硬件设计……………………………………………………………………4五、软件设计……………………………………………………………………5六、仿真调试……………………………………………………………………6七、性能测试与分析……………………………………………………………7八、参考文献……………………………………………………………………8一、设计目的:(1)在学习了《数字电子技术》和《单片机原理及接口技术》课程后,为了加深对理论知识的理解,学习理论知识在实际中的运用,培养动手能力和解决实际问题的能力。(2)熟悉Ptoteus及Keil软件的调试和仿真。(3)通过实验提高对单片机的认识。(4)通过实验提高焊接、布局、电路检查能力。(5)通过实验提高软件调试能力。(6)进一步熟悉和掌握单片机的结构及工作原理。(7)通过课程设计,掌握以单片机为核心的电路设计的基本方法和技术,了解电路参数的计算方法。(8)通过实际程序设计和调试,逐步掌握模块化程序设计方法和调试技术。(9)通过完成一个包括电路设计和程序开发的完整过程,了解开发一单片机应用系统的全过程,为今后从事相应打下基础。二、具体要求:(1)、实时显示秒、分、时、年等(可自动或手动设置显示)(2)、具有定时功能(3)、能调整时间、日期(4)、能调整定时时间(5)、时钟走时误差一天少于1分钟三、方案论证:根据本题就是要做一个时钟的要求我们有以下两个方案。方案一:利用数字电子电路的知识制作时钟,利用74LS160计数的简易数字控制电路,由NE555产生频率为1HZ的输入信号,经过74LS48译码由数码管显示。当数字大于100时有指示灯显示,大于300时返回。方案二:基于AT89C51单片机来制作电子时钟,其最大的好处就是可最大的调整时钟使其的准确度更高。所以根据课题要求为了得到更好的最确度所以决定选择方案二作为本设计的方案。其可归结如下:数码管AT89C51基本系统串行时钟电源表一(1)使用12MHz的晶振作为单片机的外部时钟输入,一个机器周期为1us(2)使用定时器0作为时钟计数器,当计数满8ms时定时器0产生中断,当中断满125次时,调用时间模块进行加1操作。先对秒进行加1,若加1后等于60秒,则清除秒单元,同时向分进1,同理,对分、时进行同样操作。(3)P3.0选择键 P3.1为加控制键 P3.2减控制键 P3.4为日期时间切换显示按键。利用发光二极管作为显示定时用,当定时时间到,从P3.3输出一低电平点亮发红光二极管。P3.3为发光二极管闪烁(4)年、月、日的判断。取年单元的数据除以4,若余数为零,则该年为闰年,再判断月单元是否为2月,若为2月则当月天数加1;若年单元数据除以4后余数不为零,则正常取表格的数据。四、硬件设计:根据要求我所制作的电路原理图用pltel99se画得如下表二:表二:根据表二的原理图我们可以得到如下表三的PCB板图:表三五、软件设计:系统软件采用汇编语言按模块化方式进行设计,然后通过KeilC51软件开发平台将程序转变成十六进制程序语言,接着使用Proteous进行仿真,其次,按照Proteous的仿真电路图,在Protel99SE中完成电路板的逻辑布局及布线。系统程序主要包括主程序,读出时钟子程序和显示数据刷新子程序。程序详情请看程序附件;程序流程图如下主程序流程图定时中断恢复初值,保护中断4000次0.1秒单元清0.60秒到吗?秒单元清0,60分到吗?分单元清0,24小时到吗?时单元清0堆栈返回0.1秒加1秒加1分加1时加1YYYYNNNN开始清显示缓冲区初始化定时计数器赋时钟初值开定时器调整时间数码管显示当前时钟值程序清单#includereg51.h#defineucharunsignedchar#defineuintunsignedint#definetrue1#definefaluse1sbitset_key=P3^0;sbitup_key=P3^1;sbitdown_key=P3^2;sbitsign=P3^3;sbitselect_key=P3^4;sbitset_ring_key=P3^5;uintsec;uintmin=23;uinthour=12;uintday=10;uintmonth=10;uintyearl=7;uintyearh=20;uinttcnt;uintcnt=0;uintcursor=0;uintsjsz=0;uchara=0xff;ucharcodeSeg[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};voiddelay(uintt){uinti;while(t--){for(i=0;i125;i++);}}voidKdelay(){uchari,j;for(i=100;i0;i--)for(j=248;j0;j--);}voiddisplay(ucharL1,ucharL2,ucharL3,ucharL4,ucharL5,ucharL6,ucharL7,ucharL8,ucharL9,ucharL10,ucharL11,ucharL12,ucharL13,ucharL14){if(cnt==1){if(cursor==6){P2=0x7F|a;P0=L1;delay(1);}else{P2=0x7F;P0=L1;delay(1);}//yearhif(cursor==6){P2=0xBF|a;P0=L2;delay(1);}else{P2=0xBF;P0=L2;delay(1);}//yearhif(cursor==6){P2=0xDF|a;P0=L3;delay(1);}else{P2=0xDF;P0=L3;delay(1);}//yearlif(cursor==6){P2=0xEF|a;P0=L4;delay(1);}else{P2=0xEF;P0=L4;delay(1);}//yearlif(cursor==5){P2=0xF7|a;P0=L5;delay(1);}else{P2=0xF7;P0=L5;delay(1);}//monthif(cursor==5){P2=0xFB|a;P0=L6;delay(1);}else{P2=0xFB;P0=L6;delay(1);}//monthif(cursor==4){P2=0xFD|a;P0=L7;delay(1);}else{P2=0xFD;P0=L7;delay(1);}//dayif(cursor==4){P2=0xFE|a;P0=L8;delay(1);}else{P2=0xFE;P0=L8;delay(1);}//dayP2=0xFF;}else{if(cursor==3){P2=0x7F|a;P0=L9;delay(1);}else{P2=0x7F;P0=L9;delay(1);}//hourif(cursor==3){P2=0xBF|a;P0=L10;delay(1);}else{P2=0xBF;P0=L10;delay(1);}//hourif(cnt!=1){P2=0xDF;P0=0X40;delay(1);}if(cursor==2){P2=0xEF|a;P0=L11;delay(1);}else{P2=0xEF;P0=L11;delay(1);}//minif(cursor==2){P2=0xF7|a;P0=L12;delay(1);}else{P2=0xF7;P0=L12;delay(1);}//minif(cnt!=1){P2=0xFB;P0=0X40;delay(1);}if(cursor==1){P2=0xFD|a;P0=L13;delay(1);}else{P2=0xFD;P0=L13;delay(1);}//secif(cursor==1){P2=0xFE|a;P0=L14;delay(1);}else{P2=0xFE;P0=L14;delay(1);}//secP1=0xFF;}}main(){TMOD=0x02;//设置模式为定时器T0的模式2断的产生中断去执行中断函数本次定时时间为64msTH0=0x06;//设置计数器初值,靠TH0存储重装的计数值X0=256-250=6TL0=0x06;TR0=1;//启动T0ET0=1;//开启定时器T0中断允许EA=1;//开启中断总控制while(1){if(set_key==0){Kdelay();if(set_key==0){cursor++;if(cursor=7){cursor=0;}//在选择到调整年时又返回秒设置,当CURSOR=7时不选中}}if(up_key==0){Kdelay();if(up_key==0){//加部分if(cursor==1){sec++;if(sec==60)sec=0;}if(cursor==2){min++;if(min==60)min=0;}if(cursor==3){hour++;if(hour==24)hour=0;}if(cursor==4){day++;if(day==31)day=1;}if(cursor==5){month++;if(month==13)month=1;}if(cursor==6){yearl++;if(yearl==100)yearl=0;}if(cursor==7){yearh++;if(yearh==30)yearh=20;}}}if(down_key==0){Kdelay();if(down_key==0){//减部分if(cursor==1){sec--;if(sec==00)sec=59;}if(cursor==2){min--;if(min==0)min=59;}if(cursor==3){hour--;if(hour==0)hour=23;}if(cursor==4){day--;if(day==0)day=31;}if(cursor==5){month--;if(month==0)month=12;}if(cursor==6){yearl--;if(yearl==0)yearl=99;}if(cursor==7){yearh--;if(yearh==20)yearh=30;}}}if(select_key==0){Kdelay();if(select_key==0){cnt++;if(cnt=2)cnt=0;}}display(Seg[yearh/10],Seg[yearh%10],Seg[yearl/10],Seg[yearl%10],Seg[month/10],Seg[month%10],Seg[day/10],Seg[day%10],Seg[hour/10],Seg[hour%10],Seg[min/10],Seg[min%10],Seg[sec/10],Seg[sec%10]);}}voidt0(void)interrupt1using0//t0的中断程序{tcnt++;if(tcnt==4000)//定时器的定时计数,4000次250us为1秒,中断4000次后才执行刷新,期间照上面的语句显示{tcnt=0;sign=~sign;a=~a;sec++;if(sec==60){sec=0;min++;if(min==60){min=0;hour++;if(hour==24){hour=0;day++;if(month==2&&((yearl==0&&yearh%4==0)||(yearl!=0&&yearl%4==0))&&day==30)day=1;elseif(month==2&&day==29)day=1;elseif((month==4||mont
本文标题:基于AT89C51单片机的电子时钟
链接地址:https://www.777doc.com/doc-7286469 .html