单片机课程设计报告.docx
《单片机课程设计报告.docx》由会员分享,可在线阅读,更多相关《单片机课程设计报告.docx(30页珍藏版)》请在冰豆网上搜索。
单片机课程设计报告
摘要
汽车计价器是乘客与司机双方的交易准则,它是出租车行业发展的重要标志,是出租车中最重要的工具。
它关系着交易双方的利益。
具有良好性能的计价器无论是对广大出租车司机朋友还是乘客来说都是很必要的。
因此,汽车计价器的研究也是有一定的应用价值的。
本设计是以AT89S52单片机为主控器,利用A44E霍尔传感器测量转速,通过转速的测量和计算实现出租车多功能计价器的设计。
该系统由单片机最小系统,键盘电路,H桥电机驱动电路,测速电路及显示电路等五部分组成。
以最小系统为核心,通过测量电路,算法设计,按键控制,输出显示来实现司机对出租车计价系统的控制。
显示部分由八位八段的共阴极数码管构成,通过键盘电路来实现对计价器的模式切换。
该系统能显示里程和金额、分别可以精确到小数点后一位;可通过按键设置单程和往返价格;当车速在5公里/h以下时,进入等待模式,每等待时间等于5分钟时,公里数加1;本系统能实现市场上出租车计价器的基本功能外,可通过按键控制进入暂停,查询以及空车指示模式,并进行清零和复位。
时钟电路采用12MHz的晶振,作为系统的时钟源,具有较高的准确性。
经实际测试,本设计基本实现了设计所期望的基本功能要求和部分扩展要求,同时通过算法设计实现了部分创新功能。
关键词:
AT89S52单片机;A44E霍尔传感器;出租车多功能计价器;
目录
1﹑概述3
1.1、出租车计价器设计要求3
1.2、课程设计的目的和意义........................................3
1.3、功能论述3
1.4、系统工作原理及其组成.......................................4
2﹑系统总体方案及硬件设计5
2.1、系统总体方案论证与比较5
2.2、系统的硬件设计6
2.2.1、单片机最小系统6
2.2.2、键盘电路8
2.2.3、霍尔传感器测速电路9
2.2.4、H桥驱动电路10
2.2.5、数码管显示电路11
3﹑软件设计12
3.1、系统主程序模块12
3.2、中断子程序13
3.3、里程计算子程序14
3.4、显示子程序15
4﹑Proteus软件仿真图16
5、实验调试........................................................17
5.1、调试与测试.................................................175.2、里程计价测试.........................................17
6、课程设计体会....................................................19
参考文献20
附录一:
源程序代码21
附录二:
原理图.....................................................30
1﹑概述
1.1、出租车计价器设计要求
基本要求:
(1)能显示里程,单位为公里,最后一位为小数位。
(2)能显示金额数,单位为元,最后一位为小数位。
(3)可设定单程价格和往返价格,单程价格为2元/公里,往返价格为
1.5元/公里。
(4)车速<5公里/小时的时间累积为总等待时间,每5分钟等待时间相
当于里程数增加1公里。
(5)起步公里数为3公里,价格为5元,若实际距离大于3公里,按规
则3计算价格。
(6)按暂停键,计价器可暂停计价,按查询键,可显示总等待时间。
1.2、课程设计的目的和意义
1)通过本次课程设计更进一步掌握和理解单片机课程知识和应用,使
自己有解决问题的能力。
2)通过本次课程设计会运用所学知识进行单片机软硬件的设计。
3)通过本次课程设计提高学生的综合能力、动手能力、文献资料查阅
能力,为将来从事有关工作打下一个良好的基础。
4)学会单片机仿真软件的使用方法和撰写课程设计报告的方法。
5)通过本次课程设计掌握单片机中按键和数码管显示的使用。
1.3、功能论述
本设计是以AT89S52单片机为主控器,利用A44E霍尔传感器测量转速,通过转速的测量和计算实现出租车多功能计价器的设计。
该系统由单片机最小系统,键盘电路,H桥电机驱动电路,测速电路及显示电路等五部分组成。
以最小系统为核心,通过测量电路,算法设计,按键控制,输出显示来实现司机对出租车计价系统的控制。
显示部分由八位八段的共阴极数码管构成,通过键盘电路来实现对计价器的模式切换。
该系统能显示里程和金额、分别可以精确到小数点后一位;可通过按键设置单程和往返价格;当车速在5公里/h以下时,进入等待模式,等待时间等于四分钟时,公里数加一;本系统能实现市场上出租车计价器的基本功能外,可通过按键控制进入暂停,查询以及空车指示模式,并进行清零和复位。
时钟电路采用12MHz的晶振,作为系统的时钟源,具有较高的准确性。
经实际测试,本设计基本实现了设计所期望的基本功能要求和部分扩展要求,同时通过算法设计实现了部分创新功能。
1.4系统工作原理及其组成
出租车计价是根据车所行驶的路程以及乘客乘车的方式综合决定的。
出租车行驶总路程可以通过车轮的周长乘车轮旋转圈数得到。
即可计算得到车轮旋转几周出租车能行驶一公里的路程。
输出的脉冲信号被接入到AT89S52单片机系统中,通过计算接收到的脉冲个数,计算出当前所行驶的路程。
同时,根据不同的收费标准,选择相应的起步价、单价等收费标准进行计算。
74HC244管理键盘和数码显示,通过键盘能够实现启动、暂停、停止计价器、切换显示当前的行驶里程和需支付的车费。
出租车计价器用于记录里程、等待时间、是否往返、起步公里数与价格的关系,它能有效地避免司机与乘客间的矛盾,保障双方的利益。
模拟出租车计价器能根据总里程数、总等待时间长短、是否往返、起步公里数的情况作出相应报价等。
当然实际的出租车计价器还具有能打印出车票等功能。
总体模块如图1.1所示。
图1.4电路的组成部分
2﹑系统总体方案及硬件设计
2.1、系统总体方案论证与比较
方案一:
采用数字电子和模拟电路实现。
利用数字电路模拟电路设计出来的计价器整体规模较大,使用器件多而杂,不易调试并且容易出现故障而不容易维修。
采用传感器件获得信号,并输出脉冲信号,经数字电路放大整形作为移位寄存器的脉冲实现计价。
考虑到这种电路过于复杂,不易实现,容易出现故障不易检修,故而在实际应用中不采用这种设计。
方案二:
采用单片机作为主控器进行设计。
基于单片机的设计功能强大,用较少的硬件和软件组合起来即可实现所要求的功能,并可以修改软件程序来改变一些设定值,方便而易操作,不容易损坏。
设计采用89S52单片机控制,利用霍尔传感器测量速度和里程,利用键盘电路对计费进行控制和设定,然后再数码管上显示出来。
此设计易于控制和显示,规模较小,更适于安装在出租车中,实用性强。
通过两个方案的比较,很明显的可以看出采用单片机实现出租车计价更
经济适用而且功能强大控制简单,因此采用方案二。
采用单片机设计的原
理框图如下所示:
2-1系统结构图
2.2、系统的硬件设计
该系统由单片机最小系统,键盘电路,H桥电机驱动电路,测速电路及显示电路等五部分组成。
2.2.1、单片机最小系统
本部分主要由AT89S52单片机,复位电路,振荡电路,以及P0口上拉组成,作为计价系统的核心控制整个系统的正常工作。
主控机系统采用了Atmel公司生产的AT89S52单片机,它含有256字节数据存储器,内置8K的电可擦除FLASHROM,可重复编程,大小满足主控机软件系统设计。
AT89S52主要功能列举如下:
1、拥有灵巧的8位CPU和在系统可编程Flash
2、晶片内部具时钟振荡器(传统最高工作频率可至12MHz)
3、内部程序存储器(ROM)为8KB
4、内部数据存储器(RAM)为256字节
5、32个可编程I/O口线
6、8个中断向量源
7、三个16位定时器/计数器
8、三级加密程序存储器
9、全双工UART串行通道。
AT89S51芯片的40个引脚功能分别为:
VCC电源电压。
GND接地。
RST复位输入。
当RST变为高电平并保持2个机器周期时,将使单片机复位。
WDT溢出将使该引脚输出高电平,设置SFRAUXR的DISRTO位(地址8EH)可打开或关闭该功能。
DISKRTO位缺省为RESET输出高电平打开状态。
ALE/PROG:
当访问外部存储器时,地址锁存允许的输出电平用于锁存地址的地位字节。
在FLASH编程期间,此引脚用于输入编程脉冲。
在平时,ALE端以不变的频率周期输出正脉冲信号,此频率为振荡器频率的1/6。
因此它可用作对外部输出的脉冲或用于定时目的。
然而要注意的是:
每当用作外部数据存储器时,将跳过一个ALE脉冲。
如想禁止ALE的输出可在SFR8EH地址上置0。
此时,ALE只有在执行MOVX,MOVC指令是ALE才起作用。
另外,该引脚被略微拉高。
如果微处理器在外部执行状态ALE禁止,置位无效。
/PSEN:
外部程序存储器的选通信号。
在由外部程序存储器取指期间,每个机器周期两次/PSEN有效。
但在访问外部数据存储器时,这两次有效的/PSEN信号将不出现。
/EA/VPP:
当/EA保持低电平时,则在此期间外部程序存储器(0000H-FFFFH),不管是否有内部程序存储器。
注意加密方式1时,/EA将内部锁定为RESET;当/EA端保持高电平时,此间内部程序存储器。
在FLASH编程期间,此引脚也用于施加12V编程电源(VPP)。
XTAL1反向振荡放大器的输入及内部时钟工作电路的输入。
XTAL2来自反向振荡放大器的输出。
P0口:
一组8位漏极开路型双向I/O口。
也即地址/数据总线复用口。
作为输出口用时,每位能驱动8个TTL逻辑门电路,对端口写“1”可作为高阻抗输入端用。
在访问外部数据存储器或程序存储器时,这组口线分时转换地址(低8位)和数据总线复用,在访问期间激活内部上拉电阻。
在Flash编程时,P0口接收指令字节,而在程序校验时,输出指令字节,校验时,要求外接上拉电阻。
P1口:
一个带内部上拉电阻的8位双向I/O口,P1的输出缓冲级可驱动(吸收或输出电流)4个TTL逻辑门电路。
对端口写“1”,通过内部的上拉电阻把端口拉到高电平,此时可作输入口。
作输入口使用时,因为内部存在上拉电阻,某个引脚被外部信号拉低时会输出一个电流。
Flash编程和程序校验期间,P1接收低8位地址。
P2口:
一个带内部上拉电阻的8位双向I/O口。
P1的输出缓冲级可驱动(吸收或输出电流)4个TTL逻辑门电路。
对端口写“1”,通过内部的上拉电阻把端口拉到高电平,此时可作输入口。
作输入口使用时,因为内部存在上拉电阻,某个引脚被外部信号拉低时会输出一个电流。
在访问外部程序存储器或16位地址的外部数据存储器时,P2口送出高8位地址数据。
在访问8位地址的外部数据存储器时,P2口线上的内容在整个访问期间不改变。
Flash编程和程序校验期间,P2亦接收低8位地址。
P3口:
一个带内部上拉电阻的8位双向I/O口。
P3的输出缓冲级可驱动(吸收或输出电流)4个TTL逻辑门电路。
对P3口写“1”时,它们被内部的上拉电阻把拉到高电并可作输入端口。
作输入端口使用时,被外部拉低的P3口将用上拉电阻输出电流。
P3口除了作为一般的I/O口线外,还作特殊功能口。
P3口的第二功能引脚分配如下:
P3.0:
RXD,串行通信输入。
P3.1:
TXD,串行通信输出。
P3.2:
INT0,外部中断0输入。
P3.3:
INT1,外部中断1输入。
P3.4:
T0,计时计数器0输入。
P3.5:
T1,计时计数器1输入。
P3.6:
WR:
外部数据存储器的写入信号。
P3.7:
RD,外部数据存储器的读取信号
AT89S52的最小系统图如下:
2-2-1单片机最小系统原理图
2.2.2、键盘电路
键盘接口电路如下图所示,键盘设计由四个按键控制即:
A键为暂停键、B键为等待时间与路程切换键、C键为单程以及往返程单价设置键、D键有清零和空车显示控制能。
电路如下:
2-2-2键盘控制电路
2.2.3、霍尔传感器测速电路
本电路采用A44E霍尔传感器,A44E属于开关型的霍尔器件,其工作电压范围比较宽(4.5~18V),其输出的信号符合TTL电平标准,但仍需接一个4.7K的上拉电阻,才能有一个较高的明显的电压脉冲输出,然后接到单片机的IO端口上,而且其最高检测频率可达到1MHZ。
里程测量是通过霍尔传感器的霍尔效应检测出车轮的运转次数,然后转变为脉冲信号输入到单片机的P3.1口。
由单片机计算速度和总里程,霍尔传感器及其电路如下:
2-2-3霍尔传感器电路
2.2.4、H桥驱动电路
本电路有NPN和PNP型的三极管构成,能够控制电机正反转,在程序控制下能够进行调速。
其电路图如下所示:
2-2-4H桥驱动电路
2.2.5、数码管显示电路
本显示单元采用两个四合一共阴极数码管,利用动态扫描显示里程、金额、等待时间以及空车指示信号等;两个数码管分别显示行驶的总里程和总费用,分别和单片机的P0口和P1口连接,当按下查询键时可以查询显示等待时间,并且可以将单价显示出来,并通过按键依此进行单价设置。
以下是数码管和单片机引脚的连接图,其电路图如下下所示:
2-2-5数码管显示电路
3﹑软件设计
3.1、系统主程序模块
在主程序模块中,需要完成对各参量和接口的初始化、出租车起价和单价的初始化以及中断、计算、循环等工作。
另外,在主程序模块中还需要设置启动/清除标志寄存器、里程寄存器和价格寄存器,并对它们进行初始化。
然后,主程序将根据各标志寄存器的内容,分别完成启动、清除、计程和计价等不同的操作。
当汽车运行起来时,就启动计价,根据里程寄存器中的内容计算和判断行驶里程是否已超过起步价公里数。
若已超过,则根据里程值、每公里的单价数和起步价数来计算出当前的总金额,并将结果存于总金额寄存器中;中途等待时,无脉冲输入,不产生中断,当时间超过等待设定值时,开始进行计时,并把等待价格加到总金额里,然后将总金额、里程和单价、往返价格送数码管显示出来。
程序流程如图3.1所示。
3-1主程序流程图
3.2、中断子程序
每当光电传感器输出一个低电平信号就使单片机中断一次,当里程计数器对里程脉冲计满50次时,进入里程计数中断服务程序中,里程变量加一。
主函数中总金额也相应地变化。
3-2-1外部中1子程序流程图
3-2-2定时器中断子程序流程图
3.3、里程计算子程序
计算程序根据里程数分别进入不同的计算公式。
如果里程大于3公里,则执行公式:
总金额=起步价+(里程-3)*单价+等待时间*等待单价;否则,执行公式:
总金额=起步价+等待时间*等待单价
3
3.4、显示子程序流程
3-3里程计算子程序
3.4显示子程序
程序利用定时器每1ms产生一次中断,相应变量置位,点亮一个数码管,显示一位数据,利用主函数内的循环,实现动态扫描显示,同时根据数码管余辉和人眼暂留现象,即可实现显示。
3-4显示子程序流程图
4﹑Proteus软件仿真图
通过Proteus软件仿真所得图
如下:
如图显示的状态设置为:
单程,车速大于5km/h,当路程等于4.5km时的显示情况。
5、实验调试
5.1调试与测试
采用KeilC51编译器进行源程序编译及仿真调试,同时进行硬件电路板的设计制作。
硬件电路制作完毕,用万用表检测有无短路开路等现象,确定硬件电路没有问题后,用仿真头与硬件电路相连,运行程序进行调试。
若调试不成功,则可再单独调试程序和硬件电路。
程序用软件仿真运行,硬件电路再次检查有无焊错,或者元件与插座接触不良等方面问题;确认均无问题后,再次把软件和硬件联机调试,直至功能正常。
把程序烧录进单片机STC89C52结束调试。
5.2里程计价测试
由于实验条件的限制,我们采用霍尔传感器产生外部中断,设定中断间隔为10ms,假定1500个脉冲为1公里,则此时车速为1km/h=5圈/S。
整个系统以此为基础,通过计费程序完成中金额的计算。
表4.1的测试条件是:
假设单程的单价是2元,起步价为5元(包含3公里),分别不公里程测试得数据如表:
4km
6km
7km
9km
总
金
额
理论
7元
11元
13元
17元
实际
7元
11元
13元
17元
行驶
里程
理论
4km
6km
7km
9km
实际
4km
6km
7km
9km
表4.1实际金额和里程数
表4.2的测试条件是:
假设在单程运行中的单价2元的情况下行驶了6km,进行中途等待,分别等待不同的时间(每5分钟相当于增加1公里),起步价为5元(包含3km)。
5min
10min
15min
20min
总
金
额
理论
13元
15元
17元
19元
实际
13元
15元
17元
19元
表4.2总金额对比
6、课程设计体会
从分析设计要求,完成设计思路,到安装并焊接元器件,从编写程序到不断的调试改写程序,一步步走来,我们遇到了许多困难和问题,但我们敢于直面问题并找出原因解决问题,在这个过程中,不仅加深了对理论知识的理解,我们的编程能力也在潜移默化中有所提高。
特别是调试程序的过程中,经常会出现莫名奇妙的错误,在队友的鼓励下,我们从头开始,一步一步查找问题所在,检查每一个变量在程序执行过程中的值,最后发现两个定时器同时工作时,会对键盘检测程序以及中断的正确工作产生影响。
最后我们决定优化方案,用一个定时器完成程设计,结果证明,我们的思路是正确的。
测试结果表明,系统设计能够完成设计要求,并且开发出了独特的功能,有趣味性。
按预期的效果进行模拟汽车启动,停止,暂停等功能并能够通过LCD显示车费数目。
本款出租车计价器包括单价输出、单价调整、显示当前的系统时间等功能。
另外,多功能出租车计价器还具有性能可靠、电路简单、成本低、实用性强等特点,加上经过优化的程序,使其有很高的智能化水平。
经过一段时间的努力,基本上完成了设计要求的内容,在系统可行性分析、原理图设计等方面都作了许多实际工作,取得了一些成绩,同时也遇到了一些问题,存在一些不足。
在动手能力方面都有了不小的进步,自己从中受益匪浅。
这次设计很好的把以前学到的理论知识应用于实践,使我认识到理论知识与实践之间有一定的差距,只有通过不断的努力学习和实践才能很好的把理论知识应用到实践当中,也只有通过不断的实践才能对理论知识的理解。
通过这次设计不仅学会了如何去查找相关资料,更重要的是通过查找资料和翻阅书籍学到了不少知识,扩大了知识面,提高了知识水平。
这次设计是我认真认识到完整、严谨、科学分析问题、解决问题的思想是多么的重要,只有拥有了科学的态度才能设计出有用的产品。
另外通过本次设计,是我认识到自己理论知识的应用能力有很大的欠缺,需要在以后的学习中进一步提高。
参考文献
[1]谭浩强.C程序设计[M].北京:
清华大学出版社,2005
[2]贾宗璞,许合利.C语言程序设计:
中国矿业大学出版社,2007
[3]康华光.电子技术基础(模拟部分)(第五版).北京:
高等教育出版社,2006.
[4]艾永乐,付子义.模拟电子技术:
中国电力出版社,2008.
[5]何希才.传感器及其应用电路.北京:
电子工业出版社,2003
[6]苏铁力,关振海.传感器及接口技术.北京:
中国石化出版社,2008
[7]吴正毅.测试技术与测试信号处理.北京:
清华大学出版社,2003
附录一:
源程序代码
#include
#defineucharunsignedchar
#defineuintunsignedint
ucharqian,bai,shi,ge;//显示临时变量
charled[10]={0x3f,0x06,0x5b,0x4f,0x66,
0x6d,0x7d,0x07,0x7f,0x6f};//段码表示0-9
uintt,m,n,distance,cost,price,wait;//定义路程、费用、等待时间及一些全局的变量等;
uchardengdai,second,minute;
unsignedlongwait_ten_ms;//记录等待时间有多少个10ms
sbitP05=P0^5;
sbitP06=P0^6;
sbitP07=P0^7;
sbitP36=P3^6;
sbitP37=P3^7;
sbitD1=P2^0;
sbitD2=P2^1;
sbitD3=P2^2;
sbitD4=P2^3;
sbitD5=P2^4;
//标志位定义
bitkey1_flag;//按键对应标志位
bitkey2_flag;
bitkey3_flag;
bitkey4_flag;
bitkey5_flag;
voidDelay(uinti)//延时函数
{uintx,y;
for(x=0;x
for(y=0;y<256;y++);{;}
}
//初始化函数
voidinitial_data(void)
{
distance=0;
cost=0;
second=0;
minute=0;
wait_ten_ms=0;
key1_flag=0;//路程/费用
key2_flag=0;//等待
key3_flag=0;//暂停
key4_flag=0;//单程/往返
key5_flag=0;//等待时间
n=0;
dengdai=0;
D1=1;//路程/费用切换指示
D2=1;//等待指示
D3=1;//暂停指示
D4=1;//往返指示
D5=1;//等待时间显示指示
}
//数据计算
voidjisuan()
{
distance=n/50+wait_ten_ms/3000;//车轮转50圈为100m
if(distance<=30)
cost=50;
price=20;//单程价格
if(key2_flag)
price=15;//往返价格
if(distance>30)
cost=price*(distance-30)/10+50;
wait=minute*100+second;
}
//得到所显示数的各位数字
voidhandle(uintnumber)
{if(number>9999)number=9999;
qian=number/1000;
bai=number/100%10;
shi=number%100/10;
ge=number%10;
}
//中断记录脉冲数
voidint0()interrupt0//中断0
{
m++;
if(key2_flag)n++;