课 程 设 计 报 告
课程设计名称:微机系统综合课程设计
课程设计题目:出租车计价器的设计与实现
院(系):计算机学院
专 业: 计算机科学与技术
班 级: 24010104
学 号: 2012040101037
姓 名: 程里
指导教师: 罗振
说明:结论(优秀、良好、中等、及格、不及格)作为相关教环节考核必要依据;格式不符合要求;数据不实,不予通过。报告和电子数据必须作为实验现象重复的关键依据。
学术诚信声明
本人声明:所呈交的报告(含电子版及数据文件)是我个人在导师指导下进行设计工作及取得的研究结果。尽我所知,除了文中特别加以标注或致谢中所罗列的内容以外,报告中不包含其他人己经发表或撰写过的研究结果,也不包含其它教育机构使用过的材料。与我一同工作的同学对本研究所做的任何贡献均己在报告中做了明确的说明并表示了谢意。报告资料及实验数据若有不实之处,本人愿意接受本教学环节“不及格”和“重修或重做”的评分结论并承担相关一切后果。
本人签名: 日期: 年 月 日
| 沈阳航空航天大学 | ||||||||||||||||||||||
| 课程设计任务书 | ||||||||||||||||||||||
| 课程设计名称 | 微机系统综合课程设计 | 专业 | 计算机科学与技术 | |||||||||||||||||||
| 学生姓名 | 程里 | 班级 | 24010104 | 学号 | 2012040101037 | |||||||||||||||||
| 题目名称 | 出租车计价器的设计与实现 | |||||||||||||||||||||
| 起止日期 | 2015 | 年 | 6 | 月 | 29 | 日起至 | 2015 | 年 | 7 | 月 | 10 | 日止 | ||||||||||
| 课设内容和要求: | ||||||||||||||||||||||
| (1)学习现有出租车计价器的计费规则,至少定义白天和夜间两种计价方式; (2)使用电位器代表出租车的油门输入,步进电机的转速代表出租车的行驶速度,8个LED灯用于显示油门的大小; (3)在键盘上定义几个功能键,用于实现启动、停止、清零功能; (4)LCD显示打表时间、当前计价方式、实时里程数和总价数。 | ||||||||||||||||||||||
| 参考资料: 【1】张毅刚,刘杰.MCS-51单片机原理及应用【M】.哈尔滨工业大学出版社,2008 【2】高锋.单片微型计算机原理与接口技术【M】.北京:科学出版社,2007 【3】胡汉才.单片机原理及其接口技术【M】.北京:清华大学出版社,2004 | ||||||||||||||||||||||
| 教研室审核意见: 教研室主任签字: | ||||||||||||||||||||||
| 指导教师(签名) | 年 | 月 | 日 | |||||||||||||||||||
| 学 生(签名) | 年 | 月 | 日 | |||||||||||||||||||
| 课程设计总结: 经过这些天有关于出租车计价器的课程设计,使我对单片机的应用有了更深的了解。在课程设计的过程中,还是碰到了许多的问题。比如,对于数码管动态扫描显示、数码管的闪烁和键盘的延时防抖的综合编程不能较好地解决;对于一些相关的应用软件没能熟练掌握。通过这几天晚上的苦想和反复调试,最终还是把问题解决了。 通过这次课程设计,我最大的收获就是自己的动手能力和解决问题的能力得到了很大的提高,也充分体会到了自己设计东西的乐趣、学会查阅资料和对别人的东西融会变通的重要性,也明白了很多知识光靠趴在书本上学是学不到其中的精髓的,必须亲自去试着实践,亲自去经历才能对它们真正的掌握。 最大的收获是更清晰了如何有条理的编程。第一个就是流程图,原来不以为然的事现在觉得非常的有必要。第二就是编程顺序,要写一个功能很复杂的程序首先写那些自己可以很快完成的较简单的内容,比如调单价时的闪烁,那么就可以开始只写调一位单价,然后再加入程序可以调两位单价,再然后加入闪烁功能,这样既可以使编程变得更有条理,而且对心态也是很有帮助的。一步一步的完成相应的要求会使自己的心情倍感舒爽而不是一直未能达到要求时的迷茫。 但是在我设计和调试的过程中,也发现了一些问题,譬如计价的金额位数有限,实际的里程可能会很远,会超出计价器的显示范围。计价器的设计还不够人性化,比如加上语音的提示功能,可能会更有生命力。 本设计是对我所学知识的用在实践中一种考验与拓展,并培养我的思考、设计和创新能力、解决遇到问题的能力和团队合作能力,以及我在走向工作岗位后能更好的发挥学以致用。在碰到困难时不急不燥,在自主解决的前提下,结合团队力量,解决问题并有所创新。 在设计中学会了一些疑难问题的探讨和工作中的协调性,汲取知识的方式和途径。为今后的工作奠定了坚实的基础。在设计的整个过程中,使我学习到很多宝贵的知识。 | ||||||||||||||||||||||
目 录
1 引言 1
1.1 出租车计价器概述 1
1.2 计价器整体功能描述结构 1
1.3 各部分电路功能描述 .....................................................................................................1
2 计价器硬件设计 2
2.1 系统的硬件构成及功能 2
2.2 MCS-51系列单片机内部结构及功能部件 3
2.2.1 MCS-51系列单片机的内部结构框图..............................................................3
2.2.2单片机外部引脚说明.......................................................................................4
2.2.3并行输入/输出接口.........................................................................................6
3 系统的软件设计 7
3.1 软件总体设计 7
3.2 系统主程序设计 7
3.3 显示子程序服务程序.........................................................................................9
3.4 按键服务程序.....................................................................................................9
4 系统调试与测试结果分析 10
4.1 系统调试 10
4.1.1 硬件调试 10
4.1.2 软件调试 ........................................................................................................10
4.1.3 软硬件联调..................................................................................................10
4.2 电路图...............................................................................................................11
参考文献 13
附 录(关键部分程序清单) 14
1 引言
1.1 出租车计价器概述
计价器显示的营运金额是营运里程与价格的函数(等候时间一般折算成一定比例的里程来计算)。出租车计价器通过传感器与行驶车辆连接。出租汽车的实际里程通过传感器的脉冲信号在计价器里折算成一定的计价营运里程。目前市场上出租车计价器功能主要有具有数据的复位功能、白天/晚上转换功能、数据输出功能、计时计价功能等等,但能够进行语音播报数据信息的出租车计价器还是比较少见的,针对这一点,我来设计一款多功能出租车计价器,在原有功能的基础上增加单价输出、单价调整、路程输出、显示当前的系统时间、语音播报数据信息等功能。
1.2 计价器整体功能描述结构
设计出租车计价器方案并进行仿真,完成不同方式转换计价,显示路程、单价、总金额。
1.3 各部分电路功能描述
1 不同情况具有不同的收费标准。
(a) 前两公里
(b) 后两公里
2 具有数据的复位功能
(a) 数据清零开关
3 数据输出
4 按键
(a) 启动计时开关
(b) 数据复位(清零)
(c) 前两公里/后两公里
2 计价器硬件设计
2.1 系统的硬件构成及功能
计价器的单片机控制方案图如图1 单片机控制方案图所示。它由以下几个部件组成:单片机MCS-51、总金额及单价显示部件、键盘控制部件、里程计算单元、串中显示驱动电路等。
利用单片机丰富的IO端口,及其控制的灵活性,实现基本的里程计价功能和价格调节、时钟显示功能。不但能实现所要求的功能而且能在很大的程度上扩展功能,而且还可以方便的对系统进行升级。
图1 单片机控制方案图
2.2 MCS-51系列单片机内部结构及功能部件
2.2.1 MCS-51系列单片机的内部结构框图
分析图2, 并按其功能部件划分可以看出, MCS-51系列单片机是由部分组成的。图3为按功能划分的MCS-51系列单片机内部结构简化框图。 这部分是:
· 一个8位处理机CPU。
· 128个字节的片内数据存储器RAM。·4 KB的片内程序只读存储器ROM或EPROM。
·18个特殊功能寄存器SFR。
·4个8位并行输入输出I/O接口:P0口、 P1口、 P2口、 P3口(共32线), 用于并行输入或输出数据。
· 1个串行I/O接口。
·2个16位定时器/计数器。
·1个具有5个中断源, 可编程为2个优先级的中断系统。 它可以接收外部中断申请, 定时器/计数器中断申请和串行口中断申请。
图2 MCS-51系列单片机内部结构框图
图3 MCS-51系列单片机内部结构简化框图
2.2.2 单片机外部引脚说明
MCS-51系列单片机芯片均为40个引脚, HMOS工艺制造的芯片采用双列直插(DIP)方式封装, 其引脚示意及功能分类如图4所示。 CMOS工艺制造的低功耗芯片也有采用方型封装的, 但为44个引脚, 其中4个引脚是不使用的。
图4 MCS—51系列单片机引脚及总线结构
(a) 管脚图; (b) 引脚功能分类
(1)主电源引脚Vcc和Vss
VCC(40脚):接+5 V电源正端;
VSS(20脚):接+5 V电源地端。
(2)外接晶体引脚XTAL1和XTAL2
XTAL1(19脚):接外部石英晶体的一端。 在单片机内部, 它是一个反相放大器的输入端, 这个放大器构成了片内振荡器。 当采用外部时钟时, 对于HMOS单片机, 该引脚接地; 对于CHMOS单片机, 该引脚作为外部振荡信号的输入端。
XTAL2(18脚):接外部晶体的另一端。 在单片机内部, 接至片内振荡器的反相放大器的输出端。 当采用外部时钟时, 对于HMOS单片机, 该引脚作为外部振荡信号的输入端; 对于CHMOS芯片, 该引脚悬空不接。
(3)控制信号或与其它电源复用引脚。控制信号或与其它电源复用引脚有:
RST/VPD 、、和等4种形式。
A、RST/VPD(9脚):RST即为RESET, VPD为备用电源, 所以该引脚为单片机的上电复位或掉电保护端。
B、(30脚):当访问外部存储器时, ALE(允许地址锁存信号)以每机器周期两次的信号输出, 用于锁存出现在P0口的低8位地址。
C、(29脚):片外程序存储器读选通信号输出端, 低电平有效。
D、/Vpp(31脚):EA为访问外部程序存储器控制信号,低电平有效。
(4) 输入/输出(I/O):引脚P0口、 P1口、 P2口及P3口
A、 P0口(39脚~32脚):P0.0~P0.7统称为P0口。P0口是一个三态双向口, 可作为地址/数据分时复用口, 也可作为通用I/O接口。
B、 P1口(1脚~8脚):P1.0~P1.7统称为P1口, 可作为准双向I/O接口使用。
C、 P2口(21脚~28脚):P2.0~P2.7统称为P2口, 一般可作为准双向I/O接口。它具有通用I/O接口或高8位地址总线输出两种功能.
D、 P3口(10脚~17脚):P3.0~P3.7统称为P3口。P3口除了可作为通用准双向I/O接口外, 每1根线还具有第2功能。(见图5)
图5 P3口第2功能表
2.2.3并行输入/输出接口
对于四个并行输入/输出接口前面已经简单介绍过了。本设计中主要用到了P1口现在着重介绍,一下P1口。
P1口为准双向口 其1位的内部结构如图6所示。 它在结构上与P0口的区别在于输出驱动部分, 其输出驱动部分由场效应管V1与内部上拉电阻组成。 当其某位输出高电平时, 可以提供拉电流负载, 不必像P0口那样需要外接电阻。
从功能上来看P1只有一种功能(对MCS-51子系列), 即通用输入输出I/O接口, 具有输入、输出、 端口操作3种工作方式, 每1位口线能地用作输入或输出线。
图6 P1口的结构原理图
3 系统的软件设计
3.1 软件总体设计
51单片机的程序设计语言主要有两种:一是汇编程序设计;二是C语言编程设计。两种程序设计语言都有各自的优点。用汇编语言编写和高级语言(C语言)比较起来节省空间,这样对于存储空间仅4Kb的芯片来说是极之有利的,51单片机能更高速的运行。C语言编写的程序,虽然不象汇编那样速度快、但程序简单易行、并且需要较小的存储空间。C语言作为一种编译型程序设计语言,它兼顾了多种高级语言的特点,并具备汇编语言的功能。此外,C语言程序还具有完善的模块程序结构,从而为软件开发中采用模块化程序设计方法提供了有力的保障。因此,使用C语言进行程序设计已成为软件开发的主流。本设计就是采用C语言编写的,由于采用模块化操作,使得程序在修改,执行的时候显得方便易行。
3.2 系统主程序设计
在主程序模块中,需要完成对各接口芯片的初始化、出租车起价和单价的初始化、中断向量的设计以及开中断、循环等待等工作。因为系统主程序的设计是一个十分重要的一个步骤,系统主程序设计的好与坏直接关系着这整个程序的有用与否,所以在系统主程序之中,一定要好好的仔细的完成完善。另外,在主程序模块中还需要设置启动/清除标志寄存器、里程寄存器和价格寄存器,并对它们进行初始化。然后,主程序将根据各标志寄存器的内容,分别完成启动、清除、计程和计价等不同的操作。主程序流程图如图7 所示。当按下启动键时,就启动计价,将根据里程寄存器中的内容计算和判断出行驶里程是否已超过起价公里数。若已超过,则根据里程值、每公里的单价数和起价数来计算出当前的累计价格,并将结果存于价格寄存器中,然后将时间和当前累计价格送显示电路显示出来。当到达目的地的时候,就停止计价,显示当前所应该付的金额和对应的单价,到下次启动计价时,系统自动对显示清零,并重新进行初始化过程。
否
是
否
是
图7 主程序流程图
3.3 显示子程序服务程序
由于是分屏显示数据,所以就要用到3个显示子程序,分别是:时分秒显示子程序、金额单价显示子程序、路程单价显示子程序。
3.4 按键服务程序
本程序中所设计的按键程序在主程序之中,该程序在主程序当中时,当没有按键按下的时候,单片机循环主程序,一旦有按键按下,便转向相应的子程序处理,处理结束再返回。
4 系统调试与测试结果分析
4.1 系统调试
根据系统设计方案,本系统的调试共分为三大部分:硬件调试,软件调试和软硬件联调。流程图如图8。由于在系统设计中采用模块设计法,所以方便对各电路模块功能进行逐级测试。利用Keil软件对其进行编译、仿真,得出比较满意的效果。在调试过程中,对其要求显示价格进行观察,比较理想地显示了价格。
4.1.1 硬件调试
在硬件调试中,首先仔细检查自己所连电路是否正确,各电路线与电路板接口的连接是否正确,在正确的基础上,在仔细检查电路线与电路板的接口是否接触良好,是否有松动,如果有所松动,则及时的将接触不好的接口好好地加以紧固,再者,仔细看看电源是否插上。
4.1.2 软件调试
在软件调试中,首先打开软件,然后在把自己写的程序代码复制到软件中,之后在进行编译,看是否有编译错误,如果有编译错误,则自己再好好的检查程序代码,看是在程序的哪个部分出了错误,检查出了错误的根源,在进行逻辑分析,之后再把错误加以改正,如果没有编译错误,则继续进行运行仿真。
4.1.3 软硬件联调
将电脑与实验电路箱连接起来,在软件上启动将所编代码要实现的功能要在实验箱上实现的键,之后再在实验箱上看看实验箱的实验结果与自己的预期结果是否一致,如果一致,则说明自己所编代码是正确的,如果不一致,则说明自己所编代码是错误的。
图8 调试流程图
4.2 电路图
图9 电路原理图
图10 实物连线图
参考文献
[1] 高富平,张楚 . 电子商务法[M]. 北京:北京大学出版社,2002
[2] 李群芳,肖看.单片机原理接口与应用.北京:清华大学出版社,2005
[3] 张迎新.单片微型计算机原理、应用及接口技术.北京:国防工业出版社,1999
[4] 高峰.单片微型应用系统设计及实用技术.北京:机械工业出版社,2004
[5] 王华祥,张淑英.传感器原来及应用(修订版)[M].天津:天津大学出版社,1999
[6] 何立民.单片机应用系统设计.北京:北京航空航天大学出版社,1990
附 录(关键部分程序清单)
#include #include void delay(unsigned int i); //函数的声名 //这个表为 LED 的字模, 共阴数码管 0-9 - unsigned char code Disp_Tab[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //为段码控制 //这个表为8个数码管位选控制, 共阴数码管 1-8个 - unsigned char code dispbit[6]={0x20,0x10,0x08,0x04,0x02,0x01}; //位选的控制 查表的方法控制 unsigned char xdata *p=0x8004; unsigned char xdata *q=0x8002; bit flag; sbit flag1=P1^0; unsigned int i; unsigned int TimeCount=0; //时间(秒) unsigned int LedOut[6],SOut[4]; float distance,y; int x,z; int r; int Calculate_distance()//路程显示的赋值子程序 { if(x<1)//这个路程0.09公里 { SOut[0]=Disp_Tab[0]; SOut[1]=Disp_Tab[0]|0x80; SOut[2]=Disp_Tab[0]; SOut[3]=Disp_Tab[x]; } else if(x<100)//这个路程0.99公里 { SOut[0]=Disp_Tab[0]; SOut[1]=Disp_Tab[0]|0x80; SOut[2]=Disp_Tab[x/10]; SOut[3]=Disp_Tab[x%10]; } else if(x<1000)//这个路程9.99公里 { SOut[0]=Disp_Tab[0]; SOut[1]=Disp_Tab[x/100]|0x80; SOut[2]=Disp_Tab[x%100/10]; SOut[3]=Disp_Tab[x/100%10]; } else//这个路程99.99公里 { SOut[0]=Disp_Tab[x/1000]; SOut[1]=Disp_Tab[x%1000/100]|0x80; SOut[2]=Disp_Tab[x%1000%100/10]; SOut[3]=Disp_Tab[x%1000%100%10]; } return 0; } //此为主函数 int main(void) { flag=0; //此为定时器1初始化;使用定时器1 TMOD=0X10; TH1=0X3C; TL1=0XB0; // 此为中断初始化;开放定时器1中断和外中断0、1 EA=1; ET1=1; ET0=1; EX0=1; EX1=1; IT1=1; IT0=1; r=0; while(1)//从这开始 { distance=TimeCount*0.02;//该车速0.02公里/秒(正常车速约80公里/时),行车里程 x=distance*100; if(distance>2)//两公里外价钱,取整 { y=8+(distance-2)*2; z=y/1; } //行车的时间 LedOut[0]=Disp_Tab[TimeCount/60/10]; LedOut[1]=Disp_Tab[TimeCount/60%10]|0x80; LedOut[2]=Disp_Tab[TimeCount%60/10]; LedOut[3]=Disp_Tab[TimeCount%60%10]; Calculate_distance();//调用路程显示赋值子程序 if(distance<=2)//行车里程2公里以内的起步价8元 { LedOut[4]=Disp_Tab[0]; LedOut[5]=Disp_Tab[8]|0x80; } else//超过2公里,每公里2元 { LedOut[4]=Disp_Tab[z/10]; LedOut[5]=Disp_Tab[z%10]|0x80; } flag1=1; //查询(切换显示总等待时间或行车里程)标志位**************************** if(flag1==1) //切换显示时间 { for( i=0; i<4; i++) { *p=LedOut[i]; *q=dispbit[i]; //使用查表法进行位选 delay(75); //扫描间隔时间,太长会数码管会有闪烁感 } } else//显示总里程 { for( i=0; i<4; i++) { *p=SOut[i]; *q=dispbit[i]; //使用查表法进行位选 delay(75); //扫描 } } for( i=4; i<6; i++) //此为显示费用 { *p=LedOut[i]; *q=dispbit[i]; //使用查表法进行位选 delay(75); //扫描间隔时间,太长会数码管会有闪烁感 } *q=0x00; } return 0; } //此为延时处理 void delay(unsigned int i) { char j; for( ; i> 0; i--) for(j = 200; j > 0; j--); } //此为定时器中断处理 void timer1(void) interrupt 3 { ET1=0; if(r<10){r++; TH1=0X3C; TL1=0XB0; ET1=1; } else { r=0; TimeCount++; TH1=0X3C; TL1=0XB0; ET1=1; } } //此为外中断1中断处理 void int1(void) interrupt 2 { EX1=0; if(flag) { TR1^=1; } EX1=1; } //此为外中断0中断处理 void int0(void) interrupt 0 { EX0=0; if(!flag) { TimeCount=0; TR1=1; flag=1; } else { TR1=0; flag=0; } EX0=1; }下载本文