单片机课设.docx

上传人:b****9 文档编号:26101373 上传时间:2023-06-17 格式:DOCX 页数:32 大小:305.08KB
下载 相关 举报
单片机课设.docx_第1页
第1页 / 共32页
单片机课设.docx_第2页
第2页 / 共32页
单片机课设.docx_第3页
第3页 / 共32页
单片机课设.docx_第4页
第4页 / 共32页
单片机课设.docx_第5页
第5页 / 共32页
点击查看更多>>
下载资源
资源描述

单片机课设.docx

《单片机课设.docx》由会员分享,可在线阅读,更多相关《单片机课设.docx(32页珍藏版)》请在冰豆网上搜索。

单片机课设.docx

单片机课设

河南理工大学

《单片机应用与仿真训练》设计报告

 

题目:

出租车计价器设计

 

姓名:

学号:

专业班级:

电信09-2班

指导老师:

  

所在学院:

电气工程与自动化学院

 

2012年12月8日

摘要

出租车已经是城市交通的重要组成部分,从加强行业管理以及减少司机与乘客的纠纷出发,具有良好性能的计价器对出租车司机和乘客来说都是很必要的。

而采用模拟电路和数字电路设计的计价器整体电路的规模较大,用到的器件多,造成故障率高,难调试。

而采用单片机进行的设计,相对来说功能强大,用较少的硬件和适当的软件相互配合可以很容易地实现设计要求,且灵活性强,可以通过软件编程来完成更多的附加功能。

本设计是以AT89S52单片机为主控器,利用A44E霍尔传感器测量转速,通过转速的测量和计算实现出租车多功能计价器的设计。

该系统由单片机最小系统,键盘电路,测速电路及显示电路等五部分组成。

以最小系统为核心,通过测量电路,算法设计,按键控制,输出显示来实现司机对出租车计价系统的控制。

显示部分由两个四位八段的共阳极数码管构成,通过键盘电路来实现对计价器的模式切换。

该系统能显示里程和金额、分别可以精确到小数点后一位;可通过按键设置单程和往返价格:

当车速在5公里/小时以下时,进入等待模式,等待时间等于5分钟时,相当于里程数增加1公里。

本系统能实现市场上出租车计价器的基本功能外,可通过按键控制进入暂停,等待时间查询以及空车指示模式,并进行清零和复位。

时钟电路采用12MHZ的晶振作为系统的时钟源具有较高的准确性。

经实际测试,本设计基本实现了设计所期望的基本功能要求,同时通过算法设计实现了部分创新功能。

关键词:

单片机AT89S52,霍尔传感器,出租车计费器

目录

1概述3

1.1出租车计价器设计要求3

1.2课程设计的目的和意义3

1.3功能论述3

2系统总体方案及硬件设计4

2.1系统总体方案论证与比较4

2.2系统的硬件设计5

2.2.1单片机各引脚功能说明5

2.2.2最小系统6

2.2.3键盘电路7

2.2.4霍尔传感器测速电路8

3软件设计10

3.1系统主程序模块10

3.2中断子程序10

3.3里程计算子程序12

3.4键盘扫描与显示程序12

4Proteus软件仿真图13

5课程设计体会14

参考文献15

附1:

源程序代码16

附2:

系统原理图26

1概述

1.1出租车计价器设计要求

基本要求:

(1)能显示里程,单位为公里,最后一位为小数位。

(2)能显示金额数,单位为元,最后一位为小数位。

(3)可设定单程价格和往返价格,单程价格为2元/公里,往返价格为1.5元/公里。

(4)车速小于5公里/小时的时间累积为总等待时间,每5分钟等待时间相当于里程数增加1公里。

(5)起步公里数为3公里,价格为5元,若实际距离大于3公里,按规则实际距离计算价格。

(6)按暂停键,计价器可暂停计价,按查询键,可显示总等待时间。

1.2课程设计的目的和意义

(1)通过本次课程设计更进一步掌握和理解单片机课程知识和应用,使自己有解决问题的能力。

(2)通过本次课程设计会运用所学知识进行单片机软硬件的设计。

(3)通过本次课程设计提高学生的综合能力、动手能力、文献资料查阅

能力,为将来从事有关工作打下一个良好的基础。

(4)学会单片机仿真软件的使用方法和撰写课程设计报告的方法。

(5)通过本次课程设计掌握单片机中按键和数码管显示的使用。

1.3功能论述

本设计是以AT89S52单片机为主控器,利用A44E霍尔传感器测量转速,通过转速的测量和计算实现出租车多功能计价器的设计。

该系统由单片机最小系统,键盘电路,测速电路及显示电路等四部分组成。

以最小系统为核心,通过测量电路,算法设计,按键控制,输出显示来实现司机对出租车计价系统的控制。

显示部分由两个四位八段的共阳极数码管构成,通过键盘电路来实现对计价器的模式切换。

该系统能显示里程和金额、分别可以精确到小数点后一位:

可通过按键设置单程和往返价格;当车速在5公里/小时以下时,进入等待模式,等待时间等于五分钟时,相当于公里数加一。

本系统能实现市场上出租车计价器的基本功能外,可通过按键控制进入暂停,查询以及空车指示模式,并进行清零和复位。

时钟电路采用12MHZ的晶振,作为系统的时钟源,具有较高的准确性。

2系统总体方案及硬件设计

2.1系统总体方案论证与比较

方案一:

采用数字电子技术,利用555定时芯片构成多谐振荡器,或采用外围的晶振电路作为时钟脉冲信号,采用计数芯片对脉冲尽心脉冲的计数和分频,最后通过译码电路对数据进行译码,将译码所得的数据送给数码管显示,以下是该方案的流程框图,如图2-1所示:

图2-1方案一

方案二:

采用单片机作为主控器进行设计。

基于单片机的设计功能强大,用较少的硬件和软件组合起来即可实现所要求的功能,并可以修改软件程序来改变一些设定值,方便而易操作,不容易损坏。

设计采用89S52单片机控制,利用霍尔传感器测量速度和里程,利用键盘电路对计费进行控制和设定,然后再数码管上显示出来。

此设计易于控制和显示,规模较小,更适于安装在出租车中,实用性强。

通过两个方案的比较,很明显的可以看出采用单片机实现出租车计价更经济适用而且功能强大控制简单,因此采用方案二。

采用单片机设计的原理框图,如图2-2所示:

图2-2方案二

2.2系统的硬件设计

2.2.1单片机各引脚功能说明

AT89S52电路图如图2-1-1所示:

图2-2-1AT89S52电路图

VCC:

供电电压。

GND:

接地。

P0口:

P0口为一个8位漏级开路双向I/O口,每脚可吸收8TTL门流。

当P1口的管脚第一次写1时,被定义为高阻输入。

P0能够用于外部程序数据存储器,它可以被定义为数据/地址的第八位。

在FIASH编程时,P0口作为原码输入口,当FIASH进行校验时,P0输出原码,此时P0外部必须被拉高。

P1口:

P1口是一个内部提供上拉电阻的8位双向I/O口,P1口缓冲器能接收输出4TTL门电流。

P1口管脚写入1后,被内部上拉为高,可用作输入,P1口被外部下拉为低电平时,将输出电流,这是由于内部上拉的缘故。

在FLASH编程和校验时,P1口作为第八位地址接收。

P2口:

P2口为一个内部上拉电阻的8位双向I/O口,P2口缓冲器可接收,输出4个TTL门电流,当P2口被写“1”时,其管脚被内部上拉电阻拉高,且作为输入。

并因此作为输入时,P2口的管脚被外部拉低,将输出电流。

这是由于内部上拉的缘故。

P2口当用于外部程序存储器或16位地址外部数据存储器进行存取时,P2口输出地址的高八位。

在给出地址“1”时,它利用内部上拉优势,当对外部八位地址数据存储器进行读写时,P2口输出其特殊功能寄存器的内容。

P2口在FLASH编程和校验时接收高八位地址信号和控制信号。

P3口:

P3口管脚是8个带内部上拉电阻的双向I/O口,可接收输出4个TTL门电流。

当P3口写入“1”后,它们被内部上拉为高电平,并用作输入。

作为输入,由于外部下拉为低电平,P3口将输出电流(ILL)这是由于上拉的缘故。

P3口也可作为AT89S52的一些特殊功能口,P3口同时为闪烁编程和编程校验接收一些控制信号。

RST:

复位输入。

当振荡器复位器件时,要保持RST脚两个机器周期的高电平时间。

ALE/PROG:

当访问外部存储器时,地址锁存允许的输出电平用于锁存地址的地位字节。

在FLASH编程期间,此引脚用于输入编程脉冲。

在平时,ALE端以不变的频率周期输出正脉冲信号,此频率为振荡器频率的1/6。

因此它可用作对外部输出的脉冲或用于定时目的。

然而要注意的是:

每当用作外部数据存储器时,将跳过一个ALE脉冲。

如想禁止ALE的输出可在SFR8EH地址上置0。

此时,ALE只有在执行MOVX,MOVC指令是ALE才起作用。

另外,该引脚被略微拉高。

如果微处理器在外部执行状态ALE禁止,置位无效。

外部程序存储器的选通信号。

在由外部程序存储器取指期间,每个机器周期两次

有效。

但在访问外部数据存储器时,这两次有效的

信号将不出现。

保持低电平时,则在此期间外部程序存储器(0000H-FFFFH),不管是否有内部程序存储器。

注意加密方式1时,

将内部锁定为RESET;当

端保持高电平时,此间内部程序存储器。

在FLASH编程期间,此引脚也用于施加12V编程电源(VPP)。

XTAL1:

反向振荡放大器的输入及内部时钟工作电路的输入。

XTAL2:

来自反向振荡器的输出。

2.2.2最小系统

主控机系统采用了Atmel公司生产的AT89S52单片机,它含有256字节数据存储器,内置8K的电可擦除FLASHROM,可重复编程,大小满足主控机软件系统设计,所以不必再扩展程序存储器。

复位电路和晶振电路是AT89S52工作所需的最简外围电路。

单片机最小系统电路图如图2-4所示。

AT89S52的最小系统图如下:

图2-2-2最小系统

AT89S52的复位端是一个史密特触发输入,高电平有效。

RST端若由低电平上升到高电平并持续2个周期,系统将实现一次复位操作。

在复位电路中,按一下复位开关就使在RST端出现一段时间的高电平,外接12M晶振和两个30pF电容组成系统的内部时钟电路。

本部分主要由AT89S52单片机,复位电路,振荡电路,以及PO口上拉组成,作为计价系统的核心控制整个系统的正常工作。

2.2.3键盘电路

按键控制电路如图2-3所示,单片机的P1.0管脚接启动按键,通过软件编程,当按下按键计数器开始工作,开始计价;同时空车指示灯灭。

单片机P1.1管脚接切换开关,其功能是用来切换单双里程单价,其中单程2元,双程1.5元。

第三个按钮是结账按钮,接P1.2口,当按下时左边四位数码管显示里程,右边显示总金额,其中也包括等待时间产生的金额。

第四个按钮是清除按钮,用来清除所有数据,同时点亮空车指示灯。

单片机P3.0管脚接的是查询按钮,用来查询等待时间。

暂停按钮接P3.1口,第一次按下停止一切计数,再次按下时恢复正常工作。

键盘电路图:

图2-2-3键盘电路图

2.2.4霍尔传感器测速电路

本电路采用A44E霍尔传感器,A44E属于开关型的霍尔器件,其工作电压范围比较宽(4.5

18V),其输出的信号符合TTL电平标准,但仍需接一个4.7K的上拉电阻,才能有一个较高的明显的电压脉冲输出,然后接到单片机的IO端口上,而且其最高检测频率可达到1MHZ。

里程测量是通过霍尔传感器的霍尔效应检测出车轮的运转次数,然后转变为脉冲信号输入到单片机的P3.1口。

由单片机计算速度和总里程,霍尔传感器及其电路如下:

图2-2-4霍尔传感器电路

2.2.4数码管显示电路

本显示单元采用两个四合一共阳极数码管,利用动态扫描显示里程、金额、等待时间及空车指示信号HELLO等。

两个数码管分别显示行驶的里程数和总费用,分别和单片机的

连接,当按下查询键时可以显示等待时间,按下结账键时显示最终里程和最终金额,并且可以将通过按键切换单价,按下清零键清零显示HELLO。

以下是数码管和单片机引脚的连接图:

电路图如下所示:

图2-2-4数码管显示电路

 

3软件设计

3.1系统主程序模块

图3-1主程序流程图

3.2中断子程序

图3-2外部中断子程序流程图

图3-3定时器1中断子程序流程图

图3-4定时器0中断子程序流程图

3.3里程计算子程序

图3-5里程计算子程序

3.4键盘扫描与显示程序

程序利用定时器每1ms产生一次中断,相应变量置位,点亮一个数码管,显示一位数据,利用主函数内的循环,实现动态扫描显示,同时根据数码管余辉和人眼暂留现象,即可实现显示。

如图3-6所示:

 

图3-6键盘扫描与显示

4Proteus软件仿真图

图4-1总体仿真图

 

5课程设计体会

这段时间的经过我们的认真合作和不懈努力,我们的出租车计价器终于成功地制作完成。

从分析设计的要求,完成设计思路,到软件仿真直至最后的硬件焊接,从编写程序到不断的调试改写,以及最后的程序下载硬件调试,我们一步步地认认真真完成。

在这个过程中我们遇到了许多问题和困难,使得我们认识到了自身知识的欠缺,由于对所学知识没有很好地掌握,所以我们在做课程设计的同时又对所学知识进行了认真系统的复习。

对于我们所遇到的困难和问题,我们敢于直面问题并找出原因及解决办法。

在这个过程中,不仅加深了对理论知识的理解,我们的编程、问题分析解决及动手能力也有了潜移默化的提高。

特别是程序的调试过程中,经常会出现很多莫名奇怪的错误,弄得自己不知所措,经过查询资料、相互探讨和请教别人,我们从头开始,一步一步查找问题所在,检查每一个变量在程序执行过程中的值,最后找到错误所在并修改。

虽然程序写好之后通过仿真可以得到预期结果,但实物与仿真毕竟还是存在差别和很多不确定性。

刚开始硬件连接好,但是结果与预期结果差别比较大,对硬件认真检测后发现按键处出现错误,致使个别按键不起作用,对硬件进行了相应的调整。

第二次调试时,虽然可以显示所需的东西,但是数码管的亮度很低,几乎看不到,必须得在比较暗的地方才可以勉强看到所显示的结果。

经过我们的不断分析思考及网上资料的查询,得知P2口带负载能力比较弱,不足以驱动数码管正常显示,所以我们把P2口和P0口对换了一下,使得数码管正常显示,调试成功。

通过这次课程设计,最大的收获就是动手能力、分析解决问题的能力及团队合作得到了很大的提高,也充分体会到了自己设计东西的乐趣、学会查阅资料和对别人的东西融会变通的重要性,也明白了很多知识光靠趴在书本上学是学不到其中的精髓的,必须亲自去试着实践,亲自去经历才能对它们真正的掌握,凡事都要自己去动下手,去实践一下,遇到困难,永远不要沮丧气馁。

在动手的过程中,不仅能增强实践能力,而且在理论上可以有更深的认识;这次设计给了我极大的鼓舞和信心,相信在以后的学习中可以通过不断的摸索和实践来提高其他方面的知识。

 

参考文献

[1]余发山,王福忠.单片机原理及应用技.北京:

中国矿业大学出版社,2008.21-162

[2]康华光,电子技术基础.北京:

高等教育出版社,2006.7-269

[3]贾宗璞,许合利.C程序程序设.北京:

中国矿业大学出版社,2007.12-116

[4]XX知道AT89S52概述:

[5]XX文库AT89S52中文资料:

 

附1:

源程序代码

#include

#include

#defineuintunsignedint

#defineucharunsignedchar

#defineDanJia_DanCheng20

#defineDanJia_WangFan15

#defineLunJing5/*车轮直径0.5m*/

#defineLunChang6.28//m3.14*0.5

/****************************

引脚定义

*********************************/

sbitKaiShi_Key=P1^0;

sbitQieHuan_Key=P1^1;

sbitJieZhang_Key=P1^2;

sbitClear_Key=P1^3;

sbitWait_Key=P3^0;

sbitZanTing_Key=P3^1;

sbitKongChe_Led=P1^4;

sbitduche_Led=P1^5;

sbitZanTing_Led=P1^6;

sbitWangFan_Led=P1^7;

ucharcodetable[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xBF,0x89,0x86,

0xC7};

ucharcodewei[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};

uintdataCount=0;

uintdataCount1=0,Count2=0;

uchardataDanJia=DanJia_DanCheng;//默认单程价格

uchardataqian,bai,shi,ge;//显示数据各个位置数字的临时变量

uintdataLiCheng=0;

uintdataJinEr=0;

uintdataWaitime=0;

uchardataSecond;

uintdataMinute;

uchardatakey;

uintdataSpeed=0;

uintdataOld_Count,New_Count;

uchark=0,n=0,i=0,j=0;

uintdata_temp[];

bitKaiShiFlag=0;

bitQieHuanFlag=0;

voiddata_process();

voiddelay(uintx)

{

uinty;

while(x--)

for(y=110;y>0;y--);

}

/*************************************

数码管显示程序

(1)

*******************************************/

voidseg_show(ucharw,uchardat,uchardp)

{

if(w==dp)

{

P0=wei[w];

P2=table[dat]&0x7f;

delay

(1);

}

else

{

P0=wei[w];

P2=table[dat];

delay

(1);

}

}

voidSeparate(uinttemp)

{

qian=temp/1000;

bai=temp/100%10;

shi=temp/10%10;

ge=temp%10;

}

/*************************************

数码管显示程序

(2)

*******************************************/

voidshow_nint(ucharw,uintdat,uchardp)//显示w位:

从w位显示;dat:

显示数据;dp:

小数点显示位;最多五位数字显示

{

Separate(dat);

if(qian!

=0)

{

seg_show(w,qian,dp);

seg_show(w+1,bai,dp);

seg_show(w+2,shi,dp);

seg_show(w+3,ge,dp);

}

else

{

if(bai!

=0)

{

seg_show(w+1,bai,dp);

seg_show((w+2),shi,dp);

seg_show((w+3),ge,dp);

}

else

{

if(shi!

=0)

{

seg_show(w+2,shi,dp);

seg_show((w+3),ge,dp);

}

else

{

if(7==dp)

{

seg_show(w+3,ge,dp);

}

else

{

seg_show(w+2,shi,dp);

seg_show((w+3),ge,dp);

}

}

}

}

}

/************************

键盘扫描函数之调用函数

*************************/

voidWaittimes()

{

show_nint(0,LiCheng,2);

show_nint(4,Waitime,7);

}

voidClear()

{

Count=0;

LiCheng=0;

JinEr=0;

Waitime=0;

Second=0;

Minute=0;

KongChe_Led=0;

ZanTing_Led=1;

WangFan_Led=1;

DanJia=DanJia_DanCheng;

duche_Led=1;

i=0;

j=0;

k=0;

key=0;

KaiShiFlag=0;

EX0=1;

TR0=1;

TR1=1;

}

voidJieZhang()

{

EX0=0;

TR0=0;

TR1=0;

show_nint(0,LiCheng,2);

show_nint(4,JinEr,6);

}

voidZanTing()

{

if(i==1)

{

ZanTing_Led=0;

EX0=0;

TR0=0;

TR1=0;

show_nint(0,LiCheng,2);

show_nint(4,JinEr,6);

}

else

{

ZanTing_Led=1;

EX0=1;

TR0=1;

TR1=1;

key=0;

}

}

voidWeiZhi()

{

show_nint(0,LiCheng,2);

//show_nint(6,DanJia,2,6);

show_nint(4,JinEr,6);

}

/********************************

按键扫描函数

**********************************/

voidkeyscan()

{

if(0==QieHuan_Key)

{

delay(5);

if(0==QieHuan_Key)

{

while(0==QieHuan_Key)

{

switch(key)

{

case0:

WeiZhi();break;

case1:

ZanTing();break;

case2:

Waittimes();break;

case3:

JieZhang();break;

case4:

Clear();break;

}

}

QieHuanFlag=1;

k=!

k;

}

}

if(1==QieHuanFlag)

{

if(1==k)

{

DanJia=DanJia_WangFan;

WangFan_Led=0;

}

elseif(0==k)

{

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 总结汇报 > 学习总结

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1