单片机课程设计.docx
《单片机课程设计.docx》由会员分享,可在线阅读,更多相关《单片机课程设计.docx(10页珍藏版)》请在冰豆网上搜索。
![单片机课程设计.docx](https://file1.bdocx.com/fileroot1/2023-5/26/dd9a39c4-b440-4b1c-88eb-c357268ba456/dd9a39c4-b440-4b1c-88eb-c357268ba4561.gif)
单片机课程设计
1.题目及要求
1.1题目:
出租车计价器
1.2要求:
(1)按公里计价并显示出来。
(2)白天夜晚的单价可变,可实现手动修改单价。
2.方案选择
2.1方案一:
用AT89C52单片机实现外围器件的控制以及一些运算功能,霍尔传器感应车轮转的圈数,进而计算出行驶路程,数码管为显示单元,按键修改价格,555定时器用来对停车时间的控制,超过10秒,转换为按时间计费单元。
2.2方案二:
用AT89C52单片机,其中AT89C52主要完成外围器件的控制以及一些运算功能,用按键修改单价和实现白天夜间的转换,数码管为显示单元。
用一个按键模拟汽车的里程。
此设计我们采用方案二。
因为方案一功能丰富,但是实现难度大,有一些元器件功能不熟悉,使用时有困难。
相对来说方案二则思路简洁,逻辑清晰,可以实现基本的功能。
3.实验环境
3.1软件环境
(1)KeiluVision3
(2)Proteus7Professional
3.2软件功能简介
KeiluVision3是一款可用于多种8051MCU的集成开发环境(IDE),该IDE同时也是PK51及其它开发套件的一个重要组件。
除增加了源代码、功能导航器、模板编辑以及改进的搜索功能外,uVision3还提供了一个配置向导功能,加速了启动代码和配置文件的生成。
本次完成对单片机程序控制功能的程序部分。
Proteus7Professional是一款专业的单片机软件仿真系统。
该软件的特点:
全部满足我们提出的单片机软件仿真系统的标准,并在同类产品中具有明显的优势。
具有模拟电路仿真、数字电路仿真、单片机及其外围电路组成的系统的仿真。
4.系统工作原理
4.1基本原理
计数器系统主要由五部分组成:
AT89C51单片机、独立键盘、显示数码管。
用按键表示汽车行进的公里数,送到单片机进行处理,单片机根据程序设定将行驶公里数与读取的价格等相关数据进行金额的计算,计算好的金额、里程和单价都实时地显示在数码管上。
独立键盘可以调节价格等相关数据,按下相应的按钮,产生信号交由单片机处理并实时显示出来系统结构图如图1。
调整
切块
独立键盘
数码管动
态显示
AT89S52单片机
按键
输入
计算输出
图1系统结构图
5. 硬件设计
5.1 单片机最小系统单元
主控机系统采用了AT89C51单片机,它含有256字节数据存储器,可重复编程,大小满足主控机软件系统设计,所以不必再扩展程序存储器。
单片机最小系统电路图如图2所示。
图2单片机最小系统图
AT89C51的复位端是高电平有效。
RST端若由低电平上升到高电平并持续2个周期,系统将实现一次复位操作。
在复位电路中,按一下复位开关就使在RST端出现一段时间的高电平。
5.2 键盘调整单元
当单价等信息需要进行修改时,就要用到键盘进行修改。
由于调节信息不多,故采用4个独立键盘即可,分别实现清零、切换、增大、减小和功能等作用。
电路原理如图3所示。
图3键盘调整单元接线图
S1:
接P1.0口,对上一次的计费进行清零,为下次载客准备
S2:
接P1.1口,实现白天和夜晚单价的切换;当功能键S4按下时,S2可对数据进行增大。
S3:
接P1.2口,当功能键S4按下时,S3可对数据进行减小。
S4:
接P1.3口,按1次,进入调整白天单价;按2次,进入调整夜晚单价;按3次,进入调整等待单价;按4次,进入调整起步价;按5次,返回。
5.3 显示单元
显示单元由7个数码管组成,采用动态扫描进行显示。
数码管分别接用于显示总金额、里程和单价。
电路如图4所示。
图4数码管显示图
6 软件设计
6.1 系统主程序
在主程序模块中,需要完成对各参量和接口的初始化、出租车起价和单价的初始化以及中断、计算、循环等工作。
另外,在主程序模块中还需要设置启动/清除标志寄存器、里程寄存器和价格寄存器,并对它们进行初始化。
然后,主程序将根据各标志寄存器的内容,分别完成启动、清除、计程和计价等不同的操作。
当汽车运行起来时,就启动计价,根据里程寄存器中的内容计算和判断行驶里程是否已超过起步价公里数。
若已超过,则根据里程值、每公里的单价数和起步价数来计算出当前的总金额,并将结果存于总金额寄存器中;中途等待时,无脉冲输入,不产生中断,当时间超过等待设定值时,开始进行计时,并把等待价格加到总金额里,然后将总金额、里程和单价送数码管显示出来。
程序流程如图5所示。
图5主程序流程图 图6计算程序流程图
6.2 计算程序
计算程序根据里程数分别进入不同的计算公式。
如果里程大于3公里,则执行公式:
总金额=起步价+(里程-3)*单价+等待时间*等待单价;否则,执行公式:
总金额=起步价+等待时间*等待单价。
程序流程图如图6所示。
6.3 显示程序
显示程序利用定时器每1ms产生一次中断,相应变量置位,点亮一个数码管,显示一位数据,利用主函数内的循环,实现动态扫描显示,同时根据数码管余辉和人眼暂留现象,即可实现显示。
6.4键盘程序
键盘采用查询的方式,放在主程序中,当没有按键按下的时候,单片机循环主程序,一旦右按键按下,便转向相应的子程序处理,处理结束再返回。
流程图如图7。
图7 键盘程序流程图
7.实现功能
出租车计价器根据乘客乘坐汽车行驶距离和等候时间的多少进行计价,并在行程中同步显示车费值。
从起步价开始,当汽车程行驶未满3公里时,均按起步价计算。
过3公里后,实现每1公里单价收费,中间遇暂停时,计程数不再增加,开始计时收费,测距收费和测时收费的和便构成了一位乘客的车费。
同时,白天和夜晚价格不同,可以进行切换。
白天单价、夜晚单价、等待单价和起步价格都可通过独立键盘进行调节。
(默认起步价为5元/3公里,里程单价白天为1.5元/公里,夜晚为1.8元/公里,等待计时单价为0.5元/5分钟)
8. 总结
经过这些天有关于出租车计价器的课程设计,使我对单片机的应用有了更深的了解。
在课程设计的过程中,还是碰到了许多的问题。
比如,对于数码管动态扫描显示和金额计算编程不能较好地解决;对于手动改变单价的程序设计的不够好;对于一些相关的应用软件没能熟练掌握,在做课程设计的过程中相当吃力,经过不断的摸索,相会的同学请教,能够仿真出计价器。
通过这次课程设计,我最大的收获就是自己的动手能力和独立解决问题的能力得到了很大的提高,也充分体会到了自己设计东西的乐趣、学会查阅资料和对别人的东西融会变通的重要性,也明白了很多知识光靠趴在书本上学是学不到其中的精髓的,必须亲自去试着实践,亲自去经历才能对它们真正的掌握,凡事都要自己去动下手,去实践一下,遇到困难,永远不要沮丧气馁。
在动手的过程中,不仅能增强实践能力,而且在理论上可以有更深的认识;这次设计给了我极大的鼓舞和信心,相信在以后的学习中可以通过不断的摸索和实践来提高其他方面的知识。
此次设计仍然有不足,在汽车里程控制时用按键控制,不能精确模拟出跳变过程。
对于每次设定的价格不能保存,断电以后要重新设定。
参考文献
[1]张毅刚单片机原理及应用高等教育出版社2003年
[2]陈明荧8051单片机基础教程科学出版社2003年
[3]陶砂单片机—原理、操作、实验、应用航空工业出版社1996年
[4]康华光电子技术基础数字部分高等教育出版社第五版
[5]李广第单片机基础北京航空航天大学出版社1999年
[6]谭浩强C程序设计(第三版)清华大学出版社2005年
附录A 系统原理图
附录B 设计程序
#include
#include
#defineucharunsignedchar
#defineuintunsignedint
ucharcodetable[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};
sbitexter=P3^3;//外部中断
sbitkey0=P1^0;//清零
sbitkey1=P1^1;//切换/+
sbitkey2=P1^2;//-
sbitkey3=P1^3;//功能键
sbitp30=P3^0;//数码管各位控制
sbitp31=P3^1;
sbitp32=P3^2;
sbitp34=P3^4;
sbitp35=P3^5;
sbitp36=P3^6;
sbitp37=P3^7;
uintinter,aa,bb,temp,temp1;
uintzongjine,licheng,dengdai;
uintkey3num,qiehuantemp,delaytemp;
uchardanjia1,danjia2,danjia3,danjia,qibu;
voiddelay(uintx)//延时时基为1ms
{inti,j;
for(i=x;i>0;i--)
for(j=340;j>0;j--);
}
voiddisplay(uintzongjine0,uintlicheng0,uintdanjia0)//数码管显示
{
uintjbai,jshi,jge,lshi,lge,dshi,dge;
uintnumwei;
//数码管位置分配
jbai=zongjine0/100;
jshi=zongjine0%100/10;
jge=zongjine0%100%10;
lshi=licheng0/10;
lge=licheng0%10;
dshi=danjia0/10;