《硬件课程设计说明书电子时钟的设计论文.doc》由会员分享,可在线阅读,更多相关《硬件课程设计说明书电子时钟的设计论文.doc(33页珍藏版)》请在三一办公上搜索。
1、信息与控制工程学院硬件课程设计说明书电子时钟的设计学生学号:05510241学生姓名: 唐重和 专业班级:自动0502指导教师:刘凤鹍职 称: 起止日期:2008.4.142008.5.4吉林化工学院Jilin Institute of Chemical Technology课程设计任务书一、设计题目:电子时钟二、设计目的1、掌握利用AT89C52和LCD1602芯片组成的电子时钟电路。2、熟悉AT89C52单片机的性能特点,并掌握使用AT89C52单片机控制LCD1602读写时间、日期的硬件电路组成及软件编程方法;3、了解LCD1602液晶显示模块的构成和用法4、了解7805构成直流稳压电源
2、的电路组成及工作原理。三、设计任务及要求 设计并实现具有显示日期和时间的电子数字钟,数字钟具有以下基本功能:1、使用LCD1602显示时间和日期,上面一行显示时间,下面一行显示日期;2、具有时间校准(调时或对时)功能,通过键盘可进行时间、日期的校准;四、设计时间及进度安排设计时间共两周(2008.03.032008.03.21),具体安排如下表:周安排设 计 内 容设计时间第一周硬件电路设计2008.04.142008.04.17第二周硬件电路焊接与调试2008.04.182008.04.252006.10.27第三周编写课程设计说明书,课程设计答辩。2008.04.262008.05.04五
3、、指导教师评语及学生成绩指导教师评语:年 月 日成绩指导教师(签字):目 录课程设计任务书I第一章绪论1第二章 设计原理介绍221原理框图222设计原理2第三章 芯片功能介绍43.1 AT89C5243.2 LCD16026第四章 各部分电路介绍94.1 直流稳压电源94.2 振荡电路94.3按键电路104.4复位电路114.5显示电路11第五章 系统程序介绍135.1万年历程序135.2按键程序13第六章 电路焊接及调试156.1 焊接注意事项156.2电路调试15第七章 总 结17第八章 参考文献18第一章 绪论硬件设计是学生理论联系实际的重要实践教学环节,是对学生进行的一次综合性专业设计
4、训练。通过课程设计使学生获得以下几方面能力,于此同时为毕业设计(论文)奠定基础。1进一步巩固和加深所学一门或几门相关专业课(或专业基础课)理论知识,培养设计、计算、绘图、计算机应用、文献查阅、报告撰写等基本技能;2培养学生实践动手能力及独立分析和解决工程实际问题的能力;3培养学生的团队协作精神、创新意识、严肃认真的治学态度和严谨求实的工作作风。本次设计是设计一个电子时钟,由直流稳压电源,单片机系统,振荡电路,按键电路,数码显示电路六部分组成。直流稳压电源为整个系统提供5V电压,键盘电路用于调节时间,通过功能程序的编写,使按键具有调节时间的作用。单片机系统通过与各个部分相连以达到调试和通过数码显
5、示电路显示实时时间,通过程序的编写,驱动LCD1602显示时间,同时使电路具有时间调整功能,并且能够显示年月日及时分秒。第二章 设计原理介绍21原理框图本次设计的原理图如图2-1图2-122设计原理本系统采用由89C52型单片机为核心构成复位电路,键盘电路,时钟电路,LCD1602液晶显示电路及电源电路。从而实现单片机小系统的设计与LCD1602的驱动电路接口设计。由AT89C51单片机的内部16位定时/计数器是一个可编程定时/计数器,它既可以工作在13位定时方式,也可以工作在16位定时方式和8位定时方式。只要通过设置特殊功能寄存器TMOD,即可完成。定时/计数器何时工作也是通过软件来设定TC
6、ON特殊功能寄存器来完成的。现在我们选择16位定时工作方式,对于T0来说,最大定时也只有65536us,即65.536ms,无法达到我们所需要的1秒的定时,因此,我们必须通过软件来处理这个问题,假设我们取T0的最大定时为50ms,即要定时1秒需要经过20次的50ms的定时。对于这20次我们就可以采用软件的方法来统计了。因此,我们设定TMOD00000001B,即TMOD01H下面我们要给T0定时/计数器的TH0,TL0装入预置初值,通过下面的公式可以计算出TH0(21650000) / 256TL0(21650000)MOD 256当T0在工作的时候,我们如何得知50ms的定时时间已到,这回我
7、们通过检测TCON特殊功能寄存器中的TF0标志位,如果TF01表示定时时间已到。通过软件编程从而实现万年历程序与键盘扫描与按键判断。第三章 芯片功能介绍3.1 AT89C52AT89C52是美国ATMEL公司生产的一种低功耗,高性能CMOS 8位单片机,片内含8k bytes的可反复擦写的Flash只读程序存储器和256 bytes的随机存取数据存储器(RAM),芯片兼容标准MCS-51指令系统。AT89C52将具有多种功能的8位CPU与Flash存储单元结合在一个芯片上,为很多嵌入式控制应用提供了非常灵活而又便宜的方案。AT89C52有40个引脚,32个外部双向输入/输出(I/O)端口,同时
8、内含2个外中断口,3个16位可编程定时计数器,2个全双工串行通信口,2个读写口线,AT89C52可以按照常规方法进行编程,也可以在线编程。其将通用的微处理器和Flash存储器结合在一起,特别是可反复擦写的Flash存储器可有效地降低开发成本。主要功能特性: 兼容MCS51指令系统 8k可反复擦写(1000次)Flash ROM 32个双向I/O口 256x8bit内部RAM 3个16位可编程定时/计数器中断 时钟频率0-24MHz 2个串行中断 可编程UART串行通道 2个外部中断源 共6个中断源 2个读写中断口线 3级加密位 低功耗空闲和掉电模式 软件设置睡眠和唤醒功能 其引脚图如图3-1所
9、示图3-1管脚说明: (1)VCC:电源电压(2)GND:接地(3)RST:复位输入。当振荡器复位器件时,要保持RST脚两个机器周期的高电平时间。(4)/EA/VPP:当/EA保持低电平时,则在此期间外部程序存储器(0000H-FFFFH),不管是否有内部程序存储器。注意加密方式1时,/EA将内部锁定为RESET;当/EA端保持高电平时,此间内部程序存储器。在FLASH编程期间,此引脚也用于施加12V编程电源(VPP)。(5)XTAL1:反向振荡放大器的输入及内部时钟工作电路的输入。(6)XTAL2:来自反向振荡器的输出。(7)P0口:P0口为一个8位漏级开路双向I/O口,也即地址/数据总线复
10、用口。作为输出口用时,每脚可吸收8TTL门电流。当P0口的管脚第一次写1时,被定义为高阻输入。P0能够用于外部程序数据存储器,它可以被定义为数据/地址的第八位。在FIASH编程时,P0 口作为原码输入口,当FIASH进行校验时,P0输出原码,此时P0外部必须被拉高。(8)P1口:P1口是一个内部提供上拉电阻的8位双向I/O口,P1口缓冲器能吸收或输出4TTL门电流。P1口管脚写入1后,被内部上拉为高,可用作输入,P1口被外部下拉为低电平时,将输出电流,这是由于内部上拉的缘故。在FLASH编程和校验时,P1口作为第八位地址接收。 (9)P2口:P2口为一个内部上拉电阻的8位双向I/O口,P2口缓
11、冲器可吸收或输出4个TTL门电流,当P2口被写“1”时,其管脚被内部上拉电阻拉高,且作为输入。并因此作为输入时,P2口的管脚被外部拉低,将输出电流。这是由于内部上拉的缘故。P2口当用于外部程序存储器或16位地址外部数据存储器进行存取时,P2口输出地址的高八位。在给出地址“1”时,它利用内部上拉优势,当对外部八位地址数据存储器进行读写时,P2口输出其特殊功能寄存器的内容。P2口在FLASH编程和校验时接收高八位地址信号和控制信号。(10)P3口:P3口管脚是8个带内部上拉电阻的双向I/O口,可吸收或输出4个TTL门电流。当P3口写入“1”后,它们被内部上拉为高电平,并用作输入。作为输入,由于外部
12、下拉为低电平,P3口将输出电流(ILL)这是由于上拉的缘故。P3口也可作为AT89C52的一些特殊功能口,如下表3-1所示:口管脚备选功能P3.0 RXD串行输入口P3.1 TXD串行输出口P3.2 /INT0外部中断0P3.3 /INT1外部中断1P3.4 T0记时器0外部输入P3.5 T1记时器1外部输入P3.6 /WR外部数据存储器写选通P3.7 /RD外部数据存储器读选通表3-1P3口同时为闪烁编程和编程校验接收一些控制信号。(11)ALE/PROG:当访问外部存储器时,地址锁存允许的输出电平用于锁存地址的地位字节。在FLASH编程期间,此引脚用于输入编程脉冲。在平时,ALE端以不变的
13、频率周期输出正脉冲信号,此频率为振荡器频率的1/6。因此它可用作对外部输出的脉冲或用于定时目的。然而要注意的是:每当用作外部数据存储器时,将跳过一个ALE脉冲。如想禁止ALE的输出可在SFR8EH地址上置0。此时, ALE只有在执行MOVX,MOVC指令是ALE才起作用。另外,该引脚被略微拉高。如果微处理器在外部执行状态ALE禁止,置位无效。(12)/PSEN:外部程序存储器的选通信号。在由外部程序存储器取指期间,每个机器周期两次/PSEN有效。但在访问外部数据存储器时,这两次有效的/PSEN信号将不出现。在本设计中所用到的引脚有VCC,GND,RST,/EA/VPP,XTAL1,XTAL2,
14、P1口,P2口。3.2 LCD1602现在的字符型液晶模块已经是单片机应用设计中最常用的信息显示器件了。LCD1602显示模块具有体积小,功耗低,显示内容丰富等特点。 LCD1602可以显示2行16个字符,有8位数据总线D0D7和RS,R/W,EN三个控制端口,工作电压为5V,并且具有字符对比度调节和背光功能。如图3-2图3-2各引脚详细功能如下,1602采用标准的16脚接口,其中: 第1脚:VSS为地电源第2脚:VDD接5V正电源第3脚:V0为液晶显示器对比度调整端,接正电源时对比度最弱,接地电源时对比度最高,对比度过高时会产生“鬼影”,使用时可以通过一个10K的电位器调整对比度第4脚:RS
15、为寄存器选择,高电平时选择数据寄存器、低电平时选择指令寄存器。第5脚:RW为读写信号线,高电平时进行读操作,低电平时进行写操作。当RS和RW共同为低电平时可以写入指令或者显示地址,当RS为低电平RW为高电平时可以读忙信号,当RS为高电平RW为低电平时可以写入数据。第6脚:E端为使能端,当E端由高电平跳变成低电平时,液晶模块执行命令。第714脚:D0D7为8位双向数据线。第1516脚:L+与L-分别接电源正端及地。1602液晶模块内部的字符发生存储器(CGROM)已经存储了160个不同的点阵字符图形,如图3-3所示,这些字符有:阿拉伯数字、英文字母的大小写、常用的符号、和日文假名等,每一个字符都
16、有一个固定的代码,比如大写的英文字母“A”的代码是01000001B(41H),显示时模块把地址41H中的点阵字符图形显示出来,我们就能看到字母“A”1602液晶模块内部的控制器共有11条控制指令,如图3-3所示,图 3-3它的读写操作、屏幕和光标的操作都是通过指令编程来实现的。(说明:1为高电平、0为低电平)指令1:清显示,指令码01H,光标复位到地址00H位置指令2:光标复位,光标返回到地址00H指令3:光标和显示模式设置 I/D:光标移动方向,高电平右移,低电平左移 S:屏幕上所有文字是否左移或者右移。高电平表示有效,低电平则无效指令4:显示开关控制。 D:控制整体显示的开与关,高电平表
17、示开显示,低电平表示关显示 C:控制光标的开与关,高电平表示有光标,低电平表示无光标 B:控制光标是否闪烁,高电平闪烁,低电平不闪烁指令5:光标或显示移位 S/C:高电平时移动显示的文字,低电平时移动光标指令6:功能设置命令 DL:高电平时为4位总线,低电平时为8位总线 N:低电平时为单行显示,高电平时双行显示 F: 低电平时显示5x7的点阵字符,高电平时显示5x10的点阵字符指令7:字符发生器RAM地址设置指令8:DDRAM地址设置指令9:读忙信号和光标地址 BF:为忙标志位,高电平表示忙,此时模块不能接收命令或者数据,如果为低电平表示不忙。指令10:写数据指令11:读数据第四章 各部分电路
18、介绍4.1 直流稳压电源直流稳压电源的电路图如图4-1所示,但在本次实验中,直流稳压电源不作为设计内容,以成品代替。图4-1如图所示,220V交流电通过双12V变压器变为12V的交流电,12V交流电通过四个二极管的全桥整流后变为12V直流电,然后经过电解电容(470F)进行一级滤波,以去除直流电里面的杂波,防止干扰。12V直流电出来后再经过三端稳压器7805稳压成为稳定的5V电源,其中7805的Vin脚是输入脚,接12V直流电源正极,GND是接地脚,接12V直流电源负极,Vout为输出脚,它和接地脚的电压就是+5V了。5V电源出来再经过电解电容的二级滤波,使5V电源更加稳定可靠。此时一个稳定输
19、出5V的电源已经设计好,对于本设计它完全能够满足单片机及集成块所需电源的要求。4.2 振荡电路AT89C52与其它型号的MCS51单片机一样,片内有一由高增益反相放大器构成的振荡器。反相放大器的输入端为XTALl,输出端为XTAL2,两端接石英晶体及两个电容形成稳定的自激振荡器。电容通常取30PF左右。振荡频率范围是1212MHz,如下图4-2(左)所示。晶体振荡器的振荡信号从XTAL2端输出到片内的时钟发生器上。时钟发生器为二分频器向CPU提供两相时钟信号P1和P2。时钟信号的周期称作机器状态时间s是振荡周期的2倍。每个时钟周期有两个节拍(相)P1和P2,CPU就以两相时钟P1和P 2为基本
20、节拍指挥AT89C52单片机各部件协调工作。下图4-2(右)给出片内时钟发生原理。图4-2 本系统的振荡电路图如图4-3所示,振荡电路为12M晶体产生振荡,为单片机提供固定频率。通过分频等产生基本秒信号,为计数器计数提供基准。 图4-3 4.3按键电路 独立式按键接口设计: 独立式按键就是各按键相互独立,每个按键单独占用一根I/O口线,每根I/O口线的按键工作状态不会影响其他I/O口线上的工作状态。因此,通过检测输入线的电平状态可以很容易判断哪个按键被按下了。 优点:电路配置灵活,软件结构简单。 缺点:每个按键需占用一根I/O口线,在按键数量较多时,I/O口浪费大,电路结构显得复杂。 因此,此
21、键盘是用于按键较少或操作速度较高的场合。 上电路中独立式按键电路,各按键开关均采用了上拉电阻,是为了保证在按键断开时,各I/O有确定的高电平。如输入口线内部已有上拉电阻,则外电路的上拉电阻可省去。为提高电路的判断速度,此按键电路采用中断形式,不断检测四个支路的电位变化;当按键按下后,接口电位被拉低,程序产生中断,执行指定功能。各按键功能:KEY_1:设 置选择要调整的选项KEY_2:加 键调整时间,向上累加数字一KEY_3:减 键调整时间,使其减少数字一KEY_4:确 定去定此次修改成功此模块与单片机的接口电路图如图4-4图4-44.4复位电路复位电路是在单片机的复位RST9引脚上进行的在振荡
22、器运行时,有两个机器周期(24个振荡周期)以上的高电平出现在此引腿时,将使单片机复位,只要这个脚保持高电平,51芯片便循环复位。复位后P0P3口均置1引脚表现为高电平,程序计数器和特殊功能寄存器SFR全部清零。当复位脚由高电平变为低电平时,芯片为ROM的00H处开始运行程序。单片机复位的条件是:必须使RSW阳或RST引脚(9)加上持续两个机器周期(即24个振荡周期)的高电平。如,若时钟频率为12MHz,每机器周期为1s,则只需2s以上时间的高点平,在RST引脚出现高电平后的第二个机器周期执行复位。本系统采用上电复位电路,它足利用电容充电来实现的。在接电瞬间,RESET端的电位与VCC相同,随着
23、充电电流的减少,RESET的电位逐渐下降。只要保证RESET为高电平的时间大于两个机器周期,使能正常复位。如图4-5图4-54.5显示电路显示电路与单片机的硬件连接如图4-6,显示电路是由LCD1602与AT89C52相连组成的,通过驱动程序,使液晶显示模块显示时间图4-6第五章 系统程序介绍5.1万年历程序万年历程序是由C语言编写,通过循环使单片机内部的计数器开始计数,显示时间时,当计数器计满“60”时,向前一位进一,显示日期时与时间相似。具体程序流程如图5-1:图5-15.2按键程序按键程序采用中断形式,不断检测按键出的电位变化,因再按动按键时有抖动现象,所以程序中有延时程序,防止抖动现象
24、。具体程序如下如图5-2:主程序循环开始取系统时间并转二进制为ACSII码将时间存入显示缓冲区显示时间和界面调用延时子程序时间调整完毕键盘按下?OK键按下?否是是否调用时间修改程序读键盘输入值 图5-2第六章 电路焊接及调试6.1 焊接注意事项使用久了的烙铁将烙铁头部锉亮,然后通电加热升温,并将烙铁头蘸上一点松香,待松香冒烟时在上锡,使在烙铁头表面先镀上一层锡。 电烙铁通电后温度高达250摄氏度以上,不用时应放在烙铁架上,但较长时间不用时应切断电源,防止高温“烧死”烙铁头(被氧化)。要防止电烙铁烫坏其他元器件,尤其是电源线,若其绝缘层被烙铁烧坏而不注意便容易引发安全事故。不要把电烙铁猛力敲打,
25、以免震断电烙铁内部电热丝或引线而产生故障。 电烙铁使用一段时间后,可能在烙铁头部留有锡垢,在烙铁加热的条件下,我们可以用湿布轻檫。如有出现凹坑或氧化块,应用细纹锉刀修复或者直接更换烙铁头。焊接过程要有一定的时间和温度,焊接时间一般不超过三秒,是将哦长则易损换元件,但时间过短,则容易形成虚焊和假焊。焊接时不可施加压力;注意区分有极性元器件的极性;尽量避免重复焊接。6.2电路调试6.2.1硬件调试在电路焊接完毕以后,把万用表旋到蜂鸣档。把表笔连接电源和地,检测在焊接过程中是否是电源和地之间短路。检测各个芯片的电源和地是否都已经连接上。检查各个应该连接在一起的管脚之间的是连接。检查键盘接的是否正确。
26、检查LCD1602的管脚焊接是否正确。6.2.2 软件调试伟福仿真器硬件方面的特点:通用仿真器、仿真CPU外置、强大的逻辑分析仪综合调试功能、波形发生器功能、影子存储器、代码覆盖、程序时效分析、数据时效分析、硬件测试、时间触发、记时器、双CPU结构。软件方面先进的特点:Wave6000和Keil uVsion 双平台、双工作模式软件模拟仿真和硬件模拟仿真、真正集成调试环境、项目管理功能、多语言多模块混合调试、直接点屏观察变量、功能强大的变量观察、强大的书签、断点管理功能、类似IE的前进、后退定位功能一、 程序的仿真调试1、 建立新程序选择文件/新建文件功能,在一个文件名为NONAME1的源程序
27、窗口下输入程序。2、 保存新程序选择菜单文件/保存文件或文件/另存为功能,文件保存位置:C:WAVE6000SAMPLES文件名.ASM3、 建立新项目选择文件/新建项目功能,新建项目会自动分三步走:加入模块文件、加入包含文件、保存项目。项目保存好后,选窗口/项目窗口功能来打开。4、 设置项目选择设置/仿真器设置功能或按“仿真器设置”快捷图标或双击项目窗口的第一行打开“仿真器设置”对话框,在“仿真器”栏中选仿真器类型和配置的仿真头及所要仿真的单片机。5、 编译程序选择项目/编译功能或按快捷图标或F9键,编译你的项目。若编译没有错误,就可调试程序了。6、 单步调试程序选择执行/跟踪功能或按快捷图
28、标或F7键进行单步跟踪调试程序。7、 连接硬件仿真将仿真器通过串行电缆连接计算机上,将仿真头接到仿真器,检查接线是否有误,确信没有接错后,接上电源,打开仿真器的电源开关。在“仿真器”和“通信设置”中选择“使用伟福软件模拟器”,如仿真器和仿真头设置正确,且硬件连接没有错误,就会出现“硬件仿真”的对话框,没有错误可进行硬件仿真调试程序。第七章 总 结通过本次硬件的设计与制作,让我进一步的了解了设计电路的过程,同时也是对我这三年来的学习的一个总结,更是在从实验室退出又一次接触到电子线路与单片机,通过这次实习,我了解到了51单片机的下载与仿真,更为重要的是深入的理解430单片机与51单片机的区别,这就
29、使我想到要不是在课堂上学习过单片机原理,我可能就不在本次实习中把理论与实践相结合。在以后的学习中只有把我们只有把理论和实践相结合才能更好的完成我们的工作。同时在实习的过程中,我还学会了团队协作精神、创新意识、严肃认真的治学态度和严谨求实的工作作风,我们小组运用大家的智慧完成了这次设计,其中缺了任何一个环节都是不行的,这种协作的能力也是我们应该注意培养的。对于这次实习我总结了以下几点:1、首先要有扎实的理论基础,理论通不过思路就无法清晰的指导实践。2、要在设计初期对每个器件的所要放的位置和所要占的空间应该有清醒 的认识,如果空间把握不好,就会在后来的布局中感觉空间不足,即使勉强把需要用的器件全部
30、放上,焊接出来的结果也不美观。3、在焊接电路时,尽可能的使电路的各模块之间分开,布线要整齐。这样既有利于自己检查调试电路,也有利于与同学进行交流。步线凌乱,容易出现短接现象,也会造成调试困难。总之,通过这次实习让我受益匪浅,从中我得到了很多锻炼,也了解到了自己的不足,在今后的学习中我会努力完善这些不足,争取从容自信的步入社会。最后感谢老师在这次实习中对我们的细心教导,让我收获很多。从硬件设计任务下达到设计任务的完成,整个过程经历了确定设计目标、拟订设计项目、执行设计任务、完成设计任务四个步骤。在这四个步骤中,执行设计任务是最艰辛的,但同时也是我们组团队精神得到最大发挥的时候,是我们组最具有成就
31、感的阶段。在执行设计任务的过程中,实物的焊接以及到后来论文的完成都不是最难的,最难的是硬件的调试,因为理论与实践总是存在着差距,想出来的东西没有经过实践的检验是不可靠的,任何一个小小的疏忽大意都能导致失败。比如说,因为P0口与其它口的区别,要在AT89C52单片机的P0口上驱动LCD的显示必须加上上拉电阻,这只是一个例子,在设计的过程中遇到的问题远远不止这一个。从这一方面来说,我认识到要做成一件事是很难的,其中必定有很多的阻碍,但是我们一定要慢慢来,一点一点地找出问题,再一点一点地解决它,这样的话,到达成功的彼岸也就仅仅是时间的问题了。我想,通过这次设计,特别是通过对硬件的制作而不单单是对原理
32、的论述,我学到的不仅仅是电子方面的知识,更重要的是,我学到了作为一名电子设计者所必需的心理素质,那就是决心加上耐心!当然,在制作的过程中我也强烈地感受到团队的力量,没有团队地共同努力是不可能完成设计任务地。除此之外,没有老师的关心与帮助也是很难达到设计要求的,在此再次向两位指导老师:刘伟老师及刘凤昆老师表示感谢!第八章 参考文献01翟玉文.电子设计与实践M.北京:中国电力出版社,2005 引用起始页356页02张毅刚.单片机原理及应用M北京:高等教育出版社,2003引用起始页145页03MCS-51系列单片机实用接口技术M北京:北京航空航天大学出版社引用起始页156页4 张伟.单片机原理及应用
33、M.北京:机械工业出版社5 余锡存.单片机原理及接口技术M.西安:西安电子科技大学出版社附录电子时钟原理图:程序:LCD1602驱动程序:/*/#ifndef LCD_CHAR_1602_2005_4_9#define LCD_CHAR_1602_2005_4_9#include #include #include LCD1602.h/Port Definitions*sbit LcdRs = P16;sbit LcdRw = P15;sbit LcdEn = P14;#define DBPort P2/P0=0x80,P1=0x90,P2=0xA0,P3=0xB0.数据端口/内部等待函数*u
34、nsigned char LCD_Wait(void)LcdRs=0;LcdRw=1;_nop_();LcdEn=1;_nop_();while(DBPort&0x80);/在用Proteus仿真时,注意用屏蔽此语句,在调用GotoXY()时, 会进入死循环, /可能在写该控制字时,该模块没有返回写入完备命令,即DBPort&0x80=0x80 /实际硬件时打开此语句LcdEn=0;return DBPort;/向LCD写入命令或数据*#define LCD_COMMAND0 / Command#define LCD_DATA1 / Data#define LCD_CLEAR_SCREEN0x
35、01 / 清屏#define LCD_HOMING 0x02 / 光标返回原点void LCD_Write(bit style, unsigned char input)LcdEn=0;LcdRs=style;LcdRw=0;_nop_();DBPort=input; _nop_();/注意顺序LcdEn=1;_nop_();/注意顺序LcdEn=0;_nop_();LCD_Wait();/设置显示模式*#define LCD_SHOW0x04 /显示开#define LCD_HIDE0x00 /显示关#define LCD_CURSOR0x02 /显示光标#define LCD_NO_CUR
36、SOR0x00 /无光标#define LCD_FLASH0x01 /光标闪动#define LCD_NO_FLASH0x00 /光标不闪动void LCD_SetDisplay(unsigned char DisplayMode)LCD_Write(LCD_COMMAND, 0x08|DisplayMode);/设置输入模式*#define LCD_AC_UP0x02#define LCD_AC_DOWN0x00 / default#define LCD_MOVE0x01 / 画面可平移#define LCD_NO_MOVE0x00 /defaultvoid LCD_SetInput(uns
37、igned char InputMode)LCD_Write(LCD_COMMAND, 0x04|InputMode);/移动光标或屏幕*/*#define LCD_CURSOR0x02#define LCD_SCREEN0x08#define LCD_LEFT0x00#define LCD_RIGHT0x04void LCD_Move(unsigned char object, unsigned char direction)if(object=LCD_CURSOR)LCD_Write(LCD_COMMAND,0x10|direction);if(object=LCD_SCREEN)LCD_
38、Write(LCD_COMMAND,0x18|direction);*/初始化LCD*void LCD_Initial()LcdEn=0;LCD_Write(LCD_COMMAND,0x38); /8位数据端口,2行显示,5*7点阵LCD_Write(LCD_COMMAND,0x38);LCD_SetDisplay(LCD_SHOW|LCD_NO_CURSOR); /开启显示, 无光标LCD_Write(LCD_COMMAND,LCD_CLEAR_SCREEN); /清屏LCD_SetInput(LCD_AC_UP|LCD_NO_MOVE); /AC递增, 画面不动/*void GotoXY(
39、unsigned char x, unsigned char y)if(y=0)LCD_Write(LCD_COMMAND,0x80|x);if(y=1)LCD_Write(LCD_COMMAND,0x80|(x-0x40);void Print(unsigned char *str)while(*str!=0)LCD_Write(LCD_DATA,*str);str+;void LCD1602_Write(unsigned char x,unsigned char y,unsigned char *str)GotoXY(y,x);Print(str);/*void LCD_LoadChar(
40、unsigned char user8, unsigned char place)unsigned char i;LCD_Write(LCD_COMMAND,0x40|(place*8);for(i=0; i8; i+)LCD_Write(LCD_DATA,useri);*/*#endif主程序:#include #include LCD1602.hsbit keyon = P10; / 调整键 fun键sbit keya = P11; / 数值 “+”sbit keym = P12; / 数值 “-”sbit keyoff= P13; / 调整结束char MONTH=04,DAY=29,H
41、=23,Min=59,S=55; /定义年,月,日,及时,分,秒unsigned int YEAR=2008;unsigned char LCD_Buf116; /显示数组1(时分秒)unsigned char LCD_Buf216; /显示数组2(年月日)unsigned char yion=0,yia=0,yim=0,queren=0; / 键位值标志位/*-延时-*/void delay(unsigned int i) while(-i);/*-延时1-*/void delay1(char ms) int i,j; for(i=0;ims;i+) for(j=0;j1000;j+);/*-*/void Char2Str(