基于51单片机智能小车的设计
单片机课程设计
设计名称:智能小车及温度显示
所在学院:电气与控制工程学院
专业班级:
学生姓名:
学生学号:0906070211 0906070225 0906070227
指导老师:
完成时间:
目 录
1.方案论证与比较 .......................................................................................................... 5
1.1 课程实现 ............................................................................................................ 5
1.2 电机驱动模块 ..................................................................................................... 5
1.3 温度测量模块 ..................................................................................................... 6
1.4 显示模块 ............................................................................................................ 6
1.5遥控.................................................................................................................... 7
2.单片机最小应用系统 ................................................................................................... 7
2.1 时钟电路 ............................................................................................................ 8
2.2 复位电路 ............................................................................................................ 9
3.控制部分 .................................................................................................................... 10
3.1电机驱动........................................................................................................... 10
3.2.温度检测及显示模块 ........................................................................................ 10
3.3.遥控 ................................................................................................................. 11
4.流程图 ........................................................................................................................ 12
4.1 主程序流程图 ................................................................................................... 12
4.2遥控器解码程序流程图...................................................................................... 12
4.3 温度显示流程图 ............................................................................................... 13
5.参考文献 .................................................................................................................... 13
6. 设计心得体会............................................................................................................ 13
6.1设计心得体会(魏璐)...................................................................................... 13
6.2设计心得体会(雷军)...................................................................................... 14
6.3设计心得体会(陈志伟) .................................................................................. 15
7.附录 ........................................................................................................................... 15
7.1元件清单: ....................................................................................................... 15
7.2程序清单: ......................................................................................................... 16
智能小车的设计
摘要: 智能作为现代的新发明,是以后的发展方向,他可以按照预先设定的模式在一个环境里自动的运作,不需要人为的管理,可应用于科学勘探等等的用途。智能小车就是其中的一个体现。本设计采用STC89C52单片机为主要控制核心,STC89C52是一款高速低功耗的新一代8051单片机,我们利用红外接收遥控器对小车的控制信号,对小车实现无线遥控,利用DS18B20检测小车所在环境的温度,并利用12864液晶显示模块将其显示出来。
关键词: STC89C52 单片机 DS18B20 检测温度 液晶显示
Abstract:Smart as a modern invention, the direction of development in the future, he can in an environment where automatic operation in accordance with the pre-set pattern, no human management can be applied to the use of scientific exploration. The smart car is one of expression. This design uses STC89C52 microcontroller core as the main control STC89C52 is a new generation of high-speed low-power 8051, we use the infrared receiver remote control signals of the car, wireless remote control car using the DS18B20 test car where the temperature of the environment and use 12864 LCD module will be displayed.
Keyword:
STC89C52 single-chip DS18B20 detection temperature LCD
1.方案论证与比较
1.1 课程实现
方案1:采用各类数字电路来组成小车的控制系统,对外围避障信号,各路趋光信号进行处理,车库拦栅上升下降控制,温度显示等。本方案电路复杂,灵活性高,效率低,不利于小车智能化的扩展,对各路信号处理比较困难。
方案2:采用STC89C52单片机来作为整机的控制核心单元。红外线探头采用市面上通用的发射管与及接收头,经过单片机调制后发射。车库拦栅控制部分用步进机来驱动再将采集到的各类信号送往单片机进行综合分析处理,实现准确有效的动作,此系统比较灵活,采用软件方法来解决复杂的硬件电路部分使系统硬件简洁化,各类功能易于实现,能很好地满足题目的要求,并容易扩展功能。
比较以上两种方案的优缺点,方案二简洁、灵活、可扩展性好,能达到题目要求。
1.2 电机驱动模块
方案1:使用晶体三级管8550搭成桥电路控制两路继电器控制小车的转向,原理简单,方便使用,但是需要用到两个继电器,既占用空间又不经济。
2:使用芯片L298N 驱动电机并控制电机的转向,L298N是SGS公司的产品,比较常见的是15脚Multiwatt封装的L298N,内部同样包含4通道逻辑驱动电路。可以方便的驱动两个直流电机,或一个两相步进电机。
方案3:使用步进电机控制小车的速度。由于步电机的特性,它能够更加准确的控制小车的转速,更好的定位,但是它的价格比较昂贵并且体积较大重量也较大,不利于本次比赛的实现。这里我们使用红外对车轮转数的计数,可以充当小车定位的功能。
L298N可接受标准TTL逻辑电平信号VSS,VSS可接4.5~7 V电压。4脚VS接电源电压,VS电压范围VIH为+2.5~46 V。输出电流可达2.5 A,可驱动电感性负载。1脚和15脚下管的发射极分别单独引出以便接入电流采样电阻,形成电流传感信号。L298可驱动2个电动机,OUT1,OUT2和OUT3,OUT4之间可分别接电动机,本实验装置我们选用驱动一台电动机。5,7,10,12脚接输入控制电平,控制电机的正反转。6和11口接控制使能端EnA,EnB,控制电机的停转。图1是L298N原理图:
图(1) L298N工作原理图
In3,In4的逻辑图与图1相同。由图1可知EnA为低电平时,输入电平对电机控制起作用,当EnA为高电平,输入电平为一高一低,电机正或反转。同为低电平电机停止,同为高电平电机刹停。该方案选择其控制两路直流电机的转向。
结合三种方案的优缺点,最终选择方案2
1.3 温度测量模块
方案一:使用热敏电阻,热敏电阻价格便宜对温度感应敏感,但是精确度不高。
方案二使用热电偶。热电偶经过全桥电路处理之后能够测量比较高的温度,而且精度也比较高,但是电路要求高,元件价格比较贵。
方案三:使用DS18B20温度传感器。DS18B20采用一种单线总线系统,可以用一根线连接主从件,DS18B20为从器件,经过单片机简单处理之后能够得到高精度的温度,并且其测量范围也比较大,精度高,性价比高,使用方便。
所以最终选择方案三。 DS18B20温度传感器实物图见图(2)
图(2) DS18B20温度传感器实物图
1.4 显示模块
方案1:使用LED数码管进行显示。数码管价格便宜,显示亮度好,能耗低,但是显示的内容少。
方案2:使用LCD液晶进行显示。液晶显示相对价格比较贵,驱动比较麻烦,但是其显示内容多,能耗小,连接电路简单,体积较小。
考虑到本设计的具体要求,选择方案2 ,选用12864LCD液晶显示器。
图(3) 12864液晶显示实物图
1.5遥控
方案一:此方案中,使用专用遥控器作为控制信号发出装置,当按下遥控器的设置键后,一体化红外接收装置接收到遥控器发出的设置控制信号,然后将信号送到专用的解码芯片中进行解码,解码后将信号送到单片机,由单片机查表判断这个信号是不是设置信号,当确认是设置信号后,启动设置子程序,那么以后接收到的红外信号就是
设置的时间信号了,红外接收头接收到红外信号后再通过放大器将信号传到解码器中,解码器解完码后送到单片机,单片机再通过查表确定这些数值并进行设置,然后按下确认键,红外接收头接收到这个信号并通过放大送到解码器中,解码后再送到单片机中,单片机通过查表确定这是确认操作后,可以通过可控硅控制。
方案二:此方案中,我们采用普通的家用电器遥控器作为控制信号发出装置,当按下遥控器的设置键后,红外接收装置接收到遥控器发出的红外线控制信号,然后把这个信号转换成电信号,传到单片机中,利用单片机对这个信号进行解码,
解码完成后查表确定是不是设置信号,当这个信号是设置信号后,启动设置子程序,那么以后接收到的红外信号就是设置的时间信号了,单片机再对这些信号进行解码,查表判断出数值是多少,然后设置,设置完时间后要进行确认,当遥控器发出确认信号后,单片机收到这个信号并查表判断这是确认信号后,执行确认指令,使设置生效。
方案一为硬件解码方案,硬件解码需要使用与遥控器相配套的专用的解码器芯片,而解码芯片一般不易得到,价格也较贵,或者自行开发解码电路(但电路太复杂,性能欠佳)。
方案二为软件解码方案,软件解码可以不考虑遥控器的芯片是什么型号的,因为我们只需检测到它的发射编码,然后用软件方式来对它进行处理,从而得到所要的信息。软件解码具有灵活、硬件精简(仅需集成红外接收头和一片单片机)、可靠性高,成本低等特点。
经以上的论证,可以采用软件解码方案,其中接受用HX1838,成本低,方便实现,并且系统整体性能和可靠性高。
图(4)HX1838红外接收器实物图
2.单片机最小应用系统
STC89C52是一种带8K字节闪烁可编程可檫除只读存储器(FPEROM-Flash Programable
and Erasable Read Only Memory )低电压,高性能COMOS8的微处理器,具有片内ROM/EPROM,因此这种芯片构成的最小系统简单、可靠。用STC89C52单片机构成最小应用系统时,只要将单片机接上时钟电路和复位电路即可,如下图示。由于集成度的限制,最小应用系统只能用作一些小型的控制单元。其应用特点:
(1)有可供用户使用的大量I/O线。
(2)内部存储器容量有限。
(3)应用系统开发具有特殊性。
图(5) 单片机的最小应用系统
2.1 时钟电路
STC89C52内部有一个用于构成振荡器的高增益反相放大器,引脚RXD和TXD分别是此放大器的输入端和输出端。时钟可以由内部方式产生或外部方式产生。内部方式的时钟电路如图(a) 所示,在RXD和TXD引脚上外接定时元件,内部振荡器就产生自激振荡。定时元件通常采用石英晶体和电容组成的并联谐振回路。晶体振荡频率可以在1.2~12MHz之间选择,电容值在5~30pF之间选择,电容值的大小可对频率起微调的作用。
外部方式的时钟电路如图(b)所示,RXD接地,TXD接外部振荡器。对外部振荡信号无特殊要求,只要求保证脉冲宽度,一般采用频率低于12MHz的方波信号。片内时钟发生器把振荡频率两分频,产生一个两相时钟P1和P2,供单片机使用。
(a)内部方式时钟电路 (b)外部方式时钟电路
图(6)
2.2 复位电路
(1)复位操作
复位是单片机的初始化操作。其主要功能是把PC初始化为0000H,使单片机从0000H单元开始执行程序。除了进入系统的正常初始化之外,当由于程序运行出错或操作错误使系统处于死锁状态时,为摆脱困境,也需按复位键重新启动。
(2)复位信号及其产生
RST引脚是复位信号的输入端。复位信号是高电平有效,其有效时间应持续24个振荡周期(即二个机器周期)以上。若使用颇率为6MHz的晶振,则复位信号持续时间应超过4us才能完成复位操作。
产生复位信号的电路逻辑如图所示:
图(7) 复位信号的电路逻辑图
整个复位电路包括芯片内、外两部分。外部电路产生的复位信号(RST)送至施密特触发器,再由片内复位电路在每个机器周期的S5P2时刻对施密特触发器的输出进行采样,然后才得到内部复位操作所需要的信号。
复位操作有上电自动复位相按键手动复位两种方式。
上电自动复位是通过外部复位电路的电容充电来实现的,其电路如图1.2.2 (2)(a)所示。这佯,只要电源Vcc的上升时间不超过1ms,就可以实现自动上电复位,即接通电源就成了系统的复位初始化。
按键手动复位有电平方式和脉冲方式两种。其中,按键电平复位是通过使复位端经电阻与Vcc电源接通而实现的,其电路如图1.2.2 (2)(b)所示;而按键脉冲复位则是利用RC微分电路产生的正脉冲来实现的,其电路如图1.2.2 (2)(c)所示:
(a)上电复位 (b)按键电平复位 (c)按键脉冲复位
图(8)复位电路
上述电路图中的电阻、电容参数适用于6MHz晶振,能保证复位信号高电平持续时间大于2个机器周期。
本系统的复位电路采用图(b)上电复位方式。
3.控制部分
3.1电机驱动
一个电动小车整体的运行性能,首先取决于它的电源模块和电机驱动模块,电机驱动模块的主要功能:驱动小车轮子转动,使小车行进。电动小车的驱动系统一般由控制器、功率变换器及电动机三个主要部分组成。
电动小车的驱动不但要求电机驱动系统具有高转矩重量比、宽调速范围、高可靠性,而且电机的转矩-转速特性受电源功率的影响,这就要求驱动具有尽可能宽的高效率区。
图(9) 电机驱动硬件接线图
3.2.温度检测及显示模块
温度检测模块使用DS18B20,它的主要特点有:独特的单线接口仅需一个端口引脚进
行通讯、简单的多点分布应用、无需外部器件、可通过数据线供电、零待机功耗、测温范
围主要在-55ºC——+125ºC、数字温度计以9位数字量的形式反映器件的温度值。
DS18B20通过一个单线接口发送或接收信息,因此在中央微处理器和DS18B20之间仅需一条连接线(加上地线)。用于读写和温度转换的电源可以从数据线本身获得,无需外部电源。因为每个DS18B20都有一个独特的片序列号,所以多只DS18B20可以同时连在一根单线总线上,这样就可以把温度传感器放在许多不同的地方。
图(10) 温度显示接线图
3.3.遥控
红外接收探头用HX1838,接收红外信号频率为38Hz,周期约26us,同时能对信号进行放大、检波、整形,得到TTL 电平的编码信号。红外接收电路一体化的红外接收装置将遥控信号的接收、放大、检波、整形集于一身,并且输出可以让单片机识别的TTL 信号,这样大大简化了接收电路的复杂程度和电路的设计工作,方便使用。在本系统中我们采用红外一体化接收头HX1838。HX1838 黑色环氧树脂封装,不受日光、荧光灯等光源干扰,内附磁屏蔽,功耗低,灵敏度高。在用小功率发射管发射信号情况下,其接收距离可达35m。当手拿遥控器对着接收头按任意键时,发光二极管会闪烁,说明红外接收头和遥控器工作都正常;如果发光二极管不闪烁发光,说明红外接收头和遥控器至少有一个损坏。只要确保遥控器工作正常,很容易判断红外接收头的优劣。
4.流程图
4.1 主程序流程图
4.2遥控器解码程序流程图
4.3 温度显示流程图
5.参考文献
[1] 何立民.MCS-51系列单片机应用系统设计[M].北京,航空航天大学出版社.1998. [2] 李广弟.单片机基础[M].北京,北京航天航空大学出版社.2001.
[3] 张毅刚,彭喜元.新编MCS—51单片机应用设计第一版[M].哈尔滨工业大学出版社.2003.
[4] 赵负图.传感器集成电路手册第一版[M].化学工业出版社.2004.
[5] 苏凯等.MCS-51系列单片机系统原理与设计[M].冶金工业出版社.2003. [6] 张鑫等.单片机原理及应用[M].电子工业出版社.2005.8.
[7] 全国大学生电子设计竞赛获奖作品汇编[M].北京,北京理工大学出版社.2004.8.
6. 设计心得体会
6.1设计心得体会(魏璐)
关于这次课程设计,我是受益颇多的。从一开始选题,就查了很多相关的资料,一直到考完试动手完成它,虽然确实遇到很多技术上的问题,但整个过程可以说是相当享受的。
我们这次的课程设计是智能小车的制作,实现的主要功能有无线遥控、检测温度并显示。电机驱动、红外遥控、温度测量并显示等相关知识及其实现已在硬件部分写出,这里只谈论下我自己的感受。
当老师在之前让我们选题目时,我就开始在网上、在图书馆找资料,当接触到智能小车这个题目时,我就很感兴趣,也征得其他两个组员得一致同意,于是就决定做智能小车。随后我们就买器材,焊接电路,写程序。但一切并不是那么顺利,其中遇到了多种困难,比如说焊接电路的难度就是一个很大的挑战,还有程序的调试也是不容易做到的,实习的
一周我们前两天是做硬件工作,其中包括焊接芯片以及显示电路,后三天主要是调程序。但程序的调试真的很让人头疼,不断地调试,但效果却始终不明显。我们无法判断到底是程序的问题还是硬件焊接有问题,鉴于查询硬件很麻烦,我们又重新焊接了块板子(驱动板),但结果总不是那么理想。
事实上,我们遇到的问题远不止这些,但是,无论怎样的挫折,无论怎样的想要放弃,最后都坚持了下来。有困难就查资料,有困难就请教同学,有困难就解决困难!本着这样的信念和心态,我们解决了一个个的困难,虽说结果不能达到预期结果,但从中我们也学到了很多知识,从原来一点都不知道的HX1838(红外接收),L298N(驱动),DS18B20(测温度)到最后的的每一个元件都有所了解,我觉得这就是我们坚持到最后的最大成果,其实在很多事情来临时,我们不仅仅关心的是最后的结果,更重要的是拥有其中的过程。
在整个动手过程,既加深了我们对单片机的理论认识,又通过智能小车这个很有意思的载体,实现了对单片机的应用。同时,对我而言,这次课程设计还有更重要的意义,那就是我开启了对单片机制作的兴趣,个人希望在以后的工作学习中,加强这方面的训练,多制作出自己感兴趣的单片机作品。
6.2设计心得体会(雷军)
经过这一个星期的实习,过程曲折真是一语难尽。从开始时充满激情总以为什么都很简单,到最后差点有点想放弃的冲动,这之间的复杂心情,点点滴滴无不令我回味无长。特别是在设计程序的过程中,我明白到做一个好程序的不易,做一个好的编程者就更加艰难,突然就很佩服那些编程者。 这我们组一共三个人,小车整体上是我们三个都在做,但个人的侧重点不同,魏璐主要负责查询资料和设计论文,我和陈志伟主要负责硬件搭建和软件调试。通过这次课程设计,加强了我们动手、思考和解决问题的能力。在整个设计过程中,我们一共用了三个板子,一个是我们以前焊的51板,红外接收电路以及12864的显示电路,硬件大体就是这样。在电路焊接的过程中,我们是不停的返工,经过不停的修改测试,最终将硬件搭接好了。剩下的主要是软件调试,这个我们花了好长时间,几乎是三个人换着调的,这个真是太麻烦了,稍微有点错误,就出现问题,这个真是对我们耐心的大挑战,不过最后还是没达到预期的效果,感觉有点遗憾。
我觉得做课程设计同时也是对课本知识的巩固和加强,由于课本上的知识太多,平时课间的学习并不能很好的理解和运用各个元件的功能,而且考试内容有限,所以在这次课程设计过程中,我们了解了很多元件的功能,并且对于其在电路中的使用有了更多的认识。平时看课本时,有时问题老是弄不懂,做完课程设计,那些问题就迎刃而解了。而且还可以记住很多东西。比如一些芯片的功能,比如HX1838(红外接收),L298N(驱动),DS18B20(测温度)等等。平时看课本,这次看了,下次就忘了,通过动手实践让我们对各个元件印象深刻。
认识来源于实践,实践是认识的动力和最终目的,实践是检验真理的唯一标准。所以这个期末测试之后的课程设计对我们的作用是非常大的。在课程设计的过程中,真正体会到了理论运用到实际中是具有很大的差别的。往往会出现意想不到的问题,我们必须得做到冷静耐心的去分析问题,而不是焦躁不安,轻言放弃。当然了,这次的课程更重要的是团队的合作,我们必须得各尽所长才能解决各种困难。
6.3设计心得体会(陈志伟)
万事开头难!在刚开始接触到硬件的时候,根本就无从下手,在几番请教过别人之后,才有一点点的头绪,之后才知道先干什么,后干什么。在这次的智能小车设计过程中,我们先查找有关的芯片和元器件的资料,了解它的用法及各个管脚的功能,然后先按模块进行硬件是焊接,先把各个模块调试好,在将模块组装在一起。
在这次的智能小车设计中,小车的模块分为电机驱动模块,红外接收模块,温度检测模块,液晶显示模块,稳压模块,单片机最小应用系统等。在红外接收模块调试中,我们遇到了本设计中遇到的最大问题,当我们把遥控解码之后,程序烧到单片机中之后,按了遥控器中的按键,红外接收模块中的发光二级管已经亮了,这说明红外能接受到遥控的信号,而单片机却没有反应,我们所用的红外是HX1838,经过几个人不停的调试,不断地修改程序,在小车接收到遥控的信号时,大家都由衷的高兴,可是还是不能达到我们所预期的结果,难免心中有些遗憾。
在整个的过程中,我清楚的意识到团队合作的重要性。一个大的项目不是一个人可以完成的,虽然我们在课程设计的一开始,就已经分工好。但是在整个过程,在开始的硬件搭建时我们三个人都有参加,如果不了解硬件的组成,软件调试和论文根本就没有办法完成。我们在查资料的时候,我们都会资源共享。在整个过正中我们每个人都会有一份芯片的资料。
总之,这次的课程设计,让我获益匪浅。我明白了团队协作,分工合作的团队精神。在经过大家不停的奋战之后,我们的智能小车终于完成的。功夫不负有心人!
7.附录
7.1元件清单:
7.2程序清单:
主程序: #include #include "51--12864.h" #include "ds18b20.h" sbit EA0=P3^4; sbit EA1=P3^5; sbit EB0=P3^6;
sbit EB1=P3^7;
uchar table[]={"多功能小车"};
uchar x[33];
uchar ircode[4],star=0,count1=0,count2,bye=0,chuliok=0; //uchar y[5]={2343,1353,1452,1848,1749}; uchar count3,count4=0; void Temp()
{
ReadTemp(); //开启温度采集程序 temp_to_str(); //温度数据转换成液晶字符 Write_Com(0x90+6); //液晶字符显示位置 Print(TempBuffer); //显示温度 }
void timer0init(void) //定时器0定时方式2初始化 {
TMOD=0x02; TH0=0x00; TL0=0x00; ET0=1; EA=1;
TR0=1; }
void int0init(void) //外部中断0初始化 {
IT0=1; EX0=1; EA=1;
}
void chuli( void) //字节数据处理 {
int i,j,k=1,a; for(j=0;j
{
a=a>>1;
if(x[k]>6) a=a|0x80; k++; } ircode[j]=a; }
chuliok=1; }
void go(void)
{EA0=0;EA1=1;EB0=0;EB1=1;} void back(void)
{EA0=1;EA1=0;EB0=1;EB1=0;} void left(void)
{EA0=0;EA1=1;EB0=1;EB1=0;} void right(void)
{EA0=1;EA1=0;EB0=0;EB1=1;}
void key() //按键扫描与处理 {count3=ircode[2]; // EA0=0; // EA1=0; // EB0=0; // EB1=0;
//默认打开电源为停止
switch(count3) { case 0x1A: go(); break;//前进键 case 0x05: back(); break;//后退 case 0x01: left(); break;//左拐弯
case 0x03: right(); break;//右拐弯
default: break; } }
void main() {
Ini_Lcd(); timer0init();
int0init();
dis_hanzi(0x80+2,table,5); Write_Com(0x90);
chinesedis("当前温度值:");
Write_Com(0x88);
chinesedis("行驶方式:"); Write_Com(0x90+7); chinesedis("℃"); while(1)
{
P1=0x07; Delay_Nms(1010); P1=0x0a;
Delay_Nms(1010); Temp(); if(bye) { chuli();
bye=0; }
if(chuliok) {
P1=0x01; chuliok=0; star=0; } if(star)
{
EA0=0;EA1=0;EB0=0;EB1=0; } key();
Write_Com(0x98+2); Write_Data(ircode[2]); }
}
void timer0() interrupt 1 //定时器中断 {
count1++; }
void int0() interrupt 0 //外部中断与数据接收 {
if(star)
{
if(count1>32) //判断是否为引导吗 count2=0;
x[count2]=count1;
count1=0; count2++;
if(count2==33) {
bye=1; } } else {
star=1; count1=0; } }
子程序: (1)
REG52.H
Header file for generic 80C52 and 80C32 microcontroller.
Copyright (c) 1988-2002 Keil Elektronik GmbH and Keil Software, Inc. All rights reserved.
--------------------------------------------------------------------------*/
#ifndef __REG52_H__ #define __REG52_H__
/* BYTE Registers */ sfr P0 = 0x80; sfr P1 = 0x90; sfr P2 = 0xA0; sfr P3 = 0xB0; sfr PSW = 0xD0; sfr ACC = 0xE0; sfr B = 0xF0; sfr SP = 0x81; sfr DPL = 0x82; sfr DPH = 0x83; sfr PCON = 0x87; sfr TCON = 0x88; sfr TMOD = 0x89; sfr TL0 = 0x8A; sfr TL1 = 0x8B; sfr TH0 = 0x8C; sfr TH1 = 0x8D; sfr IE = 0xA8; sfr IP = 0xB8;
sfr SCON = 0x98; sfr SBUF = 0x99;
/* 8052 Extensions */ sfr T2CON = 0xC8; sfr RCAP2L = 0xCA; sfr RCAP2H = 0xCB; sfr TL2 = 0xCC; sfr TH2 = 0xCD;
/* BIT Registers */ /* PSW */
sbit CY = PSW^7; sbit AC = PSW^6; sbit F0 = PSW^5; sbit RS1 = PSW^4; sbit RS0 = PSW^3; sbit OV = PSW^2;
sbit P = PSW^0; //8052 only
/* TCON */
sbit TF1 = TCON^7; sbit TR1 = TCON^6; sbit TF0 = TCON^5; sbit TR0 = TCON^4; sbit IE1 = TCON^3; sbit IT1 = TCON^2; sbit IE0 = TCON^1; sbit IT0 = TCON^0;
/* IE */ sbit EA = IE^7;
sbit ET2 = IE^5; //8052 only sbit ES = IE^4; sbit ET1 = IE^3; sbit EX1 = IE^2; sbit ET0 = IE^1; sbit EX0 = IE^0;
/* IP */
sbit PT2 = IP^5; sbit PS = IP^4; sbit PT1 = IP^3;
sbit PX1 = IP^2; sbit PT0 = IP^1; sbit PX0 = IP^0;
/* P3 */ sbit RD = P3^7; sbit WR = P3^6; sbit T1 = P3^5; sbit T0 = P3^4; sbit INT1 = P3^3; sbit INT0 = P3^2; sbit TXD = P3^1; sbit RXD = P3^0;
/* SCON */ sbit SM0 = SCON^7; sbit SM1 = SCON^6; sbit SM2 = SCON^5; sbit REN = SCON^4; sbit TB8 = SCON^3; sbit RB8 = SCON^2; sbit TI = SCON^1; sbit RI = SCON^0;
/* P1 */
sbit T2EX = P1^1; // 8052 only sbit T2 = P1^0; // 8052 only
/* T2CON */
sbit TF2 = T2CON^7; sbit EXF2 = T2CON^6; sbit RCLK = T2CON^5; sbit TCLK = T2CON^4; sbit EXEN2 = T2CON^3; sbit TR2 = T2CON^2; sbit C_T2 = T2CON^1; sbit CP_RL2 = T2CON^0; #endif
(2)DS18B20 #ifndef _DS18B20_H #define _DS18B20_H #define uint unsigned int #define uchar unsigned char
sbit DQ = P0^3; //温度传送数据IO口 uchar temp_value; //温度值
uchar TempBuffer[2];
/***********ds18b20延迟子函数(晶振12MHz )*******/
void delay_18B20(uint i) {
while(i--);
}
/**********ds18b20初始化函数**********************/
void Init_DS18B20(void) { }
/***********ds18b20读一个字节**************/
uchar ReadOneChar(void) { }
uchar i=0; uchar dat = 0; for (i=8;i>0;i--)
{ DQ = 0; // 给脉冲信号 } return(dat);
dat>>=1;
DQ = 1; // 给脉冲信号 if(DQ)
dat|=0x80;
delay_18B20(4); uchar x=0;
DQ = 1; //DQ复位 delay_18B20(8); //稍做延时
DQ = 0; //单片机将DQ拉低 delay_18B20(80); //精确延时 大于 480us DQ = 1; //拉高总线
delay_18B20(14);
x=DQ; //稍做延时后 如果x=0则初始化成功 x=1则初始化失败 delay_18B20(20);
/*************ds18b20写一个字节****************/
void WriteOneChar(uchar dat) { uchar i=0;
for (i=8; i>0; i--)
{ DQ = 0;
DQ = dat&0x01; delay_18B20(5); DQ = 1; dat>>=1;
}
}
/**************读取ds18b20当前温度************/ void ReadTemp(void) { uchar a=0; uchar b=0; uchar t=0;
Init_DS18B20();
WriteOneChar(0xCC); // 跳过读序号列号的操作 WriteOneChar(0x44); // 启动温度转换
delay_18B20(100); // this message is wery important
Init_DS18B20();
WriteOneChar(0xCC); //跳过读序号列号的操作
WriteOneChar(0xBE); //读取温度寄存器等(共可读9个寄存器) delay_18B20(100);
a=ReadOneChar(); //读取温度值低位 b=ReadOneChar(); //读取温度值高位 temp_value=b
temp_value+=(a&0xf0)>>4;
}
void temp_to_str() //温度数据转换成液晶字符显示 {
TempBuffer[0]=temp_value/10+'0'; //十位 TempBuffer[1]=temp_value%10+'0'; //个位 //TempBuffer[2]=0xdf; //温度符号 // TempBuffer[3]='C'; TempBuffer[2]='\0'; }
#endif
(3)12864显示程序: #include
前两个就是温度
#define uchar unsigned char #define uint unsigned int
extern const unsigned char shuzi_table[];
//#define LCD_DataIn P1 //数据口方向设置为输入 //#define LCD_DataOut P1 //数据口方向设置为输出 #define LCD2MCU_Data P2 #define MCU2LCD_Data P2
//#define LCD_CMDOut P2 //P3口的低三位设置为输出 sbit LCD_RS=P0^0 ; //P2.0
//#define LCD_RS_L P2^0 //P2.0 sbit LCD_RW=P0^1 ; //P3.1
//#define LCD_RW_L P2^1 //P3.1 sbit LCD_EN=P0^2 ; //P3.2
//#define LCD_EN_L P2^2 //P3.2 /******************************************* 函数名称:Delay_1ms
功 能:延时约1ms的时间 参 数:无 返回值 :无
********************************************/ void Delay_1ms(void) { uchar i;
for(i = 150;i > 0;i--) _nop_();
}
/******************************************* 函数名称:Delay_Nms
功 能:延时N个1ms的时间 参 数:n--延时长度 返回值 :无
********************************************/ void Delay_Nms(uint n) {
uint i;
for(i = n;i > 0;i--) Delay_1ms();
}
/********************************************* 函数名称:checkbusy 功能:测忙
**********************************************/ void checkbusy(void) {
uchar lcdtemp = 0;
LCD_RW=1; // LCD_DataIn;
do //判忙 {
LCD_EN=1; _nop_();
lcdtemp = LCD2MCU_Data; LCD_EN=0; }
while(lcdtemp & 0x80); }
/******************************************* 函数名称:Write_Com
功 能:向液晶中写控制命令 参 数:cmd--控制命令 返回值 :无
********************************************/ void Write_Com(uchar cmd) {
checkbusy();
// LCD_DataOut; LCD_RW=0;
MCU2LCD_Data = cmd; LCD_EN=1; _nop_(); LCD_EN=0;
}
/******************************************* 函数名称:Write_Data
功 能:向液晶中写显示数据 参 数:dat--显示数据 返回值 :无
********************************************/ void Write_Data(uchar dat) {
checkbusy();
// LCD_DataOut; LCD_RS=1;
LCD_RW=0;
MCU2LCD_Data = dat; LCD_EN=1; _nop_();
}
/*************************************** 函数名称:clear() 功能:清屏
****************************************/ void clear(void) {
Write_Com(0x01); Delay_Nms(5);
}
/*************************************** 函数名称:LCDstatus 功能:写指令
****************************************/ void LCDstatus(uchar a) { checkbusy(); Write_Com(a);
}
/******************************* 函数名称:Read_RAM 功 能:读液晶数据
**********************************/
uchar Read_RAM(void)//读数据 {
uchar i;
uchar lcdtemp = 0;
LCD_RS=0; LCD_RW=1;
// LCD_DataIn;
do //判忙 {
LCD_EN=1;
_nop_();
lcdtemp = LCD2MCU_Data; LCD_EN=0; }
while(lcdtemp & 0x80); // LCD_DataIn;
MCU2LCD_Data=0xff;
LCD_RS=1; LCD_RW=1; LCD_EN=1; Delay_Nms(1);
i=LCD2MCU_Data; Delay_Nms(1); LCD_EN=0; LCD_RS=0; LCD_RW=0; return(i);
}
/******************************************* 函数名称:Ini_Lcd 功 能:初始化液晶模块 参 数:无 返回值 :无
********************************************/ void Ini_Lcd(void)
{
// LCD_CMDOut; //液晶控制端口设置为输出
Delay_Nms(500);
Write_Com(0x30); //基本指令集 Delay_1ms();
Write_Com(0x02); // 地址归位
Delay_1ms(); Write_Com(0x0c); //整体显示打开,游标关闭 Delay_1ms(); Write_Com(0x01); //清除显示 Delay_1ms(); Write_Com(0x06); //游标右移
Delay_1ms(); Write_Com(0x80); //设定显示的起始地址 }
/******************************************* 函数名称:Clear_GDRAM
功 能:清除液晶GDRAM中的随机数据 参 数:无 返回值 :无
********************************************/ void Clear_GDRAM(void) {
uchar i,j,k; Write_Com(0x34); //打开扩展指令集
i = 0x80; for(j = 0;j
{
Write_Com(i++); Write_Com(0x80); for(k = 0;k
Write_Data(0x00); }
}
i = 0x80;
for(j = 0;j
Write_Com(i++);
for(k = 0;k
Write_Com(0x88);
Write_Data(0x00); } } Write_Com(0x30); //回到基本指令集
}
/****************************清除部分GDRAM****************/ void ClearsomeGDRAM(void) {
uchar i,j,k; Write_Com(0x36); //打开扩展指令集
i = 0x80; for(j = 0;j
Write_Com(i++); Write_Com(0x80);
for(k = 0;k
Write_Data(0x00); }
}
i = 0x80;
for(j = 0;j
Write_Com(i++);
Write_Com(0x88); for(k = 0;k
/******************************************* 函数名称:Draw_PM
功 能:在整个液晶屏幕上画图 参 数:无 返回值 :无
********************************************/ void Draw_PM(const uchar *ptr) {
uchar i,j,k;
Write_Com(0x34); //打开扩展指令集
i = 0x80; //页地址起点 for(j = 0;j
Write_Data(0x00); }
}
Write_Com(0x30); //回到基本指令集
{
Write_Com(i++);
Write_Com(0x80); //起始地址
for(k = 0;k
Write_Data(*ptr++); }
}
i = 0x80;
for(j = 0;j
Write_Com(i++);//页地址里面的纵坐标
for(k = 0;k
Write_Data(*ptr++);
Write_Com(0x88);//页的起始地址
} }
Write_Com(0x36); //打开绘图显示 }
/*********************************** * 名称:dis_hanzi
Write_Com(0x30); //回到基本指令集
* 函数功能:指定位置显示汉字 *参数名:addr 显示地址 pt 汉字地址 num 汉字个数
*****************************************/ void dis_hanzi(uchar addr,const uchar *pt,uchar num) {
uchar i;
Write_Com(addr);//写地址 for(i=0;i
Write_Data(*(pt++));//显示汉字 }
/************************************************** * 名称:dis_zifu
* 函数功能:指定位置显示字符 *参数名:addr 显示地址 pt 字符地址 num 字符个数
************************************************/ void dis_zifu(uchar addr,const uchar *pt,uchar num) {
uchar i;
Write_Com(addr);
for(i=0;i
/******************************************************* 上移
******************************************************/ void shangyi(uchar x_addr,uchar y_addr,uchar wideth,uchar longth) {
uchar MEH,MEL,i,j;
for(j=y_addr;j
{
Write_Com(0x36); Write_Com(0x80+j); Write_Com(0x80+i); Write_Com(0x30); Read_RAM();
MEH=Read_RAM(); MEL=Read_RAM(); Write_Com(0x36);
智能小车的设计
Write_Com(0x80+j-2); Write_Com(0x80+i); Write_Com(0x30); Write_Data(MEH); Write_Data(MEL); }
}
//显示文本
void chinesedis(uchar code *s) {
while(*s>0)
{ Write_Data(*s); s++;
Delay_Nms(2); } }
//显示字符
void Print(uchar *str) {
while(*str!='\0') {
Write_Data(*str); str++;
Delay_Nms(2); }
}
31 / 31