《毕业设计(论文)基于单片机的实用数字万历设计.doc》由会员分享,可在线阅读,更多相关《毕业设计(论文)基于单片机的实用数字万历设计.doc(21页珍藏版)》请在三一办公上搜索。
1、目 录第1章 系统综述3第2章 开发平台及模块介绍42.1 开发工具42.2 处理器芯片52.3 LCD显示模块52.4 时钟芯片PCF85637第3章 系统的软硬件设计83.1 硬件电路设计83.1.1 最小系统设计电路83.1.2 时钟模块电路83.1.3 显示模块电路93.2 软件设计103.2.1 系统软件设计内容103.2.2 时钟芯片驱动程序133.2.3 LCD显示子程序16第4章 调试及结果184.1 调试中所遇问题以及解决方法184.2结果18结束语19致谢20参考文献21实用数字万年历设计摘要本文设计了一种实用数字万年历,该系统的设计是以 AT89C51 单片机为核心控制器
2、,外围连接时钟模块,键盘模块,液晶模块,日历模块等。这种电子时钟不仅具有了一般电子时钟的基本功能,显示年月日时分秒,而且可以进行闹钟设置。系统软件使用单片机C51语言进行编程。关键词:时钟;单片机;液晶;C51语言;万年历 第1章 系统综述电子时钟已成为人们日常生活中必不可少的物品,广泛用于个人家庭以及车站、码头、剧院、办公室等公共场所,给人们的生活、学习、工作、娱乐带来极大的方便。随着技术的发展,人们已不再满足于钟表原先简单的报时功能,希望出现一些新的功能,诸如日历的显示、闹钟的应用等,以带来更大的方便,而所有这些,又都是以数字化的电子时钟为基础的。因此,研究实用电子时钟及其扩展应用,有着非
3、常现实的意义,具有很大的实用价值。由于数字集成电路技术的发展和采用了先进的石英技术,使电子钟具有走时准确、性能稳定、携带方便等优点,它还用于计时、自动报时及自动控制等各个领域。虽然现在市场上已有现成的电子钟集成电路芯片出售,价格便宜,使用也灵活,如可以随意设置时、分、秒的输出,改变显示数字的大小等,并且由于集成电路技术的发展,特别是MOS集成电路技术的发展,使电子钟具有体积小、携带方便,但是这里介绍的实用电子钟可以满足使用者的一些特殊要求,输出方式灵活、功耗低、计时准确、性能稳定、维护方便等优点。实用电子时钟是一个时间控制系统,既能作为一般的时间显示器,同时可以根据需要扩展其功能。本系统上电自
4、检后,实时显示小时、分钟、秒、日历和闹钟开关等指示信息,通过按键可实现校对时间、设置闹钟时间等功能。当闹钟时间到时,单片机通过蜂鸣器来实现声音报警。第2章 开发平台及模块介绍2.1 开发工具该系统的硬件电路图是由Proteus完成的,其主要概述如。Proteus提供了丰富的资源:(1)Proteus可提供的仿真元器件资源:仿真数字和模拟、交流和直流等数千种元器件,有30多个元件库。(2)Proteus可提供的仿真仪表资源 :示波器、逻辑分析仪、虚拟终端、SPI调试器、I2C调试器、信号发生器、模式发生器、交直流电压表、交直流电流表。理论上同一种仪器可以在一个电路中随意的调用。(3)除了现实存在
5、的仪器外,Proteus还提供了一个图形显示功能,可以将线路上变化的信号,以图形的方式实时地显示出来,其作用与示波器相似,但功能更多。这些虚拟仪器仪表具有理想的参数指标,例如极高的输入阻抗、极低的输出阻抗。这些都尽可能减少了仪器对测量结果的影响。 (4)Proteus可提供的调试手段 Proteus提供了比较丰富的测试信号用于电路的测试。这些测试信号包括模拟信号和数字信号。 软件仿真:支持当前的主流单片机,如51系列、AVR系列、PIC12系列、PIC16系列、PIC18系列、Z80系列、HC11系列、68000系列等。提供软件调试功能,提供丰富的外围接口器件及其仿真RAM,ROM,键盘,马达
6、,LED,LCD,AD/DA,部分SPI器件,部分IIC器件。这样很接近实际。在训练学生时,可以选择不同的方案,这样更利于培养学生。利用虚拟仪器在仿真过程中可以测量外围电路的特性,培养学生实际硬件的调试能力。 具有强大的原理图绘制功能。电路功能仿真:在Proteus绘制好原理图后,调入已编译好的目标代码文件:*.HEX,可以在Proteus的原理图中看到模拟的实物运行状态和过程。Proteus不仅可将许多单片机实例功能形象化,也可将许多单片机实例运行过程形象化。前者可在相当程度上得到实物演示实验的效果,后者则是实物演示实验难以达到的效果。 它的元器件、连接线路等却和传统的单片机实验硬件高度对应
7、。这在相当程度上替代了传统的单片机实验教学的功能,例:元器件选择、电路连接、电路检测、电路修改、软件调试、运行结果等。 该系统还采用了Keil uVision3进行编程,其概述如下。KEIL(ARM子公司)嵌入式开发工具专业制造商。KEIL软件公司的产品包括C编译器、宏汇编器、实时内核、调试器、模拟器、集成开发环境以及8051、251,M7/ARM9/Cortex-M3和XC16x/C16x/ST10系列微控制器仿真开发装置。Keil ULINK的软件环境为Keil uVision 3。Keil系列软件具有良好的调试界面,优秀的编译效果,丰富的使用资料。使其深受国内嵌入式开发工程师的喜爱。嵌入
8、式的微处理器模拟器可以模拟被支持的微处理器设备,包括指令集、片上外设、外部激发信号。应用程序的变化可以用Vision3逻辑分析器显示,可以看到微处理器pin码的变化状态和外设随着程序变化的状况。2.2 处理器芯片采用AT89C51单片机作为系统的控制核心。时钟功能可以使用液晶显示时间、日历及闹铃,有着智能化的人机界面。由于使用了单片机,整个系统可编程,系统的灵活性大大增加了。另外,本方案可以方便的实现其他功能的扩展。AT89C51是一种带4K字节闪烁可编程可擦除只读存储器(FPEROMFalsh Programmable and Erasable Read Only Memory)的低电压,高
9、性能CMOS8位微处理器,俗称单片机。AT89C2051是一种带2K字节闪烁可编程可擦除只读存储器的单片机。单片机的可擦除只读存储器可以反复擦除100次。该器件采用ATMEL高密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容。由于将多功能8位CPU和闪烁存储器组合在单个芯片中,ATMEL的AT89C51是一种高效微控制器,AT89C2051是它的一种精简版本。AT89C单片机为很多嵌入式控制系统提供了一种灵活性高且价廉的方案。2.3 LCD显示模块单片机的主要输出方式除了发光二极管、数码管之外,还有一种重要的输出模式:液晶显示。液晶显示正被广泛应用于便携式消费电子产
10、品领域。LCD(Liquid Crystal Display)液态晶体显示器一般不会单独使用,而是将LCD面板、驱动电路、控制电路集成在一个模块(Moulde)上一起使用,简称LCM。在单片机系统中使用液晶显示模块具有以下的优点。l 显示质量高:不同于阴极射线管显示器(CRT)的不断刷新亮点,液晶显示器每个点收到信号后就一直保持那种色彩和亮度,因此画面质量高,不闪烁。l 数字式接口:液晶显示器均为数字式的,方便和单片机系统连接。l 体积小、重量轻:液晶显示器通过显示屏上的电极控制液晶分子的方向,使折射率发送变化,从而达到显示的目的。比传统显示器要轻便。l 功耗小:液晶显示器的功耗主要在内部电极
11、和驱动IC上,因而耗电量很小。本系统采用的是1602型的LCD显示模块。1602字符型LCD通常有14条引脚线或16条引脚线的LCD,多出来的2条线是背光电源线,VCC(15脚)和地线GND(16脚),其控制原理与14脚的LCD完全一样。液晶显示器如图1所示,引脚功能见表1。 图1 液晶显示器外形表1 引脚功能引脚符号功能说明1VSS一般接地2VDD接电源(+5V)3V0液晶显示器对比度调整端,接正电源时对比度最弱,接地电源时对比度最高(对比度过高时会产生“鬼影”,使用时可以通过一个10K的电位器调整对比度)。4RSRS为寄存器选择,高电平1时选择数据寄存器、低电平0时选择指令寄存器。5R/W
12、R/W为读写信号线,高电平(1)时进行读操作,低电平(0)时进行写操作。6EE(或EN)端为使能(enable)端,下降沿使能。7DB0底4位三态、 双向数据总线 0位(最低位)8DB1底4位三态、 双向数据总线 1位9DB2底4位三态、 双向数据总线 2位10DB3底4位三态、 双向数据总线 3位11DB4高4位三态、 双向数据总线 4位12DB5高4位三态、 双向数据总线 5位13DB6高4位三态、 双向数据总线 6位14DB7高4位三态、 双向数据总线 7位(最高位)(也是busy flag)15BLA背光电源正极16BLK背光电源负极2.4 时钟芯片PCF8563实时时钟选择PHILI
13、PS 公司的PCF8563芯片实现,它是一款工业级低功耗的CMOS 实时时钟日历芯片。它提供一个可编程时钟输出,一个中断输出和掉电检测器,所有的地址和数据通过I2C总线接口串行传递。最大总线速度为400Kbit/s,每次读写数据后,内嵌的字地址寄存器会自动产生增量。PCF8563 是一款性价比极高的时钟芯片,它已被广泛用于电表、水表、气表、电话传真、机便携式仪器等产品上。PCF8563具有以下基本特征:(1) 低工作电流:典型值为0.25A(VDD=3.0V,Tamb=25时);(2) 400KHz 的I2C 总线接口(VDD=1.85.5V 时);(3) 可编程时钟输出频率为:32.768K
14、Hz,1024Hz,32Hz,1Hz;(4) 内含复位电路振荡器电容和掉电检测电路;(5) 四种报警功能和定时器功能;(6) I2C 总线从地址:读,0A3H;写,0A2H。PCF8563的芯片引脚排布及引脚介绍如图2所示:图2 PCF8563芯片引脚排布及说明第3章 系统的软硬件设计3.1 硬件电路设计3.1.1 最小系统设计电路单片机要正常运行,必须具备一定的硬件条件,其中最主要的就是三个基本条件:(1)电源正常;(2)时钟正常;(3)复位正常。在AT89C51单片机的40个引脚中,电源引脚2根,晶振引脚2根,控制引脚4根,可编程输入输出引脚32根。最小系统连接图如图3所示。图3 AT89
15、C51最小系统连接图3.1.2 时钟模块电路 PCF8563 芯片的工作原理如下:它有16个8位寄存器,一个可自动增量的地址寄存器,一个内置32.768KHz 的振荡器(带有一个内部集成的电容),一个分频器(用于给实时时钟RTC 提供源时钟),一个可编程时钟输出,一个定时器,一个报警器,一个掉电检测器和一个400KHz I2C总线接口。I2C 总线从地址:读,0A3H;写,0A2H。所有16个寄存器设计成可寻址的8 位并行寄存器,但不是所有位都有用。前两个寄存器(内存地址00H,01H)用于控制寄存器和状态寄存器,内存地址02H08H 用于时钟计数器(秒年计数器),地址09H0CH 用于报警寄
16、存器(定义报警条件),地址0DH 控制CLKOUT 管脚的输出频率,地址0EH 和0FH 分别用于定时器控制寄存器和定时器寄存器。秒、分钟、小时、日、月、年、分钟报警、小时报警、日报警寄存器,编码格式为BCD,星期和星期报警寄存器不以BCD 格式编码。当一个RTC 寄存器被读时,所有计数器的内容被锁存,因此,在传送条件下,可以禁止对时钟/日历芯片的错读。连接原理图如图4所示。图4 PCF8563连接原理图3.1.3 显示模块电路1602B可以显示2行16个字符,有8位数据总线D0-D7,和RS、R/W、EN三个控制端口,工作电压为5V,并且带有字符对比度调节和背光。LCD显示模块与单片机的连接
17、如图5所示。图5 LCD连接图3.2 软件设计3.2.1 系统软件设计内容本设计的软件程序包括主程序、中断子程序、闹钟设定子程序、时钟显示子程序。在整个系统中,在单片机的30H、31H和32H中存储当前时间的小时、分钟和秒。用LCD显示当前的时间,必须用到分字和合字,因此在33H、34H、35H、36H、37H和38H中存储当前时间的时十位、时个位、分十位、分个位、秒十位和秒个位,方便显示。本设计有由四个轻触按键组成的小键盘,这些按键可以任意改变当前的状态。按功能移位键一次,表示当前要校对小时的十位;按第二次,表示当前校对的是小时的个位;按第三次,则表示校对的是分钟的十位;第四次,表示的校对的
18、是分钟的个位。按下数字“+” 键和数字“-”键可在当前校对的数字上相应加上1或者减去1。系统软件采用C语言编写。时钟的最小计时单位是秒,但使用定时器的方式1,最大的定时时间也只能达到131ms。我们可把定时器的定时时间定为50ms。这样,计数溢出20次即可得到时钟的最小计时单位:秒。而计数20次可以用软件实现。秒计时是采用中断方式进行溢出次数的累积,计满20次,即得到秒计时。从秒到分,从分到时是通过软件累加并进行比较的方法来实现的。要求每满1秒,则“秒”单元中的内容加1;“秒”单元满60,则“分”单元中的内容加1;“分”单元满60,则“时”单元中的内容加1;“时”单元满24,则将时、分、秒的内
19、容全部清零。实时时钟程序设计步骤:(1)选择工作方式,计算初值;(2)采用中断方式进行溢出次数累计;(3)从秒分时的计时是通过累加和数值比较实现的;(4)时钟显示缓冲区:时钟时间在方位数码管上进行显示,为此在内部RAM中要设置显示缓冲区,共6个地址单元。显示缓冲区从左到右依次存放时、分、秒数值;(5)主程序:主要进行定时器/计数器的初始化编程,然后反复调用显示子程序的方法等待中断的到来。 (6)中断服务程序:进行计时操作;(7)加1子程序:用于完成对时、分、秒的加操作,中断服务程序在秒、分、时加1时共三次调用加1子程序,包括:合字、加1并进行进制调整、分字。3.2.2主程序MAIN流程框图3.
20、2.3 时钟芯片驱动程序时钟芯片采用的是PCF8563芯片,它提供一个可编程时钟输出,一个中断输出和掉电检测器,所有的地址和数据通过I2C总线接口串行传递。驱动程序代码如下:* (1)函数名:void I2CStart(void)* 功能:发送I2C总线的起始位* 输入:无* 输出:无*/void I2CStart(void)EA=0;SDA=1; SCL=1; SomeNOP();SDA=0; SomeNOP();SCL=0;/* (2)函数名:void I2CStop(void)* 功能:发送I2C总线的停止位* 输入:无* 输出:无*/void I2CStop(void)SCL=0; S
21、DA=0; SomeNOP();SCL=1; SomeNOP(); SDA=1; EA=1;/* (3)函数名:void WaitAck (void)* 功能:主机等待从机发送来的确认ACK* 输入:无* 输出:true / false*/bool WaitAck(void)uchar errtime=255; /因故障接收方无ACK,超时值为255。SDA=1;SomeNOP();SCL=1;SomeNOP();while(SDA) errtime-; if (!errtime) I2CStop(); SystemError=0x11; return false; SCL=0;return
22、true;/* (4)函数名:void I2CSendByte (uchar ch)* 功能:向总线发送一个字节的数据* 输入:要发送的字节数据* 输出:无*/void I2CSendByte(uchar ch)uchar i=8;while (i-)SCL=0;_nop_();SDA=(bit)(ch&0x80); ch=1; SomeNOP();SCL=1; SomeNOP();SCL=0;/* (5)函数名:uchar I2CReceiveByte (void)* 功能:接收总线上发来的一个字节的数据* 输入:无* 输出:接收到的一个字节数据*/uchar I2CReceiveByte(
23、void)uchar i=8;uchar ddata=0;SDA=1;while (i-)ddata=1;SCL=0; SomeNOP();SCL=1; SomeNOP();ddata|=SDA;SCL=0;return ddata;/* (6)函数名:void GetPCF8563(uchar firsttype,uchar count,uchar *buff)* 功能:读取时钟芯片PCF8563的时间 * 输入:设置要读的第一个时间类型firsttype,设置读取的字节数count,* 再把一次把时间读取到buff中。顺序是:0x02(秒)/ 0x03(分)/* 0x04(小时)/0x05
24、(日)/0x06(星期)/0x07(月)/0x08(年)* 输出:无*/void GetPCF8563(uchar firsttype,uchar count,uchar *buff)uchar i;I2CStart();I2CSendByte(0xA2); /0xA2表示从机的写数据地址WaitAck();I2CSendByte(firsttype);WaitAck();I2CStart();I2CSendByte(0xA3); /0xA3表示从机的读数据地址WaitAck();for (i=0;icount;i+)buff(i)=I2CReceiveByte(); /从总线上读取count
25、字节的数据if (i!=count-1) SendAck(); /除最后一个字节外,其他都要从MASTER发应答。SendNotAck();I2CStop();/* (7)函数名:void SetPCF8563(uchar timetype,uchar value)* 功能:调整PCF8563芯片中的时钟值* 输入:要调整的时间类型timetype,新设置的时间值value(BCD格式)。* 时间类型为:0x02(秒)/ 0x03(分)/ 0x04(小时)/0x05(日)/* 0x06(星期)/0x07(月)/0x08(年)* 输出:接收到的一个字节数据*/void SetPCF8563(uc
26、har timetype uchar value)I2CStart();I2CSendByte(0xA2); /0xA2表示从机的写数据地址WaitAck();I2CSendByte(timetype); /将时间类型发送到总线WaitAck();I2CSendByte(value); /将新设置的时间发送到总线WaitAck(); /等待从机应答I2CStop();3.2.4 LCD显示子程序本系统所使用的LCD模块内部已集成了驱动电路,在使用时非常方便,只需按照此LCD模块的指令表,将指令写入LCD模块即可实现对应功能。 此LCD模块的控制函数有初始化函数、命令写入函数和数据写入函数,具体
27、代码如下所述。/* (1)函数名:void LCD_Init(void)* 功能:初始化LCD模块* 输入:无* 输出:无*/void LCD_Init(void) LCD_Wcmd(0x01); /清零指令 LCD_Wcmd(0x38); /功能设置,8位数据,两行显示,57矩阵LCD_Wcmd(0x0E); /显示开关,有光标,闪烁LCD_Wcmd(0x06); /输入方式,增量加1/* (2)函数名:void LCD_Wcmd(uchar cmd)* 功能:将命令写入LCD模块* 输入:要写入的命令值* 输出:无*/void LCD_Wcmd(uchar cmd)RS=0; /RS=0表
28、示写指令 RW=0; E=1; P2=cmd; /送指令到数据线 delay(5); E=0; /下降沿写入/* (3)函数名:void LCD_Wbyte(uchar data)* 功能:将单个字节数据写入LCD模块* 输入:要写入的数据* 输出:无*/void LCD_Wbyte(uchar data)RS=1; /RS=1表示写数据 RW=0; E=1; P2=cmd; /送指令到数据线 delay(5); E=0; /下降沿写入/* (4)函数名:void LCD_Wbyte(uchar *buf )* 功能:连续写8字节数据写入LCD模块* 输入:要写入的数据缓冲区首址* 输出:无*
29、/void LCD_Wbyte(uchar *buf ) uchar i RS=1; RW=0; for(i=0;i8;i+) E=1; P2=bufi; delay(5); E=0第4章 调试及结果4.1 调试中所遇问题以及解决方法单片机最小系统方面由于是去年学的,因此还花了时间去找,一方面我们没有正确 的原理图,只有一张以前随便画的图,就算有了原理图,也不知道板上错在哪里,所以只能用万用表一个个的找。通过我们的认真检查,结果发现不管是板上还是图纸上都出了相当大的错误,图上很多引脚都标注错误了,还是一些小的原因造成LED显示不正常,诸如上述的问题还给我们造成了很大的麻烦。程序设计方面,因为是
30、自己头一次尝试独立完成一份相对规模较大程序,因些也遇到了不少的麻烦。比如程序地址空间分配问题,因为51单片机内资源有限,往往会发生冲突,此时保护就显得相当重要。诸如上面一些问题给我造成了很大的麻烦,但是经过老师的检查,最终还是找到了错误,并解决了错误。4.2 结果经过认真反复的调试,显示器终于正常显示。显示结果如图6所示图6 显示结果图结束语经过这次万年历的设计,我不但丰富了知识层次,而且我对系统开发的过程也有了很深的理解。不仅把单片机的理论与实践相结合,而且丰富了自己的编程经验。本文设计了一种基AT89C51单片机的万年历设计,能显示年月日时分秒,并能设置闹钟。通过按键的调节还能改变时间,然
31、后,送入AT89C51单片机。整个控制系统的组成按功能是由控制主板,液晶模块,键盘和时钟模块,电源,复位电路组成的。在软件设计方面,我第一次尝试编写程序,虽然对我来说是相当大的挑战,但是我还是认真完成了这次编程,多亏了老师的帮助。在组装方面,一定要认真对照电路图,因为电路图是老师给的,所以在最后实际操作时,也遇到了一些困难,特别是引脚的连接一定要注意。由于毕业设计的时间较短,所以该系统考虑还不够全面,还存在一些问题,这些都有待于进一步完善。希望老师们提出宝贵意见,这对我以后的学习会有莫大的帮助,也是对我大学学习生活的圆满总结与升华。 致谢本文主要描述了实用数字万年历,使我对单片机产生了浓厚的兴
32、趣,我已经开始关注单片机的一系列机遇与挑战。本篇论文虽然凝聚着自己的汗水,但却不是个人的智慧的产品,没有老师的指引和赠与,没有朋友的帮助和支持,我在大学的学术成长肯定会大打折扣。当我打完毕业论文的最后一张,涌上心头的不仅是长途跋涉后抵达终点的欣喜,还有源自心底的诚挚谢意。我首先感谢我的老师白延敏,对我的构思以及论文的内容不厌其烦的进行多次指导和悉心指点,使我在完成论文的同时也深受启发和教育。再次由衷感谢答辩组的各位老师对学生的指导和教诲,我也在努力的积蓄着力量,尽自己的微薄之力回报母校的培育之情,争取使自己的人生对社会产生些许积极的价值!参考文献1 李朝青.单片机原理及接口技术2008.7,北京航空航天大学出版社;2 郭勇 .EDA技术基础2008.4.机械工业技术出版社;3 童诗白.华成英,模拟电子技术基础,北京高等教育出版社,2001:312-330,387-391,408-411,446-451;4李华.MCS-51系列单片机实用接口技术,北京:北京航空航天大学出版社.1993:138-248.5皮红梅,李英顺.单片机开发中的定时方法.沈阳石油化工高等专科学校学报.2002年12月.