基于STC89C52单片机的出租车计程器.docx
- 文档编号:24803763
- 上传时间:2023-06-01
- 格式:DOCX
- 页数:70
- 大小:408.93KB
基于STC89C52单片机的出租车计程器.docx
《基于STC89C52单片机的出租车计程器.docx》由会员分享,可在线阅读,更多相关《基于STC89C52单片机的出租车计程器.docx(70页珍藏版)》请在冰豆网上搜索。
基于STC89C52单片机的出租车计程器
基于STC89C52单片机的出租车计程器
摘要
随着城市建设的不断加快,为方便市民的日常出行出租车行业也随之加速发展。
其中出租车收费环节是衡量该城市出租车行业发展健康状况的重要指标之一,因此出租车计程器技术有着很好的发展前景。
出租车计程器是单片机的一种典型应用,计程器由微处理器和外部电路组成。
微处理器采用STC89C52用于各类数据处理;外部电路包括8个独立按键用于上车开始计费和下车停止计费、切换城市类别、切换出租车档次、切换屏幕、调整时间和清除数据;时钟芯片采用DS1302用于时钟反馈;显示部分采用LCD12864显示关键信息。
为了方便乘客对每次乘坐体验进行评价,
关键词:
STC89C52、DS1302、LCD12864
Abstract
Withtheincreasingofurbanconstruction,fortheconvenienceofcitizens'dailytravelalsoacceleratethedevelopmentoftheindustry.Thetaxifeelinkistomeasurethecityoneoftheimportantindicatorsofthehealthofthetaxiindustrydevelopment,sothetaxitaximetertechnologyhasgoodprospectsfordevelopment.
TaxitaximeterisMCUisakindoftypicalapplication;taximeterconsistsofmicroprocessorandexternalcircuit.ThemicroprocessoradoptingSTC89C52forallkindsofdataprocessing;Externalcircuitincludingeightindependentkeysusedtogetonthebusstartchargingoffandstopswitch,switchcitycategory,taxiclass,screen,adjustingtimeandcleardata;UsingDS1302clockchipisusedfortheclockfeedback;DisplaypartadoptsLCD12864displaykeyinformation.
Keywords:
STC89C52,DS1302,LCD12864
一出租车计程器总体设计
1.1计程器结构组成
脉冲检测:
利用函数发生器来产生脉冲信号,并设置单片机中的计数器来检查脉冲信号,每收到1000个脉冲信号视为出租车前进1.5米;
键盘输入:
通过8个独立按键来控制计程器的计价、时间调节和切换屏幕等功能。
时钟芯片:
用于反馈时间信息,并在液晶屏上进行显示;
温度传感器:
用于采集当前车的温度,并在液晶屏上进行显示。
1.2功能分析
STC89C52是STC公司生产的一种低功耗、高性能CMOS8位微控制器,具有8K在系统可编程Flash存储器。
STC89C52使用经典的MCS-51内核,但做了很多的改进使得芯片具有传统51单片机不具备的功能。
在单芯片上,拥有灵巧的8位CPU和在系统可编程Flash,使得STC89C52为众多嵌入式控制应用系统提供高灵活、超高效的解决方案。
AT89C52具有以下标准功能:
8k字节Flash,512字节RAM,32位I/O口线,看门狗定时器,内置4KBEEPROM,MAX810复位电路,3个16位定时器/计数器,4个外部中断,一个7向量4级中断结构(兼容传统51的5向量2级中断结构),全双工串行口。
另外STC89C52可降至0Hz静态逻辑操作,支持2种软件可选择节电模式。
空闲模式下,CPU停止工作,允许RAM、定时器/计数器、串口、中断继续工作。
掉电保护方式下,RAM内容被保存,振荡器被冻结,单片机一切工作停止,直到下一个中断或硬件复位为止。
因此选用这款微处理器足以完成此出租车计程器的功能需求。
该计程器所需按键并不多,所以按键部分采用独立按键以方便程序编写且减少了产品体积使产品更轻量化,此计程器使用了两块STC89C52单片机进行通信,显示部分采用两块12864液晶显示以提供充足的显示页面且可以实现翻页功能。
二出租车计程器硬软件设计
2.1计程器硬件电路
2.1.1基本应用单元
基本应用单元包括振荡电路、复位电路和USB程序下载电路,如图1所示:
图2基本应用单元
单片机内部有一个高增益、反相放大器,其输入端为芯片引脚XTAL1,其输出端为引脚XTAL2。
通过这两个引脚在芯片外并接石英晶体振荡器和两只电容(电容和一般取30pF)。
这样就构成一个稳定的自激振荡器。
复位电路设计复位操作的形式为上电复位。
按键复位具有上电复位功能外,若要复位,只要按图中的RESET键,电源VCC经电阻R1、R2分压,在RESET端产生一个复位高电平。
上电复位电路要求接通电源后,通过外部电容充电来实现单片机自动复位操作。
上电瞬间RESET引脚获得高电平,随着电容的充电,RERST引脚的高电平将逐渐下降。
RERST引脚的高电平只要能保持足够的时间(2个机器周期),单片机就可以进行复位操作。
按键复位电路图如图2所示。
图3液晶显示电路
USB程序下载电路采用专为RS-232标准串口设计的MAX232单电源电平转换芯片,下载程序时需要冷启动。
2.1.2液晶显示电路
图4独立按键
本设计使用的液晶是12864字符型液晶,并且带字符库的,不需要查找代码。
液晶电路使用时如果发现液晶不亮可以调节连接液晶的点位器,改变液晶的亮度。
显示电路如图2所示。
2.1.3键盘接口电路
独立式键盘中,每个按键占用一根I/O口线,每个按键电路相对独立。
I/O口通过按键与地相连,不停的给P1.1到P1.7口给高电平,无键按下时引脚端为高电平,有键按下时,引脚电平被拉低。
I/O口内部有上拉电阻时,外部可不接上拉电阻。
键盘接口电路如图3所示。
2.2计程器软件设计
2.2.1主机的主函数及流程图
本设计的主机的主函数由键盘扫描及显示函数构成。
并且主机通过两个从机控制线控制从机。
其中键盘共8个按键及其按键上的符号:
城市类型选择键“CITY”、车辆类型选择键“CAR”、屏幕切换键“SCREEN”、时间修改功能键“TIME”、时间加“+”、时间减“-”、上车/下车键“IN/OFF”以及清除键“DELETE”。
按键实现的功能如下:
“CITY”:
按下后大、中、小三种城市类型循环切换。
“CAR”:
按下后高、低档两种车辆类型循环切换。
“SCREEN”:
按下后屏幕1、2、3循环切换。
“+”:
按下后光标处的时间加1。
“-”:
按下后光标处的时间减1。
“TIME”:
按下后光标出现。
通过按“+”、“-”两个按键调整光标所在处的时间。
“IN/OFF”:
按下后车辆开始行进,计费开始或车辆停止行进,计费结束。
“DELETE”:
按下后清空E2PROM中储存车程的信息。
主函数具体流程如下:
1.首先读取E2PROM中储存的当日的车程信息作为开机后的初始值。
2.显示欢迎界面,表达感激。
3.默认显示界面为界面1。
界面1中显示城市的类别、车辆的档次、当前是白天还是夜晚、当前的日期、时间和星期。
4.开始按键扫描。
若没有键被按下,则回到按键扫描程序继续扫描;若扫描到有键按下,则首先判断是否是屏幕键被按下。
5.若屏幕键被按下,则每按键一次,屏幕就切换一次,3个屏幕依次循环;若屏幕键未被按下,接下来就判断车型键是否被按下。
6.若车型键被按下,则每按键一次,车辆档次就切换一次,不同的车辆档次对应的收费标准不一样,2种车辆档次依次循环;若车型键未被按下,接下来就判断城市键是否被按下。
7.若城市键被按下,则每按键一次,城市类型就切换一次,不同的城市类型对应的收费标准不一样,3种城市类型依次循环;若城市键未被按下,接下来就判断时间键是否被按下。
8.若时间键被按下,则每按键一次,光标就移动一次,依次移动到秒钟、分钟、时钟、日和月下面,通过按“+”和“-”键修改光标所在处的时间;若时间键未被按下,接下来就判断上车/下车键是否被按下。
9.若上车/下车键被按下,则每按一次键,2种状态就切换一次,2种状态依次循环;
10.若上车/下车键未被按下,接下来就判断清除键是否被按下。
上车状态表示当前车辆正在行进并且计费,此时从机收到指令并显示欢迎屏幕,若是第一次收到指令则播放音乐。
下车状态表示当前车辆已停止行进并且计费完毕,此时从机收到指令并显示评价屏幕。
11.若清除键被按下,则清除E2PROM中存储的今日车程信息。
12.只有在电源被关闭的情况下才结束程序的进行,否则一直循环。
各个接口定义如表1。
表1接口定义
主从机
端口名
端口
含义
备注
主机
Beep
P0.7
主机发送端口
Beep连接从机S1
Beep1
P0.6
Beep1连接从机S2
DS18B20_DQ
P3.7
DS18B20数据端口
lcd_CS
P2.6
串行的片选信号
lcd_SID
P2.5
串行的数据口
lcd_SCLK
P2.7
串行的同步时钟
lcd_PSB
P3.2
并/串行接口选择
lcd_RST
P0.0
复位低电平有效
k1
P1.4
大中小城市选择
k2
P1.5
车型选择
k3
P1.6
上下客选择
k4
P1.7
切换屏幕选择
key1
P1.3
修改时间
key2
P1.2
时间+
key3
P1.1
时间-
key4
P1.0
清除E2PROM
SCK
P3.6
DS1302时钟
SDA
P3.0
DS1302数据
RST
P3.5
DS1302复位
从机
Beep
P3.6
蜂鸣器
s1
P1.0
从机接收端口
接主机Beep
s2
P1.1
接主机Beep1
k1
P3.5
乘客评价
评价好
k2
P3.4
评价良
k3
P3.3
评价差
2.2.2从机的主函数及流程图
本设计的从机的主函数由键盘扫描函数、指令扫描函数以及显示函数和音频播放函数组成。
其中键盘包含3个用于评价乘车感受的按键:
1-“好”、2-“良”和3-“差”。
指令扫描函数用于判断主机发送的指令,然后进行相应操作。
具体流程如下:
1.显示欢迎屏幕。
欢迎屏幕上显示“欢迎使用!
”以及“加载中……”。
2.接下来检测主机发送的指令。
若是第一次收到指令,则播放一段音乐;若不是第一次收到指令则判断是上车指令还是下车指令。
3.
若判断得到主机发送的指令为上车指令,则显示欢迎屏幕;若判断得到主机发送的指令为下车指令则显示乘车评价屏幕,此时客户可以通过从机的评价按键输入评价。
4.除非电源被切断,否则程序将一直执行。
三出租车计程器制作与调试
3.1计程器制作过程
3.1.1装配步骤流程图如图6:
3.1.2安装注意事项
1.焊接时注意电容的极性;
2.电路连接时要细心避免接错;
3.焊接时避免短接;
4.注意不能虚焊;
3.2计程器测试及分析
为验证制作的计程器是否符合要求,在完成硬件装配及程序下载后,我们利用函数发生器来模拟出租车轮轴的转动,且1000个脉冲视为1.5m。
模拟没有停车等待时的计价部分以及里程显示部分如表2。
通过测试数据可以看出此出租车计程器在没有停车等待时的精确度在合理的误差范围内符合要求,其中最大误差为0.2元,经过分析,此误差的来源主要是测试时难以准确控制到表格所要求的距离,属于人为误差,因此该计程器的计价部分在没有停车等待时以及里程显示部分符合实际需求。
四设计总结
该计程器采用STC89C52作为主控芯片,使用DS18B20采集出租车内的温度,键盘部分由8个独立按键组成用于用于上车开始计费和下车停止计费、切换城市类别、切换出租车档次、切换屏幕、调整时间和清除数据,利用LCD12864显示价钱、里程、时间等信息,并外接AT24C16用于掉电后数据的保存。
表2测试数据
城市
车型
时段
误差
总价(单位/元)
0-500m
1500m
3000m
4500m
6000m
7500m
小城市
低档车
白天
理论值
5.0
20.0
42.5
65.0
87.5
110.0
测试值
5.0
20.0
42.5
65.0
87.6
110.0
夜晚
理论值
6.0
24.0
51.0
78.0
105.0
132.0
测试值
6.0
24.0
51.0
78.0
105.1
132.0
高档车
白天
理论值
6.0
24.0
51.0
78.0
105.0
132.0
测试值
6.0
24.0
51.0
78.0
105.1
132.0
夜晚
理论值
7.2
28.8
61.2
93.6
126.0
158.4
测试值
7.2
28.8
61.2
93.6
126.0
158.4
中城市
低档车
白天
理论值
7.5
30.0
63.8
97.5
131.3
165.0
测试值
7.5
30.0
63.8
97.5
131.3
165.1
夜晚
理论值
9.0
36.0
76.6
117.0
157.6
198.0
测试值
9.0
36.1
76.5
117.0
157.5
198.0
高档车
白天
理论值
9.0
36.0
76.6
117.0
157.6
198.0
测试值
9.0
36.1
76.5
117.0
157.5
198.1
夜晚
理论值
10.8
43.2
91.9
140.4
189.1
237.6
测试值
10.8
43.3
91.8
140.4
189.1
237.7
大城市
低档车
白天
理论值
15.0
60.0
127.6
195.0
262.6
330.0
测试值
15.0
60.1
127.5
195.0
262.5
330.0
夜晚
理论值
18.0
72.0
153.1
234.0
315.1
396.0
测试值
18.0
72.0
152.9
234.0
315.0
396.0
高档车
白天
理论值
18.0
72.0
153.1
234.0
315.1
396.0
测试值
18.0
72.2
152.9
234.0
315.0
396.0
夜晚
理论值
21.6
86.4
183.7
280.8
378.1
475.2
测试值
21.6
86.4
183.5
280.8
377.9
475.2
该计程器实现了具有不同地区(大、中、小城市)、不同车型(高档、低档车型)进行设定的计费方式;具有自动区分白天与夜间的计费方式;计价精确到角钱;显示城市类别、车型、日期、星期、时钟、上客时间、当班载客时间、里程数、计价基数、当班载客计价;计程器失电后再加电,可以查询当日载客总班次、总载客里程、总空车里程、收费累计。
创新点:
采用了两块单片机进行控制,一块方便司机选择基价和调整时间,另一块方便乘客每次乘坐后可以对本次乘坐体验做出评价。
通过此次设计发现出租车计程器还有一些可以改进的部分,例如可以增加计程器无线数据传输的功能,以便出租车公司实时掌握车辆信息。
附录1电路图
附录2源代码
主机源代码
#include
#include
#include"LCD.h"
#include"key.h"
#include"DS1302.h"
#include"DS18B20.h"
#include"I2C.h"
#include"BEEP.h"
#defineucharunsignedchar
#defineuintunsignedint
//距离用变量
#defineN1000
uintm=0,m1=0;//记录m个1000脉冲
//温度用变量
uchartempH=0,tempL=0;//温度数据高8位,低8位
uintzhengshu;//测量到的温度的整数部分
ucharxiaoshu,xiaoshu1,xiaoshu2;//两位的小数,小数第一位,小数第二位
//修改时间用变量
ucharmiao,fen,shi,ri,yue,key1num=0;//记录key1(修改时间)被按下的次数
//计数器标志
ucharnumber_flog=0;//和screen_flog一样的用法
//按键用变量
ucharnum1=1,num2=1,num3=2,num4=1;//默认大城市.高档车.屏幕1.下车
//显示用变量
ucharscreen_flog=0,time_flog=0;//屏幕标志和时间标志(1白天,0黑夜)
//屏幕1为1,屏幕2为0
uintprice_sum=0,distance=0;//总价及路程
//时间用变量
ucharsw,gw,now_clock,temp;//时间的十位和个位,现在的小时数据(用于判断白天夜晚)
//保存上下车时间用变量
//uchartemp2=8;
//保存总班次.总里程用变量
uintdistance_sum=0;
ucharruntime_sum=0;
ucharsum1=0;
uintnum_mile=0;
//ucharH=0,L=0;
intmoney_sum=0;
ucharsum_flog=1;//和screen_flog一样的用法
//函数声明
voiddisplay_time2(ucharx,uchary,uchardate);
voidkeyscan2();
uchardate_turn(uchardate);
uchardate_turn2(uchardate);
voidsave_distance_date_E2P();
voidread_distance_date_E2P();
//voidsave_money_date_E2P();
//voidread_money_date_E2P();
/**********延迟函数*************/
/*us级延时函数*/
voiddelayus(uchari)
{
for(i;i>0;i--);
}
voiddelay(uintz)
{
uintx,y;
for(x=z;x>0;x--)
for(y=95;y>0;y--);
}
//LCD函数
/******LCD写指令(command)******/
voidLCD_write_com(ucharcommand)
{
uchari;
ucharcom;//发送指令/数据前都需先发送命令
com=0xf8;//命令控制句:
11111000-写指令;11111010-写数据
lcd_CS=1;//片选信号线,每次操作都需拉高,用于串行通信
lcd_SCLK=0;//串行同步时钟线,跳变上升沿时,液晶控制器将SID上的数据读入或输出
for(i=0;i<8;i++)
{
lcd_SID=(bit)(com&0x80);//读取最高位
lcd_SCLK=0;//跳变上升沿有效
lcd_SCLK=1;
com<<=1;//左移一次,次高位移到高位下一次循环读取
}
com=command;
com&=0xf0;//取指令数据(command)的高四位,低四位0代替
for(i=0;i<8;i++)
{
lcd_SID=(bit)(com&0x80);//读取最高位
lcd_SCLK=0;//跳变上升沿有效
lcd_SCLK=1;
com<<=1;//左移一次,次高位移到高位下一次循环读取
}
com=command;
com<<=4;//取指令数据(command)的低四位作为高四位,剩下的用0补充
for(i=0;i<8;i++)
{
lcd_SID=(bit)(com&0x80);//读取最高位
lcd_SCLK=0;//跳变上升沿有效
lcd_SCLK=1;
com<<=1;//左移一次,次高位移到高位下一次循环读取
}
lcd_CS=0;
delay(10);
}
/******LCD写数据(date)******/
voidLCD_write_date(uchardate)//显示数据(xssj)
{
uchari;
uchardate1;//发送指令/数据前都需先发送命令
date1=0xfa;//命令控制句:
11111000-写指令;11111010-写数据
lcd_CS=1;//片选信号线,每次操作都需拉高,用于串行通信
lcd_SCLK=0;//串行同步时钟线,跳变上升沿时,液晶控制器将SID上的数据读入或输出
for(i=0;i<8;i++)
{
lcd_SID=(bit)(date1&0x80);//读取最高位
lcd_SCLK=0;//跳变上升沿有效
lcd_SCLK=1;
date1<<=1;//左移一次,次高位移到高位下一次循环读取
}
date1=date;
date1&=0xf0;//取显示数据(date)的高四位,低四位0代替
for(i=0;i<8;i++)
{
lcd_SID=(bit)(date1&0x80);//读取最高位
lcd_SCLK=0;
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 STC89C52 单片机 出租车 计程