还剩28页未读,继续阅读
本资源只提供10页预览,全部文档请下载后查看!喜欢就下载吧,查找使用更方便
文本内容:
用单片机做液晶LCD时钟
一、任务设计制作基于LCD液晶显示屏的,可以调整的时钟系统
二、要求
1.基本要求
(1)采用1602液晶屏显示显示当前日期、时间和实时温度,温度精度为1度
(2)日期可以显示为年月日;时间可以显示为时分秒
(3)日期和时钟可以通过按键进行调节校正
2.发挥部分
(1)选用12864液晶屏显示日期和时钟
(2)温度精度达到
0.5度
(3)当系统断电后,时钟仍然可以保持
(4)可以设置至少两个闹铃;设置温度上下限,超限可以__
三、说明
(1)手工焊接或者自己制作PCB板,不得采购市场上成品(包括PCB和设计实物)用单片机做液晶LCD时钟[摘要]我们设计的LCD时钟温度系统是由__控制器、温度检测器、时钟系统、__系统显示器及键盘部分组成控制器采用单片机AT__S52,温度检测部分采用DS18B20温度传感器,时钟系统用时钟芯片DS1302,用LCD液晶12864F作为显示器,用蜂鸣器及发光二极管构成声光__器单片机通过时钟芯片DS1302获取时间数据,对数据处理后显示时间;温度传感器DS18B20采集温度__送该给单片机处理;单片机再把时间数据和温度数据送液晶显示器12864F显示,12864F还可以显示汉字;键盘是用来调时和温度查询的[关键字]单片机LCD液晶DS18B20DS1302128641引言随着人们生活水平的不断提高单片机控制无疑是人们追求的目标之一,它所给人带来的方便也是不可否定的,要为现代人工作、科研、生活、提供更好的更方便的设施就需要从数单片机技术入手,一切向着数字化控制,智能化控制方向发展本设计是数据采集及处理,键盘控制,显示系统及__系统与单片机有效结合,本设计是通过在“单片机原理及应用”课堂上学习的知识的综合应用,以及查阅资料,培养一种自学的能力并且引导一种创新的思维,把学到的知识应用到日常生活当中在设计的过程中,不断的学习,思考和同学间的相互讨论,运用科学的分析问题的方法解决遇到的困难,掌握单片机系统一般的__流程,学会对常见问题的处理方法,积累设计系统的经验,充分发挥教学与实践的结合全能提高个人系统__的综合能力,开拓了思维,为今后能在相应工作岗位上的工作打下了坚实的基础一方案设计及方案论证
1.时钟温度的总体设计思路按照系统的设计功能要求,本时钟温度系统的设计必须采用单片机软件系统实现,用单片机的自动控制能力配合按键控制,来控制时钟、温度的调整及显示获得时钟温度数据信息,单片机对其进行一系列的处理,最后通过液晶显示出来
2.时钟温度系统方案论证
2.1时钟系统方案选择方案1通过单片机内部的定时器/计数器,用软件实现,直接用单片机的定时器编程以实现时钟;方案2用专门的时钟芯片实现时钟的记时,再把时间数据送入单片机,由单片机控制显示虽然用软件实现时钟硬件线路简单,但是程序运行的每一步都需要时间,多一步或少一步程序都会影响记时的准确度,对定时器定时也不是十分准确,时钟精度很低,对于我们实现所需要的功能造成软件编程非常复杂用专用时钟芯片硬件成本相对较高,但它的精度很高,软件编程很简单综上所述,选择方案
22.2单片机的选择对于单片机的选择,如果用8031系列,由于它没有内部RAM,系统又需要大量内存存储数据,因而不可用;51系列单片机的ROM为4K,对于我们设计的系统可能有点小;52系列单片机与51系列的结构一样,而ROM扩大为8K,对我们设计系统提供充足的空间进行功能的扩展再有51系列单片机与52系列的单片机__差不多因此,我们选择52系列的单片机
2.3显示系统的方案比较方案1用数码管或LED显示方案2用液晶1602显示方案3用液晶12864显示时钟和温度的显示可以用数码管或LED,而且__便宜但是数码管的只能显示简单的设计的系统,与我们设计要求也不相符有很多东西需要显示,还是用显示功能更好的液晶显示器比较好,它能显示更多的数据,用1602液晶显示数据有限,显示数据的可读性不好,用可以显示汉字的12864液晶显示器还可以增加显示信息的可读性,让人看起来会很方便另外它们在__上差距很大,考虑成本我们首选1602但是我们有
12864.因此我们选择方案三
2.4__系统的方案比较方案1用长鸣的蜂鸣器实现闹钟__及温度超限__方案2用喇叭加__芯片实现闹钟__及温度超限__用喇叭加__芯片成本很高,但声音还不错,再有喇叭体积庞大用蜂鸣器,成本低,电路结构简单,而且体积小限于设计所需要的功能,用蜂鸣器是最佳选择所以我们采用方案
1.
2.5温度系统方案选择方案1用热敏电阻等测温元件测出电压,再转换成对应的温度需要比较多的外部元件支持,且硬件电路复杂,制作成本相对较高方案2用DS18B20直接测温DS18B20温度传感器是美国DALLAS半导体公司最新推出的一种改进型智能温度传感器,它能直接读出被测温度,并且可根据实际要求通过简单的编程实现9~12位的数字值读数方式经比较,我们选择方案2温度实现只能通过外部的温度传感器来实现经上网查阅及市场考察,DS18b20体积小,只有3只脚,电路接法简单内部含有寄存器为我们设计实现上下限__功能提供保障精度为
0.5°C,也符合我们设计的要求DS18B20也是我们通常使用的型号,因此温度传感器用DS18B
202.6键盘控制方案选择方案1__集成键盘,采用矩阵形式连接方案2__单个复位开关做成键盘虽然集成键盘美观,与单片机的接口少,但是它的成本比较高单片机的IO口对于我们的设计绰绰有余通常我们选用__便宜单个复位开关做成键盘
3.时钟温度系统总体设计初步确定设计系统由单片机主控模块、时钟模块、测温模块、__模块、显示模块、键盘接口模块共6个模块组成,电路系统框图如图
(1)所示二.硬件设计部分1单片机最小系统电路设计
1.1单片机芯片选择单片机采用52系列单片机由ATMEL公司生产的AT__S52是一种低功耗、高性能CMOS8位微控制器,具有8K在系统可编程Flash存储器使用Atmel公司高密度非易失性存储器技术制造,与工业80C51产品指令和引脚完全兼容在单芯片上,拥有灵巧的8位CPU和在线系统可编程Flash,使得AT__S52为众多嵌入式控制应用系统提供高灵活、有效的解决方案AT__S52具有以下标准功能8k字节Flash,256字节RAM,32位I/O口线,看门狗定时器,2个数据指针,三个16位定时器/计数器,一个6向量2级中断结构,全双工串行口,片内晶振及时钟电路空闲模式下,CPU停止工作,允许RAM、定时器/计数器、串口、中断继续工作掉电保护方式下,RAM内容被保存,振荡器被冻结,单片机一切工作停止,直到下一个中断或硬件复位为止而且,它还具有一个看门狗(WDT)定时/计数器,如果程序没有正常工作,就会强制整个系统复位,还可以在程序陷入死循环的时候,让单片机复位而不用整个系统断电,从而保护你的硬件电路AT__S52有40个引脚,32个外部双向输入/输出(I/O)端口,同时内含2个外中断口,2个16位可编程定时计数器2个全双工串行通信口,片上Flash允许程序存储器在系统可编程,亦适于常规编程器其将通用的微处理器和Flash存储器结合在一起,特别是可反复擦写的Flash存储器可有效地降低__成本其芯片外观及引脚图如下图
1.1_1图
1.1_
21.2单片机管脚说明VCC供电电压GND接地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口也可作为AT__S52的一些特殊功能口,如下表所示管脚备选功能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)XTAL1反向振荡放大器的输入及内部时钟工作电路的输入XTAL2来自反向振荡器的输出
1.3单片机最小系统单片机最小系统主要由复位电路,晶振电路,电源等几部分组成1)复位电路复位电路有两种方式上电复位和按钮复位,我们主要用按钮复位方式如下图所示2)晶振电路晶振电路原理图如3-2 3-2 晶振模块原理图 选取原则电容选取30pF,晶振为12MHz3)电源AT__S52单片机的供电电源是5V的直流电4)EA非/Vpp脚我们没有用外部扩展ROM因此EA非/Vpp为高电平,即接+5V电源2时钟系统电路设计
2.1时钟芯片选择我们采用具有涓细电流充电能力的低功耗实时时钟电路DS1302它可以对年、月、日、周日、时、分、秒进行计时,且具有闰年补偿等多种功能它采用主电源和备用电源双电源供电它的工作电压范围
2.0~
5.5V,在
2.2V时,小于300nA它内部含有31个字节的静态RAM,可提供用户访问 http://___.hudong.com/editsectionauth/DS1302%E8%8A%AF%E7%__%87/3\t_selfDS1302可以对年、月、日、周日、时、分、秒进行计时可以达到我们设计的基本的要求内部的寄存器为我们调时,闹钟定时提供了寄存空间备用用电源也实现了当系统断电后,时钟仍然可以保持而且它是串行接口,与单片机通信所需要的接口少不像DS12887等芯片并行通信需要很多IO口
2.2DS1302管脚及寄存器说明
(1)DS1302的引脚排列Vcc1为后备电源,VCC2为主电源在主电源关闭的情况下,也能保持时钟的连续运行DS1302由Vcc1或Vcc2两者中的较大者供电当Vcc2大于Vcc1+
0.2V时,Vcc2给DS1302供电当Vcc2小于Vcc1时,DS1302由Vcc1供电因此,我们vcc1用3V的纽扣电池作为备用电源,vcc2用系统电源作为主电源X1和X2是振荡源,外接
32.768kHz晶振RST是复位/片选线,通过把RST输入驱动置高电平来启动所有的数据传送RST输入有两种功能首先,RST接通控制逻辑,允许地址/命令序列送入移位寄存器;其次,RST提供终止单字节或多字节数据的传送手段当RST为高电平时,所有的数据传送被初始化,允许对DS1302进行操作如果在传送过程中RST置为低电平,则会终止此次数据传送,I/O引脚变为高阻态上电运行时,在Vcc≥
2.5V之前,RST必须保持低电平只有在SCLK为低电平时,才能将RST置为高电平I/O为串行数据输入输出端双向SCLK为时钟输入端 http://___.hudong.com/editsectionauth/DS1302%E8%8A%AF%E7%__%87/5\t_self j__ascript:void0 http://___.hudong.com/wiki/DS1302%E8%8A%AF%E7%__%87\lcatalog#catalog http://___.hudong.com/editsectionauth/DS1302%E8%8A%AF%E7%__%87/7\t_self j__ascript:void0
(2)DS1302的寄存器说明DS1302有12个寄存器,其中有7个寄存器与日历、时钟相关,存放的数据位为BCD码形式此外,DS1302还有年份寄存器、控制寄存器、充电寄存器、时钟突发寄存器及与RAM相关的寄存器等时钟突发寄存器可一次性顺序读写除充电寄存器外的所有寄存器内容DS1302与RAM相关的寄存器分为两类一类是单个RAM单元,共31个,每个单元组态为一个8位的字节,其命令控制字为C0H~FDH,其中奇数为读操作,偶数为写操作;另一类为突发方式下的RAM寄存器,此方式下可一次性读写所有的RAM的31个字节,命令控制字为FEH写、FFH读
2.3DS1302时钟电路 DS1302时钟电路如下图所示DS1302与单片机的连接仅需3条线时钟线SCLK、数据线I/O和复位线RST时钟线SCLK与P
2.4相连,数据线I/O与P
2.5相连,复位线RST与P
2.6相连由于DS1302是靠涓细电流充电来实现串行输入输出的,因此,在SCLK、I/O、RST线上要加上拉电阻,其中,它们的电流应该在500u~1__之间,若电源为5V,则R约为5k,因此,我们的电阻R=
4.7K在单电源与电池供电系统中,vcc1提供低电源并提供低功率的备用电源Vcc2提供高电源作为芯片供电的主电源因此,这里vcc1用3V纽扣电池,vcc2用5V的系统电源晶振为
32.768KHz接入X
1、X2引脚3温度系统电路
3.1温度芯片的选择温度实现只能通过外部的温度传感器来实现经上网查阅资料及市场考察,DS18b20体积小,只有3只脚,电路接法简单它能够直接读出被测温度内部含有寄存器为我们设计实现上下限__功能提供保障用户可定义的非易失性温度__设置;__搜索命令识别并标志超过程序限定温度(温度__条件)的器件;精度为
0.5°C,也符合我们设计的要求DS18B20也是我们通常使用的型号,因此温度传感器用DS18B
203.2DS18B20内部结构描述DS18B20温度传感器的内部存储器还包括一个高速暂存RAM和一个非易失性的可电擦除的EERAM高速暂存RAM的结构为8个字节的存储器,结构如图
4.1所示头两个字节包含测得的温度信息,第三和第四字节是TH和TL的拷贝,是易失的,每次上电复位时被刷新第五个字节为配置寄存器,它的内容用于确定温度值的数字转换分辨率DS18B20工作时按此寄存器中的分辨率将温度转换为相应精度的数值该字节各位的定义如图
4.2所示低5位一直为1,TM是测试模式位,用于设置DS18B20在工作模式还是在测试模式
3.3DS18b20温度系统电路DS18B20系统电路如下DS18B20有两种接法一是单线接法即只接QT这种方法应用它内部的寄生电源,因此在QT上要用一个MOSFET把I/O线只接拉到电源上二是从vdd脚加上电源方法一适合于远距离温度监控,不需要本地电源而我们只是设计测温系统,选择方法二就行了,还有MOSFET极容易烧,我们不用它Vdd接5V电源,vss接地,QT与P
2.7相连因为DS18B20的工作电流约为1__,因此Qt端还要加上拉电阻为其提供电流若用5V电源,则R=5/1__=5kR取
4.7K4键盘控制系统设计按键需要4个,分别实现为时间调整、时间的加、时间的减、退出四个功能用单片机的4个I/O口接收控制__,其电路图如下4个按键的一端与地相连,另一端分别与P
1.
0、P
1.
1、P
1.
2、P
1.3相连这时当按键按下就输入低电平5__电路系统设计__电路由蜂鸣器、三极管、电阻、LED等构成电路图如下它们与单片机的接口分别是P
2.0P
1.4P
1.56液晶显示系统设计
6.112864F简介带中文字库的128X64是一种具有4位/8位并行、2线或3线串行多种接口方式,内部含有国标一级、二级简体中文字库的点阵图形液晶显示模块http://blog.mop.com/diary/__in/diarySearchMore.jspv=模块\t_blank;其显示分辨率为128×64内置8192个16*16点汉字,和128个16*8点ASCII字符集.利用该模块灵活的接口方式和简单、方便的操作指令,可构成全中文人机交互图形界面可以显示8×4行16×16点阵的汉字.也可完成图形显示.低电压低功耗是其又一显著特点由该模块构成的液晶显示方案与同类型的图形点阵液晶显示模块相比,不论硬件电路结构或显示程序都要简洁得多,且该模块的__也略低于相同点阵的图形液晶模块
6.212864F引脚说明管脚号管脚名称电平管脚功能描述1VSS0V电源地2VCC
3.0+5V电源正3V0-对比度(亮度)调整4RSCS)H/LRS=“H”表示DB7——DB0为显示数据RS=“L”表示DB7——DB0为显示指令数据5R/WSIDH/LR/W=“H”E=“H”数据被读到DB7——DB0R/W=“L”E=“H→L”DB7——DB0的数据被写到IR或DR6ESCLKH/L使能__7DB0H/L三态数据线http://blog.mop.com/diary/__in/diarySearchMore.jspv=数据线\t_blank8DB1H/L三态数据线9DB2H/L三态数据线10DB3H/L三态数据线11DB4H/L三态数据线12DB5H/L三态数据线13DB6H/L三态数据线14DB7H/L三态数据线15P__H/LH8位或4位并口方式,L串口方式(见注释1)16NC-空脚17/RESETH/L复位端,低电平有效(见注释2)18VOUT-LCD驱动电压输出端19AVDD背光源正端(+5V)(见注释3)20KVSS背光源负端(见注释3)*注释1如在实际应用中仅使用并口通讯模式,可将P__接固定高电平,也可以将模块上的__和“VCC”用焊锡短接*注释2模块内部接有上电复位电路,因此在不需要经常复位的场合可将该端悬空 *注释3如背光和模块共用一个电源,可以将模块上的JA、JK用焊锡短接四.模块主要硬件构成说明
6.312864F液晶显示电路设计中采用LCD12864液晶显示它一般串口、并口两种方式显示,而我们一般采用并口显示12864的
4、
5、
6、
15、17脚分别与单片机的P
3.0~P
3.4相连7~14脚与单片机的P0口相连
1、20号脚接地,2号脚接电源,19号脚背光灯正端串一个电阻与电源相连,电阻起限流的作用,我们取R=10K3号脚是对比度(亮度)调整,这里要用一个滑动变阻器来调整亮度,这里我们取电位器大小为10KLCD12864显示电路如下图所示7总体硬件系统设计
1.由于时间经费有限,我们不采用PCB印刷板制作硬件电路,我们用通用的电路板焊接而成经市场考察和以往的经验,我们选用型号为ADA5的电路板,它大小合适,而且它上面的孔都是三孔相连的,方便我们的设计并且这是市场最便宜的
2.各电气元件的连接,我们采用单排针和杜邦线相连这样为我们避免各元件的跨接,对我们对线路的排错提供方便
3.上述六个模块可以按原理图整齐的焊接在电路板最后效果,板子正面连线错横复杂,板子反面横整齐三.软件设计部分本系统的软件系统主要分为主程序、液晶程序、时钟程序、温度程序、键盘控制程序、液晶显示程序
3.1主程序系统主程序首先对系统进行初始化,包括设置定时器、液晶、DS
1302、DS18B20和端口的初始化;由于单片机没有命令指令,所以可以设计系统程序不断地循环执行液晶显示时间程序即show_time程序如果单片机接收命令指令,就执行相应的程序及闹钟是否到,温度上下限是否到的判断,执行相应的__及__程序简单流程图如下
3.2液晶程序LCD12864的程序主要是对内部控制指令进行指定如液晶初始化,显示空白,读,写,判断液晶是否忙及指定字符的位置等函数构成了解LCD12864的内部结构及控制指令和网上大部分程序模块大致相同
3.3Ds1302时钟数据处理程序DS1302数据处理要对始终内部的数据进行处理获得液晶显示的字符和键盘系统对DS1302内部数据进行处理它主要包括ds1302的初始化,读一个字节,写一个字节,读写,数据处理等函数组成我们对DS1302读写数据命令、DS1302RAM读写命令和寄存器标志内容的的了解,实现闹钟,调时程序很容易在程序尽量用位移,位或,位与来实现乘除法,这样可节约单片机处理的时间最后将时分秒年月日分解为字符送给液晶显示部分流程图如图
3.
2.
3.4DS18B20温度数据处理程序DS18B20数据处理对芯片内部数据处理获得液晶的显示字符它主要包括DS18B20的初始化,读写一个字节,读取DS18B20中的数据和对数据的转换液晶显示的字符对DS18B20的精度进行不同定义可得到不同精度部分流程如图
3.
13.5键盘控制程序键盘的控制是本系统的核心,也是本系统的最复杂的部分通过按键设置,改变芯片内数据达到调时的效果,设置闹钟,设置温度上下限等功能我们设置4个按键分别是设置(set),上(up),下(down),退出(out)我们首先按set就进入功能选择界面,通过上下键选择功能,再按set进入功能设置界面,按set改变设置项目及退出,按上下键改变所设置的值按out键退出到时钟显示界面
3.6液晶显示程序液晶显示程序是对单片机内数据视化,让用户更直观方便观察结果及对功能的设置在程序中加入闪烁,使显示更加直观图
3.
23.8其他程序其他程序包括延时程序,闹铃程序,警报程序,闪烁程序其中闹铃程序,警报程序用延时函数来实现闪烁程序用定时器的中断来完成的
3.9程序中的注意点
1.按键处理防抖动应加延时函数
2.程序用调用函数,最好在头文件申明函数,主函数一般最后写
3.为了使程序更加容易写,我们要分模块来完成程序四.软硬件调试部分1)软件调试软件调试,我是在keil软件平台和单片机学习板上来完成的当我写部分程序在keil软件经过调试,开始出现很多错误和警告通过逐个错误排错及修改得出下列经验,
(1)调用函数最好在头文件中进行申明,主函数写在最后;
(2)特别注意一些字母的大小写,一般要用英语文字写,不要用中文汉写,这是最不容易检查的,如我在检查液晶显示程序时,时钟没检查到错误,最后我删掉此行重新写,错误排除了,据我分析可能是中英文变换时出现问题经过一系列排错,最后文件没有错误但还有警告由于c语言中有警告是没关系的,我将HEX文件下在到单片机竟显示一些乱码我有回到文件,经过对警告的分析及上网查阅将程序稍微修改警告慢慢被排除,最后没有错误和警告了,下载到单片机,发现乱码竟然还出现,还有多个界面叠加显示,里面还有一些乱码经过分析,叠屏现象是没有对液晶清平所致于是我又在不同界面程序前加入调用填充空格函数(voidclrram_lcd)然后又下载,结果与前面一样,崩溃啊!经过几个小时后,无意间我去掉调用函数前void结果叠屏现象解决但是显示还是乱码谢天谢地啊!有进步!又经过几天,排错,上网查阅与参考程序对照最后在voidR1302函数中DS1302InputByteucAddr|0x01;掉了|0x01,加上生成HEX文件,下载到单片机中能够正常显示了界面的闪烁不能闪烁呵呵!又进一步!经过一段时间,我发现界面程序中的a==1与功能设置中a重赋值(a=0)相冲突,最后将if()语句中a==1改为a==0相应的问题也解决了最后对程序进行相应的扩展完善,由于按键不灵敏我们加上声音程序加上另一个闹钟实现设计需求通过单片机学习板对照,程序基本实现我所预期的要求,但是界面显示闹钟1,闹钟2闪烁时,液晶竟然出现显示淡化据分析,可能使程序的问题由于这部分显示复杂,用了多个if语句,可能出现语句冗余我只有请教高手啰!2)硬件调试硬件调试,我们用万用表,单片机学习板来完成的首先,我们调试LCD12864显示我将液晶显示程序下载到单片机内,连好所有的线,通电后,观察显示结果唉!液晶竟然不显示我们用万用表测试各连线是否导通及某些点的电压,发现没问题最后在网上发现我的P0口竟然没接上拉电阻,通过计算电阻应该去5K至10K,我们选用
4.7k的电阻由于没准备多的电阻,我在以前买的电阻找到了
4.7k的电阻开始布局没有为上拉电阻留下空间,我们在单片机插槽里插电阻,解决一些连线的复杂度后来在调试液晶能够显示了然后,我们调试DS1302时钟芯片连上按键模块,液晶显示模块,单片机最小系统,时钟系统,温度系统,连接所有线,通上电源后,我们观察到液晶显示2085—85—
8585858520.125C温度能正常显示,时钟不能正常显示我们还是用万用表检查所用线路,对照电路原理图,最后发现时钟上拉电阻没焊上电源接上电源后,时钟能够正常显示,按键也能控制最后,我们对__模块进行简单调试最后发现没问题整个硬件调试完成程序完成后五.总结与体会经过将近一个月的设计,终于完成LCD液晶时钟设计,虽然达到设计要求,但单片机的资源并没完全应用,毕竟这次设计把实物都做了出来,心底是很高兴的,这次不是用单片机学习板而是自己动手制作的作品在本次设计的过程中,我发现很多的问题,虽然以前还做过这样的设计但这次设计真的让我长进了很多,单片机课程设计重点就在于软件算法的设计,需要有很巧妙的程序算法这次设计是液晶,单片机,键盘控制的综合应用,其间,遇到许多困难,甚至,有时竟然想放弃从这次的课程设计中,我真真正正的意识到,在写程序时,逻辑思维要清晰,要有耐心在以后的学习中,要理论__实际,把我们所学的理论知识用到实际当中,学习单机片机更是如此,程序只有在经常的写与读的过程中才能提高,这就是我在这次设计中的最大收获____
1.单片机学习板配套资料
2.《C语言程序设计》谭浩强编清华大学出版社
3.《单片机原理与应用及C51程序设计》谢维成杨加国主编清华大学出版社附件LCD液晶时钟设计元件清单名称型号数量单片机AT__S521液晶显示器JHD12864F1电阻10k(1/4w)5电阻1k5电阻200欧姆5电阻
4.7k5电阻
4.7k5电位器10k1电容10u/16V1电容30p4三极管90131轻触按键小(尺寸6×6mm×
5.5)4蜂鸣器5V1晶振12M(小体积)1底座8脚1底座40脚1发光二极管红1发光二极管绿1时钟芯片DS13021温度芯片DS18B201纽扣电池及底座3V(大)1液晶插槽20孔1单排针3排120杜邦线及杜邦头1股40电路板AOA51由于我们由单片机学习板,很多器件没买,像DS1302DS18B20单片机等,节约设计成本总的花费约30元LCD液晶时钟设计原理电路图LCD液晶时钟设计部分参考程序液晶部分显示程序//屏幕显示屏幕显示voidshow_lcdvoid{switchw{case0:show_time;break;case1:show_timeset;break;//在不同的条件下显示不同的字符case2:show_dateset;break;case3:show_alarmclockset1;break;case4:show_alarmclockset2;break;case5:show_tempset;break;}}/*******************************************************************************w=0时,显示液晶时钟设计日期yyyy-mm-dd时间hh mmss当前温度xx.x℃********************************************************************************/voidshow_time{clrram_lcd;DS1302_GetTime;//获取时钟芯片的时间数据TimeToStr;//时间数据转换液晶字符DateToStr;//日期数据转换液晶字符ReadTemperature;//开启温度采集程序temp_to_str;//温度数据转换成液晶字符gotoxy40;print温度;gotoxy43;//液晶字符显示位置printTempBuffer;//显示温度gotoxy46;print℃;gotoxy30;print时间:;gotoxy33;printTimeString;//显示时间gotoxy23;printDateString;//显示日期gotoxy20;print日期;gotoxy11;print液晶时钟设计;mdelay500;//扫描延时}/*******************************************************************************w=1时,显示时钟设置按set进入下面界面时间设置时间闪日期在按set分闪时xx(闪)闹钟1闹钟2再按set秒闪分温度通过上下键改变xx值秒********************************************************************************/voidshow_timeset{clrram_lcd;DS1302_GetTime;HourToStr;MinuteToStr;SecondToStr;ifk==0{gotoxy40;print温度;gotoxy30;print闹钟1;gotoxy34;print闹钟2;gotoxy24;print日期;gotoxy10;print时钟设置;ifa==0{gotoxy20;print;//不显示}else{gotoxy20;print时间;}//显示time}else{//id不为零进入时间调整项目gotoxy41;print秒:;gotoxy31;print分;gotoxy21;print时:;gotoxy10;print时间设置;ifk==5a==0{gotoxy23;print;}else{gotoxy23;printHourString;}/******************************分显示闪烁控制********************/ifk==6a==0{gotoxy33;print;}else{gotoxy33;printMinuteString;}/******************************秒显示闪烁控制********************/ifk==7a==0{gotoxy43;print;}else{gotoxy43;printSecondString;}}mdelay500;}/*******************************************************************************w=3时,显示时钟设置闹钟设置时间日期闹钟1clockoff(闪)或clockon闹钟1(闪)闹钟2时温度分********************************************************************************/voidshow_alarmclockset1{clrram_lcd;DS1302_GetTime;C1_hourToStr;C1_minuteToStr;ifk==0{gotoxy40;print温度;gotoxy20;print时间;gotoxy34;print闹钟2;gotoxy24;print日期;gotoxy10;print时钟设置;ifa==0{gotoxy30;print;//不显示}else{gotoxy30;print闹钟1;}//显示闹钟}else{ifk==9//k不为零进入时间调整项{gotoxy20;print闹钟1;gotoxy10;print闹钟设置;/*****************************闹铃开关显示********************************/ifa==0//A为闪烁标志{gotoxy23;print;}else{ifR13020xc3%16==0//闹铃寄存器的值是否为零(关){gotoxy23;printclockoff;}//显示OFFelse{gotoxy23;printclockon;}}}ifR13020xc3%16==1{gotoxy20;print闹钟1;gotoxy10;print闹钟设置;gotoxy31;print时;gotoxy41;print分;/**************************闹铃时闪烁显示**********************/ifk==10a==0//闹铃时闪烁{gotoxy33;print;}else{gotoxy33;printC1_hourString;}/**************************闹铃分闪烁显示*******************/ifk==11a==0//闹铃时闪烁{gotoxy33;print;}else{gotoxy43;printC1_minuteString;}}mdelay500;}}/*******************************************************************************w=5时,显示时钟设置温度设置时间日期温度上限xx(闪)°C闹钟1闹钟2温度下限xx(闪)°C温度(闪)********************************************************************************/voidshow_tempset{clrram_lcd;DS1302_GetTime;shangxianToStr;xiaxianToStr;ifk==0{gotoxy34;print闹钟2;gotoxy30;print闹钟1;gotoxy24;print日期;gotoxy20;print时间;gotoxy10;print时钟设置;ifa==0{gotoxy40;print;//不显示}else{gotoxy40;print温度;}}else{gotoxy37;print℃;gotoxy30;print下限温度;gotoxy27;print℃;gotoxy20;print上限温度;gotoxy10;print温度设置;ifk==17a==0{gotoxy25;print;}else{gotoxy25;printshangxianString;}ifk==18a==0{gotoxy35;print;}else{gotoxy35;printxiaxianString;}}mdelay500;}按键部分程序voidModset//模式键处理{ifSet==0{Delay5Ms;ifSet==0{whileSet==0;KeySound;//蜂鸣声a=0;msec=0;b=0;//a、msec为闪烁标志,按键有动作时清零,不闪烁}//b为模式键确认动作其它程判断b是否为零时来确定模式键是否动作.否为零时来确定模式键是否动作}}voidsystemsetupvoid//系统设置{w=1;whilew!=0{show_lcd;ifUp==0//设置项目左移{Delay5Ms;ifUp==0{a=0;msec=0;KeySound;//蜂鸣声ifw--==1//5种系统设置项目w=6;}whileUp==0;}ifDown==0//设置项目右移{Delay5Ms;ifDown==0{a=0;msec=0;KeySound;//蜂鸣声ifw++==6w=1;}whileDown==0;}b=1;//模式键是否动作标志为1时不动作,为0时动作Modset;//调用模式键处理程序判断按键是否按下ifb==0{KeySound;//蜂鸣声switchw//进入进个项目设置{case1:timesetup;break;//时间设置case2:datesetup;break;//日期设置case3:alarmclockset1;break;//闹铃1设置case4:alarmclockset2;break;//闹铃2设置case5:tempsetup;break;//温度设置case6:w=0;break;//退出系统设置}}}}voidtimesetup//时间调整{k=5;whilew==1//w为1时进入时间调整{b=1;Modset;ifb==0{KeySound;//蜂鸣声ifk++==8//
6..9为时分秒调k=5;}id_case1_key;//调用按键处理show_lcd;//显示输出}}voidalarmclockset1void//闹铃调整{k=9;whilew==3//进入闹铃设置{b=1;Modset;//模式键是否动作ifb==0{KeySound;//蜂鸣声ifR13020xc3%16==0{k=0;w++;}//0xc2为闹铃开关寄存器当为关时按下模式键时将退出闹铃设置,当开时铃时间设置elseifk++==12//
12..15为闹铃开关和时间设置exitk=9;}id_case1_key;//调整show_lcd;//显示输出}}voidtempsetup//对温度进行调整{k=17;whilew==5//model为4时进入温度调整{b=1;Modset;//模式键是否动作ifb==0{KeySound;//蜂鸣声ifk++==19//exitk=17;}id_case1_key;//温度调整show_lcd;//显示输出}}//对相应的项目进行加、减调整voidid_case1_key//按键处理{ifUp==0//增加{Delay5Ms;ifUp==0{a=0;msec=0;KeySound;//蜂鸣声ifk==8||k==4||k==12||k==16||k==19{w++;k=0;}elseKEYk1;}whileUp==0;}ifDown==0//减少{Delay5Ms;ifDown==0{a=0;msec=0;KeySound;//蜂鸣声ifk==8||k==4||k==12||k==16||k==19{w++;k=0;}elseKEYk0;//调用DS1302写入函数}whileDown==0;}}voidtimer_1voidinterrupt1//中断入口,闪烁{TH0=0x3c;//50ms定时TL0=0xb0;ifmsec++==10//500ms{msec=0;a=~a;//闪烁标志反转}}//根据选择调整相应项目并写入DS1302voidKEYucharselucharsel_1{ucharaddressitem;uchar__xmin;ifsel==1{address=0x8c;__x=99;min=0;}ifsel==2{address=0x88;__x=12;min=1;}ifsel==3{address=0x86;__x=31;min=1;}ifsel==5{address=0x84;__x=23;min=0;}ifsel==6{address=0x82;__x=59;min=0;}ifsel==7{address=0x80;__x=59;min=0;}ifsel==9{address=0xc2;__x=1;min=0;}ifsel==10{address=0xc4;__x=23;min=0;}ifsel==11{address=0xc6;__x=59;min=0;}ifsel==13{address=0xc8;__x=1;min=0;}ifsel==14{address=0xca;__x=23;min=0;}ifsel==15{address=0xcc;__x=59;min=0;}ifsel==17{address=0x__;__x=99;min=0;}ifsel==18{address=0xd0;__x=99;min=0;}item=R1302address+1/16*10+R1302address+1%16;ifsel_1==0item++;elseitem--;ifitem__xitem=min;ifitemminitem=__x;W13020x8e0x00;//允许写操作W1302addressitem/10*16+item%10;//写入DS1302//转成BCD码W13020x8e0x80;//写保护,禁止写操作}主函数__in{init_lcd;clrram_lcd;Init_DS18B20;//DS18B20初始化Initial_DS1302;//时钟芯片初始化b=1;//进入默认液晶显示Speaker=1;LED1=0;LED2=0;TMOD=0x01;//16位定时TH0=0x3c;//50msTL0=0xb0;EA=1;TR0=1;ET0=1;while1{ifSet==0{b=0;Modset;//调用模式键处理程序判断按键是否按下ifb==0{KeySound;//蜂鸣声systemsetup;}//进入调整模式ifR13020xc3==1//闹铃是否打开{ifR13020x85==R13020xc5R13020x83==R13020xc7//判断闹铃时间是否到,ClockSound;//发出闹铃蜂鸣声}ifR13020xc9==1//闹铃是否打开{ifR13020x85==R13020xcbR13020x83==R13020xcd//判断闹铃时间是否到,ClockSound;}//发出闹铃蜂鸣声ifmshangxian||mxiaxian{armSound;LEDFLASH;}show_time;//液晶显示数据}}由于程序所占页面很大,因此我省去很多程序有一些程序大体结构差不多,我留下重要程序,里面的DS1302DS18B20液晶程序都没写,完整程序到网络硬盘下载主控器件AT__S52DB1820温度采集系统DS1320时间采集系统12864/1602显示系统蜂鸣器LED__系统键盘控制系统温度L__温度M__TH用户字节1TL用户字节2配置寄存器保留保留保留CRC图
4.1高速暂存RAM结构图1字节2字节3字节4字节5字节6字节7字节8字节9字节EEROMTH用户字节1TL用户字节2TMR1R011111图
4.2配置寄存器开始初始化时钟、温度芯片显示键盘设置闹钟时间是否到闹钟__温度上下限是否到__系统YYYESYESNONO初始化调用显示子程序读出温度值温度计算处理显示数据刷新发温度转换开始命令1秒到初次上电图
3.1DS18B20温度计主程序流程图。