基于51的客运计价器的设计.docx
《基于51的客运计价器的设计.docx》由会员分享,可在线阅读,更多相关《基于51的客运计价器的设计.docx(25页珍藏版)》请在冰豆网上搜索。
基于51的客运计价器的设计
湖南人文科技学院
课程设计报告
课程名称:
单片机原理及应用课程设计
设计题目:
客运计价器的设计
系别:
通信与控制工程系
专业:
自动化
班级:
09级自动化三班
学生姓名:
张鹏胡彬
学号:
0942132609421305
起止日期:
2011年12月19日~2011年12月31日
指导教师:
成运方智文岳舟
教研室主任:
方智文
指导教师评语:
指导教师签名:
年月日
成绩评定
项目
权重
成绩
张鹏
胡彬
1、设计过程中出勤、学习态度等方面
0.2
2、课程设计质量与答辩
0.5
3、设计报告书写及图纸规范程度
0.3
总成绩
教研室审核意见:
教研室主任签字:
年月日
教学系审核意见:
主任签字:
年月日
摘要
随着生活水平的提高,人们已不再满足于衣食住的享受,出行的舒适已受到越来越多人的关注。
于是,出租车行业以低价高质的服务给人们带来了出行的享受。
随着出租车行业的发展,出租车已经是城市交通的重要组成部分,但是总存在着买卖纠纷困扰着行业的发展,出租车计价器是乘客与司机双方的交易准则,它是出租车行业发展的重要标志,是出租车中最重要的工具。
它关系着交易双方的利益。
具有良好性能的计价器无论是对广大出租车司机朋友还是乘客来说都是很必要的。
因此,汽车计价器的研究也是十分有应用价值的。
而采用模拟电路和数字电路设计的计价器整体电路的规模较大,用到的器件多,造成故障率高,难调试,对于模式的切换需要用到机械开关,机械开关时间久了会造成接触不良,功能不易实现。
而采用单片机进行的设计,相对来说功能强大,用较少的硬件和适当的软件相互配合可以很容易的实现设计要求,且灵活性强,可以通过软件编程来完成更多的附加功能,用数码管显示费用。
针对计费模式的切换,通过软件编程就可以轻易而举的实现。
避免了机械开关带来的不稳定因素。
本设计以89C52单片机为中心实现对出租车计价统计本设计采用6位8段数码管显示,可以清楚地显示出单价、所走时间、总金额数,而且还能根据白天、黑夜来调节单价,具有很强大实用性。
再加上24C08的外部存储芯片,即使在掉电的情况下数据也不会丢失。
关键词:
单片机;C程序;按键扫描;定时中断;掉电保护
目录
设计要求1
1方案论证与对比1
1.1方案一采用数字电路控制1
1.2方案二采用STC89C52单片机控制1
1.3方案比较2
2系统的组成及工作原理2
2.1系统的硬件构成及功能2
2.2STC89C52单片机及其引脚说明2
3硬件模块设计5
3.1控制键盘模块5
3.2掉电保护模块设计6
3.3显示单元电路设计6
4软件模块设计7
4.1系统主程序设计7
4.2定时中断服务程序8
4.3显示服务程序8
4.4键盘服务程序9
5系统调试9
6心得体会及致谢10
7参考文献11
附录1总体设计电路图12
附录2元件清单13
附录3源程序14
客运计价器的设计
设计要求
本课题以单片机为核心,设计并制作出一台出客运计价器,具有以下功能:
1、不同情况具有不同的收费标准,具备白天和晚上不同的计价能力。
2、能进行手动修改单价。
3、具有数据的复位功能。
4、能够在掉电的情况下存储单价等数据。
此题可以以时间做计价方式。
1方案论证与对比
1.1方案一采用数字电路控制
该系统采用传感器件,输出脉冲信号,经过放大整形作为移位寄存器的脉冲,实现计价,但是考虑到这种电路过于简单,性能不够稳定,而且不能调节单价,也不能根据天气调节计费标准,电路不够实用。
其原理方框图如图1所示。
图1数字电路控制方框图
1.2方案二采用STC89C52单片机控制
该系统是用STC89C52单片机,根据所走时间计价钱,即:
白天/晚上总金额=3元/4元(时间<=10s)
总金额=3/4+单价*(时间-10)元(时间>10s)
此系统用单片机的定时器0。
通过启动定时器0来实现时间计费,进而求出总金额。
然后将单价,时间,总金额送到数码管显示。
按键部分可以进行白天晚上模式的选择与单价的调整。
此方案的外部存储模块,可以在系统掉电的情况下保存单价、时间、总金额等数据。
其原理方框图如图2所示。
STC89C52
图2客运计价器系统方框图
1.3方案比较
本设计要求是实现基本的计价和不同时间段的加价方式。
方案一种用到里程传感器,移位寄存器这些装置的实现,要比较复杂的数字电路,应用不灵活。
方案二中采用单片机来实现,比较方便,简单不需要太大的要求就可以实现计价要求。
上述两种方案中:
方案一比方案二的硬件设计难度大,稳定性差,难操作。
综合比较,再根据本设计的要求,所以采用方案二来实现功能。
2系统的组成及工作原理
2.1系统的硬件构成及功能
本系统的硬件设计主要包括单片机STC89C52、数据显示部件、模拟行驶时间单元、及计价单元的设计。
在硬件设计过程中,充分利用各部件的功能,实现多功能的客运计价器设计。
利用单片机丰富的IO端口,及其控制的灵活性,实现基本的时间计价功能和价格选择、总价显示控制等功能。
不但能实现所要求的功能而且能在很大的程度上扩展功能,而且还可以方便的对系统进行升级。
具体电路参见附录中“总体设计电路图”。
2.2STC89C52单片机及其引脚说明
STC89C52是美国ATMEL公司生产的低功耗,高性能CMOS8位单片机,片内含8KB的可系统编程的Flash只读程序存储器,器件采用ATMEL公司的高密度、非易失性存储技术生产,兼容标准8051指令系统及引脚。
它集Flash程序存储器既可在线编程(ISP)也可用传统方法进行编程及通用8位微处理器于单片芯片中,具有高性价比。
STC89C52是一个有40个引脚的芯片,引脚配置如图3STC89C52引脚配置所示。
图3STC89C52引脚配置
STC89C52芯片的40个引脚功能为:
VCC:
电源电压。
GND:
接地。
RST:
复位输入。
当RST变为高电平并保持2个机器周期时,将使单片机复位。
WDT溢出将使该引脚输出高电平,设置SFRAUXR的DISRTO位可打开或关闭该功能。
DISKRTO位缺省为RESET输出高电平打开状态。
XTAL1:
反向振荡放大器的输入及内部时钟工作电路的输入。
XTAL2:
来自反向振荡放大器的输出。
P0口:
一组8位漏极开路型双向I/O口。
也即地址/数据总线复用口。
作为输出口用时,每位能驱动8个TTL逻辑门电路,对端口写“1”可作为高阻抗输入端用。
在访问外部数据存储器或程序存储器时,这组口线分时转换地址(低8位)和数据总线复用,在访问期间激活内部上拉电阻。
在Flash编程时,P0口接收指令字节,而在程序校验时,输出指令字节,校验时,要求外接上拉电阻。
P1口:
一个带内部上拉电阻的8位双向I/O口,P1的输出缓冲级可驱动(吸收或输出电流)4个TTL逻辑门电路。
对端口写“1”,通过内部的上拉电阻把端口拉到高电平,此时可作输入口。
作输入口使用时,因为内部存在上拉电阻,某个引脚被外部信号拉低时会输出一个电流(IIL)。
Flash编程和程序校验期间,P1接收低8位地址。
P1口部分端口引脚及功能如表2-1P1口特殊功能所示。
表1P1口特殊功能
P1口引脚
特殊功能
P1.5
MOSI(用于ISP编程)
P1.6
MOSI(用于ISP编程)
P1.7
SCK(用于ISP编程)
P2口:
一个带内部上拉电阻的8位双向I/O口。
P1的输出缓冲级可驱动(吸收或输出电流)4个TTL逻辑门电路。
对端口写“1”,通过内部的上拉电阻把端口拉到高电平,此时可作输入口。
作输入口使用时,因为内部存在上拉电阻,某个引脚被外部信号拉低时会输出一个电流(IIL)。
在访问外部程序存储器或16位地址的外部数据存储器时,P2口送出高8位地址数据。
在访问8位地址的外部数据存储器时,P2口线上的内容在整个访问期间不改变。
Flash编程和程序校验期间,P2亦接收低8位地址。
P3口:
一个带内部上拉电阻的8位双向I/O口。
P3的输出缓冲级可驱动(吸收或输出电流)4个TTL逻辑门电路。
对P3口写“1”时,它们被内部的上拉电阻把拉到高电并可作输入端口。
作输入端口使用时,被外部拉低的P3口将用上拉电阻输出电流(IIL)。
P3口除了作为一般的I/O口线外,更重要的用途是它的第二功能,如表2-2P3口特殊功能所示。
P3口还接收一些用于Flash闪速存储器编程和程序校验期间的控制信号。
表2-2P3口特殊功能
P3口引脚
特殊功能
P3.0
RXD(串行输入口)
P3.1
TXD(串行输出口)
P3.2
(外部中断0)
P3.3
(外部中断1)
P3.4
T0(定时器0外部输入)
P3.5
T1(定时器1外部输入)
P3.6
(外部数据存储器写选通)
P3.7
(外部数据存储器读选通)
PSEN/:
程序储存允许输出是外部程序存储器的读先通信号,当AT89C52由外部程序存储器取指令(或数据)时,每个机器周期两次PSEN/有效,即输出两个脉冲。
当访问外部数据存储器,没有两次有效的PSEN/信号。
EA/VPP:
外部访问允许。
欲使CPU仅访问外部程序存储器,EA端必须保持低电平,需注意的是:
如果加密位LB1被编程,复位时内部会锁存EA端状态。
Flash存储器编程时,该引脚加上+12V的编程电压VPP。
3硬件模块设计
3.1控制键盘模块
键盘采用4*4矩阵按键,接在8255A的PC口,当有键按下时,相对应的接口被置0。
矩阵键盘又称为行列式键盘,它是用4条I/O线作为行线,4条I/O线作为列线组成的键盘。
在行线和列线的每一个交叉点上,设置一个按键。
如图4所示,行线接PC.0~PC.3,列线接PC.4~PC.7。
外中断按键,通过与单片机的P3.2口和P3.3口,实现计价器的中途停止和继续行驶,其电路图如图5所示。
图4矩阵键盘电路
图5外中断电路
按键S3:
复位按键。
按下该键。
所有数据初始化。
按键S4:
白天和黑夜计价方式的切换键。
按键S8:
单价从1元每秒到2元每秒的切换键。
按键S12:
开始计价按键。
外中断0按键:
表示汽车中途停止。
外中断1按键:
表示汽车继续行驶。
3.2掉电保护模块设计
掉电存储单元的作用是在电源断开的时候,存储当前设定的单价信息。
掉电保护的芯片较多,如AT24C08是ATMEL公司的2KB字节的电可擦除存储芯片,采用两线串行的总线和单片机通讯,电压最低可以到2.5V,额定电流为1mA,静态电流10Ua(5.5V),芯片内的资料可以在断电的情况下保存40年以上,而且采用8脚的DIP封装,使用方便。
掉电保护电路图如下图6所示。
图6掉电保护电路
3.3显示单元电路设计
由于设计要求有时间、金额、单价,所以采用6位LED数码管的分屏显示。
显示电路由6位LED数码管组成。
电路如图7所示,8255A用于连接51单片机和LED数码管,51单片机的P0.0~P0.7分别顺序对应8255A的D0~D7,8255A的PA口为数码管的位选,PA为0xdf时,选择右一数码管。
以次类推。
PB口为数码管段选,PB为0xa0时,数码管显示为零。
各个数码管显示内容示意图见图7。
图7LED数码管显示电路
4软件模块设计
本系统的软件设计主要可分为主程序模块、定时计数中断程序、外中断服务程序、显示子程序服务程序、键盘服务程序五大模块。
下面对各部分模块作介绍。
4.1系统主程序设计
图8主程序流程图
在主程序模块中,需要完成对各接口芯片的初始化、出租车起价和单价的初始化、中断向量的设计以及开中断、循环等待等工作。
另外,在主程序模块中还需要设置启动/清除标志寄存器、时间寄存器和价格寄存器,并对它们进行初始化。
然后,主程序将根据各标志寄存器的内容,分别完成启动、清除、计时和计价等不同的操作。
主程序流程图如图8所示。
当按下S12时,就启动计价,将根据时间寄存器中的内容计算,并将结果存于价格寄存器中,然后将时间和当前累计价格送显示电路显示出来。
到下次启动计时,系统自动对显示清零,并重新进行初始化过程。
4.2定时中断服务程序
在定时中断服务程序中,每1/20s产生一次中断,当产生20次中断的时候,也就到了一秒,送数据到相应的显示缓冲单元,并调用显示子程序实时显示。
其程序流程如图9所示。
图9定时中断服务程序
4.3显示服务程序
数码管在一般情况下显示时间,总价格,单价三项数据。
程序流程图如图10。
图10显示服务程序
4.4键盘服务程序
键盘采用查询的方式,放在主程序中,当没有按键按下的时候,单片机循环主程序,一旦有按键按下,便转向相应的子程序处理,处理结束再返回。
三个按键分别对应三个简单的子程序。
如果按键S3被按下,单片机复位键:
实时数据自动初始化。
如果按键S4被按下,白天黑夜计价方式切换,按一次进入白天计价方式,两次进入黑夜计价方式,循环按键。
如果按键S8被按下,单价从1元到2元切换,循环按键。
5系统调试
根据系统设计方案,本系统的调试共分为三大部分:
硬件调试,软件调试和软硬件联调。
测试包括时间计价测试、掉电存储测试。
根据系统设计方案,本系统的调试共分为三大部分:
硬件调试,软件调试和软硬件联调。
由于在系统设计中采用模块设计法,所以方便对各电路模块功能进行逐级测试。
在软件编程时,应充分利用原理图,不然会在编程时导致硬件与软件不能对应起来,使程序无法实现功能,还有在编程时子程序的名称应与其功能对应,否则会使别人在读程序的时候不能及时理解程序含义,而且在软件调试时逻辑一定要清晰,不然在找错时会浪费很多时间。
6心得体会及致谢
经过这些天有关于出租车计价器的课程设计,使我对单片机的应用有了更深的了解。
在课程设计的过程中,还是碰到了许多的问题。
比如,对于数码管动态扫描显示和键盘的延时防抖的综合编程不能较好地解决;对于代码的前后顺序及调用掌握得还不够好;对于一些相关的应用软件没能熟练掌握。
通过这几天晚上的苦想和反复调试,以及参考网上的程序,最终还是把问题解决了。
通过这次课程设计,我最大的收获就是自己的动手能力和独立解决问题的能力得到了很大的提高,也充分体会到了自己设计东西的乐趣、学会查阅资料和对别人的东西融会变通的重要性,也明白了很多知识光靠趴在书本上学是学不到其中的精髓的,必须亲自去试着实践,亲自去经历才能对它们真正的掌握,凡事都要自己去动下手,去实践一下,遇到困难,永远不要沮丧气馁。
在动手的过程中,不仅能增强实践能力,而且在理论上可以有更深的认识;这次设计给了我极大的鼓舞和信心,相信在以后的学习中可以通过不断的摸索和实践来提高其他方面的知识。
通过本次课程设计,又使我学到了许多书本上无法学到的知识,也使也深该体会到单片机技术应用领域的广泛,不仅使我对学过的单片机知识有了很多的巩固,同时也对单片机这一门课程产生了更大的兴趣。
在本次课程设计过程中,我学会了在网络上查找有关本设计的各硬件的资源,其中包括:
AT89C52单片机及其引脚说明,为本次课程设计提供了一定的资料。
也为以后的进一步学习打下了坚实的基础。
最后要感谢学校给了我们这次课程设计的机会,让我们将理论能运用于实践提供了条件,感谢指导老师成运,方智文,岳舟老师对我们的建议和指导,感谢同学们对我们组的支持。
祝愿老师们工作顺利,同学们学业有成!
7参考文献
[1]张友德、赵志英、涂时亮.单片微型机原理、应用与实验上海:
复旦大学出版社2005.12.
[2]徐光翔. 单片机原理接口及应用 南京大学出版社 .
[3]张淑清等.单片微型计算机接口技术及其应用北京:
国防工业出版社.
[4]王晓君等.MCS-51及兼容单片机原理与选型北京:
电子工业出版社.
[5]张鑫、华臻、陈书谦.《单片机原理及应用》[M].电子工业出版社,2005.P110~136.
[6]丁元杰、吴大伟.《单片微机实题集与实验指导书》[M].机械工业出版社.2004.P124~125.
附录1总体设计电路图
附录2元件清单
名称
型号
数量
电阻
1KΩ10Ω
若干
电容
10433
若干
单片机芯片
AT89C52
1
扩展芯片
8255A
1
三极管
9015
6
数码管
2
开关
1
按键
19
USB串口线
1
USB串口电源线
1
掉电保护芯片
AT24C02
1
发光二极管
1
数字万用表
DT9203
1
单片机仿真器
STC_ISP
1
双踪稳压稳流电源
DH1718E-5
1
数字示波器
TDS1002
1
电烙铁
1
附录3源程序
#include
#include
#defineucharunsignedchar
#defineuintunsignedint
#definePAXBYTE[0xd9ff]
#definePBXBYTE[0xdbff]
#definePCXBYTE[0xddff]
#defineCONXBYTE[0xdfff]
uchartemp,temps,tempg,time,times,timeg,price=1,prices,priceg;//定义变量
voiddelay(uintz)//毫秒延时函数
{
uintx,y;
for(x=z;x>0;x--)
for(y=120;y>0;y--);
}
ucharcodedisplay1[10]=//数码管显示不带点的数
{
0xA0,/*0共阳极*/
0xBB,/*1*/
0x62,/*2*/
0x2A,/*3*/
0x39,/*4*/
0x2C,/*5*/
0x24,/*6*/
0xBA,/*7*/
0x20,/*8*/
0x28,/*9*/
};
ucharcodedisplay2[10]=//数码管显示带点的数
{
0x80,/*0共阳极*/
0x9B,/*1*/
0x42,/*2*/
0x0A,/*3*/
0x19,/*4*/
0x0C,/*5*/
0x04,/*6*/
0x9A,/*7*/
0x00,/*8*/
0x08,/*9*/
};
uchartable1[3]=//数码管中不带点的位
{
0xfe,
0xfb,
0xef
};
uchartable2[3]=//数码管中带点的位
{
0xfd,
0xf7,
0xdf
};
voidcomdisplayer(uchara,ucharb,ucharc,uchard,uchare,ucharf)//数码管显示函数,分别为单价显示,费用显示,时间显示
{
PB=display1[a];
PA=table1[0];
delay
(1);
PA=0xff;
PB=display2[b];
PA=table2[0];
delay
(1);
PA=0xff;
PB=display1[c];
PA=table1[1];
delay
(1);
PA=0xff;
PB=display2[d];
PA=table2[1];
delay
(1);
PA=0xff;
PB=display1[e];
PA=table1[2];
delay
(1);
PA=0xff;
PB=display2[f];
PA=table2[2];
delay
(1);
PA=0xff;
}
ucharkeyscan()//键盘扫描函数
{
uchartem;
PC=0x10;
tem=PC;
tem=tem&0x0f;
if(tem==0x08)
{
tem=PC;
tem=tem&0x0f;
delay(5);
if(tem==0x08)
{
while(PC==0x18);
return1;
}
}
if(tem==0x04)
{
return2;
}
if(tem==0x02)
{
return3;
}
elsereturn0;
}
voidmain()//主函数
{
ucharch,key,b=1,d=1;
CON=0x81;//设置8255控制字
EA=1;
EX0=1;
EX1=1;
TMOD=0x11;
IT1=1;
IT0=1;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
TH1=(65536-50000)/256;
TL1=(65536-50000)%256;
ET1=1;
ET0=1;
temp=3;
while
(1)
{
comdisplayer(0,1,0,3,0,0);//计费初始化
delay(30);
key=keyscan();
if(key==1)//转化昼夜计费模式
{
while(b)
{
if(ch==0)
{
temp=4;
temps=temp/10;
tempg=temp%10;
prices=price/10;
priceg=price%10;
comdisplayer(prices,priceg,temps,tempg,times,times);
key=keyscan();
if(key==1)
{ch++;}
if(key==2||key==3)
b=0;
}
if(ch==1)
{
temp=3;
temps=temp/10;
tempg=temp%10;
prices=price/10;
priceg=price%10;
comdisplayer(prices,priceg,temps,tempg,times,times);
key=keyscan();
if(key==1)
ch++;
if(ch==2)
ch=0;
if(key==2||key==3)
b=0;
}
}
}