用51单片机实现电子时钟单片机课程设计.doc_第1页
用51单片机实现电子时钟单片机课程设计.doc_第2页
用51单片机实现电子时钟单片机课程设计.doc_第3页
用51单片机实现电子时钟单片机课程设计.doc_第4页
用51单片机实现电子时钟单片机课程设计.doc_第5页
已阅读5页,还剩20页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

湖北文理学院湖北文理学院 单片机课程设计 题目:用 51 单片机实现电子时钟 院 部 物理与电子信息工程学院 专 业 名 称 电子信息科学与技术 班 级 1111 姓 名 杨庆月 学 号 2011111136 指 导 教 师 李刚 2013 年 12 月 09 日 目录 摘要-1 1 单片机的相关知识 -1 1.1 单片机的简介-1 1.2 单片机的特点-1 1.3 89c52单片机的基本特点-2 2 电子时钟-3 2.1电子时钟的基本特点-3 2.2电子时钟的原理-4 3 控制系统的硬件设计 -4 3.1单片机型号的选择-4 3.2 lcd1602工作的原理-4 3.3 键盘电路的设计-6 3.4 复位电路设计-6 3.5 时钟电路设计-7 3.6 整体电路原理图-7 4 控制系统的软件的设计 -8 4.1程序的设计-8 4.2程序源代码-8 5 仿真结果和实物图-19 5.1仿真结果-19 5.2实物图-19 6 总结-20 参考文献 -21 0 摘要:单片计算机即单片微型计算机。由 ram ,rom,cpu构成,定时,计数和多种接 口于一体的微控制器。它体积小,成本低,功能强,广泛应用于智能产业和工业自动化上。 而 51系列单片机是各单片机中最为典型和最有代表性的一种。这次课程设计通过对它的学 习,应用,从而达到学习、设计、开发软、硬的能力。 本设计主要设计了一个基于 at89c52单片机的电子时钟。并在 1602上显示相应的时间。并 通过一个控制键用来实现时间的调节和是否进入省电模式的转换。 具有时钟和日历的功能,年限显示范围是2013-2099(可修改),且具有闰年自动修 正功能 关键字:单片机;子时钟;键盘控制;lcd1602。 1 1 单片机识的相关知识 1.11.1 单片机简介 mcs-51是 intel公司在成功推广的 mcs-48单片机基础上加以改进而成的 8位单片机。 这种单片机大约是上世纪 70年代末推出的,内部程序可重写的为 8751,外扩程序的是 8031,一次性生产,不可改变程序的是 8051。外形一般 为 dip40封装。不久又推出了增强型的 8052,其资源更加丰富。以后又采用 chmos技术推出了 80c51,耗电大大降低。到了 90年代,intel公司把精力放到 更赚钱的计算机上,将 51单片机技术转让给了一此其它公司,如 atmel philips等半导体制造公司,使 51系列单片机的市场份额不断扩大。 尽管十多年前就有人认为 51单片机会很快淘汰,但事实证明 51单片机经 过不断的改进后,由于技术成熟,使用方便,至今在 8位单片机市场仍然拥有 庞大的用户。特别是 mcs-51技术的 20年专利期限到期后,大量的兼容型号不 断推出。从上世纪 90年代后期开始,美国 atmel公司在掌握快速擦写的存储器 后,推出了 at89c系列,此系列在中国获得了广泛的应用。 在此之前,由于可擦写的 8751价格昂贵,国内长时间采用 8031+27c64这 样的外扩存程序储器方式。 51单片机最初只有 dip40这种很古老的封装,后来推出了 chmos工艺的 80c51后开始有了 plcc44这种相对较小的方形封装。at89c系列中开始有 20脚 的 dip20的精简型封装,这极大方便了在一些相对简单的单片机应用,缩小了 pcb的体积。20脚的有 at89c1051、at89c1051、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 1 的单片机,价格较低 stc采用串口直接下载程序,写入程序很方便。 1.21.2 单片机的特点 1 . 单片机的存储器rom 和ram 时严格区分的。rom 称为程序存储器,只存放 程序,固定常数,及数据表格。ram 则为数据存储器,用作工作区及存放用户 数 据。 2 . 采用面向控制的指令系统。为满足控制需要,单片机有更强的逻辑控制能 力, 特别是单片机具有很强的位处理能力。 3 . 单片机的i/o 口通常时多功能的。由于单片机芯片上引脚数目有限,为了 解决实际引脚数和需要的信号线的矛盾,采用了引脚功能复用的方法,引脚处 于 何种功能, 可由指令来设置或由机器状态来区分。 4 . 单片机的外部扩展能力很强。在内部的各种功能部件不能满足应用的需求 时,均可在外部进行扩展,与许多通用的微机接口芯片兼容,给应用系统设计 带 来了很大的方便。 1.31.3 89c5289c52 单片机介绍 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)这是由于上拉的缘故。 2 p3 口也可作为at89c52 的一些特殊功能口,如下表所示: 口管脚备选功能 p3.0 rxd(串行输入口)p3.1 txd(串行输出口)p3.2 /int0(外部中断0) p3.3 /int1(外部中断1)p3.4 t0(记时器0 外部输入)p3.5 t1(记时器1 外 部输入)p3.6 /wr(外部数据存储器写选通)p3.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 3 端保持高电平时,此间内部程序存储器。在flash 编程期间,此引脚也用于施 加 12v 编程电源(vpp) 。 2 2 电子时钟 2.1 电子时钟的基本特点 现在高精度的计时工具大多数都使用了石英晶体振荡器,由于电子钟、石 英 钟、石英表都采用了石英技术,因此走时精度高,稳定性好,使用方便,不需 要 经常调试,数字式电子钟用集成电路计时时,译码代替机械式传动,用用液晶 显 示器代替指针显示进而显示时间,减小了计时误差,这种表具有时、分、秒显 示 时间的功能,还可以进行时和分的校对,片选的灵活性好。 2.2 电子时钟的原理 该电子时钟由89c52,1602 液晶等构成,采用晶振电路作为驱动电路,由 延时程序和循环程序达到时分秒的计时,六十秒为一分钟,六十分钟为一小时, 满二十四小时为一天。而电路中有四个控制按键,一个是选择,一个进行加数, 一个进行减数,还有一个保存。例如按下选择键,然后1602显示光标,此时可 以用加或减来进行调节,在按下选择键,光标移到不同的单位上,同理进行调 节,最后待日期时间调节好后,按下保存键,时钟开始计时。 3 3 控制系统的硬件设计 3.1 单片机型号的选择 通过对51单片机的学习,认为stc89c52 是最理想的电子时钟开发芯片。 stc89c52,最终认为89c52是一种带8k 字节闪烁可编程可擦除只读存储器的低 电压,高性能cmos8位微处理器,器件采用高密度非易失存储器制造技术制造, 与工业标准的mcs-52指令集和输出引脚相兼容。还有一点重要原因,就是采用 at89c52时不能用开发板进行程序的下载,所以最终选用stc89c52进行设计。 3.2 1602 工作原理及显示电路 字符型lcd 通常有14 条引脚线或16 条引脚线的lcd,多出来的2 条线是背 光电源线vcc(15 脚)和地线gnd(16 脚),其控制原理与14 脚的lcd 完全一样 1602液晶的基本的操作分为以下四种: 4 状态字读操作:输入rs=低、rw=高、ep=高; 输出:db07 读出为状态字; 数据读出操作:输入rs=高、rw=高、ep=高; 输出:db07 读出为数据; 指令写入操作:输入rs=低、rw=低、ep=上升沿; 输出:无; 数据写入操作:输入rs=高、rw=低、ep=上升沿; 输出:无。 如图 1602 模块的引脚 lcd1602 正面 5 lcd1602 背面 1602 与单片机连接图 3.3 键盘电路设计 6 本时钟采用四个按键控制,一个(实物图蓝色线24号引脚)是选择,一个进 行加数(实物图紫色线25号引脚) ,一个进行减数(实物图灰色线26号引脚) , 还有一个保存(实物图白色线27号引脚) 。例如按下选择键,然后1602显示光标, 此时可以用加或减来进行调节,在按下选择键,光标移到不同的单位上,同理 进行调节,最后待日期时间调节好后,按下保存键,时钟开始计时。 3.4 复位电路设计 单片机复位有上电复位和手动复位两种方式,上电复位是接通电源后利 用 rc 充电来实现复位。手动复位是通过人为干预,强制系统复位。 连接至9号复位引脚 复位电路如图所示,可以实现上电复位和手动复位功能。 3.5 时钟电路设计 7 系统时钟源由内部时钟方式产生,时钟电路由 12mh 晶振和两个 30pf 瓷片 电容组成,构成自激振荡,形成振荡源提供给单片机。电容可在 5pf 到 30pf 之间选择,电容的大小对振荡频率有微小影响,可起频率微调作用。 3.6 整体电路原理图 4 控制系统的软件设计 4.1 程序设计 由于c 语言程序设计较汇编可读性强,可移植性,且可以大大降低编程的 难 8 度和缩短开发周期,本系统程序采用c 语言设计。 4.2 程序源代码 #include /包含单片机寄存器的头文件 #include /包含_nop_()函数定义的头文件 #define uchar unsigned char #define uint unsigned int sbit rs=p20; /寄存器选择位,将rs位定义为p2.0引脚 sbit rw=p21; /读写选择位,将rw位定义为p2.1引脚 sbit e=p22; /使能信号位,将e位定义为p2.2引脚 sbit bf=p07; /忙碌标志位,将bf位定义为p0.7引脚 uchar code table=“2013-12-07 week6“; /初始化液晶显示 16 uchar code table1=“time: 19-27-50“; /14 uchar count,s1num; char second,minute,hour,day,month,year,week; sbit s1=p23; /功能键 sbit s2=p24; /加键 sbit s3=p25; /减键 sbit s4=p26; /保存并退出 /* 延时若干毫秒 */ void delay(uchar n) uchar i,a,b; for(i=0;i0;b-) for(a=1;a0;a-); /* 函数功能:判断液晶模块的忙碌状态 返回值:result。result=1,忙碌;result=0,不忙 */ uchar busytest(void) bit result; rs=0; /根据规定,rs为低电平,rw为高电平时,可以读状态 rw=1; e=1; /e=1,才允许读写 9 _nop_(); /空操作 _nop_(); _nop_(); _nop_(); /空操作四个机器周期,给硬件反应时间 result=bf; /将忙碌标志电平赋给result e=0; /将e恢复低电平 return result; /* 函数功能:写指令 入口参数:dictate */ void writeinstruction(uchar dictate) while(busytest()=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(为字符常量) */ void writedata(uchar y) while(busytest()=1); rs=1; /rs为高电平,rw为低电平时,可以写入数据 rw=0; 10 e=0; /e置低电平(根据表8-6,写指令时,e为高脉冲, /就是让e从0到1发生正跳变,所以应先置“0“ p0=y; /将数据送入p0口,即将数据写入液晶模块 _nop_(); _nop_(); _nop_(); _nop_(); /空操作四个机器周期,给硬件反应时间 e=1; /e置高电平 _nop_(); _nop_(); _nop_(); _nop_(); /空操作四个机器周期,给硬件反应时间 e=0; /当e由高电平跳变成低电平时,液晶模块开始执行命令 /* 函数功能:对lcd的显示模式进行初始化设置 */ void lcdinitiate(void) uchar num; second=50; minute=27; hour=19; week=6; day=7; month=12; year=13; count=0; s1num=0; e=0; delay(15); /延时15ms,首次写指令时应给lcd一段较长的反应时间 writeinstruction(0x38); /显示模式设置:162显示, /57点阵,8位数据接口 delay(5); /延时5ms?,给硬件一点反应时间 writeinstruction(0x38); delay(5); writeinstruction(0x38); /连续三次,确保初始化成功 delay(5); writeinstruction(0x0c); /显示模式设置:显示开,无光标, /光标不闪烁 delay(5); writeinstruction(0x06); /显示模式设置:光标右移,字符不移 11 delay(5); writeinstruction(0x01); /清屏幕指令,将以前的显示内容清除 delay(5); writeinstruction(0x80); for(num=0;num7) s1num=1; if(s1num=1) /第一个键被按一次 tr0=0; writeinstruction(0x80+0x40+13); writeinstruction(0x0f); if(s1num=2) writeinstruction(0x80+0x40+10); if(s1num=3) 13 writeinstruction(0x80+0x40+7); if(s1num=4) writeinstruction(0x80+9); if(s1num=5) writeinstruction(0x80+6); if(s1num=6) writeinstruction(0x80+3); if(s1num=7) writeinstruction(0x80+15); if(s1num!=0) /如果功能键被按下 if(s2=0) /第二个按下 delay(5); if(s2=0) while(!s2); if(s1num=1) /第一个键被按一次,秒钟加一 second+; if(second=60) second=0; write_sfm(12,second); writeinstruction(0x80+0x40+13); if(s1num=2) /第一个键被按二次,分钟加一 minute+; if(minute=60) minute=0; write_sfm(9,minute); writeinstruction(0x80+0x40+10); 14 if(s1num=3) /第一个键被按三次,时钟加一 hour+; if(hour=24) hour=0; write_sfm(6,hour); writeinstruction(0x80+0x40+7); if(s1num=4) /日期加一 day+; if(day=32) day=1; write_nyr(8,day); writeinstruction(0x80+9); if(s1num=5) /月加一 month+; if(month=13) month=1; write_nyr(5,month); writeinstruction(0x80+6); if(s1num=6) /年加一 year+; if(year=99) year=0; write_nyr(2,year); writeinstruction(0x80+3); if(s1num=7) /星期加一 week+; if(week=8) week=1; write_week(15,week); writeinstruction(0x80+15); if(s3=0) /第三个键被按下 15 delay(5); if(s3=0) while(!s3); if(s1num=1) /秒减一 second-; if(second=-1) second=59; write_sfm(12,second); writeinstruction(0x80+0x40+13); if(s1num=2) /分减一 minute-; if(minute=-1) minute=59; write_sfm(9,minute); writeinstruction(0x80+0x40+10); if(s1num=3) /时减一 hour-; if(hour=-1) hour=23; write_sfm(6,hour); writeinstruction(0x80+0x40+7); if(s1num=4) /日减一 day-; if(day=0) day=31; write_nyr(8,day); writeinstruction(0x80+9); if(s1num=5) /月减一 month-; if(month=0) month=12; write_nyr(5,month); writeinstruction(0x80+6); 16 if(s1num=6) /年减一 year-; if(year=-1) year=99; write_nyr(2,year); writeinstruction(0x80+3); if(s1num=7) /日期减一 week-; if(week=0) week=7; write_week(15,week); writeinstruction(0x80+15); if(s4=0) /保存并退出 s1num=0; writeinstruction(0x0c); tr0=1; /* main function */ void main(void) uchar k=0; lcdinitiate(); /调用lcd初始化函数 while(1) keyscan(); k=1; /* 函数功能:定时器t0的中断服务函数 17 */ void timer0() interrupt 1 count+; if(count=13) count=0; second+; if(second=60) /秒计满60,秒归0,分+1 second=0; minute+; if(minute=60)/分计满60,分归0,时+1 minute=0; hour+; if(hour=24) /时计满24,时归0,星期+1,日+1 hour=0; week+; day+; if(week=8) week=1; /星期计满7,星期归1 if(month=1|month=3|month=5|month=7|month=8|month

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论