51单片机出租车计价器设计课程设计Word格式.docx
- 文档编号:19056119
- 上传时间:2023-01-03
- 格式:DOCX
- 页数:20
- 大小:88.82KB
51单片机出租车计价器设计课程设计Word格式.docx
《51单片机出租车计价器设计课程设计Word格式.docx》由会员分享,可在线阅读,更多相关《51单片机出租车计价器设计课程设计Word格式.docx(20页珍藏版)》请在冰豆网上搜索。
本人完全意识到本声明的法律后果由本人承担。
日期:
年月日
学位论文版权利用授权书
本学位论文作者完全了解学校有关保留、利用学位论文的规定,同意学校保留并向国家有关部门或机构送交论文的复印件和电子版,许诺论文被查阅和借阅。
本人授权 大学能够将本学位论文的全数或部份内容编入有关数据库进行检索,能够采纳影印、缩印或扫描等复制手腕保留和汇编本学位论文。
涉密论文按学校规定处置。
导师签名:
摘要
随著超大规模集成电路技术的进展,单片机也随之有了专门大进展,各类新颖的单片机层出不穷,并已普遍地应用到人类生活的各个领域,成为现今科学技术现代化不可缺少的重要工具。
许多高校也纷纷开办了单片机这门学科,并在学科教授完后设有课程设计,希望同窗能够通过这次设计学习和应用单片机解决工作中碰着的实际问题。
现代交通工具迅猛进展,出租车在人们的日常生活中所扮演的角色越练越重要,但如何准确计费,以达到既使乘客中意又不让出租车司机赔本的目的,就迫在眉睫。
本课程设计主题是利用89C51单片机、LCD液晶显示器、可编程键盘显示接口器件827九、8位LED等实现出租车费用、路程和时刻显示,作为一个单片机在实际生活中的简单应用。
关键字:
89C51,8279,LCD液晶显示器,出租车计价器,
第一章概述
设计意义
出租车的计价器应用很广,平常比较常见,明白得较为深切,适合作为编程联系的例子。
在设计中能够加倍透彻的明白得和较为全面的考虑各类情形。
通过这次的练习,能够加深对单片机应用了解,更能灵活的利用51系列单片机的资源解决实际问题。
系统功能
上车按键后开始计价。
有实不时钟、单价、距离和总价钱显示。
能够通过键盘修改单价(元/千米)和时刻。
有清除键用以清楚上次费用。
利用LCD别离显示时刻、单价、路程和费用。
LED辅助显示说做操作。
要紧方式:
原理是,价钱=速度⨯时刻⨯单价;
采纳直流电机测速单元模拟出租车速度,通过光电耦合A/D转换进行速度采样,利用单片机的按时器/计数器按时和计数,用LED数码管或LCD显示总价和时刻,并通过键盘进行单价设定及时刻显示。
附加功能:
当出租车速度低于某一设定值时,自动进行计数,当计时每达到1分钟时,价钱依照1千米长度计。
功能详述
按键
0~9数字键;
B:
开始计价;
C:
清除数据;
D:
(P)设置单价键,按一次后,再按数字键进行设置;
E:
(T)设置时刻键,按一次后,再按数字键进行设置;
F/A:
完成设置键。
操作流程
程序运行后,时刻照常显示。
现在能够进行单价和时刻的设置。
按B键开始计价,运行中也能够进行单价和时刻的设置。
按C键清除上次费用和路程
系统所涉及模块
按时器与计数器
利用模拟直流定动机模拟出租车,转盘上有孔,利用光电转换变成电脉冲。
利用计数器进行计数,按时器进行按时。
路程和费用计算
依照计数值和计不时刻换算出速度,乘以单价得出单位计时刻隔的费用,加上以前的费用得出即时费用。
即路程=计数个数*计时刻隔/转盘上孔的个数。
即时费用=路程*价钱。
实不时钟
出租车上的显示器上要求有时钟,选择DS12887时钟芯片作为时钟操纵单元。
键盘及LED
上车开始计价,数据清除,单价及时刻的修改都需要利用键盘,数字加上功能键共计15个,因此利用8279来治理4×
4键盘及辅助显示的8位LED。
8279是一种通用的可编程的键盘/显示器接口器件,可对64个开关组成的键盘矩阵进行自动扫描,接收键盘上的输入信息,并在有键输入时向单片机请求中断,还能对8位或16位LED自动扫描,使显示缓冲器的内容在LED上显示出来。
利用8279对键盘/显示器的自动扫描,能够减轻CPU负担,具有显示稳固、程序简单、可不能显现误动作等特点。
利用8279芯片治理键盘,可有效减轻单片机I/O资源负担。
键盘由74LS138译码扫描,当有按键时,有8279自行编值,并引发外中断。
在中断程序中读取键值。
8279采纳单±
5V电源供电,40脚封装。
其具体管脚介绍如下:
DB0~DB7:
双向数据总线,用来传送8279与CPU之间的数据和命令。
CLK:
时钟输入线,用以产生内部按时的时钟脉冲。
RESET:
复位输入线,8279复位后被置为字符显示左端输入,二键闭锁的触点回弹型式,程序时钟前置分频器被置为31,RESET信号为高电平有效。
CS:
片选输入线,低电平有效,单片机在CS端为低时能够对8279读/写操作。
A0:
缓冲器低位地址,当A0为高电平常,表示数据总线上为命令或状态,当为低电平常,表示数据总线上为命令或状态,当为低电平常,表示数据总线上为数据。
RD:
读信号输入线,低电平有效,将缓冲器读出,数据送往外部总线。
WR:
写信号输入线,低电平有效,将缓冲器读出,将数据从外部数据总线写入8279的缓冲器。
LCD液晶显示器
时钟、单价、路程及费用需要利用液晶显示器来显示,选用RT12864hz液晶显示器。
各类参数通过处置后用它来显示。
RT12864HZ汉字图形点阵液晶显示模块可显示汉字和图形。
内置8192个中文汉字(16x16点阵)、128个字符(8X16点阵)及64X256点阵显示(用子图形)。
模块由20个引脚与外界电路相连,其中8条数据线,5条操纵线,3条电源线,2条背光电源线,2条没概念。
文本显示RAM提供8个,4行的汉字空间,当写入文本显示RAM时,能够别离显示CGROM、HCGROM和CGRAM字型。
HCGROM为半宽字型(8x16点阵),CGROM为中文字型,CGRAM为自概念的中文字型。
三种字型的选择由写入DDRAM的编码选择
我所做的工作
通过度工我负责用Protel画原理图,编写部份程序模块,包括时钟操纵函数、键盘输入操纵函数、模拟直流电机速度转换函数、LCD状态检测及刷新函数、X5045存储模块、主程序及整个程序的调试。
第二章硬件设计
硬件原理图简图
图硬件简图
简要说明
1.外部测速单元有模拟直流电动机(通过直流电机测速和对速度进行采样)和光电耦合器组成,输出脉冲信号由计数器输入单片机进行处置,其中电动机速度可调;
2.4×
4键盘和8位LED由8279治理,IRQ接INT0,CLK接ALE,键盘由十个数字键和五个功能键组成,其中一个键重复概念,LED用字母和数字显示表示当前的状态、进行的操作和输入的数据;
3.LCD显示信息,如下图;
图LCD及LED显示示用意
器件名称
生产公司
数量
89C51
ATMEL
1
DS12887
DALLAS
RT12864
8279
NECJapan
74LS138
TOSHIBA
3
74LS245
74LS573
4×
4键盘
第三章软件设计流程及描述
主函数程序流程图
先进行初始化,显示计价初始值,然后等待开始计价或进行设置。
计价分两种情形:
速度超过设定值时,按那时速度进行计价;
速度低于设定值时,自动进行计数,当计数每达到一分钟时,价钱依照一千米长度计。
修改分、修改时刻和单价。
清零用于清除当前路程和费用,以便进行下次计价。
按时器中断效劳程序流程图
关计数器关定时器
提取数据
设置计数/定时常数
开计数器开定时器
进入中断
中断返回
在定不时刻内记录脉冲个数,赋给全局变量,用于计算速度。
按键中断服效劳程序流程图
读取键值
转换,通过全局变量送至主函数
置位相应标志位
在LED上显示操作
中断返回回回
读取键值,转换为可用数据,而且置位相应标志位,为以后操作做好预备。
然后依照状态在LED上显示相应操作。
时钟芯片中断效劳程序
低速计数值加一
关中断
取时间(时,分,秒)
开中断
进入中断断
由于DS12887时钟芯片一秒钟产生一次中断,因此低速计数在那个地址进行计数。
读取时刻数值,赋给全局变量进行处置。
第四章源程序代码
#include<
>
#include<
#defineucharunsignedchar
#defineuintunsignedint
/*DS12887实不时钟时刻地址设置*/
#definesecondXBYTE[0x6000]/*秒寄放器地址*/
#definesec_alarmXBYTE[0x6001]
#defineminuteXBYTE[0x6002]/*分寄放器地址*/
#definemin_alarmXBYTE[0x6003]
#definehourXBYTE[0x6004]/*小时寄存器地址*/
#defineweekXBYTE[0x6006]/*礼拜寄放器地址*/
#definedateXBYTE[0x6007]/*日期寄存器地址*/
#definemonthXBYTE[0x6008]/*月寄放器地址*/
#defineyearXBYTE[0x6009]/*年寄放器地址*/
#defineregaXBYTE[0x600A]/*A寄放器地址*/
#defineregbXBYTE[0x600B]/*B寄放器地址*/
#defineregcXBYTE[0x600C]/*C寄放器地址*/
#defineregdXBYTE[0x600D]/*D寄放器地址*/
/*RT12864HZ汉字图形点阵液晶地址设置*/
#definew_c_addXBYTE[0x2070]/*写命令字地址*/
#definew_d_addXBYTE[0x2071]/*写数据地址*/
#definer_s_addXBYTE[0x2072]/*读状态字地址*/
#definer_d_addXBYTE[0x2073]/*读数据地址*/
#defineCOMXBYTE[0x2021]/*8279命令口*/
#defineDATXBYTE[0x2020]/*8279数据口*/
#defineL1/*长度系数*/
#defineTI50/*分度数*/
#defineHN30/*孔个数*/
#defineLOW30/*最低速度*/
ucharxdatakey;
/*键值*/
uintidatanum=0;
/*计数值*/
uintxdataa=1,b=0;
uintidatalen,fa,m,n,o,p,q,r,s,t,COUT,CLO;
uintidatah1,h2,m1,m2,s1,s2;
/*时钟参数*/
uintidataprice=10,fate=00,length=0,leng;
uintidatastate=0,clear=1,begin=0,pri,tim,tt=0,cc=0;
nn=0;
/*几个状态标志位*/
/*设置,清除,开始计价,单价修改,时刻修改,两位数监视,六位数监视,数字标志*/
unsignedcharbdatastatus;
/*lcd可位寻址片内数据存储器,许诺位与字节混合访问*/
sbitbusy=status^7;
/*lcd“忙”线的第7位*/
ucharbdatasta_8279;
/*8279*/
sbitdu=sta_8279^7;
/*8279方式设置命令字*/
unsignedcharrflag;
unsignedcharbdatasta_ds;
sbituip=sta_ds^7;
uchards_h,ds_m,ds_s,ds_t;
unsignedcharbdatads_time;
unsignedcharcodeNO[10]={0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9};
ucharcodetab[16]={0x3f,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,
0x71,0x7C,0x39,0x73,0x31,0x71};
/*0~F的字型编码*/
ucharxdatahz2[16]={0xB5,0xA5,0xBC,0xDB,0xA3,0xBA,0x20,0x20,0x20,0x20,
/*单价:
空空*/
0xA3,0xB0,0xA3,0xB0,0xD4,0xAA};
/*NN元*/
ucharxdatahz3[16]={0xBE,0xE0,0xC0,0xEB,0xA3,0xBA,0xA3,0xB0,0xA3,0xB0,
/*距离:
空N*/
0xA3,0xB0,0xA3,0xB0,0x4B,0x4D};
/*NNkm*/
ucharxdatahz4[16]={0xBC,0xDB,0xC7,0xAE,0xA3,0xBA,0xA3,0xB0,0xA3,0xB0,
/*价格:
NN*/
ucharxdatahz5[16]={0x20,0x20,0xCA,0xE4,0xC8,0xEB,0xC1,0xBD,0xCE,0xBB,
/*空输入两位*/
0xB5,0xA5,0xBC,0xDB,0x20,0x20};
/*单价空*/
ucharxdatahz6[16]={0x20,0x20,0x20,0x20,0xA3,0xBA,0xA3,0xB0,0xA3,0xB0,
/*空空:
0xD4,0xAA,0xA3,0xAF,0x4B,0x4D};
/*元/km*/
voidinitial(void);
voiddelay(void);
voidcheck_lcd(void);
voidshow_lcd(uchar*,uchar*,uchar*);
voidlcd_busy(void);
/*LCD忙状态检测函数*/
voidcompute(void);
voidchange_pri(void);
voidchange_time(void);
voidclock(void);
voidcheck_ds12887(void);
voide(void)
{w_c_add=0x80;
delay;
lcd_busy();
w_d_add=0xCA;
lcd_busy();
w_d_add=0xE4;
w_d_add=0xC8;
w_d_add=0xEB;
w_d_add=0xB4;
w_d_add=0xED;
w_d_add=0xCE;
w_d_add=0xF3;
w_d_add=0x20;
h1=0;
h2=0;
m1=0;
m2=0;
s1=0;
s2=0;
cc=0;
delay();
delay();
}
main()
{
uintinf=0;
initial();
show_lcd(hz2,hz3,hz4);
while
(1)
{
clock();
if(begin==1)
if(inf==0)
{
fate=20;
inf=1;
}
if(state==0)
if(num>
=LOW)
COUT=0;
price=a*10+b;
len+=num*L/HN;
if(len/TI>
=0)
leng=len/TI;
len%=TI;
fa=leng*price;
length+=leng;
leng=0;
fate+=fa;
}
else
if(COUT>
=120)
length++;
fate+=(10*a+b);
compute();
if(pri==1)
change_pri();
if(tim==1)
change_time();
if(clear==1)
length=0;
fate=0;
inf=0;
}0f0C0c00”00”0f0f0f2f验箱故障问题:
本次实验中,我组利用的实验箱上的LCD显示器件是坏的,不能做正常的测速。
在编写程序时,花费了较多的时刻对各类可能因素一一排查,而在其他的实验箱上能够成功高度,终于确信问题来自该器件本身。
2.计算费用:
速度较大时路程正常增加,而当速度较小时路程没有转变,故又修改了当速度小于某值时路程及计费的算法。
由于所设单位为KM,路程随时刻转变较慢,需多花一点时刻观看才能看见正确的显示结果。
3.LCD液晶显示:
要紧存在液晶显示抖动不稳及容易产生一些乱码,经查验为实验箱上的LCD液晶显示器本身故障。
第二,正确合理安排时刻、单价、路程和计费的位置也相当重要。
4.综合调试:
综合调试时碰到的问题较多,也对其他子程序做了较多的修改。
涉及到标志位初始值的问题,显示频率的问题等。
起先费用有一个起价费,在费用初始化时边加上,可是清除后显示费为起价费,与显示不符,后来在计价程序段中加上了起价判定,在清除时就能够够将费用显示为零,按“B”后当即显示起价费。
在清除状态时不能做设置操作,便在清楚程序段中加上了设置判定程序段,可是在清楚状态修改单价时,显示在设置状态和正常状态之间闪动,未能修正。
总之,虽有4天整的时刻做本次课程设计,但总感觉并无做得很完美,要紧问题存在于X5045模块没有调试成功,咱们曾单独编程用于数据的写入和读取,但并无从中读到咱们想要的数,还有对直流电机测速数据处置地也不是很准确,从中发觉了自己毛躁等问题,还有待于以后做进一步更正,希望本次课程再多几天并非是在考试前就更好了.
最后感激王教师和杨教师在本次课程设计中给预的帮忙.
参考文献
1.单片机的C语言应用程序设计[M],马忠梅,籍顺心。
北京:
北京航空航天大学出版社,2005
2.单片机原理及接口技术(第3版)[M],李朝青。
3.微操纵器原理及接口技术实验教程[M],张志,高大志,杨为名等。
沈阳:
东北大学出版社,2004
4.C51单片机实验指导书[M],闻绍飞。
信息学院实验中心,2000
5.东北大学微操纵器实验室源程序
所呈交的学位论文,是本人在导师的指导下进行的研究工作所取得的功效。
尽我所知,除文中已经专门注明引用的内容和致谢的地址外,本论文不包括任何其他个人或集体已经发表或撰写过的研究功效。
对本文的研究做出重要奉献的个人和集体,均已在文中以明确方式注明并表示感激。
本人完全意识到本声明的法律结果由本人承担。
学位论文作者(本人签名):
学位论文出版授权书
本人及导师完全同意《中国博士学位论文全文数据库出版章程》、《中国优秀硕士学位论文全文数据库出版章程》(以下简称“章程”),情愿将本人的学位论文提交“中国学术期刊(光盘版)电子杂志社”在《中国博士学位论文全文数据库》、《中国优秀硕士学位论文全文数据库》中全文发表和以电子、网络形式公布出版,并同意编入CNKI《中国知识资源总库》,在《中国博硕士学位论文评判数据库》中利用和在互联网上传播,同意按“章程”规定享受相关权益。
论文密级:
□公布□保密(___年__月至__年__月)(保密的学位论文在解密后应遵守此协议)
_______导师签名:
_______
_______年_____月_____日_______年_____月_____日
独创声明
所呈交的毕业设计(论文),是本人在指导教师的指导下,独立进行研究工作所取得的功效,功效不存在知
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 51 单片机 出租车 计价器 设计 课程设计