• 回复
  • 收藏
  • 点赞
  • 分享
  • 发新帖

【工程师6】+实践类+基于编码器的快递车门行程监测系统设计

随着快递运输越来越普遍,由于小规模企业无力改进和大规模企业难以统一调度,无法对快递安全和完整送到顾客手中进行监控,对快递小哥误操作等行为也缺乏有效监控措施这就导致了快递安全送达的几率变低,特别是现在快递越来越向着小、精的方向发展,导致很多快递公司损失严重,顾客也难以信任快递公司。本设计根据快递运输的情况,利用用单片机与编码器相结合,完成对车车门开关行程位置的实时监测,实现提升货物安全的目的。

主要功能是记录显示行车时间以及开门次数,开门、未关紧显示。未关紧报警,行车开门报警等等。

工作原理是1.利用旋转编码器测量旋转角度来测量是否门关闭,是否关紧。

2.利用码轮以及光电门模块检测车轮是否在转从而判断是否在行驶过程中

3.利用单片机进行定时计时

4.利用AT24C02储存芯片实现掉电储存

5.通过串口通信将行车信息传输到终端设备上

这是我搭建的实物模型

全部回复(23)
正序查看
倒序查看
薄浩楠
LV.5
2
2019-08-23 23:15
加油等待跟新
0
回复
GJGJ
LV.1
3
2019-08-23 23:21

旋转编码器是一种用来测量旋转角度和旋转角速度的旋转式传感器,它通过将角位移转化为数字脉冲信号发送给单片机等接收端来记录角位移或者角速度。在光电式旋转编码器中角位移的转换采用了光电扫描原理。它可以分为三个部分,第一部分由交替的透光窗口和不透光窗口组成,就像齿轮一样的结构,使它成为角位移的记录依据。第二部分为发射光源,第三部分为接收光源,发射光源经过第一部分的遮光和透光,使光照交替出现,记录由电子电路实现,经过计算处理即可得到所测量的角度,

如图2.1所示旋转编码器输出为两相方波,它们波形相同,频率相同,只有相位不同,通常A脚和B脚输出随意选择一个脚记录其震荡次数即可计算其旋转角度,与此同时,我们还可以通过比较两个方波的提前与滞后的相位关系来判断旋转方向,不仅如此,旋转编码器在每转一圈之后会输出一个高电平,输出这个高电平的通道给出编码器的绝对零位,也就是每转一圈这个通道会输出一个高电平,以此记录圈数。此信号是一个方波时间大约在A输出一个高电平的中间位置如图2.2所示

旋转编码器精度取决于机械和电气两种因素,其中机械因素有:分光栅栏的精度、旋钮的灵敏度、光源和接收元件的角度等,其中电气因素主要包括:电子电路设计的误差、电路传输的时效、以及处理软件的误差等。可以用下列公式来计算电气角度与机械角度的关系其中n0表示电气角度,n1表示机械角度,a表示脉冲数,t表示转数。

0
回复
GJGJ
LV.1
4
2019-08-23 23:21
@GJGJ
旋转编码器是一种用来测量旋转角度和旋转角速度的旋转式传感器,它通过将角位移转化为数字脉冲信号发送给单片机等接收端来记录角位移或者角速度。在光电式旋转编码器中角位移的转换采用了光电扫描原理。它可以分为三个部分,第一部分由交替的透光窗口和不透光窗口组成,就像齿轮一样的结构,使它成为角位移的记录依据。第二部分为发射光源,第三部分为接收光源,发射光源经过第一部分的遮光和透光,使光照交替出现,记录由电子电路实现,经过计算处理即可得到所测量的角度,如图2.1所示旋转编码器输出为两相方波,它们波形相同,频率相同,只有相位不同,通常由A脚和B脚输出。随意选择一个脚记录其震荡次数即可计算其旋转角度,与此同时,我们还可以通过比较两个方波的提前与滞后的相位关系来判断旋转方向,不仅如此,旋转编码器在每转一圈之后会输出一个高电平,输出这个高电平的通道给出编码器的绝对零位,也就是每转一圈这个通道会输出一个高电平,以此记录圈数。此信号是一个方波时间大约在A输出一个高电平的中间位置如图2.2所示。旋转编码器精度取决于机械和电气两种因素,其中机械因素有:分光栅栏的精度、旋钮的灵敏度、光源和接收元件的角度等,其中电气因素主要包括:电子电路设计的误差、电路传输的时效、以及处理软件的误差等。可以用下列公式来计算电气角度与机械角度的关系:其中n0表示电气角度,n1表示机械角度,a表示脉冲数,t表示转数。[图片][图片]

光电门主要包括一个发光元件和一个接收元件,发光元件和接收元件组成槽型光耦,当凹槽内有物体时,发光元件发出的光被物体挡住,接收元件无法接收到光照,向D0口输出一个高电平;当凹槽内没有遮挡物体时,发光元件发出的光直接照射到接收元件上,D0口输出一个低电平。除此之外,光电门模块还提供了电源指示灯和开关指示灯可以看出光电门是否正常工作,其内部电路图如图2.7所示。

(2)连接方法

光电门模块连接方法如图2.8所示

图2.7光电门模块连接方法

0
回复
GJGJ
LV.1
5
2019-08-23 23:22
@GJGJ
光电门主要包括一个发光元件和一个接收元件,发光元件和接收元件组成槽型光耦,当凹槽内有物体时,发光元件发出的光被物体挡住,接收元件无法接收到光照,向D0口输出一个高电平;当凹槽内没有遮挡物体时,发光元件发出的光直接照射到接收元件上,D0口输出一个低电平。除此之外,光电门模块还提供了电源指示灯和开关指示灯可以看出光电门是否正常工作,其内部电路图如图2.7所示。(2)连接方法光电门模块连接方法如图2.8所示[图片]图2.7光电门模块连接方法

5脚的旋转编码开关具有左转,右转,按下三个功能,根据任务要求我们只需要使用左转右转功能而且只180度。2脚接地,1,3脚接上拉电阻。4脚,5脚是按下功能的两个脚,可以根据需求自己接线

在连接中,通常有A和B两个集电极输出接口,为确保线路衔接性,需要在3.3V上的电压上进行操作,通常串联10kΩ使用。旋转编码器模块接线图如图2.3所示。在硬件接口连接成功之后,以防万一,须做好测试工作检查。

0
回复
GJGJ
LV.1
6
2019-08-23 23:22
@GJGJ
5脚的旋转编码开关具有左转,右转,按下三个功能,根据任务要求我们只需要使用左转右转功能而且只180度。2脚接地,1,3脚接上拉电阻。4脚,5脚是按下功能的两个脚,可以根据需求自己接线。在连接中,通常有A和B两个集电极输出接口,为确保线路衔接性,需要在3.3V上的电压上进行操作,通常串联10kΩ使用。旋转编码器模块接线图如图2.3所示。在硬件接口连接成功之后,以防万一,须做好测试工作检查。[图片]

5脚的旋转编码开关具有左转,右转,按下三个功能,根据任务要求我们只需要使用左转右转功能而且只180度。2脚接地,1,3脚接上拉电阻。4脚,5脚是按下功能的两个脚,可以根据需求自己接线

在连接中,通常有A和B两个集电极输出接口,为确保线路衔接性,需要在3.3V上的电压上进行操作,通常串联10kΩ使用。旋转编码器模块接线图如图2.3所示。在硬件接口连接成功之后,以防万一,须做好测试工作检查。

0
回复
GJGJ
LV.1
7
2019-08-23 23:23
@GJGJ
5脚的旋转编码开关具有左转,右转,按下三个功能,根据任务要求我们只需要使用左转右转功能而且只180度。2脚接地,1,3脚接上拉电阻。4脚,5脚是按下功能的两个脚,可以根据需求自己接线。在连接中,通常有A和B两个集电极输出接口,为确保线路衔接性,需要在3.3V上的电压上进行操作,通常串联10kΩ使用。旋转编码器模块接线图如图2.3所示。在硬件接口连接成功之后,以防万一,须做好测试工作检查。[图片]

由于蜂鸣器产生报警信号驱动的工作电流一般比较大,以致于单片机的I/O口是无法直接驱动的,所以要利用放大电路来驱动,一般使用三极管来放大电流就可以了

蜂鸣器分为有源蜂鸣器和无源蜂鸣器,这里的源并不是电源的意思,而是振荡源,如果是有源蜂鸣器只要通的电流足够驱动蜂鸣器,蜂鸣器就可以正常工作,而无源蜂鸣器则需要一个振荡波去驱动它。

蜂鸣器的工作电路:蜂鸣器的工作电流一般比较大,以致于单片机的I/O口是无法直接驱动的,所以要放大电路来驱动,放大电路一般由三极管组成,也就是基极联通单片机,控制蜂鸣器是否工作,集电极连接电源供电,发射极连接蜂鸣器,使其正常工作。

值得注意的是,理论上来说所有I/O口都可以驱动该电路,但当使用P0口作为驱动电路时需要外加1k欧姆的上拉电阻,其他口并不需要。接线图如图所示。

0
回复
GJGJ
LV.1
8
2019-08-23 23:23
@GJGJ
由于蜂鸣器产生报警信号驱动的工作电流一般比较大,以致于单片机的I/O口是无法直接驱动的,所以要利用放大电路来驱动,一般使用三极管来放大电流就可以了。蜂鸣器分为有源蜂鸣器和无源蜂鸣器,这里的源并不是电源的意思,而是振荡源,如果是有源蜂鸣器只要通的电流足够驱动蜂鸣器,蜂鸣器就可以正常工作,而无源蜂鸣器则需要一个振荡波去驱动它。蜂鸣器的工作电路:蜂鸣器的工作电流一般比较大,以致于单片机的I/O口是无法直接驱动的,所以要放大电路来驱动,放大电路一般由三极管组成,也就是基极联通单片机,控制蜂鸣器是否工作,集电极连接电源供电,发射极连接蜂鸣器,使其正常工作。值得注意的是,理论上来说所有I/O口都可以驱动该电路,但当使用P0口作为驱动电路时需要外加1k欧姆的上拉电阻,其他口并不需要。接线图如图所示。[图片]

为了将行程数据采集并记录下来此次利用AT24C02作为储存芯片,

0
回复
GJGJ
LV.1
9
2019-08-23 23:24
@GJGJ
为了将行程数据采集并记录下来此次利用AT24C02作为储存芯片,[图片]

1602液晶模块内部存储了字符图形、英文字母、数据符号,而且已经编号,存储方式与ISCII码值相同,其工作原理如图。

0
回复
GJGJ
LV.1
10
2019-08-23 23:25
@GJGJ
1602液晶模块内部存储了字符图形、英文字母、数据符号,而且已经编号,存储方式与ISCII码值相同,其工作原理如图。[图片]

LCD1602引脚及其接线方法如图所示

0
回复
GJGJ
LV.1
11
2019-08-23 23:25
@GJGJ
LCD1602引脚及其接线方法如图所示[图片]

旋转编码器模块接线方法如图

0
回复
GJGJ
LV.1
12
2019-08-23 23:26
@GJGJ
旋转编码器模块接线方法如图[图片]

存储芯片模块接线方法如图

0
回复
GJGJ
LV.1
13
2019-08-23 23:27
@GJGJ
存储芯片模块接线方法如图[图片]
接下来是关于软件原理的编写
0
回复
GJGJ
LV.1
14
2019-08-26 23:57
@GJGJ
接下来是关于软件原理的编写

  部分程序及其功能

(1)旋转编码器检测

旋转编码器的AB相分别接入单片机的P1.1和P1.2,并在软件中申请变量PINB和PINA进行检测。首先把接收的引脚置高电平,并申请一个变量EncOld记录编码器初始的状态(00,01,10,11),用一个变量EncNew记录编码器现在的状态,对两个状态进行比较,如果两个数据相同则返回0,如果两个数据不同则通过判断改变的顺序判断方向,00-10-11或11-01-00表示右转,返回R,00-01-11或11-10-00表示左转,返回L。另外由于旋转编码器具有开关特性,所以使用时需要延时消除抖动的影响。

(2)计时实现

在主程序中申请定时器中断,根据计算定时器中断初始化为TH0=0xdc,

TL0=0x00定时器每10ms中断一次,也就是0.01秒,我们申请一个全局变量ms_10记录定时器中断次数,一个6位数组存储秒十位个位,分十位个位,时十位个位。当中断执行100次时,也就是ms_10=100时清零ms_10,把秒个位自加1。当秒个位自加到10时,把秒十位自加1并清零秒个位。当秒十位自加到6时,把秒十位清零并把分个位自加1,同理记录分十位,时个位十位。当每次定时器执行完一次重复执行主程序打开定时器,则可以实现计时。值得注意的是,计时器中断的功能软件中不能由太多延时时间,或者通过一步步调试通过调试软件的时间对延时初值进行调整,否则会出现计时不准的情况发生。

(3)显示实现

使用LCD屏需要三个子程序通过RS和RW的引脚拉高和拉低实现对液晶屏判断是否正在工作、写一个字节和写一个命令。再通过初始化LCD屏程序把计时器和误操作次数显示到LCD屏中,具体操作如下:使用写命令子程序设置16*2显示开显示,关显示光标,使用写一个字节程序执行清屏操作和显示TIME和DEGREE作为标题。再申请一个play函数,显示行车时间和误操作次数,只需要使用写一个字节把时间数组中的数据写在屏幕上。

0
回复
GJGJ
LV.1
15
2019-08-26 23:57
@GJGJ
 部分程序及其功能(1)旋转编码器检测旋转编码器的AB相分别接入单片机的P1.1和P1.2,并在软件中申请变量PINB和PINA进行检测。首先把接收的引脚置高电平,并申请一个变量EncOld记录编码器初始的状态(00,01,10,11),用一个变量EncNew记录编码器现在的状态,对两个状态进行比较,如果两个数据相同则返回0,如果两个数据不同则通过判断改变的顺序判断方向,00-10-11或11-01-00表示右转,返回R,00-01-11或11-10-00表示左转,返回L。另外由于旋转编码器具有开关特性,所以使用时需要延时消除抖动的影响。(2)计时实现在主程序中申请定时器中断,根据计算定时器中断初始化为TH0=0xdc,TL0=0x00定时器每10ms中断一次,也就是0.01秒,我们申请一个全局变量ms_10记录定时器中断次数,一个6位数组存储秒十位个位,分十位个位,时十位个位。当中断执行100次时,也就是ms_10=100时清零ms_10,把秒个位自加1。当秒个位自加到10时,把秒十位自加1并清零秒个位。当秒十位自加到6时,把秒十位清零并把分个位自加1,同理记录分十位,时个位十位。当每次定时器执行完一次重复执行主程序打开定时器,则可以实现计时。值得注意的是,计时器中断的功能软件中不能由太多延时时间,或者通过一步步调试通过调试软件的时间对延时初值进行调整,否则会出现计时不准的情况发生。(3)显示实现使用LCD屏需要三个子程序通过RS和RW的引脚拉高和拉低实现对液晶屏判断是否正在工作、写一个字节和写一个命令。再通过初始化LCD屏程序把计时器和误操作次数显示到LCD屏中,具体操作如下:使用写命令子程序设置16*2显示开显示,关显示光标,使用写一个字节程序执行清屏操作和显示TIME和DEGREE作为标题。再申请一个play函数,显示行车时间和误操作次数,只需要使用写一个字节把时间数组中的数据写在屏幕上。

(4)掉电保护

掉电保护通过把数据写入24C02的方法实现,24C02需要使用I2C通信,所以我们需要使用程序模拟I2C总线通信的方法,根据I2C总线通信方法需要申请SCL和SDA通过改变它们的数值实现对24C02的写入和读取。另外掉电保护写入需要时间所以要加入延时保证写入程序的顺利执行。

(5)串口通信

使用串口通信时,需要在串口助手中选择与串口通信软件中申请的相同波特率,并且申请计时器作为波特率发生器,初始化时打开计时器即可使用串口通信。根据计算,串口初始化波特率9600时,初值为0xfdfd,工作方式为自动重装。

在接收到计算机发送的数据时进入串口中断服务程序,接收之后存入一个临时变量中,并对这个数进行判断,如果为0,把存储芯片中数据以一定的顺序放入输出数组,并发送给计算机;如果接收到的数据为1时,把存储芯片的数据清零,即可实现清零功能。

(6)主程序

每次上电时,首先初始化24C02芯片,读取芯片中的信息放入误操作次数和时间数组的全局变量中,然后执行显示初始化和时间显示,并启动定时器。

如果光电门检测有脉冲,进入行车循环检测,启动中断和使用时间显示,判断开关角度变量是否为0,为0时车门已经关紧,否则车门没有关紧,如果车门没有关紧则记录红灯亮、警报器响直到行车停止,也就是光电门不再有脉冲一段时间。误操作次数加一,并写入到掉电保护芯片中。而且每循环一次都把时间数组写入到掉电保护芯片中,在每次上电的时候读取并写入其中。

进入停车循环,执行扫描旋转编码器并记录旋转编码器的开关角度,左转变量自减1,右转自加1,如果车门关紧红灯灭、绿灯亮,如果车门每关紧红灯亮,绿灯灭,并记录车门是否关紧的变量x,当行车循环检测时进行判断,以提醒司机行车状态。

0
回复
GJGJ
LV.1
16
2019-08-27 00:02
@薄浩楠
加油等待跟新

在快递业的不断发展过程中,快递业务逐步包括文件资料、纸质合同、公务信函、研究资料等为主的函件快递和实验样品、高科技产品、高精度仪器和易碎奢侈品等为主的货物快递,这两种货物越来越多,越来越普及的情况下,大多数的快递公司由于其能力有限,资金不足、创新能力弱,难以承担运输风险,以及安全方面不能让顾客放心失去竞争力。国际知名的快递公司依靠其强大的资金支持和群众优势,不断提高竞争力,在某一区域甚至全球逐渐形成优势,并开辟了多种新的服务方式和手段。可见安全问题已经越来越进入快递行业的核心竞争力标准,在这一背景下各种快递业务安全措施,通过各种方法防止意外发生已势在必行。

本设计基于单片机STC12C5A60S2实现对快递车行车时对车门开关的提醒,把车门开关和行车时间作为数字量存储在24C02芯片中,并通过LCD1602屏实现对行车途中车门监测和实现显示行车时间并通过串口实现与计算机的通信实现对车行程时间和误操作次数的记录。

本设计使用的旋转编码器需要更高的分辨率,如果精度较低会导致车门关紧却误报警,或者车门未关紧不能正确显示。在路况不佳的道路行车时,旋转编码器的使用需要加装一个保护壳,或者有缓冲的物品防止被撞坏。而且编码器会受到大型机器的干扰,所以需要尽可能远离发动机等机械。如果运输道路有风沙、水汽等恶劣条件,需要加一个防尘罩。

本设计的光电门不仅可以作为统计行车时间的标志,还可以通过记录输出脉冲数,结合发动机和车轮齿轮比、车轮直径计算行车的路程和速度。

0
回复
2019-08-30 07:33
@GJGJ
(4)掉电保护掉电保护通过把数据写入24C02的方法实现,24C02需要使用I2C通信,所以我们需要使用程序模拟I2C总线通信的方法,根据I2C总线通信方法需要申请SCL和SDA通过改变它们的数值实现对24C02的写入和读取。另外掉电保护写入需要时间所以要加入延时保证写入程序的顺利执行。(5)串口通信使用串口通信时,需要在串口助手中选择与串口通信软件中申请的相同波特率,并且申请计时器作为波特率发生器,初始化时打开计时器即可使用串口通信。根据计算,串口初始化波特率9600时,初值为0xfdfd,工作方式为自动重装。在接收到计算机发送的数据时进入串口中断服务程序,接收之后存入一个临时变量中,并对这个数进行判断,如果为0,把存储芯片中数据以一定的顺序放入输出数组,并发送给计算机;如果接收到的数据为1时,把存储芯片的数据清零,即可实现清零功能。(6)主程序每次上电时,首先初始化24C02芯片,读取芯片中的信息放入误操作次数和时间数组的全局变量中,然后执行显示初始化和时间显示,并启动定时器。如果光电门检测有脉冲,进入行车循环检测,启动中断和使用时间显示,判断开关角度变量是否为0,为0时车门已经关紧,否则车门没有关紧,如果车门没有关紧则记录红灯亮、警报器响直到行车停止,也就是光电门不再有脉冲一段时间。误操作次数加一,并写入到掉电保护芯片中。而且每循环一次都把时间数组写入到掉电保护芯片中,在每次上电的时候读取并写入其中。进入停车循环,执行扫描旋转编码器并记录旋转编码器的开关角度,左转变量自减1,右转自加1,如果车门关紧红灯灭、绿灯亮,如果车门每关紧红灯亮,绿灯灭,并记录车门是否关紧的变量x,当行车循环检测时进行判断,以提醒司机行车状态。
满满的知识量
0
回复
GJGJ
LV.1
18
2019-08-30 17:05
@心如刀割
满满的知识量[图片]
谢谢
0
回复
GJGJ
LV.1
19
2019-08-30 21:58
@GJGJ
谢谢
源代码如下:
#include 
#include 
typedef unsigned char uchar;
typedef unsigned int uint;


uchar data table[10]={60,2,3,4,5,6,7,8,9,0}; //发送数组
uint ms_10;
uint i,j,k;
char a,b;
unsigned char enc,x=0,y=0;

sbit PINA=P3^2;
sbit PINB=P3^3;
sbit LED_R=P1^3;
sbit LED_G=P1^4;
sbit Cm_ok=P1^5;

sbit sda=P2^0;							   //IO口定义
sbit scl=P2^1;
sbit BEEP = P2^3;                           //蜂鸣器
sbit dula=P2^6;
sbit wela=P2^7;

sbit sw_12=P3^7;
sbit RS = P3^5;
sbit RW = P3^6;
sbit EN = P3^4;         



/***********************************************
串行口初始化波特率9600,定时器1,工作方式2 *************************************************/
void serial_init(void)
{
	TMOD=0x20;//计时器1作为比特率发生器,方式2
	TH1=0xfd;
	TL1=0xfd; //装入初值
	TR1=1;//计时中断允许
	SM0=0;
	SM1=1;//串行口工作于方式2
	ES=1;//串行口中断允许
	REN=1;//接收允许
	EA=1;// 总中断允许
}
/********************* **************************
串行口传送数据
传送显示数组各字符给计算机
*************************************************/
void send(uchar *dis)
{
	while(*dis!=0)
	{
		SBUF=*dis;
		dis++;
		while(!TI);
		TI=0; //软件请发送中断
	}
}
/************************************************************************************************
    函数名称:Encoder
    函数功能:编码器旋转的扫描及处理
    入口参数:无
    出口参数:char型    0-无旋转   'R'-正转(向右转)   'L'-反转(向左转)
************************************************************************************************/
unsigned char Encoder(void)
{
    static bit Enc0=0,Enc1=0;
    static unsigned char EncOld,EncX=0;
    unsigned char EncNow;
    bit EncType=0; //设置编码器类型: 0为一定位一脉冲,1为两定位一脉冲

    PINA=1;        //PINA置高电平
    PINB=1;        //PINB置高电平
    if(Enc0==0)EncOld=(PINA?0x02:0x00)+(PINB?0x01:0x00),Enc0=1;  //记住初次调用时编码器的状态
    EncNow=(PINA?0x02:0x00)+(PINB?0x01:0x00);        //根据两个IO当前状态组合成16进制的0x00|0x01|0x02|0x03
    if(EncNow==EncOld)return(0);                                //如果新数据和原来的数据一样(没有转动)就直接返回0

    if(EncOld==0x00&&EncNow==0x02||EncOld==0x03&&EncNow==0x01)EncX=EncNow;         //00-10|11-01
    if(EncOld==0x00&&EncX==0x02&&EncNow==0x03||EncOld==0x03&&EncX==0x01&&EncNow==0x00)//00-10-11|11-01-00右转
    {
        EncOld=EncNow,EncX=0;
        if(EncType==1)return('R');   //两定位一脉冲
        else       						//一定位一脉冲
        {
            if(Enc1==0)Enc1=1;
            else
            {
                //Delayms(60);       //延时降低旋转灵敏度(不能用在定时器中)
                Enc1=0;
                return('R');
            }
        }
    }

    if(EncOld==0x00&&EncNow==0x01||EncOld==0x03&&EncNow==0x02)EncX=EncNow;         //00-01|11-10
    if(EncOld==0x00&&EncX==0x01&&EncNow==0x03||EncOld==0x03&&EncX==0x02&&EncNow==0x00)//00-01-11|11-10-00左转
    {
        EncOld=EncNow,EncX=0;
        if(EncType==1)return('L');   //两定位一脉冲
        else           //一定位一脉冲
        {
            if(Enc1==0)Enc1=1;
            else
            {
                //Delayms(60);       //延时降低旋转灵敏度(不能用在定时器中)
                Enc1=0;
                return('L');
            }
        }
    }
    return(0);           //不旋转返回0
}

uchar display[6]={0};
uint num=0;

//延时
void delay(unsigned char i)
{
  for(j=i;j>0;j--)
    for(k=125;k>0;k--);
}
/*********************************************************
 蜂鸣器响一声                                           
**********************************************************/
void beep()
{
    unsigned char y;
    for (y=0;y<180;y++)
    {
      BEEP=!BEEP;                //BEEP取反
	  delay(70);
    } 
    BEEP=1;                      //关闭蜂鸣器
}
/////////24C02读写驱动程序////////////////////
void delay1(unsigned int m)
{	unsigned int n;
  	for(n=0;n
0
回复
GJGJ
LV.1
20
2019-08-30 22:00
@GJGJ
源代码如下:#include#includetypedefunsignedcharuchar;typedefunsignedintuint;uchardatatable[10]={60,2,3,4,5,6,7,8,9,0};//发送数组uintms_10;uinti,j,k;chara,b;unsignedcharenc,x=0,y=0;sbitPINA=P3^2;sbitPINB=P3^3;sbitLED_R=P1^3;sbitLED_G=P1^4;sbitCm_ok=P1^5;sbitsda=P2^0;//IO口定义sbitscl=P2^1;sbitBEEP=P2^3;//蜂鸣器sbitdula=P2^6;sbitwela=P2^7;sbitsw_12=P3^7;sbitRS=P3^5;sbitRW=P3^6;sbitEN=P3^4;/***********************************************串行口初始化波特率9600,定时器1,工作方式2*************************************************/voidserial_init(void){TMOD=0x20;//计时器1作为比特率发生器,方式2TH1=0xfd;TL1=0xfd;//装入初值TR1=1;//计时中断允许SM0=0;SM1=1;//串行口工作于方式2ES=1;//串行口中断允许REN=1;//接收允许EA=1;//总中断允许}/***********************************************串行口传送数据传送显示数组各字符给计算机*************************************************/voidsend(uchar*dis){while(*dis!=0){SBUF=*dis;dis++;while(!TI);TI=0;//软件请发送中断}}/************************************************************************************************函数名称:Encoder函数功能:编码器旋转的扫描及处理入口参数:无出口参数:char型0-无旋转'R'-正转(向右转)'L'-反转(向左转)************************************************************************************************/unsignedcharEncoder(void){staticbitEnc0=0,Enc1=0;staticunsignedcharEncOld,EncX=0;unsignedcharEncNow;bitEncType=0;//设置编码器类型:0为一定位一脉冲,1为两定位一脉冲PINA=1;//PINA置高电平PINB=1;//PINB置高电平if(Enc0==0)EncOld=(PINA?0x02:0x00)+(PINB?0x01:0x00),Enc0=1;//记住初次调用时编码器的状态EncNow=(PINA?0x02:0x00)+(PINB?0x01:0x00);//根据两个IO当前状态组合成16进制的0x00|0x01|0x02|0x03if(EncNow==EncOld)return(0);//如果新数据和原来的数据一样(没有转动)就直接返回0if(EncOld==0x00&&EncNow==0x02||EncOld==0x03&&EncNow==0x01)EncX=EncNow;//00-10|11-01if(EncOld==0x00&&EncX==0x02&&EncNow==0x03||EncOld==0x03&&EncX==0x01&&EncNow==0x00)//00-10-11|11-01-00右转{EncOld=EncNow,EncX=0;if(EncType==1)return('R');//两定位一脉冲else//一定位一脉冲{if(Enc1==0)Enc1=1;else{//Delayms(60);//延时降低旋转灵敏度(不能用在定时器中)Enc1=0;return('R');}}}if(EncOld==0x00&&EncNow==0x01||EncOld==0x03&&EncNow==0x02)EncX=EncNow;//00-01|11-10if(EncOld==0x00&&EncX==0x01&&EncNow==0x03||EncOld==0x03&&EncX==0x02&&EncNow==0x00)//00-01-11|11-10-00左转{EncOld=EncNow,EncX=0;if(EncType==1)return('L');//两定位一脉冲else//一定位一脉冲{if(Enc1==0)Enc1=1;else{//Delayms(60);//延时降低旋转灵敏度(不能用在定时器中)Enc1=0;return('L');}}}return(0);//不旋转返回0}uchardisplay[6]={0};uintnum=0;//延时voiddelay(unsignedchari){for(j=i;j>0;j--)for(k=125;k>0;k--);}/*********************************************************蜂鸣器响一声**********************************************************/voidbeep(){unsignedchary;for(y=0;y

这是当时在做毕设时候拍的几张照片

0
回复
GJGJ
LV.1
21
2019-08-30 22:00
@GJGJ
这是当时在做毕设时候拍的几张照片[图片][图片]
0
回复
GJGJ
LV.1
22
2019-08-30 22:01
@GJGJ
[图片]

这是演示时侯的图片

0
回复
GJGJ
LV.1
23
2019-08-30 22:02
@GJGJ
[图片][图片]这是演示时侯的图片
当时利用串口助手模拟上位机的
0
回复
GJGJ
LV.1
24
2019-08-30 22:02
@GJGJ
当时利用串口助手模拟上位机的[图片]

本设计基于单片机STC12C5A60S2实现对快递车行车时对车门开关的提醒,把车门开关和行车时间作为数字量存储在24C02芯片中,并通过LCD1602屏实现对行车途中车门监测和实现显示行车时间并通过串口实现与计算机的通信实现对车行程时间和误操作次数的记录。

本设计使用的旋转编码器需要更高的分辨率,如果精度较低会导致车门关紧却误报警,或者车门未关紧不能正确显示。在路况不佳的道路行车时,旋转编码器的使用需要加装一个保护壳,或者有缓冲的物品防止被撞坏。而且编码器会受到大型机器的干扰,所以需要尽可能远离发动机等机械。如果运输道路有风沙、水汽等恶劣条件,需要加一个防尘罩[20]。

本设计的光电门不仅可以作为统计行车时间的标志,还可以通过记录输出脉冲数,结合发动机和车轮齿轮比、车轮直径计算行车的路程和速度。

0
回复