单片机课程设计专业:生物医学工程班级:11医工本(一)班姓名:许谷益学号:110615002指导老师:王佑湖课程设计课题课题一简易电子时钟设计一、51系列单片机简介MCS51是指由美国INTEL公司(对了,就是大名鼎鼎的INTEL)生产的一系列单片机的总称,这一系列单片机包括了好些品种,如8031,8051,8751,8032,8052,8752等,其中8051是最早最典型的产品,该系列其它单片机都是在8051的基础上进行功能的增、减、改变而来的,所以人们习惯于用8051来称呼MCS51系列单片机,而8031是前些年在我国最流行的单片机,所以很多场合会看到8031的名称。INTEL公司将MCS51的核心技术授权给了很多其它公司,所以有很多公司在做以8051为核心的单片机,当然,功能或多或少有些改变,以满足不同的需求,其中89C51就是这几年在我国非常流行的单片机,它是由美国ATMEL公司开发生产的。MCS-51系列单片机MCS-51系列单片机分为两大系列,即51子系列与52子系列。51子系列:基本型,根据片内ROM的配置,对应的芯片为8031、8051、8751、895152子系列:增强型,根据片内ROM的配置,对应的芯片为8032、8052、8752、8952这两大系列单片机的主要硬件特性如下表:片内ROM型式ROM大小RAM大小寻址范围I/O特性中断源数量无内容来自单片机之家*164*8580C3180C5187C54KB128B64KB2*164*8518032805287528KB256B64KB3*16内容来自单片机之家*8680C3280C5287C528KB256B64KB3*164*86从上表中可以看到,8031、8031、8032、80C32片内是没有ROM的,对应着上表看,我们可以发现,51系列的单片机的RAM大小为128B,52系列的RAM大小为256B,51系列的计数器为两个16位的,52系列的计数器为三个16位计数器。51系列的中断源为5个,52系列的中断源为6个。二、设计任务和要求利用单片机的定时/计数器,以及阵列键盘和LED显示进行设计。在数码管显示器上实现电子时钟,并且能进行设置时间、暂停和启动控制。要求如下:1.按下电源开关,LED数码管开始从初始位置开始计时。2.按下位于P1.0的开关时进入时间设定,按一下调时,再按一下调分,再按一下调秒。3.按下位于P1.1的开关时进入闹钟设定,按一下调时,再按一下调分。4.按下位于P1.2的键实现加的功能。5.按下位于P1.3的键实现减的功能。6.始终运行了也可以按复位键使时钟回到初始状态。三、课程设计原理:单片机控制的数字时钟的硬件和软件设计,写出了C语言源程序。此数字时钟是一个将“时”、“分”、“秒”显示于人的视觉器官的计时装置。显示器件选用LED七段数码管。在译码显示电路输出的驱动下,显示出清晰、直观的数字符号。针对数字时钟会产生走时误差的现象,在电路中就设计有校准时间功能的电路。使用动态数码显示的方法,运用独立式按键识别过程,按“时”、“分”、“秒”数据送出显示处理方法。四、系统硬件电路设计根据以上电子时钟的设计要求可以分为以下的几个硬件电路模块:单片机模块、数码显示模块与按键模块,模块之间的关系如下图所示。四、元器件清单五、课程设计目的:名称数量单价CPUSTC89C52RC1晶振12MHZ1电阻1K3电容10uf1电容30pf240引脚插针14位共阴数码管2按键5DCJACK电源坐子2红LED灯1蜂鸣器1导线若干1电路铜板1USB电源线1K排阻8550三极管111单片机晶振手动复位数码管显示时间调整按钮六、参考电路电子时钟电路参考图如图所示S1S2S3S4S5S6S7S8AFBEDDPCGXTAL218XTAL119ALE30EA31PSEN29RST9P0.0/AD039P0.1/AD138P0.2/AD237P0.3/AD336P0.4/AD435P0.5/AD534P0.6/AD633P0.7/AD732P2.7/A1528P2.0/A821P2.1/A922P2.2/A1023P2.3/A1124P2.4/A1225P2.5/A1326P2.6/A1427P1.01P1.12P1.23P1.34P1.45P1.56P1.67P1.78P3.0/RXD10P3.1/TXD11P3.2/INT012P3.3/INT113P3.4/T014P3.7/RD17P3.6/WR16P3.5/T115U180C51234567891RP2RESPACK-8+5V发声器时间设定进入按一下调时再按一下调分再按一下调秒闹钟设定进入按一下调时再按一下调分加键减键C122pFC222pFX112MR110kC310u七、流程图在编程上,首先进行初始化,定义程序的入口地址以及终端的入口地址,在主程序开始定义了一组固定单元用来储存计数的时、分、秒,在显示初值之后,进入主循环。在主程序中,对不同的按键进行扫描,实现秒表,时间调整,复位清零功能,系统总流程图如下:八、正反实物图七、程序:#includereg51.h#definetl0xba;#defineth0x3c;sbittime=P1^0;//时间设置sbittimer=P1^1;//闹钟设置sbitadd=P1^2;//加sbitdec=P1^3;//减sbitspeaker=P3^5;//闹钟输出bitdisp_sd;//数码管闪动显示标志位bitdisp_ms;//数码管显示时间/闹钟标志位bitdisp_sdt;//数码管闪动间隔反转标志位bitzhengdian=0;//整点报时标志位unsignedcharcodeled[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//数字0-9的编码//unsignedcharcodeled[]={0x5F,0x44,0x9D,0xD5,0xC6,0xD3,0xDB,0x45,0xDF,0xD7,};//数字0-9的编码unsignedcharcodemoth[]={0x01,0x3,0x04,0x05,0x06,0x07,0x08,0x09,0x010,0x11,0x12};//数字0-9的编码unsignedchartime_cc,timer_cc,ml;//调时计数器unsignedcharcount0,com,count1,second,minit,hour;//时间时分秒unsignedintsecond1,minit1,hour1,yers,yers2,Months,days,ryears,daydata,Mothdata,dsfl,dsfg;//闹钟时分秒unsignedcharhour_zd;//整点小时记录unsignedchartimenum1,timenum2,timenum3,f1,f2,st;unsignedintdsflg,timeval,timerval,addval,adcval,dayfl;voiddelay(void){unsignedinti;for(i=0;i100;i++);}voiddelay1(unsignedintk){unsignedintx,y;for(x=0;xk;x++)for(y=0;y110;y++);}voiddisplay(void){P0=led[hour/10];//p0口送数据拆数显示P2=0xFE;//片选delay();//延时P2=0xFF;//片选关P0=led[hour%10];P2=0xFD;delay();P2=0xFF;P0=0x40;P2=0xFB;delay();P2=0xFF;P0=led[minit/10];P2=0xF7;delay();P2=0xFF;P0=led[minit%10];P2=0xEF;delay();P2=0xFF;P0=0x40;P2=0xDF;delay();P2=0xFF;P0=led[second/10];P2=0xBF;delay();P2=0xFF;P0=led[second%10];P2=0x7F;delay();P2=0xFF;}voidKeykonzhi(){if(time==0)//键盘时间设定键按下{delay();delay();if(time==0){while(!time);timenum1++;//标记++TR1=0;f2=0;}}if(timenum1==1)//如果timenum1==1调时{dsflg=0;st=0;if(add==0)//加键按下{delay();delay();if(add==0){while(!add);//松手检测hour++;//小时++}}if(dec==0)//减键按下{delay();delay();if(dec==0){while(!dec);//松手检测hour--;//小时--}}if(hour23)//限位{hour=0;}P0=led[hour/10];//显示小时函数P2=0xFE;delay();P2=0xFF;P0=led[hour%10];//显示小时函数P2=0xFD;delay();P2=0xFF;}if(timenum1==2)////如果timenum1==2调分//以下也是和调时一样的方法{dsflg=0;st=0;if(add==0){delay();delay();if(add==0){while(!add);minit++;}}if(dec==0){delay();delay();if(dec==0){while(!dec);minit--;}}if(minit60){minit=0;}P0=led[minit/10];P2=0xF7;delay();P2=0xFF;P0=led[minit%10];P2=0xEF;delay();P2=0xFF;}if(timenum1==3)////如果timenum1==3调秒{dsflg=0;st=0;if(add==0){delay();delay();if(add==0){while(!add);second++;}}if(dec==0){delay();delay();if(dec==0){while(!dec);second--;}}if(second60){second=0;}P0=led[second/10];P2=0xBF;delay();P2=0xFF;P0=led[second%10];P2=0x7F;delay();P2=0xFF;}if(timenum1==4)////如果timenum1==4退出{TR1=1;timenum1=0;dsflg=1;f2=1;st=1;}}voidalmset(){timenum1=0;if(timer==0)//键盘上的闹钟键按下{delay();delay();if(timer==0){while(!timer);//松手timenum2++;//标记++f1=0;}}if(timenum2==1)//如果timenum2=1设定脑钟的小时{dsflg=0;st=0;if(add==0)//加键按下{delay();delay();if(add==0){while(!add);//松手hour1++;//小时++}}if(dec==0)//减键按下{delay();delay();if(dec==0){while(!dec);//松手hour1--;//小时--}}if(hour123)//限位{hour1=0;}P0=led[hour1/10];//小时显示P2=0xFE;delay();P2=0xFF;P0=led[hour1%10];P2=0xFD;delay();P