基于STC89C52的测速和超速报警系统设计

基于STC89C52的测速和超速报警系统设计@[TOC]基于STC89C52的测速和超速报警系统设计电平触发方式时,中断标志寄存器不锁存中断请求信号。单片机把每个机器周期采样到的外部中断源口线的电平逻辑直接赋值到中断标志寄存器。

声明:本文为作者原创,用于交流学习,严禁抄袭本文。转载请注明出处。

第一章 设计背景
随着人们生活水平的提高,汽车在我国的保有量也越来越大。根据统计,在2021年,我国的汽车保有量就已经达到了3.95亿辆。公路里程达到了501.25万公里,汽车驾驶员人数达到了4.44亿人。汽车的普及极大的方便了人们的出行交通,但是随之而来的也是交通事故的频发,据统计,在2021年全国交通事故死亡人数为61703人,其中超速行驶作为事故的重要因素占据了相当一部分比重。根据动能定理,物体的动能与速度的平方成正比,当车速过快时,其动能会以几何倍数增长。“道路千万条,安全第一条”因此控制超速行为,对促进安全驾驶具有重要的社会意义。
随着技术的进步,许多中高配置的轿车中已经配备了超速提醒功能,例如在大众汽车的仪表板中,可以设置行车超速提示,当行车速度超过预设速度时,就会出现叮叮的提示音。但是其设置步骤繁琐,在使用便捷性上还有待提高。并且现在已经保有的车辆中,大部分都不具备此功能。此外现在很多的导航产品也有超速提醒功能,但是其大都依赖道路交通标志的限速要求,无法做到自由设置超速上限。使用上有一定的局限性。基于此背景,本次设计准备开发一款便于安装和使用的超速提示系统。解决车辆功能的缺失和使用灵活性的问题。
第二章 硬件设计方案
2.1 设计思路
本次设计从便于使用、方便改装方面考虑,方案使用非接触式霍尔元件进行测速,使用红外遥控的方式进行设置,并配备蜂鸣器显示屏等提示装置,传感器和提示装置由微控制器进行控制。霍尔传感器可以置于变速箱、车轮等旋转部件的附近,根据霍尔传感器的脉冲发生频率和次数就经过换算就可以获取实际转速,控制器选用STC89C52RC。此方案的优点为方便对车辆进行改装,且系统可靠性好。在实际安装时,只需提供给系统5V电源即可,将霍尔传感器布置在车轮轮毂或者变速箱、传动轴等旋转部件附近即可,系统的设置使用红外遥控,无需另外接按键板等外设,使用灵活,即使在在驾驶途中也能方便的使用遥控器对系统进行报警车速的设置等。系统还设计有1602LCD显示屏,屏幕上显示实时车速、行驶里程、平均车速等信息,方便驾驶员及时了解驾驶信息。
本着稳定可靠和低成本的原则,本次设计使用到的主要元器件型号如下:单片机型号为STC89C52RC,霍尔传感器型号为YS-27,红外接收传感器型号为VS1838B,LCD显示屏的型号为LCD1602A。
2.2 元器件选型和电路设计
2.2.1 单片机部分
STC89C52单片机采用51内核,具备低功耗,高可靠性的优点。 STC89C52使用普通的TTL电平串口线即可进行程序的刷写,使用起来非常方便并且其价格低廉,在电子设计领域有广泛的应用。STC89C52具有以下标准功能:8k字节Flash,512字节RAM, 32 位I/O 口线,看门狗定时器,内置4KB EEPROM,MAX810复位电路,3个16 位定时器/计数器,4个外部中断,一个7向量4级中断结构(兼容传统51的5向量2级中断结构),全双工串行口。另外 STC89C52 可降至0Hz 静态逻辑操作,支持2种软件可选择节电模式。空闲模式下,CPU 停止工作,允许RAM、定时器/计数器、串口、中断继续工作。掉电保护方式下,RAM内容被保存,振荡器被冻结,单片机一切工作停止,直到下一个中断或硬件复位为止。最高运作频率35MHz,6T/12T可选,本次设计使用6T,即晶振震荡6个周期单片机完成一个指令周期。
STC89C52工作原理工作原理:单片机就是按时钟周期,取出指命和数据,作出相关的硬件操作。就好比医生抓药一样,在读一张药方抓药,因为只是一个人,也就是所谓的单核,每读一种药方((要花的时间就是单片机的时钟周期)就去不同的地方找(单片机指命操作)。能否找到,要做出什么处理,就是人做的记录(程序判断,做出相应的数据存储器)。在找的过程中,可能会有人打断(单片机的中断)。做完这个工作后,该做什么,是发呆还是休息(单片机的休眠),—但有新的任务就又开始工作。
想让单片机工作,需要给单片机提供电源、晶振、复位电路等一些外围电路。这些能够满足单片机最基本运行条件的电路连同单片机本身就被成为单片机最小系统。STC89C52单片机只需要很少的一些外围器件就能构成最小体统,使用起来极为方便。
STC89C52单片机下载程序使用14、15号引脚,使用串口通信线就可对其进行程序的下载。下载程序使用的是STC-ISP软件。下载程序时选择对应的单片机型号和程序文件即可。点击下载按钮后,连接单片机对应引脚即可进行程序的刷写。

在这里插入图片描述

图2-1 ISP软件界面
2.2.2 测速传感器
测速模块使用3144霍尔传感器,霍尔传感器是利用霍尔效应原理制作而成的磁场传感器。当霍尔传感器接收到的磁场信号发生变化时,其输出引脚电压信号就会发生变化。霍尔传感器在汽车和工业领域应用广泛,例如汽车行业中的发动机转速传感器、工业应用中的接近开关等。器本次设计使用的霍尔测速传感器模块中集成了一个电压比较芯片。调节传感器模块上的可调电阻旋钮就能调整传感器模块的灵敏度。其实现原理是利用了LM393电压比较器,将霍尔传感器的输出值进行了二值化输出,即当霍尔传感器的输出值高于设定值时,传感器模块就会输出高电平信号,当霍尔传感器的输出值低于设定值时,传感器模块就会输出低电平信号。在实际使用中,这回极大的降低单片机的编程难度,更易于使用。因不同厂家的传感器模块电路设计会有差异,本次设计中只针对霍尔传感器模块的使用和测速程序的实现做出说明,对霍尔测速模块的实际电路不做阐述。
2.2.3 红外传感器
红外传感器在日常生活中具有广泛的应用,从电视空调遥控器到玩具。都能看到红外传感器的身影。红外传感器能够接收红外信号,使得不用物理导线连接就能进行信息的传递,极大的扩展了控制系统的作用范围。另外红外遥控还具有成本低,可靠的优点。本次使用的红外接收传感器型号为VS1838B,其具有一个金属外壳,可以避免一些物理碰撞引起的传感器损坏。VS1838B红外传感器的工作电压为2.7V~5.5V,具有一定的宽电压工作能力。VS1838B传感器在工作时,只要接收到38KHz的信号就会输出低电平,没有接收到信号时就被上拉成高电平。因此根据VS1838B的引脚输出状态,配合单片机定时器就可以对红外传感器接收到的信号进行解析处理、解码。

2.2.4 LCD1602液晶显示屏
LCD1602是广泛应用的一款液晶显示模块,其屏幕能显示两行字符,每行能显示16个字符。每个字符的像素为8×5,能够显示字符和一些简单的符号。LCD1602广泛的应用在打印机、定时器、和各种仪表中,其通讯协议和外围电路简单,造价便宜且能够显示较为丰富的信息。本次设计中使用LCD1602液晶模块显示实时车速、平均车速、行驶里程和设定速度等信息。LCD1602与单片机连接有两种方式,直接连接和间接连接。并口连接方式要占用更多的引脚进行通信,但是在编写程序时更容易理解。间接连接方式是通过HD44780与单片机进行通讯,其占用较少的单片机端口,但是在电路和程序控制上也更为复杂。本次设计中单片机引脚资源足够进行直接连接控制,所以从减少系统复杂度方面考虑,采用直接连接的方式进行控制。
LCD1602使用直接控制方式与单片机通信时,需要8根数据线和3根控制线,即占用11个单片机端口资源。另外LCD1602还有一个可以进行对比对调节的引脚VO,此引脚能够调节LCD1602显示的对比度,当此引脚悬空时,对比度最低,即使屏幕有内容显示也无法分辨。在本次设计的实物制作调试阶段,因为漏接VO引脚导致屏幕显示异常,排查了好久才找到原因。
2.2.5 电路设计
本次的电路设计如下,其中单片机复位电路中的复位按钮因本次设计中几乎不使用,按键没有在实物设计中进行体现。单片机最小系统中使用的晶振频率为22.1184MHz,单片机电源由下载线提供5V电压。在单片机的P0和P2口使用排阻对端口进行了上拉。上拉电阻,就是将不确定的信号通过一个电阻钳位在高电平,电阻同时起限流作用。上拉电阻一般是一端接电源,一端接芯片管脚的电路中的电阻,下拉电阻一般是指一端接芯片管脚一端接地的电阻。上拉就是将不确定的信号通过一个电阻钳位在高电平,电阻同时起限流作用。单片机的P0口和P2口部分引脚用来驱动LCD1206液晶显示模块进行信息显示。单片机两个中断口P3.2 P3.3分别用于霍尔测速和红外接收。
在这里插入图片描述

图2-2 系统原理图
LCD1602模块驱动电路如上图所示,其中R2可调电阻的作用为调节LCD液晶显示屏的对比度,在电路板实物制作时,如果不接此电阻,LCD会不显示字符(对比度最小,无法区分字符)。由于手头没有合适的互动变阻器,实际使用了一个6.8K的电阻将对比度固定在了一个合适值上。实际显示效果如下图。

在这里插入图片描述

图2-3 LCD1602显示效果
蜂鸣器正常工作时的电流约为150mA,虽然STC89C52单片机引脚的理论最大驱动能力为300mA,考虑到单路的稳定性和单片机发热等因素。本次设计在蜂鸣器报警电路部分使用了三极管对蜂鸣器进行驱动,驱动电路如上图所示。在实际测试中蜂鸣器能正常工作,声音也比较响亮,驱动电路芯片也无发热现象。红外接收电路部分使用VS1838B传感器,并使用10K电阻对中断引脚P3.3进行上拉,防止干扰信号引起异常中断响应。
第三章 程序设计
3.1 程序设计思路
本次设计的程序部分各功能模块之间不具有强耦合性,因此程序结构设计较为清晰。程序中main函数作为程序的入口,在程序开始时对单片机资源进行配置,对相关的模块进行初始化,初始化完成后进入while死循环,循环中重复执行LCD显示的刷新函数,和超速判断函数。这样在单片机中数据改变时,就能在LCD上进行快速的刷新显示。红外和霍尔测速程序因为涉及外部信号的快速处理,因此放到中断函数中处理。这样保证了测速的准确性和红外通信的可靠性。
3.2 单片机初始化和中断设置
3.2.1 定时器初始化
在程序的开始部分,对程序中用到的变量进行了定义,程序中用于记录里程和计算平均速度相关的变量使用unsigned long int 即无符号长整形数据进行定义,防止数据过大溢出造成程序异常。在main函数的起始部分,对单片机的定时器进行了设置,本次设计中单片机的外部晶振频率为22.1184MHz,晶振一震荡周期的时间为0.045us,单片机运行在6T模式下,即一个机器指令周期的时间为0.27us,设定的定时器中断时间为250ms所以定时器需要计数926次才能到定时时间。定时器的溢出值为65536,因此定时器初值设置为64610即十六进制0xFC62,将定时器初值的高低位分别放置在TL0和TL1寄存器中即完成定时器时间的设置。定时器设置部分的完整程序如下:
//定时器Timer0初始化
TMOD&=0xF0; //将TMOD的低4位定时器0控制部分清零
TMOD|=0x01; //设置定时器0为方式1
TL0=0x62; //设置定时器0初值低8位
TH0=0xFC; //设置定时器0初值高8位
TR0=1; //启动定时器0
ET0=1; //Timer0中断允许
3.2.2 外部中断初始化
完成定时器初始化后进行单片机外部中断的设置。STC 89C52单片机有两种外部中断方式可以使用:电平触发和边沿触发。在使用电平触发中断时,单片机在每个机器运行周期中不断检查中断源端口电平,检测到低电平,即置位中断请求标志,向CPU请求中断。使用边沿触发方式时,单片机在上一个机器周期检测到中断源口线为高电平,下一个机器周期检测到低电平,即置位中断标志,请求中断。这个原理很好理解。但应用时需要特别注意的几点:
(1) 电平触发方式时,中断标志寄存器不锁存中断请求信号。单片机把每个机器周期采样到的外部中断源口线的电平逻辑直接赋值到中断标志寄存器。这样当中断请求被阻塞而没有得到及时响应时,将被丢失。因此当CPU正在执行同级中断或更高级中断期间,产生的外部中断源(产生低电平)如果在该中断执行完毕之前撤销(变为高电平)了,那么将得不到响应,就如同没发生一样。
(2)边沿触发方式时,中断标志寄存器锁存了中断请求。中断口线上一个从高到低的跳变将记录在标志寄存器中,直到CPU响应并转向该中断服务程序时,由硬件自动清除。因此当CPU正在执行同级中断(甚至是外部中断本身)或高级中断时,产生的外部中断(负跳变)同样将被记录在中断标志寄存器中。在该中断退出后,将被响应执行。否则,必须在中断退出之前,手工清除外部中断标志。
(3)中断标志可以手工清除。一个中断如果在没有得到响应之前就已经被手工清除,则该中断将被CPU忽略。就如同没有发生一样。
(4)选择电平触发还是边沿触发方式应从系统使用外部中断的目的上去考虑,而不是如许多资料上说的根据中断源信号的特性来取舍。比如,有的书上说(《Keil C51使用技巧及实战》),就有类似的观点。
外部中断部分的程序代码如下:
//外部中断INT1初始化 红外接口
IT1=1; //下降沿触发方式
IT1=1; //下降沿触发方式
EX1=1; //外部INT1中断允许
//********************** 霍尔接口
IT0 = 1; //设置为下降沿触发
EX0 = 1; //外部中断0中断允许位
PX0=0; //设置中断优先级
PX1=1;
//开全局中断设置*
EA=1; //开全局中断

3.2.3 车速检测部分程序的实现
在测量车速部分的程序编写时,遵循以下思路:单位时间内记录脉冲次数,每检测到一次脉冲即说明电机转过一圈。根据换换算关系即可计算处电机的转速。在本次的程序设计中,为了让测量值具有实际含义,测量1秒内的外部中断次数并进行显示,即每秒电机转过的圈数。同样不难理解,对外部中断次数不断累加,即可得到电机转过得总圈数,可以模拟对车辆行驶里程的计量。中断计数部分程序如下
void INIT0(void) interrupt 0
//INT0外部中断 测速用,由霍尔传感器触发
{

v0_count++; //瞬时车速累加
s_count++; //里程计数累加
}
3.2.4 红外遥控部分程序的实现
红外遥控部分的程序主要由红外接收解码和按键修改速度上限两部分组成。红外解码部分程序也是通过外部中断实现的,因为只有一个外部中断引脚实现通信,其通信方式可以与手发电报用的摩尔斯码进行类比。通过引脚上高低电平持续的时间就能解析出不同的数据。
红外解码后的数据就可以用来对车速上限进行设置。考虑到使用的便捷性,本次设计中使用了4个按键分别对应速度加10、减10、加1、减1。为了防止数据溢出,程序中对速度上下限进行了限制,其代码实现如下:
//只取了最后一位来区分按下了哪个按键
if(j==‘7’&&v_set>0) //速度-1
{v_set–;}
if(j==‘5’&&v_set<9998)//速度+1
{v_set++;}
if(j==‘4’&&v_set>9)//速度-10
{v_set=v_set-10;}
if(j==‘0’&&v_set<9989)//速度+10
{v_set=v_set+10;}

3.2.5 LCD1602液晶显示部分程序的实现
LCD1602液晶显示需要先对液晶进行初始化操作,其具体的通信实现是在程序开始运行时调用 LCD1602_init() 函数。在程序编写时,我发下LCD1602示例程序中只能显示单个的字符,无法直接显示可变化的数值。因此我编写了一个显示数值的函数来显示车速和里程等变化的数值。其实现思路为:将十进制数值的每一位单独取出,让LCD1602单独显示每一位数字,在函数中定义好显示位置,数值的每一位的显示位置依次加1,即可完成对数值的显示。程序的主要难点在于单独取出数值的每一位,其程序实现如下:
//—————————————
//LCD显示4位数值
//—————————————
void LCD_ShowNum(unsigned char li,unsigned char row ,unsigned int num)
{

unsigned char qian=0;
unsigned char bai=0;
unsigned char shi=0;
unsigned char ge=0;
if(num>9999) //限定数值范围
num=9999; qian=num/1000; //取出千位
bai=(num%1000)/100;//取出百位
shi=(num%100)/10; //取出十位
ge=num%10; //取出个位
LCD1602_Disp(li,row,‘0’+qian); //显示千位
LCD1602_Disp(li+1,row,‘0’+bai); //显示百位
LCD1602_Disp(li+2,row,‘0’+shi); //显示十位
LCD1602_Disp(li+3,row,‘0’+ge); //显示个位
}
3.2.6 超速报警的实现
超速报警部分的程序相对简单,只需要在循环中不断比较设定值和当前车速的大小即可,当前车速大于设定车速时,蜂鸣器控制引脚进行输出即可,需要注意的是因为蜂鸣器驱动电路使用三级管进行驱动。当输出引脚为低电平时,蜂鸣器响,当输出引脚为高电平时,蜂鸣器不响。其程序实现如下:
//超速判断处理***************************************
if(v0>v_set) //判断是否超速
P2_0=0; //超速蜂鸣器响
else
P2_0=1; //未超速不响
第四章 实物制作和调试
4.1 实物制作过程
本次设计中,系统实物制作使用了万能板进行焊接制作。万能板又称为洞洞板,其上有2.54mm间距的圆孔焊盘。洞洞板在电子制作领域广泛使用,使用洞洞板能够快速的制作电子系统硬件原型。本次设计中,使用了一块7×9公分的洞洞板来制作系统实物。在制作实物过程中,考虑到制作有可能失败,因此使用了40P单片机底座,将底座焊接在洞洞板上,单片机插装在底座上,可以进行二次插拔利用。制作的实物如下图。

在这里插入图片描述

图4-1 系统实物图片
在焊接实物时,对照设计原理图,从单片机最小系统开始,先制作完成单片机最小系统。并测试能否成功的进行程序的刷写,能够成功进行程序刷写后再一步一步的完成LCD1602以及其他部分的连接。在实物制作过程中,因为没有选型经验,部分零部件买到的是贴片(SMD)封装的样式,这也对我的焊接制作带来了挑战,例如单片机晶振电路中的两个22pF 电容,实际买到的是0805封装的贴片,其大小仅比芝麻大一点,后来借助镊子才成功的将其焊接在了电路板的背面。电路板的背面元件引脚之间的连线使用黑色导线进行连接。在刚开始制作时,元件的引脚不粘锡,费了九牛二虎之力才勉强焊接几根导线。后来请教了其他同学才知道使用助焊剂能够帮助焊接,后来使用助焊剂后果然容易焊接了,焊点光滑并且更加牢固。在焊接制作实物的过程中,我的焊接水平也有了很大提高,从初期的手忙脚乱到后期的处变不惊,让我明白了纸上得来终觉浅,绝知此事要躬行的道理。
4.2 实物调试和问题解决
实际上在制作时,实物制作和调试是交叉进行的。在每制作完成一部分电路时都会进行调试,看电路是否有问题。在实物调试过程中,出现了很多问题,经历了很多次的重复拆装反复修改才最终实现了设计的功能和效果。下面将调试过程中出现的典型问题进行阐述。
4.2.1 上拉电阻方向问题
在LCD控制引脚上使用了上拉电阻,上拉电阻的封装为9脚直插式。9脚排阻的公共引脚上方有一个小圆点。在一开始焊接时没有注意到这个细节,导致上拉电阻不萌正常工作。后排查原理图发现排阻是非对称结构的,重新焊接排阻后问题得到解决。
4.2.2 霍尔传感器无反应问题
第一次使用霍尔传感器,没有注意到霍尔传感器其实是对磁场极性有要求的。使用的圆片型磁铁只有其中一面才能引起霍尔传感器动作。更改磁铁方向后问题解决。
4.2.3 单片机无法下载程序问题
在焊接完最小系统后,使用下在线对单片机程序进行刷写,刷写成功率低,只有偶尔几次能碰巧刷写成功。将单片机芯片放到开发板上,使用下载线能够成功下载,说明芯片和下载线本身没有问题。锁定问题在焊接的电路板上,因为电容封装是0805 的,焊接难度大,一开始晶振的22pF电容没有焊接,经过问题锁定和网络查找资料后,判断问题大概率是没有电容引起的。焊接上电容后问题得到解决。
4.2.4 单片机定时器问题
在按照晶振频率设置好定时器后,单片机实际运行速度与理论计算速度差异较大。在仔细查阅单片机定时器部分的文档后,发现编写程序时并没有出现错误。此问题困扰我很长一段时间,后在查看一篇51单片机的下载程序教程时发现,单片机有两种工作模式,6T和12T工作模式的设置在下载程序界面进行设置。重新按照6T速率更改定时器设置,问题解决。
在单片机调试过程中出现的这些问题大都是因为自己没有严格按照使用说明进行操作引起的。总结整个制作和调试过程,让我感受最深的是对待技术问题一定要严谨,容不得一点马虎,遇到问题不能自以为是,一定要严格按照既定的步骤进行操作。
结论

本文详细阐述了基于STC89C52单片机的车速测量和报警系统的设计。系统使用红外遥控器进行超速阈值的设定,使用霍尔元件结合单片机的外部中断以及定时器功能进行转速测量。并使用LCD1602液晶显示模块和蜂鸣器显示信息和和报警。本次设计对以下内容进行了研究:
1、给出了STC89C52单片机的最小系统设计原理图,并结合实物制作过程对实物电路中需要注意的问题进行了阐述。并针对单片机的程序下载电路和程序下载方法进行和实践和验证。
2、使用霍尔传感器模块测量磁场信号,结合单片机实现了对转速的测量。本次设计给出了霍尔传感器和单片机的连接电路原理图,并对霍尔测速的原理和单片机程序的实现进行了详细阐述。
3、对LCD1602液晶的使用和程序编写进行了实践验证,在实物制作过程中遇到的异常问题,在本文中进行了记录。例如对比度调节电阻的异常会导致LCD1602显示异常,为解决LCD1602显示异常的问题排查提供了参考。
4、使用红外遥控的方式进行速度上限的设置。在单片机程序中结合定时器和外部中断对红外遥控器的按键进行了解码。并使用4个按键实现了对速度上限的快速设置。
5、本文详细描述了一种速度测量和超速报警系统,并给出了硬件原理图设计和软件程序设计,对解决实际问题提供了一种可行的方案。
另外,本次设计中以方案验证为主,对实际问题进行了简化。例如在实际应用中,还应考虑系统的供电,测速的换算系数等问题,这些在本次的设计过程中都以简化的方案或算法进行了替代。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/38778.html

(0)
编程小号编程小号

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注