基于单片机的汽车水温表设计方案.docx
《基于单片机的汽车水温表设计方案.docx》由会员分享,可在线阅读,更多相关《基于单片机的汽车水温表设计方案.docx(25页珍藏版)》请在冰豆网上搜索。
基于单片机的汽车水温表设计方案
基于单片机的汽车水温表设计方案
2汽车水温表简介
2.1汽车水温表概述
汽车水温表是用来指示汽车发动机冷却水的工作温度,并向司乘人员显示发动机工作水温是否工作正常。
它由装在气缸盖上的温度传感器和转在仪表盘上的水温表组成。
2.2常见汽车水温表的工作原理
常见的汽车水温表有电热式、电磁式和蒸气压力是三类,它们与不同的感应器相配合,进行水温测定。
2.2.1电热式水温表工作原理
当汽车发动机水温升高使双金属片向离开固定触点的方向弯曲,使触点彼此接触的压力减弱;通过压力的减弱增加打开的时间,使通过加热线圈的电流平均值减小,水温表指针指向高温。
水温降低时,触电压力增大,平均电流增大,水温表的双金属片弯曲怎大,指针指向低温。
如图2-1所示;
图2-1电热式水温表
2.2.2电磁式水温表工作原理
电磁式水温表有两个铁芯式线圈,在线圈交叉位置上,装有小磁片、配重和指针等组成的转子,传感器为温度系数热敏电阻。
低温时,传感器热敏电阻阻值为1000Ω,此时,线圈L2和大电阻串联,通过的电流,大部分流入L1,在综合电场是指针停在刻度32℃处。
当温度升高时,传感器受温度的影响,热敏电阻阻值变小(约为150Ω),L2所通过电流,L1相对减少,磁场的综合作用是指针向高温100℃刻度移动。
如图2-2所示;
图2-2电磁式水温表
3.1.1蒸气压力式水温表工作原理
当水温表的感温包受热时,充灌在其中的介质(氯乙烷或乙醚等)受热蒸发(乙醚液体在大气压力下的沸点是34℃),蒸气压力通过毛细管进入弹簧管,压力迫使弹簧向外扩,弹簧管的自由端与连杆的一头销钉连接,连杆的另一端与扇形齿轮固定。
传动机构中,扇形齿轮与中心齿轮啮合传动,并使装在中心齿轮轴上的指针在刻度盘上指出被测介质温度值。
感温包液体体积受感温包与弹簧管相对位置影响。
如图2-3所示;
图2-3蒸气压力式水温表
3水温表总体原理及设计
3.1硬件总体设计
设计并制作一个基于单片机的汽车水温表的电路,其结构框图如图2-1:
单片机AT89S51
数码管显示
温度传感器
DS18B20
图3-1系统结构框图
3.1.1硬件系统子模块
(1)单片机最小系统电路部分
(2)温度采集电路部分
(3)数码管温度显示电路部分
3.2软件总体设计
良好的设计方案可以减少软件设计的工作量,提高软件的通用性,扩展性和可读性。
本系统的设计方案和步骤如下:
(1)根据需求按照系统的功能要求,逐级划分模块。
(2)明确各模块之间的数据流传递关系,力求数据传递少,以增强各模块的独立性,便于软件编制和调试。
(3)确定软件开发环境,选择设计语言,完成模块功能设计,并分别调试通过。
(4)按照开发式软件设计结构,将各模块有机的结合起来,即成一个较完善的系统。
首先接通电源系统开始工作,系统开始工作后,通过温度传感器开始实时检测,调用显示子程序显示检测结果。
4水温表硬件设
4.1单片机最小系统电路
因为89S52单片机部自带8K的ROM和256字节的RAM,因此不必构建单片机系统的扩展电路。
如图3-1,单片机最小系统有复位电路和振荡器电路。
值得注意的一点是单片机的31脚
必须接高电平,否则系统将不能运行。
因为该脚不接时为低电平,单片机将直接读取外部程序存储器,而系统没有外部程序存储器,所以
必须接VCC。
在按键两端并联一个电解电容,滤除交流干扰,增加系统抗干扰能力。
图4-1单片机最小系统图
4.2数码管显示电路
(1)数码管显示说明
各个数码管的段码都是单片机的数据口输出,即各个数码管输入的段码都是一样的,为了使其分别显示不同的数字,可采用动态显示的方式,即先只让最低位显示0(含点),经过一段延时,再只让次低位显示1,如此类推。
由视觉暂留,只要我们的延时时间足够短,就能够使得数码的显示看起来非常的稳定清楚,过程如表3-1。
表4-1数码管编码表
段码
位码
显示器状态
08H
01H
□□□□□□□0
abH
02H
□□□□□□1□
12H
04H
□□□□□2□□
22H
08H
□□□□3□□□
a1H
10H
□□□4□□□□
24H
20H
□□5□□□□□
04H
40H
□6□□□□□□
aaH
80H
7□□□□□□□
本论文中使用了3个数码管,其中前两位使用动态扫描显示实测温度,在设置加热温度的时候,两个数码管是闪烁,以提示目前处在温度设置状态。
第三位数码管静态显示符号“℃”。
4.3温度采集电路
(1)DS18B20介绍
Dallas最新单线数字温度传感器DS18B20简介新的“一线器件”体积更小、适用电压更宽、更经济。
Dallas半导体公司的数字化温度传感器DS1820是世界上第一片支持“一线总线”接口的温度传感器。
一线总线独特而且经济的特点,使用户可轻松地组建传感器网络,为测量系统的构建引入全新概念。
DS18B20、DS1822“一线总线”数字化温度传感器同DS18B20一样,DS18B20也支持“一线总线”接口,测量温度围为-55℃~+125℃,在-10℃~+85℃围,精度为±0.5℃。
DS1822的精度较差为±2℃。
现场温度直接以“一线总线”的数字方式传输,大大提高了系统的抗干扰性。
其DS18B20的管脚配置和封装结构如图3-4所示。
图4-2DS18B20封装
引脚定义:
①DQ为数字信号输入/输出端;
②GND为电源地;
③VDD为外接供电电源输入端(在寄生电源接线方式时接地)。
(2)DS18B20的单线(1-wirebus)系统
单线总线结构是DS18B20的突出特点,也是理解和编程的难点。
从两个角度来理解单线总线:
第一,单线总线只定义了一个信号线,而且DS18B20智能程度较低(这点可以与微控制器和SPI器件间的通信做一个比较),所以DS18B20和处理器之间的通信必然要通过严格的时序控制来完成。
第二,DS18B20的输出口是漏级开路输出,这里给出一个微控制器和DS18B20连接原理图。
这种设计使总线上的器件在合适的时间驱动它。
显然,总线上的器件与(wiredAND)关系。
这就决定:
(1)微控制器不能单方面控制总线状态。
之所以提出这点,是因为相当多的文献资料上认为,微控制器在读取总线上数据之前的I/O口的置1操作是为了给DS18B20一个发送数据的信号。
这是一个错误的观点。
如果当前DS18b20发送0,即使微控制器I/O口置1,总线状态还是0;置1操作是为了是I/O口截止(cutoff),以确保微控制器正确读取数据。
(2)除了DS18B20发送0的时间段,其他时间其输出口自动截止。
自动截止是为确保:
1时,在总线操作的间隙总线处于空闲状态,即高态。
2时,确保微控制器在写1的时候DS18B20可以正确读入。
由于DS18B20采用的是1-Wire总线协议方式,即在一根数据线实现数据的双向传输,而对AT89S52单片机来说,硬件上并不支持单总线协议,因此,我们必须采用软件的方法来模拟单总线的协议时序来完成对DS18B20芯片的访问。
1DS18B20的复位时序,如图3-5
图4-3DS18B20的复位时序图
②DS18B20的读时序
对于DS18B20的读时序分为读0时序和读1时序两个过程。
对于DS18B20的读时隙是从主机把单总线拉低之后,在15秒之就得释放单总线,以让DS18B20把数据传输到单总线上。
DS18B20在完成一个读时序过程,至少需要60us才能完成。
DS18B20的读时序图如图3-6所示。
图4-4DS18B20的读时序
③DS18B20的写时序
对于DS18B20的写时序仍然分为写0时序和写1时序两个过程。
对于DS18B20写0时序和写1时序的要求不同,当要写0时序时,单总线要被拉低至少60us,保证DS18B20能够在15us到45us之间能够正确地采样IO总线上的“0”电平,当要写1时序时,单总线被拉低之后,在15us之就得释放单总线。
如图3-7所示。
图4-5DS18B20的写时序图
(3)DS18B20的供电方式
在图3-8中示出了DS18B20的寄生电源电路。
当DQ或VDD引脚为高电平时,这个电路便“取”的电源。
寄生电路的优点是双重的,远程温度控制监测无需本地电源,缺少正常电源条件下也可以读ROM。
为了使DS18B20能完成准确的温度变换,当温度变换发生时,DQ线上必须提供足够的功率。
有两种方法确保DS18B20在其有效变换期得到足够的电源电流。
第一种方法是发生温度变换时,在DQ线上提供一强的上拉,这期间单总线上不能有其它的动作发生。
如图3-8所示,通过使用一个MOSFET把DQ线直接接到电源可实现这一点,这时DS18B20工作在寄生电源工作方式,在该方式下VDD引脚必须连接到地。
图4-6DS18B20供电方式1
另一种方法是DS18B20工作在外部电源工作方式,如图3-9所示。
这种方法的优点是在DQ线上不要求强的上拉,总线上主机不需要连接其它的外围器件便在温度变换期间使总线保持高电平,这样也允许在变换期间其它数据在单总线上传送。
此外,在单总线上可以并联多个DS18B20,而且如果它们全部采用外部电源工作方式,那么通过发出相应的命令便可以同时完成温度变换。
图4-7DS18B20供电方式2
(4)DS18B20设计中应注意的几个问题
DS18B20具有测温系统简单、测温精度高、连接方便、占用接口线少等优点,但在实际应用中也应注意以下几方面的问题:
较小的硬件开销需要相对复杂的软件进行补偿,由于DS18B20与微处理器间采用串行数据传送。
因此,在对DS18B20进行读写编程时,必须严格的保证读写时序,否则将无法读取测温结果。
在DS18B20有关资料中均未提及1Wire上所挂DS18B20数量问题,容易使人误认为可以挂任意多个DS18B20,在实际应用中并非如此。
当1Wire上所挂DS18B20超过8个时,就需要考虑微处理器的总线驱动问题,这一点在进行多点测温系统设计时要加以注意。
连接DS18B20的总线电缆是有长度限制的。
实际应用中,测温电缆线建议采用屏蔽4芯双绞线,其中一对线接地线与信号线,另一组接VCC和地线,屏蔽层在源端单点接地。
本文以广泛应用的数字温度传感器DS18B20为例,说明了1Wire总线的操作过程和基本原理。
事实上,基于1Wire总线的产品还有很多种,如1Wire总线的E2PROM、实时时钟、电子标签等。
他们都具有节省I/O资源、结构简单、开发快捷、成本低廉、便于总线扩展等优点,因此有广阔的应用空间,具有较大的推广价值。
本设计将温度传感器DS18B20与单片机TXD引脚相连,读取温度传感器的数值。
DS18B20与单片机连接图如图所示4-8所示。
图4-8DS18B20与单片机连接图
5水温表的软件设计
本系统采用的是循环查询方式,来显示和控制温度的。
主要包括四段程序的设计:
DS18B20读温度程序,数码管的驱动程序,键盘扫描程序,以及抱经处理程序。
5.1主程序流程图
初始化
开始
读D18B20
温度转换
显示温度
返回
图5-1主程序流程图
5.2读取温度DS18B20模块的流程图
由于DS18B20采用的是一根数据线实现数据的双向传输,而对AT89S52单片机来说,硬件上并不支持单总线协议,因此,我们必须采用软件的方法来模拟单总线的协议时序来完成对DS18B20芯片的访问。
DS18B20单线通信功能是分时完成的,它有严格的时隙概念。
因此系统对DS18B20的各种操作必须按协议进行。
操作协议为:
初始化DS18B20(发复位脉冲)→发ROM功能命令→发存储器操作命令→处理数据DS18B20虽然具有测温系统简单、测温精度高、连接方便、占用口线少等优点,
DS18B20必须首先调用启动温度转换函数,根据数据手册上对应转换时间来超作,如为12位转换,则应该是最大750mS,另外在对DS18B20超作时,时序要求非常严格,因此最好禁止系统中断。
由于DS18B20是在一根I/O线上读写数据,因此,对读写的数据位有着严格的时序要求。
DS18B20有严格的通信协议来保证各位数据传输的正确性和完整性。
该协议定义了几种信号的时序:
初始化时序、读时序、写时序。
所有时序都是将主机作为主设备,而每一次命令和数据的传输都是从主机主动启动写时序开始,如果要求单总线器件回送数据,在进行写命令后,主机需启动读时序完成数据接收。
数据和命令的传输都是低位在先。
DS18B20的读时序:
(1)对于DS18B20的读时序分为读0时序和读1时序两个过程。
(2)对于DS18B20的读时隙是从主机把单总线拉低之后,在15秒之就得释放单总线,以让DS18B20把数据传输到单总线上。
DS18B20在完成一个读时序过程,至少需要60us才能完成。
DS18B20的写时序:
(1)对于DS18B20的写时序仍然分为写0时序和写1时序两个过程。
(2)对于DS18B20写0时序和写1时序的要求不同,当要写0时序时,单总线要被拉低至少60us,保证DS18B20能够在15us到45us之间能够正确地采样IO总线上的“0”电平,当要写1时序时,单总线被拉低之后,在15us之就得释放单总线。
系统程序设计主要包括三部分:
读出温度子程序、温度转换命令子程序、显示温度子程序。
图5-2读取温度DS18B20模块的流程图
程序代码为:
unsignedintReadTemperature(void)
{
unsignedchara=0;
unsignedintb=0;
unsignedintt=0;
Init_DS18B20();
WriteOneChar(0xCC);//跳过读序号列号的操作
WriteOneChar(0x44);//启动温度转换
DelayMs(10);
Init_DS18B20();
WriteOneChar(0xCC);//跳过读序号列号的操作
WriteOneChar(0xBE);//读取温度寄存器等
a=ReadOneChar();//低位
b=ReadOneChar();//高位
b<<=8;
t=a+b;
return(t);
}
6水温表的系统调试
6.1硬件电路调试
仔细检查所接电路,按照硬件原理图接线,理论上是能实现的,如果数码管不显示,则应该检查线路是否正确,或是因为单片机没有工作,还有集电极和发射极是否接对。
如果只显示两个八,则可能是DS18B20没有接正确,检查上拉电路是否接好。
如果能注意这些问题,电路基本不会出错。
6.2软件调试
如果硬件电路检查后,没有问题却实现不了设计要求,则可能是软件编程的问题,首先应检查初始化程序,然后是读温度程序,显示程序,对这些分段程序,要注意逻辑顺序,调用关系,除此之外,还要熟悉各语句的用法,以免出错。
还有一个容易忽略的问题就是,源程序生成的代码是否烧入到单片机中,如果这一过程出错,那不能实现设计要求也是情理之中的事。
硬件与软件调试相结合,仔细检查各个模块的设计,旧能顺利完成任务,实现设计要求,在调试过程中必须认真耐心,不能有一点马虎,否则遗漏一个小的问题就会导致整个设计的失败。
总结
通过本次的设计,使我们不仅对单片机这门课程有了更深刻的认识,懂得了如何运用课本知识结合实际来完成定时器的显示和编程方法以及数码显示电路的驱动方法,使我们能够很快的适应现代控制技术发展的需求,同时也提高了我们的思维能力和实际操作能力,为以后更好的走上工作岗位奠定了坚实的基础。
另外,这次的设计还让我更进一步的认识了关于AT89S51等芯片的引脚功能以及使用方法,使我学会了应用不同的芯片来配合完成整个设计的操作。
在做硬件电路的这段时间里,从思考设计到对电路的调试经过了一些困难。
同样在对软件进行设计时,也可为一路坎坷。
但是通过对软硬件不断撞墙,不断思考解决问题的过程中,我学会了很多东西,同时对单片机也有了更深的认识。
在做设计的时候,很需要耐心和对事物的细心,很多时候一个简单问题的一个简单的疏忽就会导致整个电路的不工作,只有不断的检查不断的调试,才能真正完成一个设计的制作。
只有不断的发现问题解决问题,才能从问题中改变自己,提升自己对单片机的能力。
此设计虽然能够完成温度的显示,但功能和精度有待于进一步提高。
以后可以通过加入一些算法优化控制功能,并通过液晶显示屏实时显示温度,增加、拓展一些功能。
参考文献
[l]乐建波编著《温度控制系统》化学工业
[2]自美编著《电子线路设计·实验·测试(第二版)》华中科技大学2000
[3]东光编著《单片微型计算机原理及C语言程序设计》华中科技大学2004.4
[4]武庆生仇梅编著《单片机原理与应用》电子科技大学1998.2
[5]谭浩强编著《C程序设计》.:
清华大学1999年
[6]华中理工大学电子学教研室编《电子技术基础模拟部分(第四版)》高等教育1999.6
[7]华中理工大学电子学教研室编《电子技术基础数字部分(第四版)》高等教育2000.6
[8]王彬任艳颖编著《DigitalICSystemDesign》电子科技大学2005.9
[9]丽娟邵欣编著《基于单片机的温度监控系统的设计与实现》机械制造
[10]仁杰编著《汽车电器设备》人民交通1998.10
附录一:
系统源程序
#include//包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义
#defineDataPortP0//定义数据端口程序中遇到DataPort则用P0替换
sbitLATCH1=P2^2;//定义锁存使能端口段锁存
sbitLATCH2=P2^3;//位锁存
sbitDQ=P1^3;
bitReadTempFlag;//定义读时间标志
unsignedcharcodedofly_DuanMa[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//显示段码值0~9
unsignedcharcodedofly_WeiMa[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//分别对应相应的数码管点亮,即位码
unsignedcharTempData[8];//存储显示值的全局变量
/*------------------------------------------------
uS延时函数,含有输入参数unsignedchart,无返回值
unsignedchar是定义无符号字符变量,其值的围是
0~255这里使用晶振12M,精确延时请使用汇编,大致延时
长度如下T=tx2+5uS
------------------------------------------------*/
voidDelayUs2x(unsignedchart)
{
while(--t);
}
/*------------------------------------------------
mS延时函数,含有输入参数unsignedchart,无返回值
unsignedchar是定义无符号字符变量,其值的围是
0~255这里使用晶振12M,精确延时请使用汇编
------------------------------------------------*/
voidDelayMs(unsignedchart)
{
while(t--)
{
//大致延时1mS
DelayUs2x(245);
DelayUs2x(245);
}
}
/*------------------------------------------------
18b20初始化
------------------------------------------------*/
bitInit_DS18B20(void)
{
bitdat=0;
DQ=1;//DQ复位
DelayUs2x(5);//稍做延时
DQ=0;//单片机将DQ拉低
DelayUs2x(200);//精确延时大于480us小于960us
DelayUs2x(200);
DQ=1;//拉高总线
DelayUs2x(50);//15~60us后接收60-240us的存在脉冲
dat=DQ;//如果x=0则初始化成功,x=1则初始化失败
DelayUs2x(25);//稍作延时返回
returndat;
}
/*------------------------------------------------
读取一个字节
------------------------------------------------*/
unsignedcharReadOneChar(void)
{
unsignedchari=0;
unsignedchardat=0;
for(i=8;i>0;i--)
{
DQ=0;//给脉冲信号
dat>>=1;
DQ=1;//给脉冲信号
if(DQ)
dat|=0x80;
DelayUs2x(25);
}
return(dat);
}
/*------------------------------------------------
写入一个字节
------------------------------------------------*/
voidWriteOneChar(unsignedchardat)
{
unsignedchari=0;
for(i=8;i>0;i--)
{
DQ=0;
DQ=dat&0x01;
DelayUs2x(25);
DQ=1;
dat>>=1;
}
DelayUs2x(25);
}
/*------------------------------------------------
读取温度
------------------------------------------------*/
unsignedintReadTemperature(void)
{
unsignedchara=0;
unsignedintb=0;
unsignedintt=0;
Init_DS18B20();
WriteOneChar(0xCC);//跳过读序号列号的操作
WriteOneChar(0x44);//启动温度转换
DelayMs(10);
Init_DS18B20();
WriteOneChar(0xCC);//跳过读序号列号的操作
WriteOneChar(0xBE);//读取温度寄存器等(共可读9个寄存器)前两个就是温度
a=ReadOneChar();//低位
b=ReadOneChar();//高位
b