摘 要
随着经济时代高速发展的趋势,高速公路作为运输通道在社会经济中发挥着决定性的作用,因此萌发出了高速
公路管理难的主要矛盾,为了解决这个矛盾需要建立高速公路智能收费控制系统,从而改变传统的收费模式,不仅
可以优化高速公路管理,更能最大化的解决现如今高速公路收费站的弊端。
本文研究设计基于单片机高速公路智能收费控制系统,这个系统主要以STC89C52单片机为重心,OLED屏幕、步
进电机、外设射频终端、光电传感器、压力传感器等。在高速公路收费处通过OLED屏幕显示车重、价格;步进电机
控制路障挡杆;光电传感器判断车辆的到来;射频终端远距离通过手机支付链收取费用。最后通过实物电路验证了
此次设计硬件电路稳定可行,实现了以STC89C52芯片为重心的智能收费控制系统的基本功能。本系统不仅优化收费
站资源,车主操作便利,同样有着易于实现,使用简单,功能多元化等优点。
关键词:STC89C52;OLED;射频;智能控制
第1章 前言
随着信息时代的迅速发展集成化技术在各个领域应用颇为广泛,人工智慧不管在人类生活还是军事领域都有着
绝对地位,随着人类经济文化的迅速发展,人们在社会生活中的各个方面的需求都发生质的提高,其中就包括人们
的:衣、食、住、行等各方面,因此随着交通工具种类的繁多和速度、性能的加快,高速公路收费站的压力也随之
而来。根据我国地区发展不平衡的原因多数高速公路收费模式仍是人工收费的半智能化,数据处理慢,人员分配的
不均,收费站的运维成本高。而且由于各路段投资商的不同,如果在交通高峰期以及事故路段,收费站成为公路的
瓶颈就显而易见,容易造成交通的拥堵等一系列问题,同时车辆的频繁刹车、启动也造成了能源资源不合理化浪费
和环境污染,进一步也加快了车辆零件的磨损,埋下了大大小小的交通隐患。因此研究智能化的车辆高速公路收费
系统是适应建设中国特色社会主义的需求。
1.1 高速公路发展的历程
收费高速公路的特定历史地位:公路是国家的公共基础设施,公路建设是公益性事业,公路建设所需资金应由
国家财政安排,但在八十年代初,我国正处在万事俱兴这样一个时期,而对公路建设投入资金很少,公路基础设施
远远落后于经济发展,针对这一现实,1988年1月交通部、财政部、国家物价局联合发出通知,明确规定“随着商品
经济的发展,公路状况不适应国民经济发展的需要的矛盾日益突出,在国家投资有限的情况下,利用贷款、集资、
外资等多渠道筹集建设公路,建成后,收取合理的通行费用于偿还贷款,对加快公路建设起到积极作用”,这是我
国第一个明确可以实行贷款建路,收费还贷的规定,是一条有中国特色公路建设路子,完全符合当时国情,一九九
七年七月《中华人民共和国公路法》以法律形式,确立收费公路的发展过程和历史地位[1]。
目前公路现状:根据2021年数据显示,我国的高速公路总里程达到16万公里左右,相对2020年而言增加0.48万
公里,我国高速公路在近几年新增率处于下降,说明我国道路建设进入饱和期。高速公路收入端的变动因素主要是
车流量变动,因为高速行业收费费率相对稳定。车流量的增长,从车型的角度看,主要区分大中小型客车及货车。
大中小型客车车流量增长驱动来自于车辆保有量以及高速出行频次,而货车车流量驱动来自社会物流总量及装载
率。如图1-1为2015-2021年中国高速公路新增及总里程情况。
图1-1 2015-2021年中国高速公路新增及总里程
高速公路收费现状和面临的难题:事件的产生往往是有两面性,收费高速公路的建设成功解决了人们出行麻烦
的问题,收费站的建设变得颇有意义,收取车辆过路费偿还贷款以及日常的维护费用,这种政策被全社会支持的。
交通事业的发展对建设中国特色社会主义有一定里程碑意义,随着公路建设程度越来越完善,加速推进了由交通枢
纽带动地方经济的步伐,将曾经出门难的问题作为时代进步转折点,为后期的高速发展按下了快进键。我国的经济
建设很大一部分依靠高速公路物流,物流经济的快速发展使得需要功能完善性高的运输方案将会成为时代进步的产
物。
1.2 国内外高速公路收费研究现状
目前国内外收费系统通常有2种模式:开放式收费模式和封闭式模式。开放式收费模式就是在高速公路收费站收
特制卡片,收费人员通过识别卡片后根据收费标准收取车辆通行费,这种收费模式主要适合在线路较长的高速公路
例如我国京昆高速公路、沈海高速公路、大广高速公路以及美国宾州高速公路、日本东京首都高速公路等采用开放
式收费。封闭式收费模式主要适用于路程总干线短、进入高速公路路口少,主要在城市机场和市区环线运用较多,
收费模式主要根据不同需求而改变,收费金额相同有在出口下高速进行收费,在入口上高速进行收费例如济青高速
公路、沪昆高速公路以及韩国的高速公路等采用封闭式收费。
在当今飞速发展时代以节约、绿色、环保、健康、能源、空间等的利用,成了人们着重关注的对象。然而在这
个信息传递飞速的环境里,OLED的横空出现给人们在显示色彩方面带来了转机,OLED的优点之处就是直接功耗、间
接耗能低,无基本电离辐射,空间利用率较高。
在现如今高科技迅猛发展的时代,高速公路遍布全国大大小小城市,越来越多的车辆穿梭在高速公路之上,从
而带来了一系列的高速公路管理的社会矛盾。在修建收费高速公路的同时还需要相应配套收费控制系统,这个系统
优越性能直接影响收费高速公路运维效率情况以及高峰期车流量大造成的拥堵问题。截止目前为止,根据收费自动
化程度可分为:人工、半自动、全自动三类,根据我国国情发展大部分的收费站处还都是实施的停车收费和人工干
预收费的措施,从而对高速公路收费站处的交通及安全矛盾日益显现,因此高速公路车辆类型的自动识别与分类、
公路自动收费是今后公路管理现代化的必然趋势,研究一个符合能解决当前矛盾的收费系统就显得非常重要。
1.3 本文主要研究内容
本设计选用STC89C52单片机作为高速公路智能收费控制系统的控制核心,加上外设备组成单片机最小系统,用
压力传感器、射频卡识别以及光电感应采集车辆基本参数,通过输入单片机对参数进行处理,单片机控制步进电机
机构实现自动抬杆,自动放杆,在OLED显示屏上显示车辆信息以及收费金额,尽量要求系统集成化程度高,结构简
约,操作方面便捷。
本设计的主要目的是开发一个可以适用于公路的收费以及车辆检测的控制系统,从而解决高速公路使用效率的
高低、效益的最大化以及道路上车辆行驶畅通的主要交通矛盾。本次设计的控制系统设计的特点是:
(1)利用智能化的单片机控制系统设计,收费系统具有自动抬杆、自动放杆、自动检测车辆到来、显示车辆基
本信息等功能,具有智能化控制功能。实现节省投资、简便易行。时间效率有效提高等优点。
(2)让系统显示更加丰富多彩,采用显示程度较高OLED显示屏,可以让收费系统信息数据看起来更加简洁明
了,显示内容多样化的特点。
(3)通过射频卡数据轨迹的保存及采集,并设计利用上下位机通讯端口,更方便设置内容的基本参数,对数据
的管理以及查看。
(4)设计出的系统产品具有满足解决高速公路收费站处的交通及安全矛盾人性化特点。
本设计的主要内容:
5
(1)整体设计。为什么对高速公路设计收费控制系统提出原因,解决需求与现状比较进行相应功能的实现,其
次对设计最终系统模型的研究。
(2)硬件设计。首先分析该系统需要实现的一些基本功能,并画出相应的系统流程框图,依次研究实现每一个
模块的基础电路,根据电路图选择需要的芯片以及其他元件并进行介绍,最后进行整体的汇总,从而设计系统的原
理图和PCB图。
(3)软件设计。说明硬件板块实现的方法,并设置软件基本参数以及局部模块数据的配置,最后使用C语言编
写出主程序以及每个模块实现的子程序。
(4)系统的调试和运行。首先确认画出的电路图以及PCB图是否存在错误,然后购买元器件进行焊接,仔细检
查是否存在短路和断路以及错线等问题,并在实物调试中进一步改进电路的功能,软件先使用Keil C运行编译以及
调试,然后使用STC相应下载软件将程序下到单片机中去与硬件配合一起调试,看程序实际运行状况是否符合设计的
功能要求
第2章 方案选择与论证
上一章是对设计思路大体进行讲解,本章主要根据高速公路收费控制系统的设计要求进行可行性的分析,其次
根据任务书上所指导的内容,这款智能收费设计需要实步进电机抬闸、RFID射频刷卡收费、压力感应计量、OLED显
示内容四个功能,从而根据这几项功能设计了总体的框图,对其中几项主要模块进行的选型验证。
2.1 系统整体硬件框图
本次设计主要以STC89C52为核心,光电感应、压力感应、射频读卡为输入模块,步进电机及OLED显示模块为输
出模块。其中射频读卡模块需要进行上位机Demo软件和IC卡调试程序相互协调才能达到预想的效果,OLED显示采用
中景园电子0.96寸OLED显示屏因控制芯片不同,但软件兼容性高,管脚顺序一致,硬件电路一样这是选择它的原
由,需要通过文字取模、英文取模、图像取模来实现显示屏上字体的显现,光电感应模块则是通过对环境光线的处
理来进行信号的传递,对该设计整体硬件进行简单的概述。硬件框图如下图:图2-1为系统的硬件电路框图
图2-1 系统的硬件框
2.2 各模块选型及论证
2.2.1 控制模块的选型
单片机芯片是系统主控制的重要部件,单片机型号的选择也是起决定性作用,在高速公路智能收费控制系统设
计过程中,根据市场需求量条件和程序编写的难易程度以及成本低廉、并选择出最合适的方法。
方法1:如果系统选择STM32型单片机,这个芯片是对高性能的嵌入式应用设计的ARM。但是该软件和系统的缺陷
也较为明显,不能使用处理器的虚拟内存管理技术,只能采用实存储器管理策略,移植相对困难内核也较大,其实
时性也差一些,软件设计难度较高,且单片机价格昂贵,对于电子小白而言开发难度程度难。
方法2:当系统选择STC89C52单片机芯片为系统的中心控制处理器,功能多元化、设备性价相对于同类产品较
高,电子技术发展成熟使得产品获取方式更加广泛,学习探讨和参照对比的资源颇为丰富,由于STC89C52的特性可
以搭建出单片机真正最小应用系统,缩小系统体积,增加系统的可靠性,降低系统的成本。
为了满足极简原则要求程序开发简单,因而选择更加方便的软件设计方法,所以本系统选择STC89C52单片机为
主控制芯片。如图2-2为STC89C52型单片机
图2-2 STC89C52型单片机
2.2.2 电机模块的选型
市面上常用电机主要有步进电机、直流电机、交流电机。为了满足设计的需求从电机的功能、精度、大小以及
转速等方面考虑与比较,根据电机的基本工作原理得出步进电机满足设计的需求,步进电机通过脉冲信号变换成角
位移的开环影响电机步进角度,精度和转速好设定的优点,让步进电机的力矩会随转速的升高而下降。根据步进电
机的特性符合本设计的要求,同过步进电机控制抬杆和放杆过程。如图2-3为步进电机
图2-3 步进电机
步进电机的使用需要配合驱动,当无脉冲信号时步进电机处于停止,有脉冲信号时按照设定角度转动,因此驱
动信号是要满足为脉冲信号,由于转动的快慢和脉冲的频率成正比步进电机有瞬启和急停的特点,利于改变方向的
转动。
2.2.3 检测模块的选型
方法1:选用红外测温传感器。基本原理就是当环境温度超过绝对零度时,在规定区域内连续辐射红外电磁波让
接收区域温度变高,这时感温元件因温度物理量的变化,通过收集的信号做出反应由于该传感器功率消耗小满足系
统的功能要求,但是需要外围电路相辅,费用较高。
方法2:选用光电传感器。它拥有一对红外接收和发射管,主要是通过发射端射出具有一定频率的红外线,在检
测区域内受到遮挡物时红外线反射回来被接收端接收,经过信号比较器处理后实现信号的传递。它的检测距离可以
通过电位器控制、抗干扰能力强、使用多元化等特点,更加适合符合设计需求。
2.2.4 显示模块的选型
方案1:选择LED点阵显示,本设计需要显示内容多有汉字和数字以及字母条件,需使用更多的LED点阵1616,
则只需在8x8原理的基础上将四块8x8级联而成,此次设计使用到6块88点阵LED级联成3列2行的LED点阵系统,可以
显示1个半的汉字,在电路连线时将3个相同行的88LED模块的每个行引脚连接到一起,将2个处于同一列的88LED模
块的每个列引脚连接到一起。但是由于本设计外设设备较多单片机的引脚分配不足,LED点阵级联后引脚颇多不符合
设计需求。
方案2:选择OLED显示屏,中景园电子的0.96寸OLED有黄蓝,白,蓝三种颜色可选并能够实现分栏显示,能够同时显示汉字、数组以及字母,分辦率为128*64,3线或4线的串行SPI接口方式、IC接口方式,满足了系统引脚不足的
问题,在同系列它的性价比较高,更能满足市场需求,显示方面更加精彩丰富,满足现代化的低碳所以选用0.96寸
OLED显示屏显示终端更为满足需求。
2.2.5 数据识别模块的选型
无源RFID产品发展最早,也是发展最成熟,市场应用最广的产品,比如公交卡、食堂餐卡、银行卡、宾馆门禁
卡、二代身份证等,这个在我们的日常生活中随处可见属于近距离接触式识别类其产品的主要工作频率有低频
125KHZ、高频13.56MHZ、超高频433MHZ,超高频915MHZ[2]。该系统选用RFID RC522高频13.56MHz非接触式读写卡芯
片,它与主控制芯片通信为SPI模式有利于接线的美观,具有电压较低、价格低、整体小等优势满足设计需求。
2.2.6 压力传感器的选型
本设计选用的是HX711专为高精度称重传感器而设计的24位A/D转换器芯片,与其他相似芯片比较它有稳定电
源、操作简单、不易受到外界干扰等特点,由于上下表面各有一个应变片同时每个应变片包含2个压力电阻,所以组
成一个全桥式电路利于提高所测的精度,提高了整个称重需求的性能和可靠性。
2.3 本章小结
本章主要介绍了高速公路智能收费控制系统的整体方法,对控制单元、数据识别单元、光感检测单元、电机单
元、显示单元进行说明,根据相似产品性价比和设计的相配度以及成本等参考因素,按照系统需求选取合适产品的
类型以及型号功能进行简单介绍。
第3章 高速公路智能收费系统硬件设计
上一章介绍设计的整体方法以及模块的选择,本章说明介绍智能高速公路智能收费系统硬件设结构的设计。文
中包括控制芯片模块、压力感应模块、光电感应按模块、步进电机模块、OLED显示模块设计,RFID-RC522射频读卡
模块设计。并且详细地介绍了各模块设计所选用的元器件的功能和基本原理以及元件引脚功能说明。
3.1 STC89C52芯片介绍
STC89C52单片机是宏晶科技推出的新一代高速、低功耗、高抗干扰的单片机。该指令码与传统的8051单片机完
全兼容,12时和6时周期任意选择。因此该系统采用的单片机型号为STC89C52单片机,由于51系列单片机在大多数市
场上更兼容的特性,在延展性和快速性方面更具优势,在单芯片上有8位CPU和可编程闪存系统,这使得STC89C52为
许多嵌入式控制应用系统提供了高度灵活和超高效的解决方案,这些都是我选择STC89C52原因。
如下表1为引脚复用功能
表1 引脚复用功能
编号 引脚号 功能特性
1 P1.0 T2 定时器/计数器2外部计数输入,时钟输出
2 P1.1 T2EX 定时器/计数器2捕获/重装触发和方向控制
3 P3.0 RXD串行输入口
4 P3.1 TXD串行输出口
5 P3.2 外部中断0
6 P3.3 外部中断1
7 P3.4 T0定时器0的外部输入
8 P3.5 T1定时器1的外部输入
9 P3.6 外部数据存储器写选通
10 P3.7 外部数据存储器读选通
外部石英晶体或陶瓷振荡器和电容器C2和C3连接到放大器的反馈电路,被称为并联振荡电路的电容的大小影响
系统的振荡频率、启动难易度、振荡和温度的稳定性,系统不能使用大容量为了使系统更加稳定。如图3-1为单片机
最小系统图
图3-1 单片机最小系统图
3.2 RFID-RC522射频读卡模块
MF RC522采用前卫的调制和解调思维模式,基本集成了所有类型的13.56MHz非接触无源通信和协议。不仅支持
兼容应答器信号还具有数字部分处理和错误检测等特点。如图2-3为RFID-RC522射频模块原理图
图3-2 RFID-RC522射频模块原理图
RFID深受一些电子发烧友的热爱主要进行设备开发和读卡器的开发的深度应用,根据设计需求的不同制造出高
级的射频终端。由于它开放式的特性可以广泛使用在读卡器模具当中,因为它工作运行稳定、识别距离长的优势使
得用简单的SPI接口连线就能直接与市面大多数用户CPU主板连接和通信。单元具有易用、高可靠、体积小等特点,
可帮助客户方便、快捷的将非接触卡应用到系统中。
3.3 OLED显示模块
OLED显示屏不需要背光源、鲜明度高、运行迅速、对温度要求小以及集成化高等特点,一度将会成为未来显示
方面的宠儿,LCD则需要背光源,与之相比OLED各方面更加的出色一点。因此本次设计我使用的是中景园电子的0.96
寸OLED显示屏,该屏有以下特点:其中黄蓝是屏上1/4部分为黄光,下3/4为蓝,而且是固定区域显示固定颜色,颜
色和显示区域均不能修改,白光则为纯白也就是黑底白字,蓝色则为纯蓝也就是黑底蓝字,分辦率为128*64,多种
接口方式:6800、8080两种并行接口方式、3线或4线的串行SPI接口方式、IC接口方式,这五种接口是通过屏上的
BSO~BS2来配置的[3]。这个中景园电子屏幕开发了两种接口演示卡,接口分别为七针SPV/IC兼容模块和四针IC模
块。根据实际的需求简单为原则我选择的是四针的IC接口OLED显示屏,如图3-3为OLED显示屏原理图
图3-3 OLED显示屏原理图
本次设计选用IIC串口要把BS1设置为1,BS0设置为0不是直接接地,因此在焊锡电阻时R2和R3不需要焊接,R1和
R4可以焊接,R8可管可不管不会改变功能作用。当用7线SPI接口时R8容易引起不稳定所以不用焊接。重点关注C3,C4
在内部升压的时候要用的,这两个电容参数设置成一样的。如下表3为IIC接口功能
表3 IIC接口功能
编号 引脚号 功能特性
1 GND 电源接地
2 VCC 电源正极(3~5.5V)
3 SCL OLED的D0脚 在IIC通信中为时钟管脚
4 SDA OLED的D1脚 在IIC通信中为数据管脚
3.4 压力感应模块
HX711芯片和后端MCU芯片之间的接口和编程非常简单,所有控制信号都由引脚驱动,而无需编程芯片的内部寄存
器。传感器是将各种物理量、化学量按一定规律转换成便于传输的另一个物理量的装置。压力传感器由三部分组
成:敏感元件、转换元件和测量电路,有时还需要额外的辅助电源。当材料受到应力时,其电阻率会发生显著变
化,这种现象被称为压阻效应。如图3-4为压力感应原理图
图3-4 压力感应原理图
3.5 本章小结
本章根据功能实现的需求从而对高速公路智能收费控制系统进行硬件方法的设计,按照功能呈现、结构梳理、
电路设计基本流程进行说明,同时针对各硬件模块的工作原理进行讲解,包括单片机系统最小电路、压力传感器电
路、称重原理和RFID-RC522射频读卡原理,OLED显示器的内部电路和操作时序。了解每硬件的具体作用和功能在一
定程度上在设计是十分有益的,从而挑选满足适合的硬件。
PCB图
原理图
第4章 高速公路智能收费系统软件设计
上一章详细的介绍了系统的硬件设计方案,本章主要开始介绍高速智能收费系统的软件设计,根据统的功能要
求和系统的硬件电路为基础进行系统的软件设计。为了方便设计出来的软件功能更加完善,单片机系统程序采用单
片机C语言编程环境进行开发的,单片机系统的程序共分为四个模块,即主程序模块、称重计量模块、OLED显示模
块,步进电机模块每个模块实现不同的功能,其中有的模块需要子模块相互协同低级模块可以被高级模块调用从而
实现完整的功能。
4.1 软件系统的总体结构
高速公路智能收费控制系统的软件结构主程序是对车辆到达规定区域内环境参数进行智能控制和检测的主监控
程序,通过复杂问题简单化思维,将大问题拆解成明了的小问题在一定程度上能够减小总工作量。根据模块化的设
计思想可以将系统功能划分为HX711AD驱动程序、RC522驱动程序、步进电机控制程序、OLED字幕程序、射频扫描中
断程序等多个子程序,每个所需实现的功能由对应的子程序运行来实现,通过主程序将各个子程序整合起来就可以
实现智能收费的功能。
主要实现通过射频卡来判断车型,然后进行OLED显示屏显示欢迎光临宁芜高速的初始画面,如果有车辆识别中
断输入则立即切换至新的车型OLED显示数据;光电传感器检测车辆的到来,步进电机控制抬闸实现车辆的通行,压
力感应实现车辆的称重,收集数据经过单片机整合计算,其次呈现在液晶显示屏最终刷卡支付完成。
4.2 主程序工作流程图
系统软件主程序是检测车辆的动态数据,从而实现车辆信息、计重收费等参数的采集功能。这样的设计在一方
面可以清晰明了知道设计者的思路,另一方面可以根据需求编写与调试程序。如图4-2为系统主程序的工作流程图
图4-2 系统主程序的工作流程图
(1)对系统进行初始化
在控制程序中,先对系统开始初始化并编程。OLED显示得电常亮并显示欢迎光临宁芜高速基本字样,系统显示
正常开始工作。
(2)刷卡识别
当车辆到达刷卡识别区域,由于卡片存储车辆的基本信息,系统根据车辆车型以及去皮重量总合计费用,通过
刷卡扣除卡片预存的费用,支付不成功继续重复刷卡动作,完成刷卡支付
(3)电机正转
当刷卡支付成功后,步进电机得到一个正转脉冲信号,进行一个抬杆过程车辆可以正常行驶通过。
(4)电机反转
当车辆离开光感传感器检测范围后,步进电机得到一个反转脉冲信号,进行一个放杆过程,从而完成一系列车
辆通行,车辆收费的过程。
4.3 步进电机程序图
步进电机整个系统的实施程序,主要完成的是信号间的传递依靠ULN2003芯片驱动。当控制I/O向驱动芯片传输
脉冲信号,从而电机单元得到旋转角度的信号,在两个信号通道需要一个延时时钟更有效的控制电机工作的速度。
步进电机旋转程序如图4-3为步进电机控制图。
图4-3 步进电机控制图
4.4 液晶显示程序
单片机运行初始化程序正常工作模式下,开始OLED程序初始化接收到单片机转换的车重和费用数据程序,显示
系统需要向显示器输入显示字符包括请刷卡、请离开、称重信息、收费信息、剩余额度。根据不同子程序的输入显
示器显示内容也是不同的,通过判断显示是否成功来确定程序的正确性,当显示不成功循环执行输入程序。如图4-4
为OLED显示流程图
图4-4 OLED显示流程图
4.5 称重计量程序
当车辆到达称重区域,系统开始初始化读取重力程序功能启动A/D转换将称重传感器测量的重量值转换成数字
信号并读取到单片机内部。读取重量值并检测是否小于100,当超过100则是超重(CN)显示重量值无计算直接通过
单片机数据信号传输到OLED显示屏上接收端口,当小于重量100时,显示重量值并在单片机进行计算后将计算数信号
传输到OLED显示屏上接收端口,跟单片机建立数据传输通道通过命令的相互进行,来实现称重计量功能。如图4-5为
称重流程图
图4-5 称重计量流程图
4.6 本章小结
本章主要介绍了软件实现的功能以及软件设计的方法,由于Keil功能的多元化在很大的一方面给设计提供便利
的基础,其次是对OLED液晶显示、HX711称重、步进电机驱动3个软件程序的说明。
附 录 2
1.C52主要程序
#include <reg52.h> //C52头文件定义
#include "oled.h"
#include "main.h"
#include "mfrc522.h"
#include <STDIO.H>
#include <string.h>
#include <intrins.h>
#include "HX711.h"
sbit IO=P2^5;
sbit BEEP=P2^0;
#define uint unsigned int
#define uchar unsigned char
sfr AUXR = 0x8E; //0000,0000 辅助寄存器
unsigned char g_ucTempbuf[20];
unsigned long HX711_Buffer=0;
unsigned long Weight_Maopi=0;
long Weight_Shiwu=0;
校准参数因为不同的传感器特性曲线不是很一致,因此,每一个传感器需要矫正这里这个参数才能使测量值很
准确。当发现测试出来的重量偏大时,增加该数值,如果测试出来的重量偏小时,减小改数值该值可以为小数。
#define GapValue 430
static step_index;
unsigned int count1,count2; 定时
//定义端口
20
sbit P1_0=P3^7;
sbit P1_1=P3^6;
sbit P1_2=P3^5;
sbit P1_3=P3^4;
void ground(step_index) //转步
{
switch(step_index)
{
case 0://0
P1_0=1;
P1_1=0;
P1_2=0;
P1_3 = 0;
break;
case 1://0,1
P1_0=1;
P1_1=1;
P1_2=0;
P1_3=0;
break;
case 2://1
P1_0=0;
P1_1=1;
P1_2=0;
P1_3=0;
break;
case 3://1,2
P1_0=0;
P1_1=1;
P1_2=1;
P1_3=0;
break;
case 4://2
P1_0=0;
P1_1=0;
P1_2=1;
P1_3=0;
break;
case 5://2,3
P1_0=0;
P1_1=0;
P1_2=1;
P1_3=1;
break;
case 6://3
P1_0=0;
P1_1=0;
21
P1_2=0;
P1_3=1;
break;
case7://3,0
P1_0=0;
P1_1=0;
P1_2=0;
P1_3=1;
}
}
延时子程序
void Delay500us() //@11.0592MHz
{
unsigned char i, j;
_nop_();
_nop_();
i=6;
j=93;
do
{
while (--j);
} while (--i);
}
void Delay1000ms() //@11.0592MHz
{
unsigned char i, j, k;
_nop_();
i=8;
j=1;
k=243;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
void InitializeSystem()
{
TMOD=0x21; //设T0为方式1,GATE=1;
SCON=0x50;
TH1=0xFD; //波特率为4800bps
TL1=0xFD;
TH0=0;
TL0=0;
TR0=1;
22
ET0=1; //允许T0中断
TR1=1; //开启定时器
TI=1;
EA=1; //开启总中断
ES=1;
RI= 1;
}
void main()//主函数
{
int count1=1000,count2=1000,count3=1000,count4=100,count5=100,count6=100,count7=100;
int i=0;
unsigned char status;
unsigned int temp;
InitializeSystem( );
OLED_Init(); //初始化OLED
OLED_Clear();
Delay1000ms() ;
Get_Maopi(); //称毛皮重量、
while(1)
{
OLED_ShowCHinese(0,6,7);//欢迎光临
OLED_ShowCHinese(36,6,8);
OLED_ShowCHinese(72,6,9);
OLED_ShowCHinese(108,6,10);
OLED_ShowCHinese(0,0,11);
OLED_ShowCHinese(36,0,12);
OLED_ShowCHinese(72,0,13);
OLED_ShowCHinese(108,0,14);
if(IO==0)
{
OLED_ShowCHinese(0,2,0);
OLED_ShowCHinese(36,2,1);
OLED_ShowCHinese(72,2,2);
EA=0;
Get_Weight(); //称重
EA=1;
if(Weight_Shiwu>100){Weight_Shiwu=0;OLED_ShowString(40,4,"CZ",16); }
else
{
OLED_ShowNum(80,4,Weight_Shiwu,4,16);
status = PcdRequest(PICC_REQALL, g_ucTempbuf);//寻卡
if (status != MI_OK)
{
InitializeSystem( );
PcdReset();
PcdAntennaOff();
PcdAntennaOn();
23
continue;
}
status = PcdAnticoll(g_ucTempbuf);//防冲撞
if (status != MI_OK)
{ continue; }
BEEP=0; Delay500us();
if(g_ucTempbuf[2]==0xf5)
{
OLED_ShowString(0,4,"A-",16);
count1=count1-(5+Weight_Shiwu) ;OLED_ShowNum(20,4,5+Weight_Shiwu,4,16) ;OLED_ShowNum(60,4,count1,
4,16);
}
if(g_ucTempbuf[2]==0xff)
{
OLED_ShowString(0,4,"B-",16);
count2=count2-(10+Weight_Shiwu);OLED_ShowNum(20,4,10+Weight_Shiwu,4,16);OLED_ShowNum(60,4,count2,
4,16);
}
if(g_ucTempbuf[2]==0xf0)
{
OLED_ShowString(0,4,"C-",16);
count3=count3-(15+Weight_Shiwu);OLED_ShowNum(20,4,15+Weight_Shiwu,4,16);OLED_ShowNum(60,4,count3,
4,16);
}
BEEP=1;
for(i=0;i<1000;i++)
{
step_index++;//大于7,从头再来
if(step_index>7)
step_index=0;
ground(step_index);
Delay500us();
}
OLED_ShowCHinese(0,2,0);
OLED_ShowCHinese(36,2,3);
OLED_ShowCHinese(72,2,4);
for(i=0;i<1000;i++)
{
step_index--;//大于7,从头再来
if(step_index<0)
step_index=7;
ground(step_index);
Delay500us();
}
OLED_ShowString(0,4," ",16);
}
}
24
else
{
OLED_ShowString(0,2," ",16);
OLED_ShowString(0,4," ",16);
}
}
}
//称重
void Get_Weight()
{
Weight_Shiwu = HX711_Read();
Weight_Shiwu = Weight_Shiwu - Weight_Maopi; //获取净重
Weight_Shiwu = (unsigned int)((float)Weight_Shiwu/430); //计算实物的实际重量
}
//获取毛皮重量
void Get_Maopi()
{
Weight_Maopi = HX711_Read();
}
2.称重HX711子程序
#include "HX711.h"
//延时函数
void Delay__hx711_us(void)
{
_nop_();
_nop_();
}
//读取HX711
unsigned long HX711_Read(void) //增益128
{
unsigned long count;
unsigned char i;
HX711_DOUT=1;
Delay__hx711_us();
HX711_SCK=0;
count=0;
EA=1;
while(HX711_DOUT);
EA = 0;
for(i=0;i<24;i++)
{
HX711_SCK=1;
count=count<<1;
HX711_SCK=0; Delay__hx711_us();
if(HX711_DOUT)
count++;
}
25
HX711_SCK=1;
count=count^0x800000;//第25个脉冲下降沿来时,转换数据
Delay__hx711_us();
Delay_ms1(5);
HX711_SCK=0;
return(count);
}
4.4 RC522射频子程序
#include <intrins.h>
#include <reg52.h>
#include "main.h"
#include "mfrc522.h"
#define MAXRLEN 18
功能:寻卡
参数说明: req_code[IN]:寻卡方式
0x52=寻感应区内所有符合14443A标准的卡
0x26=寻未进入休眠状态的卡
pTagType[OUT]:卡片类型代码
0x4400=Mifare_UltraLight
0x0400=Mifare_One(S50)
0x0200 = Mifare_One(S70)
0x0800 = Mifare_Pro(X)
0x4403 = Mifare_DESFire
返回:成功返回MI_OK
char PcdRequest(unsigned char req_code,unsigned char *pTagType)
{
char status;
unsigned int unLen;
unsigned char ucComMF522Buf[MAXRLEN];
ClearBitMask(Status2Reg,0x08);
WriteRawRC(BitFramingReg,0x07);
SetBitMask(TxControlReg,0x03);
ucComMF522Buf[0] = req_code;
status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,1,ucComMF522Buf,&unLen);
if ((status == MI_OK) && (unLen == 0x10))
{
*pTagType = ucComMF522Buf[0];
*(pTagType+1) = ucComMF522Buf[1];
}
else
{ status = MI_ERR;
}
return status;
}
功能:防冲撞
参数说明: pSnr[OUT]:卡片序列号,4字节
返回: 成功返回MI_OK
26
char PcdAnticoll(unsigned char *pSnr)
{
char status;
unsigned char i,snr_check=0;
unsigned int unLen;
unsigned char ucComMF522Buf[MAXRLEN];
ClearBitMask(Status2Reg,0x08);
WriteRawRC(BitFramingReg,0x00);
ClearBitMask(CollReg,0x80);
ucComMF522Buf[0] = PICC_ANTICOLL1;
ucComMF522Buf[1] = 0x20;
status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,2,ucComMF522Buf,&unLen);
if (status == MI_OK)
{
for (i=0; i<4; i++)
{
*(pSnr+i) = ucComMF522Buf[i];
snr_check ^= ucComMF522Buf[i];
}
if (snr_check != ucComMF522Buf[i])
{ status = MI_ERR; }
}
SetBitMask(CollReg,0x80);
return status;
}
功能:复位RC522
返回:成功返回MI_OK
char PcdReset(void)
{
unsigned char i;
MF522_RST=1;
_nop_();
MF522_RST=0;
_nop_();
MF522_RST=1;
_nop_();
WriteRawRC(CommandReg,PCD_RESETPHASE);
_nop_();
WriteRawRC(ModeReg,0x3D); //和Mifare卡通讯,CRC初始值0x6363
WriteRawRC(TReloadRegL,30);
WriteRawRC(TReloadRegH,0);
WriteRawRC(TModeReg,0x8D);
WriteRawRC(TPrescalerReg,0x3E);
WriteRawRC(TxAutoReg,0x40);
return MI_OK;
}
功能:读RC632寄存器
27
参数说明:Address[IN]:寄存器地址
返回:读出的值
unsigned char ReadRawRC(unsigned char Address)
{
unsigned char i, ucAddr;
unsigned char ucResult=0;
MF522_SCK = 0;
MF522_NSS = 0;
ucAddr = ((Address<<1)&0x7E)|0x80;
for(i=8;i>0;i--)
{
MF522_SI = ((ucAddr&0x80)==0x80);
MF522_SCK = 1;
ucAddr <<= 1;
MF522_SCK = 0;
}
for(i=8;i>0;i--)
{
MF522_SCK = 1;
ucResult <<= 1;
ucResult|=(bit)MF522_SO;
MF522_SCK = 0;
}
MF522_NSS = 1;
MF522_SCK = 1;
return ucResult;
}
功能:写RC632寄存器
参数说明:Address[IN]:寄存器地址
value[IN]:写入的值
void WriteRawRC(unsigned char Address, unsigned char value)
{
unsigned char i, ucAddr;
MF522_SCK = 0;
MF522_NSS = 0;
ucAddr = ((Address<<1)&0x7E);
for(i=8;i>0;i--)
{
MF522_SI = ((ucAddr&0x80)==0x80);
MF522_SCK = 1;
ucAddr <<= 1;
MF522_SCK = 0;
}
for(i=8;i>0;i--)
{
MF522_SI = ((value&0x80)==0x80);
MF522_SCK=1;
28
value <<=1;
MF522_SCK = 0;
}
MF522_NSS = 1;
MF522_SCK = 1;
}
功能:置RC522寄存器位
参数说明:reg[IN]:寄存器地址
mask[IN]:置位值
void SetBitMask(unsigned char reg,unsigned char mask)
{
char tmp = 0x0;
tmp = ReadRawRC(reg);
WriteRawRC(reg,tmp | mask); // set bit mask
}
功能:清RC522寄存器位
参数说明:reg[IN]:寄存器地址
mask[IN]:清位值
void ClearBitMask(unsigned char reg,unsigned char mask)
{
char tmp = 0x0;
tmp = ReadRawRC(reg);
WriteRawRC(reg, tmp & ~mask); // clear bit mask
}
功能:通过RC522和ISO14443卡通讯
参数说明:Command[IN]:RC522命令字
pInData[IN]:通过RC522发送到卡片的数据
InLenByte[IN]:发送数据的字节长度
pOutData[OUT]:接收到的卡片返回数据
*pOutLenBit[OUT]:返回数据的位长度
char PcdComMF522(unsigned char Command,
unsigned char *pInData,
unsigned char InLenByte,
unsigned char *pOutData,
unsigned int *pOutLenBit)
{
char status = MI_ERR;
unsigned char irqEn = 0x00;
unsigned char waitFor = 0x00;
unsigned char lastBits;
unsigned char n;
unsigned int i;
switch (Command)
{
case PCD_AUTHENT:
irqEn = 0x12;
waitFor = 0x10;
29
break;
case PCD_TRANSCEIVE:
irqEn = 0x77;
waitFor = 0x30;
break;
default:
break;
}
WriteRawRC(ComIEnReg,irqEn|0x80);
ClearBitMask(ComIrqReg,0x80);
WriteRawRC(CommandReg,PCD_IDLE);
SetBitMask(FIFOLevelReg,0x80);
for (i=0; i<InLenByte; i++)
{ WriteRawRC(FIFODataReg, pInData[i]); }
WriteRawRC(CommandReg, Command);
if (Command == PCD_TRANSCEIVE)
{ SetBitMask(BitFramingReg,0x80); }
i = 600;//根据时钟频率调整,操作M1卡最大等待时间25ms
do
{
n = ReadRawRC(ComIrqReg);
i--;
}
while ((i!=0) && !(n&0x01) && !(n&waitFor));
ClearBitMask(BitFramingReg,0x80);
if (i!=0)
{
if(!(ReadRawRC(ErrorReg)&0x1B))
{
status = MI_OK;
if (n & irqEn & 0x01)
{ status = MI_NOTAGERR; }
if (Command == PCD_TRANSCEIVE)
{
n = ReadRawRC(FIFOLevelReg);
lastBits = ReadRawRC(ControlReg) & 0x07;
if (lastBits)
{
*pOutLenBit = (n-1)*8 + lastBits;
}
else
{*pOutLenBit = n*8;
}
if (n==0)
{n=1;
}
f (n>MAXRLEN)
30
{n = MAXRLEN;
}
for (i=0; i<n; i++)
{
pOutData[i] = ReadRawRC(FIFODataReg);
}
}
}
else
{
status = MI_ERR;
}
}
SetBitMask(ControlReg,0x80); // stop timer now
WriteRawRC(CommandReg,PCD_IDLE);
return status;
}
开启天线
每次启动或关闭天险发射之间应至少有1ms的间隔
void PcdAntennaOn()
{
unsigned char i;
i =ReadRawRC(TxControlReg);
if (!(i & 0x03))
{
SetBitMask(TxControlReg, 0x03);
}
}
关闭天线
void PcdAntennaOff()
{
ClearBitMask(TxControlReg, 0x03);
}
第5章 系统调试和仿真
上一章主要介绍软件程序的设计,本章主要对高速公路智能收费控制系统的硬件和软件进行调试以及实物焊接
说明,通过软硬件相辅相成结合,更能有效得出详细问题所在,实现收费站的多功能控制设计的可行性,从而进行
实物的调试。
5.1 软件调试
本设计主要利用Proteus与Keil相互配合共同开发,将编译好的程序语言进行软硬件的调试,验证程序语言的正
确性有利于提高设计的成功率,软件调试为了确保设计原理的可行性及减少制作实物硬件电路时所出现的错误,并
查处是否有漏洞和改进。
(1)首先创建工程文件:mian.c、oled.c、hx711.c、rc522.c。
(2)为工程选择目标器件设计选择的STC89C52,在Keil软件中我选择AT89C52就行,两者的功能相同。
(3)工程项目设罝软硬件调试环境,设置工程的参数输入单片机的晶振,选择“生成hex文件”用以编译生成
可执行的机器码hex文件。
(4)创建源程序文件并输入程序代码,保存创建的源程序项目文件,把源程序文件添加到项目中。
(5)编译源文件,keil具有语法检查功能,方便我进行错误的地方修改,当编译完成后窗口显示“main”0
Error(s),0 Warning(s)则说明程序没有语法错误。
(6)当源程序编译成功后可以进行程序和逻辑功能的调试保证能够正确运行。如图5-1为称重调试运行
图5-1 称重调试运行
(7)当基本调试完成后,通过编写并生成相应的hex文件,然后通过STC单片机下载软件将程序下载到单片机
C52芯片中。
5.1.1 OLED取模调试
打开模制软件PCtoLCD2002,模式选择根据自己的需求设定汉字所需的字体,设置液晶的颜色为蓝色,输入宁芜
高速汉字,单击“字模的生成”。这里图像的取型、数字的取型方法相同,只是选择模式不同而已。
5.1.2 IC卡读写调试
IC卡读写操作程序首先进行串口的设置,连接好写读器必须保证有电源接入,当得电后会听到一阵阵的响声,
没有响声则说明没有正常得电,需要检查接口是否损坏。启动测试软件已经默认光感检测正常工作,这时用IC卡测
试靠近感应终端当发出“滴”一声说明通讯正常,若没有发出声音说明串口通讯没设置好,
5.1.3 C52芯片程序调试
使用软件STC进行对单片机芯片程序的下载,首先选择对应单片机的型号,选择连接的串口号,如果没有显示已
连接的串口,这可能就是串口驱动没装,有时候装了也不行,所以需要卸载了重装就解决了,然后在保存程序的文
件夹找到hex文件,最后点击下载就可以了。如图5-4为C52芯片程序的下载测试
图5-4 C52芯片程序的下载测试
5.2 硬件调试
首先明确自己电源以及接地线的位置,这样有利于实现资源最大化的利用,规范合理的布线对电路的美观以及
简化电路有着重要作用。其次观察元器件的构造不要盲目的进行焊接要利用好元件本身的引脚,因为在焊接过程中
会先很多问题比如当你各类元器件没规划好就容易出现跨接和跳线等问题,不要着急剪掉引脚有时候跨接有引脚更方便一些,怀着节俭的心态不要多多浪费材料,用需所需的原则尽量设置跳线可以使你的电路简化明了。
焊接事项和问题解决:万能板使用的时候,把器件焊接在万能板上面,然后用电烙铁把需要连接的管脚连接起
来这样就组成了一个电路。由于其价格低廉,使用方便,比打印PCB板方便太多了扩展灵活,本次设计选用这种万能
板。万能板具有焊盘紧密的特点所以要准备的烙铁头有较高的精度。
(1)光感检测。用阻挡物挡住检测探头,显示屏出现请刷卡说明光感检测运行正常。如图5-5为光感检测
图5-5 光感检测
(2)射频读卡检测。在光感检测运行的同时用支付卡片靠近射频读卡区域,当显示屏出现请离开以及支付费用
说明射频读卡正常工作。如图5-6为射频读卡检测
图5-6 射频读卡检测
本设计应该先查看原理图是否正确,按照原理图绘制出PCB图,依旧按着原理图的位置摆放元器件这样更能有效
的合理化安排,依次按照排放顺序依旧方向进行焊接,当焊接完成了再对系统进行实物的调试,这样能更快更准地
发现电路错误的地方,更高效地解决调试问题最后验证此设计可行性。利用元器件自身的结构特点来简化连线,既
美观又能保护元件。
5.3 实物调试
在实物调试高速公路智能收费控制系统功能中,首先对绘制的PCB板图进行检查,看是否存在有短路和断路等一
些情况的出现。一般使用插件电子器件,使用贴片封装的电子器件,容易造成短路使用万能板只能作为临时实验测
试使用,由于其容易老化、以折损,不能够作为正真产品使用。PCB图检查完毕后,查看万能板连线是否有脱落或者
断掉的情况出现。实物板完成后,首先对电源进行调试,查看实物板的电源是否为原理设计上所需要的电压值,并
通过示波器观察电源是否存在波动。电源确立完毕后,将程序烧录进STC89C52单片机中,并进行功能的验证。验证
时采用模块化单独验证的方法,逐个对每个模块的功能进行验证。验证射频模块时查看射频传输是否灵敏和可用,
可以检查出程序中的射频扫描消抖延时是否合理。压力感应模块的验证可以查看称重程序是否合理,通过实物仿真
的发现压力传感器模块在称重时所需要的时间过长,否则将会影响到前一个OLED显示内容,通过程序修改调节相应
合理的延时。此次设计的压力传感器仍存在着一些问题,如称重时不太灵敏,当物体放在称重台时应该轻放,由于
本身激发电阻不灵敏不能进行完善,但在原理上已经实现称重相应功能。同时也能判断光感模块、称重模块、射频
模块、步进电机模块的设计是否合理,从而完成电路功能。
5.4 本章小结
本章主要介绍了软件调试、硬件调试和实物调试。在调试中发现问题并有效解决问题以及在焊接实物时需要做
到简化接线,整个设计更加简约不简单原则,从而另一方面验证程序和电路是否满足需求,调试结果为正常同时说
明高速公路智能收费控制系统能解决现有的问题。
结 论
本文所设计高速公路智能收费控制系统,以单片机为控制芯片主要实现车辆通过高速路收费站光感检测和地磅
称重区域时OLED显示屏显示车型、费用,射频读卡器远距离通过手机钱包支付成功后步进电机得到抬道闸杆等功
能。当系统连接电源后显示屏显示欢迎光临宁芜高速说明系统运行正常,当车辆到达收费站地磅和光电检测区域时
开始对车型进行识别,不同车型的收费是不同,小型车主要以小型轿车为主收费标准为5元,中型车主要以客车和小
货车为主收费标准为10元加去除皮载重量费用,大型车主要以大挂车为主收费标准为15元加去除皮载重量费用,为
了使高速公路使用寿命延长有限重标准,限重主要针对大型车当超重时显示屏告知你此车辆超重,在场执勤人员告
知驾驶员不能通过此段高速公路,其次根据显示屏显示的费用通过手机钱包NPC和定制支付卡片支付费用,当支付成
功后步进电机开始工作抬起闸杆并且显示请离开说明车辆可以行驶通过,当检测到新车辆时立马进行新的工作流
程。
按照提前绑定的车型调用皮重,刷卡识别后系统从内存中找到该车的对应皮重值调出使用从而实现去皮功能,
用户可以通过绑定射频卡选择不同支付方式比如NFC实现收费功能,降低了人力物力成本,大大的提高了通行效率,
有效的解决了当前高速路收费站存在的问题。
总体来说此次的设计达到了预想的目的,虽然在高速公路智能收费控制系统工作中,能够很好地实现本文所提
到的功能,但是仍有一些不足之处需要改善,本设计虽然满足了高速公路智能收费控制系统的大部分功能,当然受
限于设计能力有限、物力和资源不足,还有诸多不足在以后的研究中有待