还剩22页未读,继续阅读
本资源只提供10页预览,全部文档请下载后查看!喜欢就下载吧,查找使用更方便
文本内容:
湖北文理学院单片机课程设计题目用51单片机实现电子时钟院部物理与电子信息工程学院专业名称电子信息科学与技术班级1111姓名杨庆月学号2011111136指导教师李刚2013年12月09日目录摘要-------------------------------------------------------------11单片机的相关知识-------------------------------------------
11.1单片机的简介---------------------------------------------------
11.2单片机的特点---------------------------------------------------
11.389C52单片机的基本特点-------------------------------------------22电子时钟---------------------------------------------------
32.1电子时钟的基本特点-----------------------------------------------
32.2电子时钟的原理--------------------------------------------------43控制系统的硬件设计----------------------------------------
43.1单片机型号的选择------------------------------------------------
43.2lcd1602工作的原理----------------------------------------------
43.3键盘电路的设计-------------------------------------------------
63.4复位电路设计--------------------------------------------------------
63.5时钟电路设计--------------------------------------------------
73.6整体电路原理图------------------------------------------------74控制系统的软件的设计-------------------------------------
84.1程序的设计-----------------------------------------------------
84.2程序源代码-----------------------------------------------------85仿真结果和实物图----------------------------------------------
195.1仿真结果-------------------------------------------------------------
195.2实物图---------------------------------------------------------------196总结-----------------------------------------------------------------------------------------------20参考文献-------------------------------------------------------21摘要单片计算机即单片微型计算机由RAMROMCPU构成,定时,计数和多种接口于一体的微控制器它体积小,成本低,功能强,广泛应用于智能产业和工业自动化上而51系列单片机是各单片机中最为典型和最有代表性的一种这次课程设计通过对它的学习,应用,从而达到学习、设计、开发软、硬的能力本设计主要设计了一个基于AT89C52单片机的电子时钟并在1602上显示相应的时间并通过一个控制键用来实现时间的调节和是否进入省电模式的转换具有时钟和日历的功能,年限显示范围是2013-2099(可修改),且具有闰年自动修正功能关键字单片机;子时钟;键盘控制;LCD16021单片机识的相关知识
1.1单片机简介MCS-51是INTEL公司在成功推广的MCS-48单片机基础上加以改进而成的8位单片机这种单片机大约是上世纪70年代末推出的,内部程序可重写的为8751,外扩程序的是8031,一次性生产,不可改变程序的是8051外形一般为DIP40封装不久又推出了增强型的8052,其资源更加丰富以后又采用CHMOS技术推出了80c51耗电大大降低到了90年代,INTEL公司把精力放到更赚钱的计算机上,将51单片机技术转让给了一此其它公司,如ATMELPhilips等半导体制造公司,使51系列单片机的市场份额不断扩大尽管十多年前就有人认为51单片机会很快淘汰,但事实证明51单片机经过不断的改进后,由于技术成熟,使用方便,至今在8位单片机市场仍然拥有庞大的用户特别是MCS-51技术的20年专利期限到期后,大量的兼容型号不断推出从上世纪90年代后期开始,美国ATMEL公司在掌握快速擦写的存储器后,推出了AT89C系列,此系列在中国获得了广泛的应用在此之前,由于可擦写的8751价格昂贵,国内长时间采用8031+27C64这样的外扩存程序储器方式51单片机最初只有DIP40这种很古老的封装,后来推出了CHMOS工艺的80C51后开始有了PLCC44这种相对较小的方形封装AT89C系列中开始有20脚的DIP20的精简型封装,这极大方便了在一些相对简单的单片机应用,缩小了PCB的体积20脚的有AT89C
1051、AT89C
1051、AT89C1051,对应程序存储器分别为1K、2K、4K标准的51为4K程序空间,128字节的RAM,32条端口,5个中断,2个定时/计数器,12个时钟周期执行一条基本指令,最长的除法为48个周期52为8K程序空间,256字节的RAM,32条端口,6个中断,3个定时/计数器AT89S51是可在板上直接下载程序的改进型号,并增加了看门狗功能,AT89C51只能在编程器下写入程序,所以经常会有人在PCB上安装IC插座,以便取下来编程更新程序AT的51系列后来也推出了单周期的51,但价格没什么优势,国内很少使用最近几年宏晶在国内大量推广STC51系列单片机,最近又推出不少所谓1T的单片机,价格较低STC采用串口直接下载程序,写入程序很方便
1.2单片机的特点
1.单片机的存储器ROM和RAM时严格区分的ROM称为程序存储器,只存放程序,固定常数,及数据表格RAM则为数据存储器,用作工作区及存放用户数据
2.采用面向控制的指令系统为满足控制需要,单片机有更强的逻辑控制能力,特别是单片机具有很强的位处理能力
3.单片机的I/O口通常时多功能的由于单片机芯片上引脚数目有限,为了解决实际引脚数和需要的信号线的矛盾,采用了引脚功能复用的方法,引脚处于何种功能,可由指令来设置或由机器状态来区分
4.单片机的外部扩展能力很强在内部的各种功能部件不能满足应用的需求时,均可在外部进行扩展,与许多通用的微机接口芯片兼容,给应用系统设计带来了很大的方便
1.389C52单片机介绍P0口P0口为一个8位漏级开路双向I/O口,每脚可吸收8TTL门电流当P1口的管脚第一次写1时,被定义为高阻输入P0能够用于外部程序数据存储器,它可以被定义为数据/地址的第八位在FIASH编程时,P0口作为原码输入口,当FIASH进行校验时,P0输出原码,此时P0外部必须被拉高P1口P1口是一个内部提供上拉电阻的8位双向I/O口,P1口缓冲器能接收输出4TTL门电流P1口管脚写入1后,被内部上拉为高,可用作输入,P1口被外部下拉为低电平时,将输出电流,这是由于内部上拉的缘故在FLASH编程和校验时,P1口作为第八位地址接收P2口P2口为一个内部上拉电阻的8位双向I/O口,P2口缓冲器可接收,输出4个TTL门电流,当P2口被写“1”时,其管脚被内部上拉电阻拉高,且作为输入并因此作为输入时,P2口的管脚被外部拉低,将输出电流这是由于内部上拉的缘故P2口当用于外部程序存储器或16位地址外部数据存储器进行存取时,P2口输出地址的高八位在给出地址“1”时,它利用内部上拉优势,当对外部八位地址数据存储器进行读写时,P2口输出其特殊功能寄存器的内容P2口在FLASH编程和校验时接收高八位地址信号和控制信号P3口P3口管脚是8个带内部上拉电阻的双向I/O口,可接收输出4个TTL门电流当P3口写入“1”后,它们被内部上拉为高电平,并用作输入作为输入,由于外部下拉为低电平,P3口将输出电流(ILL)这是由于上拉的缘故P3口也可作为AT89C52的一些特殊功能口,如下表所示口管脚备选功能P
3.0RXD(串行输入口)P
3.1TXD(串行输出口)P
3.2/INT0(外部中断0)P
3.3/INT1(外部中断1)P
3.4T0(记时器0外部输入)P
3.5T1(记时器1外部输入)P
3.6/WR(外部数据存储器写选通)P
3.7/RD(外部数据存储器读选通)P3口同时为闪烁编程和编程校验接收一些控制信号RST复位输入当振荡器复位器件时,要保持RST脚两个机器周期的高电平时间ALE/PROG当访问外部存储器时,地址锁存允许的输出电平用于锁存地址的地位字节在FLASH编程期间,此引脚用于输入编程脉冲在平时,ALE端以不变的频率周期输出正脉冲信号,此频率为振荡器频率的1/6因此它可用作对外部输出的脉冲或用于定时目的然而要注意的是每当用作外部数据存储器时,将跳过一个ALE脉冲如想禁止ALE的输出可在SFR8EH地址上置0此时,ALE只有在执行MOVX,MOVC指令是ALE才起作用另外,该引脚被略微拉高如果微处理器在外部执行状态ALE禁止,置位无效PSEN外部程序存储器的选通信号在由外部程序存储器取指期间,每个机器周期两次/PSEN有效但在访问外部数据存储器时,这两次有效的/PSEN信号将不出现EA/VPP当/EA保持低电平时,则在此期间外部程序存储(0000H-FFFFH),不管是否有内部程序存储器注意加密方式1时,/EA将内部锁定为RESET;当/EA端保持高电平时,此间内部程序存储器在FLASH编程期间,此引脚也用于施加12V编程电源(VPP)2电子时钟
2.1电子时钟的基本特点现在高精度的计时工具大多数都使用了石英晶体振荡器,由于电子钟、石英钟、石英表都采用了石英技术,因此走时精度高,稳定性好,使用方便,不需要经常调试,数字式电子钟用集成电路计时时,译码代替机械式传动,用用液晶显示器代替指针显示进而显示时间,减小了计时误差,这种表具有时、分、秒显示时间的功能,还可以进行时和分的校对,片选的灵活性好
2.2电子时钟的原理该电子时钟由89C52,1602液晶等构成,采用晶振电路作为驱动电路,由延时程序和循环程序达到时分秒的计时,六十秒为一分钟,六十分钟为一小时,满二十四小时为一天而电路中有四个控制按键,一个是选择,一个进行加数,一个进行减数,还有一个保存例如按下选择键,然后1602显示光标,此时可以用加或减来进行调节,在按下选择键,光标移到不同的单位上,同理进行调节,最后待日期时间调节好后,按下保存键,时钟开始计时3控制系统的硬件设计
3.1单片机型号的选择通过对51单片机的学习,认为STC89C52是最理想的电子时钟开发芯片STC89C52,最终认为89C52是一种带8K字节闪烁可编程可擦除只读存储器的低电压,高性能CMOS8位微处理器,器件采用高密度非易失存储器制造技术制造,与工业标准的MCS-52指令集和输出引脚相兼容还有一点重要原因,就是采用AT89C52时不能用开发板进行程序的下载,所以最终选用STC89C52进行设计
3.21602工作原理及显示电路字符型LCD通常有14条引脚线或16条引脚线的LCD,多出来的2条线是背光电源线VCC15脚和地线GND16脚,其控制原理与14脚的LCD完全一样1602液晶的基本的操作分为以下四种状态字读操作输入RS=低、RW=高、EP=高;输出DB0~7读出为状态字;数据读出操作输入RS=高、RW=高、EP=高;输出DB0~7读出为数据;指令写入操作输入RS=低、RW=低、EP=上升沿;输出无;数据写入操作输入RS=高、RW=低、EP=上升沿;输出无如图1602模块的引脚LCD1602正面LCD1602背面1602与单片机连接图
3.3键盘电路设计本时钟采用四个按键控制,一个实物图蓝色线24号引脚是选择,一个进行加数(实物图紫色线25号引脚),一个进行减数(实物图灰色线26号引脚),还有一个保存(实物图白色线27号引脚)例如按下选择键,然后1602显示光标,此时可以用加或减来进行调节,在按下选择键,光标移到不同的单位上,同理进行调节,最后待日期时间调节好后,按下保存键,时钟开始计时
3.4复位电路设计单片机复位有上电复位和手动复位两种方式,上电复位是接通电源后利用RC充电来实现复位手动复位是通过人为干预,强制系统复位连接至9号复位引脚复位电路如图所示,可以实现上电复位和手动复位功能
3.5时钟电路设计系统时钟源由内部时钟方式产生,时钟电路由12MH晶振和两个30PF瓷片电容组成,构成自激振荡,形成振荡源提供给单片机电容可在5PF到30PF之间选择,电容的大小对振荡频率有微小影响,可起频率微调作用
3.6整体电路原理图4控制系统的软件设计
4.1程序设计由于C语言程序设计较汇编可读性强,可移植性,且可以大大降低编程的难度和缩短开发周期,本系统程序采用c语言设计
4.2程序源代码#includereg
52.h//包含单片机寄存器的头文件#includeintrins.h//包含_nop_函数定义的头文件#defineucharunsignedchar#defineuintunsignedintsbitRS=P2^0;//寄存器选择位,将RS位定义为P
2.0引脚sbitRW=P2^1;//读写选择位,将RW位定义为P
2.1引脚sbitE=P2^2;//使能信号位,将E位定义为P
2.2引脚sbitBF=P0^7;//忙碌标志位,将BF位定义为P
0.7引脚ucharcodetable[]=2013-12-07WEEK6;//初始化液晶显示16ucharcodetable1[]=TIME:19-27-50;//14ucharcounts1num;charsecondminutehourdaymonthyearweek;sbits1=P2^3;//功能键sbits2=P2^4;//加键sbits3=P2^5;//减键sbits4=P2^6;//保存并退出/*延时若干毫秒*/voiddelayucharn{uchariab;fori=0;in;i++forb=199;b0;b--fora=1;a0;a--;}/***********************************************函数功能判断液晶模块的忙碌状态返回值resultresult=1,忙碌;result=0,不忙************************************************/ucharBusyTestvoid{bitresult;RS=0;//根据规定,RS为低电平,RW为高电平时,可以读状态RW=1;E=1;//E=1,才允许读写_nop_;//空操作_nop_;_nop_;_nop_;//空操作四个机器周期,给硬件反应时间result=BF;//将忙碌标志电平赋给resultE=0;//将E恢复低电平returnresult;}/********************************************函数功能写指令入口参数dictate*********************************************/voidWriteInstructionuchardictate{whileBusyTest==1;//如果忙就等待RS=0;//根据规定,RS和R/W同时为低电平时,可以写入指令RW=0;E=0;//E置低电平根据表8-6,写指令时,E为高脉冲,//就是让E从0到1发生正跳变,所以应先置0_nop_;_nop_;//空操作两个机器周期,给硬件反应时间P0=dictate;//将数据送入P0口,即写入指令或地址_nop_;_nop_;_nop_;_nop_;//空操作四个机器周期,给硬件反应时间E=1;//E置高电平_nop_;_nop_;_nop_;_nop_;//空操作四个机器周期,给硬件反应时间E=0;//当E由高电平跳变成低电平时,液晶模块开始执行命令}/*********************************************函数功能写数据入口参数y为字符常量**********************************************/voidWriteDatauchary{whileBusyTest==1;RS=1;//RS为高电平,RW为低电平时,可以写入数据RW=0;E=0;//E置低电平根据表8-6,写指令时,E为高脉冲,//就是让E从0到1发生正跳变,所以应先置0P0=y;//将数据送入P0口,即将数据写入液晶模块_nop_;_nop_;_nop_;_nop_;//空操作四个机器周期,给硬件反应时间E=1;//E置高电平_nop_;_nop_;_nop_;_nop_;//空操作四个机器周期,给硬件反应时间E=0;//当E由高电平跳变成低电平时,液晶模块开始执行命令}/******************************************函数功能对LCD的显示模式进行初始化设置*******************************************/voidLcdInitiatevoid{ucharnum;second=50;minute=27;hour=19;week=6;day=7;month=12;year=13;count=0;s1num=0;E=0;delay15;//延时15ms,首次写指令时应给LCD一段较长的反应时间WriteInstruction0x38;//显示模式设置16×2显示,//5×7点阵,8位数据接口delay5;//延时5ms,给硬件一点反应时间WriteInstruction0x38;delay5;WriteInstruction0x38;//连续三次,确保初始化成功delay5;WriteInstruction0x0c;//显示模式设置显示开,无光标,//光标不闪烁delay5;WriteInstruction0x06;//显示模式设置光标右移,字符不移delay5;WriteInstruction0x01;//清屏幕指令,将以前的显示内容清除delay5;WriteInstruction0x80;fornum=0;num16;num++//让液晶显示日期{WriteDatatable[num];delay5;}WriteInstruction0x80+0x40;fornum=0;num14;num++//让液晶显示时间{WriteDatatable1[num];delay5;}TMOD=0x01;//定时器中断初始化TH0=65536-50000/256;TL0=65536-50000%256;EA=1;ET0=1;TR0=1;}//-------写年月日---------------voidwrite_nyrucharadduchardate{ucharij;i=date/10;j=date%10;WriteInstruction0x80+add;WriteData0x30+i;WriteData0x30+j;}//--------写时分秒---------------voidwrite_sfmucharadduchardate{ucharij;i=date/10;j=date%10;WriteInstruction0x80+0x40+add;WriteData0x30+i;WriteData0x30+j;}//-------------写星期-------------voidwrite_weekucharadduchardate{WriteInstruction0x80+add;WriteData0x30+date;}//---------该年是否是闰年-------------bitleap_year{intleap;ifyear%4==0year%100!=0||year%400==0leap=1;//是闰年elseleap=0;//非闰年returnleap;}//----------键盘扫描--------------------voidkeyscan{ifs1==0//第一个键是否按下{delay5;ifs1==0{while!s1;s1num++;ifs1num7s1num=1;ifs1num==1//第一个键被按一次{TR0=0;WriteInstruction0x80+0x40+13;WriteInstruction0x0f;}ifs1num==2{WriteInstruction0x80+0x40+10;}ifs1num==3{WriteInstruction0x80+0x40+7;}ifs1num==4{WriteInstruction0x80+9;}ifs1num==5{WriteInstruction0x80+6;}ifs1num==6{WriteInstruction0x80+3;}ifs1num==7{WriteInstruction0x80+15;}}}ifs1num!=0//如果功能键被按下{ifs2==0//第二个按下{delay5;ifs2==0{while!s2;ifs1num==1//第一个键被按一次,秒钟加一{second++;ifsecond==60second=0;write_sfm12second;WriteInstruction0x80+0x40+13;}ifs1num==2//第一个键被按二次,分钟加一{minute++;ifminute==60minute=0;write_sfm9minute;WriteInstruction0x80+0x40+10;}ifs1num==3//第一个键被按三次,时钟加一{hour++;ifhour==24hour=0;write_sfm6hour;WriteInstruction0x80+0x40+7;}ifs1num==4//日期加一{day++;ifday==32day=1;write_nyr8day;WriteInstruction0x80+9;}ifs1num==5//月加一{month++;ifmonth==13month=1;write_nyr5month;WriteInstruction0x80+6;}ifs1num==6//年加一{year++;ifyear==99year=0;write_nyr2year;WriteInstruction0x80+3;}ifs1num==7//星期加一{week++;ifweek==8week=1;write_week15week;WriteInstruction0x80+15;}}}ifs3==0//第三个键被按下{delay5;ifs3==0{while!s3;ifs1num==1//秒减一{second--;ifsecond==-1second=59;write_sfm12second;WriteInstruction0x80+0x40+13;}ifs1num==2//分减一{minute--;ifminute==-1minute=59;write_sfm9minute;WriteInstruction0x80+0x40+10;}ifs1num==3//时减一{hour--;ifhour==-1hour=23;write_sfm6hour;WriteInstruction0x80+0x40+7;}ifs1num==4//日减一{day--;ifday==0day=31;write_nyr8day;WriteInstruction0x80+9;}ifs1num==5//月减一{month--;ifmonth==0month=12;write_nyr5month;WriteInstruction0x80+6;}ifs1num==6//年减一{year--;ifyear==-1year=99;write_nyr2year;WriteInstruction0x80+3;}ifs1num==7//日期减一{week--;ifweek==0week=7;write_week15week;WriteInstruction0x80+15;}}}ifs4==0//保存并退出{s1num=0;WriteInstruction0x0c;TR0=1;}}}/******************************************mainfunction*******************************************/voidmainvoid{uchark=0;LcdInitiate;//调用LCD初始化函数while1{keyscan;k=1;}}/*****************************************函数功能定时器T0的中断服务函数******************************************/voidtimer0interrupt1{count++;ifcount==13{count=0;second++;ifsecond==60//秒计满60,秒归0,分+1{second=0;minute++;ifminute==60//分计满60,分归0,时+1{minute=0;hour++;ifhour==24//时计满24,时归0,星期+1,日+1{hour=0;week++;day++;ifweek==8week=1;//星期计满7,星期归1ifmonth==1||month==3||month==5||month==7||month==8||month==10||month==12//大月三十一天{ifday==32//大月天数计满31,日归1,月+1{day=1;month++;}}ifmonth==4||month==6||month==9||month==11//小月三十天{ifday==31{//小月天数计满30,日归1,月+1day=1;month++;}}ifmonth==2{ifleap_year{ifday==30//闰年二月29天计满,日归1,月+1{day=1;month++;}}else{ifday==29//非闰年二月28天计满,日归1,月+1{day=1;month++;}}}ifmonth==13//月计满12,月归1,年+1{month=1;year++;ifyear==99//年计满99,年归0{year=0;}write_nyr2year;}write_nyr5month;}write_nyr8day;write_week15week;}write_sfm6hour;}write_sfm9minute;}write_sfm12second;}5仿真结果和实物图
5.1仿真结果
5.2实物图6总结说句实话,这个时钟在硬件上没有什么太多的技术含量,只有一个单片机的最小系统和一个显示电路,其实它们可以结合在一起,但是为了以后的方便,我还是将它们设计了两个部分,方便以后最小系统的其他方面的应用还有就是程序,这个时钟程序如果让我自己写的话那我肯定不能再规定时间内完成,所以还是靠外界力量的帮忙也正是如此,我找到我学习单片机的弱点,那就是程序的编写,记得室友百度开玩笑说“程序是单片机的灵魂”,想想当时很搞笑,但仔细一想,那还真是个恰当的比喻,如果说单片机没有程序的输入,那么它不能完成任何事情虽然本学期的单片机课程即将结束,但是我学习单片机的过程还没有结束,以后还是要在程序的编写上多多下工夫此次的电子时钟设计给我奠定了一个实践基础,我会在以后的学习、生活中磨练自己,使自己适应于以后的竞争当遇到不会或是设计不出来的地方,我们就会在QQ群里讨论或者是同学之间相互帮助团结就是力量,无论在现在的学习中还是在以后的工作中,团结都是至关重要的,有了团结会有更多的理念、更多的思维、更多的情感参考文献
[1]郭天祥.新概念51单片机C语言教程——入门,提高,开发,拓展全攻略[M].北京电子工业出版社,2009.。