毕业设计基于单片机的汽车载重测试仪.docx
《毕业设计基于单片机的汽车载重测试仪.docx》由会员分享,可在线阅读,更多相关《毕业设计基于单片机的汽车载重测试仪.docx(23页珍藏版)》请在冰点文库上搜索。
毕业设计基于单片机的汽车载重测试仪
项目名称:
基于单片机的汽车载重测试仪
前言
摘要:
本文介绍一种基于89C51单片机的一种汽车载重测试仪,该电路采用ICL7135高精度、双积分A/D转换电路,测量范围直流0-±2000伏,使用LCD液晶模块显示,可以与PC机进行串行通信。
正文主要说明软硬件系统的各部分电路,介绍了双积分电路的原理,ICL7135的功能和应用,LCD1602的功能和应用。
该电路设计新颖、功能强大、可扩展性强。
关键词:
电压测量,双积分A/D转换器,单片机,LCD1602液晶模块
数显测量电路,它是采用数字化测量技术,把连续的模拟量(直流输入电压)转换成不连续、离散的数字形式并加以显示的仪表。
传统的指针式测量仪器功能单一、精度低,不能满足数字化时代的需求,采用单片机的数字测量电路,由精度高、抗干扰能力强,可扩展性强、集成方便,还可与PC进行实时通信。
目前,由各种单片A/D转换器构成的数字化测量仪器,已被广泛用于电子及电工测量、工业自动化仪表、自动测试系统等智能化测量领域,示出强大的生命力。
与此同时,由DVM扩展而成的各种通用及专用数字仪器仪表,也把电量及非电量测量技术提高到崭新水平。
本章重点介绍单片A/D转换器以及由它们构成的基于单片机的数据采集和数字测量仪器的工作原理。
一、研究意义
(1)研究背景:
《中华人民共和国道路交通安全法》第四十九条规定:
机动车载人不得超过核定的人数,客运机动车不得违反规定载货。
《中华人民共和国道路运输条例》第三十五条规定:
道路运输车辆运输旅客的,不得超过核定的人数,不得违反规定载货。
我们研究的是一种用于汽车等交通工具的压力测试仪,意义在于当司机不太清楚自己装的东西到底多重时,我们通过压力传感器、单片机等器件使在显示器上可以显示出此时的载重量,最终达到对车辆损害小,减少事故发生率的目的。
(2)学术价值:
超载不仅对车辆使用寿命危害极大,而且还会严重危及行车安全;同时超载还会严重影响车辆的转向性能、制动效能,易因转向失控、制动失效而导致车辆事故;严重超载会因轮胎负荷过大、变形过大而爆胎,从而引起车辆突然偏驶造成事故。
很多司机意识不到这样的问题的严重性,等真出了事故,后悔莫及。
而一些测量器车载重量的仪器大多十分笨重,且不易移动。
在公路上,交警对司机超载的情况作出大致的估计时,一般检测后会发现超载很多,交警也对此十分无奈。
当问及司机这些问题时,司机会有些摸不到头脑,因为他们也不知道什么算是超重,为什么超重算是违法,对装的东西或是乘客的重量不是很明白,原因没有一个量化的标准。
(3)应用价值:
现在很多测量汽车司机或是交警检测车辆是否超重都是通过检测整个车辆的重量,检测的测试仪器俗称地秤,而地秤大都不能移动,且十分笨重,用起来十分麻烦。
而我们发现随着汽车载重量的不同,汽车的弓子板会有不同的弯曲度,针对不同型号的汽车弯曲度的不同,压力传感器有不同的输出量,通过AD转换器、单片机输出不同的数值。
使产品轻巧实用。
(4)可行性分析:
1、现在压力传感器技术、单片机技术已日趋成熟,并且此种产品对司机提供了方便,我们相信这种产品一定会受到欢迎的。
2、与笨重的地秤相比较我们制作的产品轻便实用,有些已经研制出的便携汽车载重测量仪没有用到单片机或者不是通过测量弓子板的弯曲度来测量的3、使用时要注意不同的汽车载重量和弯曲度都会有差别,因不同的汽车而异。
4、小组各人员都很敬业,指导老师是我们自己的专业老师,交流协调都比较方便。
经总体分析,该项目切实可行。
二、研究的基本内容与拟解决的关键问题
(1)基本内容:
各部分功能实现如下面项目流程图:
(2)关键问题:
了解弓子板的机械特性,对弓子板受到压力与产生形变的关系进行了解。
关于弓子板方面的资料网上都不全,很难查到,这对我们的科研立项造成了很大的障碍。
数据的采集与转换。
数据的线性放大和保真。
三、具体的研究方案以及功能的实现
3.1弓子板机械特性分析
对钢板弹簧施加外力时,钢板弹簧前端固定住,在中部逐渐增加力,直到钢板趋于平直为止。
1、由于钢板弹簧在运动过程中片与片之间产生摩擦力,为使计算准确,对摩擦力采取分段施加模拟。
2、通常片间摩擦因数取0.2~0.3,动摩擦因数取0.15~0.2,不同钢板摩擦因数不同。
载荷位移曲线线性拟合位移曲线
某轻型车的设计参数:
满载轴荷/KG2400空载轴荷/KG1593非悬架质量/KG289
钢板弹簧作用长度/mm1200空载偏频/HZ2.1~2.5满载偏频/HZ1.7~2.0
3.2A/D转换电路
A/D转换器的转换精度对测量电路极其重要,它的参数关系到测量电路性能。
本设计采用双积A/D转换器,它的性能比较稳定,转换精度高,具有很高的抗干扰能力,电路结构简单,其缺点是工作速度较低。
在对转换精度要求较高,而对转换速度要求不高的场合如电压测量有广泛的应用。
本项目采用ICL7135,它是一种四位半的双积分A/D转换器,具有精度高(精度相当于14位二进制数)、价格低廉、抗干扰能力强等优点。
本文介绍用单片机并行方式采集ICL7135的数据以实现基于单片机的测量电路
3.2.1双积A/D转换器的工作原理
图3.2.1.1双积A/D转换器
如图所示:
对输入模拟电压和基准电压进行两次积分,先对输入模拟电压进行积分,将其变换成与输入模拟电压成正比的时间间隔T1,再利用计数器测出此时间间隔,则计数器所计的数字量就正比于输入的模拟电
压;接着对基准电压进行同样的处理。
图3.2.1.2双积A/D转换器的波形图
3.2.17135的应用
ICL7135是采用CMOS工艺制作的单片4位半A/D转换器,其所转换的数字值以多工扫描的方式输出,只要附加译码器,数码显示器,驱动器及电阻电容等元件,就可组成一个满量程为2V的数字测量电路。
主要介绍引脚的使用:
图3.2.1.3ICL7135引脚图
①R/H(25脚)当R/H=“1”(该端悬空时为“1”)时,7135处于连续转换状态,每40002个时钟周期完成一次A/D转换。
若R/H由“1”变“0”,
则7135在完成本次A/D转换后进入保持状态,此时输出为最后一次转换结果,不受输入电压变化的影响。
因此利用R/H端的功能可以使数据有保持功能。
若把R/H端用作启动功能时,只要在该端输入一个正脉冲(宽度≥300ns),转换器就从AZ阶段开始进行A/D转换。
②/ST(26脚)每次A/D转换周期结束后,ST端都输出5个负脉冲,其输出时间对应在每个周期开始时的5个位选信号正脉冲的中间,ST负脉冲宽度等于1/2时钟周期。
需要注意的是,若上一周期为保持状态(R/H=“0”)则ST无脉冲信号输出。
ST信号主要用来控制将转换结果向外部锁存器、UARTs或微处理器进行传送。
③BUSY(21脚)在双积分阶段(INT+DE),BUSY为高电平,其余时为低电平。
因此利用BUSY功能,可以实现A/D转换结果的远距离双线传送,其还原方法是将BUSY和CLK“与”后来计数器,再减去10001就可得到原来的转换结果。
④OR(27脚)当输入电压超出量程范围(20000),OR将会变高。
该信号在BUSY信号结束时变高。
在DE阶段开始时变低。
图3.2.1.2ICL7135的波形图
⑤UR(28脚)当输入电压等于或低于满量程的9%(读数为1800),则一当BUST信号结束,UR将会变高。
该信号在INT阶段开始时变低。
⑥POL(23脚)该信号用来指示输入电压的极性。
当输入电压为正,则POL等于“1”,反之则等于“0”。
该信号DE阶段开始时变化,并维持一个A/D转换调期。
⑦位驱动信号D5、D4、D3、D2、D1(12、17、18、19、20脚)每一位驱动信号分别输出一个正脉冲信号,脉冲宽度为200个时钟周期,其中D5对应万位选通,以下依次为千、百、十、个位。
在正常输入情况下,D5--D1输出连续脉冲。
当输入电压过量程时,D5--D1在AZ阶段开始时只分别输出一个脉冲,然后都处于低电平,直至DE阶段开始时才输出连续脉冲。
利用这个特性,可使得显示器件在过程时产生一亮一暗的直观现象。
⑧B8、B4、B2、B1(16、15、14、13脚)该四端为转换结果BCD码输出,采用动态扫描输出方式,即当位选信号D5=“1”时,该四端的信号为万位数的内容,D4=“1”时为千位数内容,其余依次类推。
在个、十、百、千四位数的内容输出时,BCD码范围为0000--1001,对于万位数只有0和1两种状态,所以其输出的BCD码为“0000”和“0001”。
在ICL7135与单片机系统进行连接时,使用并行采集方式,要连接BCD码数据输出线,可以将ICL7135的/STB信号接至单片机的P3.2(INT0)。
ICL7135需要外部的时钟信号,本设计采用CD4060来对4M信号进行32分频得到125KHz的时钟信号。
CD4060计数为14级2进制计数器,在数字集成电路中可实现的分频次数最高,而且CD4060还包含振荡电路所需的非门,使用更为方便。
图3.2.1.3ICL7135与系统的连接
3.3单片机部分
图3.2.1.189C51引脚图
单片机选用的是ATMEL公司新推出的AT89C51,如图3.2.1.1所示。
该芯片具有低功耗、高性能的特点,是采用CMOS工艺的8位单片机,与AT89C51完全兼容。
AT89C51还有以下主要特点:
①采用了ATMEL公司的高密度、非易失性存储器(NV-SRAM)技术;
②其片内具有256字节RAM,8KB的可在线编程(ISP)FLASH存储器;
③有2种低功耗节电工作方式:
空闲模式和掉电模式
④片内含有一个看门狗定时器(WDT),WDT包含一个
14位计数器和看门狗定时器复位寄存器(WDTRST),只要对WDTRST按顺序先写入01EH,后写入0E1H,WDT便启动,当CPU由于扰动而使程序陷入死循环或“跑飞”状态时,WDT即可有效地使系统复位,提高了系统的抗干扰性能。
3.4液晶显示部分
显示接口用来显示系统的状态,命令或采集的电压数据。
本系统显示部分用的是LCD液晶模块,采用一个16×1的字符型液晶显示模块。
点阵图形式液晶由M行×N列个显示单元组成,假设LCD显示屏有64行,每行有128列,每8列对应1个字节的8个位,即每行由16字节,共16×8=128个点组成,屏上64×16个显示单元和显示RAM区1024个字节相对应,每一字节的内容和屏上相应位置的亮暗对应。
一个字符由6×8或8×8点阵组成,即要找到和屏上某几个位置对应的显示RAM区的8个字节,并且要使每个字节的不同的位为‘1’,其它的为‘0’,为‘1’的点亮,为‘0’的点暗,这样一来就组成某个字符。
但对于内带字符发生器的控制器来说,显示字符就比较简单了,可让控制器工作在文本方式,根据在LCD上开始显示的行列号及每行的列数找出显示RAM对应的地址,设立光标,在此送上该字符对应的代码即可。
3.4.11602使用说明
图3.4.1.11602引脚图
表3.4.1.2LCD1602液晶模块的引脚
引脚
符号
功能说明
1
GND
接地
2
Vcc
+5V
3
VL
驱动LCD,一般将此脚接地
4
RS
寄存器选择0:
指令寄存器(WRITE)Busyflag,位址计数器(READ)1:
数据寄存器(WRITE,READ)
5
R/W
READ/WRITE选择1:
READ0:
WTITE
6
E
读写使能(下降沿使能)
7
DB0
低4位三态、双向数据总线
续表3.4.1.1LCD1602液晶模块的引脚
8
DB1
9
DB2
10
DB3
11
DB4
高4位三态、双向数据总线
另外DB7也是一个Busyflag
12
DB5
13
DB6
14
DB7
表3.4.1.3LCD160216×1显示字的地址
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
00
01
02
03
04
05
06
07
40
41
42
43
44
45
46
47
LCD各地址列举如下表:
表3.4.1.4LCD160216×1显示字的外部地址
16×116字1行
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
80
81
82
83
84
85
86
87
C0
C1
C2
C3
C4
C5
C6
C7
表3.4.1.5LCD1602的指令
指令
说明
设置码
RS
R/W
D7
D6
D5
D4
D3
D2
D1
D0
清除显示幕
0
0
0
0
0
0
0
0
0
*
光标回到原点
0
0
0
0
0
0
0
0
1
*
进入模式设定
0
0
0
0
0
0
0
1
I/D
S
显示幕ON/OFF
0
0
0
0
0
0
1
D
C
B
移位
0
0
0
0
0
1
S/C
R/L
*
*
功能设定
0
0
0
0
1
DL
N
F
*
*
字发生器地址设定
0
0
0
1
AGC
设置显示地址
0
0
0
1
ADD
忙碌标志位BF
0
0
1
BF
显示数据
1
0
写入数据
读取数据
1
1
读取数据
I/DI/D=1表示加1,I/D=0表示减1
SS=1表示显示幕ONS=0表示OFF
DD=1表示显示屏幕OND=0表示显示屏幕OFF
CC=1表示光标ONC=0表示光标OFF
BB=1表示闪烁ONB=0表示显示闪烁OFF
S/CS/C=1表示显示屏幕移位S/C=0光标移位
R/LR/L=1表示右移R/L=0表示左移
DLDL=1表示8位DL=0表示4位
FF=1表示5×10点矩阵F=0表示5×7点矩阵
NN=1表示2行显示行N=0表示1行显示行
BFBF=1:
内部正在动作BF=0:
可接收指令或数据码
3.4.2液晶显示部分与89C51的接口
3.4.2.1液晶与89C51的接口
如图所示:
用89C51的P2口作为数据线,用P0.1、P0.2、P0.3分别作为LCD的E、R/W、RS。
其中E是下降沿触发的片选信号,R/W是读写信号,RS是寄存器选择信号本模块设计要点如下:
显示模块初始化:
首先清屏,再设置接口数据位为8位,显示行数为1行,字型为5×7点阵,然后设置为整体显示,取消光标和字体闪烁,最后设置为正向增量方式且不移位。
向LCD的显示缓冲区中送字符,程序中采用2个字符数组,一个显示字符,另一个显示电压数据,要显示的字符或数据被送到相应的数组中,完成后再统一显示.首先取一个要显示的字符或数据送到LCD的显示缓冲区,程序延时2.5ms,判断是否够显示的个数,不够则地址加一取下一个要显示的字符或数据。
3.5通讯模块
89C51内部已集成通信接口URT,只需扩展一片MAX232芯片将输出信号转换成RS-232协议规定的电平标准, MAX232是一种双组驱动器/接收器,每个接收器将EIA/TIA-232-E电平输入转换为5V TTL/CMOS电平。
每个驱动器将TTL/CMOS输入电平转换为EIA/TIA-232-E电平。
即EIA接口,就是把5V转换为-8V到-15V电位0V转换为8V到15V再经RXD输出,接收时由RXD输入,把-8V到-15V电位转换为5V,8V到15V转换为0V。
MAX232的工作电压只需5V,内部有振荡电路产生正负9V电位。
3.6单片机开发板的综合设计
3.7软件程序块
#include//52系列头文件
#defineDisdataP1//液晶数据端口
#defineucharunsignedchar//无符号字符8位
#defineuintunsignedint//无符号整数8位
uintdatadis[4]={0x00,0x00,0x00,0x00};//4个数据单元和一个
ucharcodetable[]="weight:
+.%";//定义初始上电液晶默认显示
状态
ucharcodetable1[]="mynameis:
";
ucharcodetable3[]="zaizhongceshiyi";
ucharcodetable2[]="SCOPE:
0-5.00V";
ucharcodetable4[]="notreversed!
";
sbitlcden=P3^5;//定义液晶使能端
sbitlcdrs=P3^0;//定义液晶RS端
sbitrw=P3^1;//定义液晶RW端
sbitALE=P2^3;//定义锁存地址控制位
sbitcs_ad=P0^1;//片选段,低电平有效
sbitdout=P0^2;//数据输出端
sbitclk=P0^3;//转换结束标志位
sbitspeak=P0^0;//蜂鸣器
sbitbijiao=P3^6;//接反检测信号
dataintresult;//测量变量暂存地址
voidjiefan();//接反子函数
ucharnum,num1,num2,num3,num4,num5;
ucharshii,gei;
//********延时函数************
voiddelay(uintz)
{
uintx,y;
for(x=z;x>0;x--)
{
此处需要循环体;
}
for(y=110;y>0;y--)
{
此处需要循环体;
}
}
//*************
voidwrite_com(ucharcom)//液晶写命令函数
{
lcdrs=0;
P1=com;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
voidwrite_data(uchardate)//液晶写数据函数
{
lcdrs=1;
P1=date;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
voidwrite_sg(ucharadd,uchardate)//写整数位和小数位函数注意:
这里data是字符型的,如可参与运算:
date/10 date%10
{
ucharshi,ge;
shi=date/10;//分解出一个2位数的十位
ge=date%10;
write_com(0x80+add);//设置显示位置
write_data(0x30+shi);//送去液晶显示十位
write_data(0x30+ge);//送去液晶显示个位
}
voidinit()
{
rw=0;
lcden=0;
shii=0;
gei=0;
write_com(0x38);//初始化1602液晶
write_com(0x0c);
write_com(0x06);
write_com(0x01);
write_com(0x80);//设置显示初始坐标
for(num2=0;num2<13;num2++) //table1[]="mynameis:
"这是11个字符,为何这块是小于13应该是11吧!
{
write_data(table1[num2]);
delay(5);
}
write_com(0x80+40);
for(num3;num3<16;num3++)//table3[]="SCOPE:
0-5.00V"这是15个字符,为何这块是小于16应该是15吧!
{
write_data(table3[num3]);
delay(5);
}
delay(3000);
}
//*******************************
voidscan1()
{
write_com(0x80);//设置显示初始坐标
for(num=0;num<16;num++)//table字符就15个字符,所以这块是num<15(从0到15就是15个字符了)
{
write_data(table[num]);
delay(5);
}
write_sg(9,shii);//显示在第一行第九个位置这个weight:
+.%是不是要显示在第二行,因为开始初始化的时候已经有:
mynameis:
zaizhongceshiyi了,这些字符是显示在第一行的吧,难道你所指的是mynameis:
zaizhongceshiyi显示在第0行?
还有shii和gei都分别代表什么?
没有说清楚?
我不太明白?
记住变量名最好是见名知意!
write_sg(12,gei);//显示在第一行第十二个位置
write_com(0x80+40);
for(num1;num1<16;num1++)
{
write_data(table2[num1]);
delay(5);
}
write_sg(9,shii);
write_sg(12,gei);
}
//****TLC1549转换处理子函数********
voidtest()
{
datauchari; //这里的变量i是什么类型的,是data类型,还是uchar类型?
若看下边对变量i的应用,应该定义成int类型的。
cs_ad=1;//禁止i/oclock
cs_ad=0;//开启控制电路,使能dataout和i/oclock
result=0;//清转换变量
for(i=0;i<10;i++)//采集10次,即10bit
{
clk=0;
result*=2;
if(dout)result+=result; //这里dout是什么?
看一下if条件语句的用法,能不能这样用?
注意:
如果if后边没有大括号的话,是默认只执行它后边的一句!
!
clk=1;
}
delay(590);
cs_ad=1;;;;;//dataout返回到高阻状态而终止序列
//****数据转换处理**********
result=result*2500;//结果值扩大25倍因为是百分比,让输入为4V时输出100%,输入为5V时输出为125%;
//你这里扩大的不是25倍,而是2500倍,注意一下下!
!
//dis[2]=result/205;//计算整数位
//dis[3]=re