单片机课程设计出租车计费系统255计数50000计数.docx
《单片机课程设计出租车计费系统255计数50000计数.docx》由会员分享,可在线阅读,更多相关《单片机课程设计出租车计费系统255计数50000计数.docx(21页珍藏版)》请在冰豆网上搜索。
![单片机课程设计出租车计费系统255计数50000计数.docx](https://file1.bdocx.com/fileroot1/2023-5/16/39ec6f12-321d-41ad-9c19-73b99fbd9f79/39ec6f12-321d-41ad-9c19-73b99fbd9f791.gif)
单片机课程设计出租车计费系统255计数50000计数
(题目)
255计数器、50000计数器、出租车计费系统
起
电气与信息工程学院
单片机课程设计实验报告
一、设计任务:
1.1外部脉冲自动计数,自动显示。
1.1.1设计一个255计数器:
0-255计数,计满后自动清0,重新计数(在数码管中显示)。
1.1.2设计一个50000计数器:
0-50000计数,计满后自动清0,重新计数(在数码管中显示)。
1.2设计一个出租车计费系统:
起步价为5元(2km以内),2km后,0.8元/0.5km;要求每500m刷新计费一次,在8位数码管中,前3位显示数码管显示里程数,后3位数码管显示价钱(角,元,十元,百元)
注:
要求首先采用PROTEUS完成单片机最小系统的硬件电路设计及仿真;程序仿真测试通过后,再下载到单片机实训板上执行。
二、单片机最小系统硬件资源介绍:
1单片机系统数码管和键盘接口电路
27279A资料
三、设计思路:
1、255计数:
255可用8位二进制数表示,故本设计可直接采用可以重装载的计数器T1模式二进行计数。
然后对TL1的内容进行相应的二进制---十进制转换:
首先TL1的内容除以64H,所的商就是十进制的百位,然后用余数除以0AH,所得的商就是十进制数的十位,余数即相应的十进制的个位。
接着将相应的十进制数进行译码,并在LED数码管上显示出来。
每来一个脉冲其显示的结果加一,直加至255然后T1重新开始计数。
255计数器汇编程序
ORG0000H
AJMPSTART
ORG0300H
START:
MOVDPTR,#0CFE9H
MOVA,#0D1H
MOVX@DPTR,A
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
MOVTMOD,#50H
MOVTH1,#00H
MOVTL1,#00H
SETBTR1
LOOP1:
MOVA,TL1
MOVB,#64H
DIVAB
MOVR1,A//存百位
MOVA,B
MOVB,#0AH
DIVAB
MOVR2,A//存十位
MOVR3,B//存个位
MOVDPTR,#0CFE9H
MOVA,#80H
MOVX@DPTR,A//选择第一个显示管
MOVDPTR,#TAB
MOVA,R1
MOVCA,@A+DPTR
MOVDPTR,#0CFE8H
MOVX@DPTR,A
CLRA
MOVDPTR,#0CFE9H
MOVA,#81H
MOVX@DPTR,A//选择第二个显示管
MOVDPTR,#TAB
MOVA,R2
MOVCA,@A+DPTR
MOVDPTR,#0CFE8H
MOVX@DPTR,A
CLRA
MOVDPTR,#0CFE9H
MOVA,#82H
MOVX@DPTR,A//选择第三个显示管
MOVDPTR,#TAB
MOVA,R3
MOVCA,@A+DPTR
MOVDPTR,#0CFE8H
MOVX@DPTR,A
LJMPLOOP1
TAB:
DB3FH,06H,5BH,4FH,66H
DB6DH,7DH,07H,7FH,6FH
END
PROTUES仿真图
50000计数器设计思路;由于DIVAB指令中A、B均为8位寄存器,因此255二进制转十进制计数的方法不能用于0-50000的循环计数。
可根据TH0(T0计数)或TH1(T1计数)中的内容为多少进行256累加,因为TH0或TH1中每一个二进制‘1’代表十进制的256,再和TL0或TL1按前一步二转十的方法转换得到的百、十、个相加,即可完成16位二进制转十进制
50000计数器汇编程序
ORG0000H
SJMPSTART
ORG000BH
AJMPT0
START:
MOVTMOD,#05H;用计数器T0工作方式1进行工作
MOVP1,#0;将P1口置0
MOVTH0,#0FFH;
MOVTL0,#0FFH;计数器初始化,有一个脉冲即中断
MOVP3,#0;将P3口置0
CLRC;C置0
MOVDPTR,#TAB;指针指向TAB
SETBEA;总中断控制设为"1"
SETBET0;T0中断允许控制设为"1"
MOVR0,#0;个位值清零
MOVR1,#0;十位值清零
MOVR2,#0;百位值清零
MOVR3,#0;千位值清零
MOVR4,#0;万位值清零
SETBTR0;打开T0开关
ACALLT1;显示加等待中断
T0:
MOVTH0,#0FFH;
MOVTL0,#0FFH;中断将计数器初始化
INCR0;R0自加1
MOVA,R0;将R0的值赋入A中
CJNEA,#10,AAA;比较A是否等于十,如果为十则进位,未满十就继续计数
MOVR0,#0;R0置0
INCR1;进位到十位
AAA:
MOVCA,@A+DPTR;查表
MOVP2,A;
SETBP1.0;显示个位
ACALLDELAY;延时
CLRP1.0;
MOVA,R1;R1的值赋入A中
CJNEA,#10,BBB;比较,是否进位
MOVR1,#0;进位R1置0
INCR2;进位到百位
BBB:
MOVCA,@A+DPTR;查表
MOVP2,A;
SETBP1.1;显示十位
ACALLDELAY;延时
CLRP1.1;
MOVA,R2;R2赋入百位
CJNEA,#10,CCC;比较,是否进位
MOVR2,#0;进位,R2置0
INCR4;进位到千位
CCC:
MOVCA,@A+DPTR;查表
MOVP2,A
SETBP1.2;显示百位
ACALLDELAY;延时
CLRP1.2
MOVA,R3;R3赋入A中
CJNEA,#10,DDD;比较,是否进位
MOVR3,#0;进位置0
INCR4;进位到万位
DDD:
MOVCA,@A+DPTR;查表
MOVP2,A
SETBP1.3;显示千位
ACALLDELAY;延时
CLRP1.3
MOVA,R4;R4赋入A中
CJNEA,#5,EEE;比较万位是否到5
MOVR4,#0;万位到5时置0
MOVR3,#0
EEE:
MOVCA,@A+DPTR;查表
MOVP2,A;
SETBP1.4;显示万位
ACALLDELAY;延时
CLRP1.4
RETI
T1:
MOVA,R0;等待中断时调用
MOVCA,@A+DPTR
MOVP2,A
SETBP1.0
ACALLDELAY
CLRP1.0
MOVA,R1
MOVCA,@A+DPTR
MOVP2,A
SETBP1.1
ACALLDELAY
CLRP1.1
MOVA,R2
MOVCA,@A+DPTR
MOVP2,A
SETBP1.2
ACALLDELAY
CLRP1.2
MOVA,R3
MOVCA,@A+DPTR
MOVP2,A
SETBP1.3
ACALLDELAY
CLRP1.3
MOVA,R4
MOVCA,@A+DPTR
MOVP2,A
SETBP1.4
ACALLDELAY
CLRP1.4
AJMPT1
DELAY:
MOVR7,#10
DE1:
MOVR6,#50
DE2:
DJNZR6,DE2
DJNZR7,DE1
RET
TAB:
DB0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,88H,83H,0C6H,0A1H,86H,8EH
设计思路:
在上步的基础上,每1个脉冲当作1公里(可自己设置几个脉冲1公里),5个脉冲,数码管显示05.0005,前3位金额,后3位为里程,超过5个脉冲,里程加1,金额加0.8元。
难点主要在于计费金额的显示,可将初值置为50,其中十位调用带点的字型码,即显示05.0,超过5个脉冲,里程加1,金额加8,由于十位是带有小数点,即可实现金额加0.8元。
计费器程序
ORG0000H
LJMPSTART
ORG000BH
LJMPT0
JIAOEQU20H
YUANEQU21H
SHIYEQU22H
BAIYEQU23H
BAIMIEQU24H
LIEQU25H
SHILIEQU26H
ORG2000H
START:
MOVTMOD,#06H;设置计数器T0工作方式2
MOVTH0,#0FFH;
MOVTL0,#0FFH;初始化
SETBEA;总中断控制设为"1"
SETBET0;T0中断允许控制设为"1"
SETBTR0;打开TR0开关
CLRJIAO
MOVYUAN,#5;从5元开始计费
CLRSHIY
CLRBAIY
CLRBAIMI
CLRLI
CLRSHILI
MOVR0,#21;超过了两公里换另一种计费方式
MOVDPTR,#TAB
A0:
ACALLXS
AJMPA0
T0:
INCBAIMI
DJNZR0,H0
MOVR0,#5;每500米更新一次金额
B1:
MOVA,JIAO
ADDA,#8;每次走500米,金额加0.8元
MOVJIAO,A
CJNEA,#10,Z0;比较是否满十,满十仅进位
MOVJIAO,#0
INCYUAN
SJMPZ1
Z0:
JCZ1
SUBBA,#10
MOVJIAO,A
INCYUAN
Z1:
MOVA,YUAN
CJNEA,#10,Z2;比较是否满十,满十仅进位
MOVYUAN,#0
INCSHIY
Z2:
MOVA,SHIY
CJNEA,#10,H0;比较是否满十,满十仅进位
MOVSHIY,#0
INCBAIY
H0:
MOVA,BAIMI
CJNEA,#10,Y0;比较是否满十,满十仅进位
MOVBAIMI,#0
INCLI
Y0:
MOVA,LI
CJNEA,#10,Z3;比较是否满十,满十仅进位
MOVLI,#0
INCSHILI
Z3:
ACALLXS
ZZZ:
RETI
XS:
MOVA,JIAO
MOVCA,@A+DPTR
MOVP2,A;显示"角"
SETBP1.0;位选
ACALLW1
CLRP1.0
MOVA,YUAN
MOVDPTR,#TAB1
MOVCA,@A+DPTR
MOVP2,A;显示"元"
SETBP1.1;位选
ACALLW1
CLRP1.1
MOVDPTR,#TAB
MOVA,SHIY
MOVCA,@A+DPTR
MOVP2,A;显示"十元"
SETBP1.2;位选
ACALLW1
CLRP1.2
MOVA,BAIY
MOVCA,@A+DPTR
MOVP2,A;显示"百元"
SETBP1.3;位选
ACALLW1
CLRP1.3
MOVA,BAIMI
MOVCA,@A+DPTR
MOVP2,A;显示"百米"(0.1公里)
SETBP1.4;位选
ACALLW1
CLRP1.4
MOVDPTR,#TAB1
MOVA,LI
MOVCA,@A+DPTR
MOVP2,A;显示"公里数"
SETBP1.5;位选
ACALLW1
CLRP1.5
MOVDPTR,#TAB
MOVA,SHILI
MOVCA,@A+DPTR
MOVP2,A;显示"十公里数"
SETBP1.6;位选
ACALLW1
CLRP1.6
RET
W1:
MOVR7,#10
DJNZR7,$
RET
TAB:
DB0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H;共阳极数值码
TAB1:
DB40H,79H,24H,30H,19H,12H,02H,78H,00H,10H
温度报警器源程序
DISPLAY0EQU71H;EQU赋值命令
DISPLAY1EQU72H
DISPLAY2EQU73H
ADCEQU74H
STBITP1.0;将P2.5地址赋值给START
EOCBITP1.1;将P2.6地址赋值给EOC
OEBITP1.2;将P2.7地址赋值给OE
ORG00H
SJMPSTART
START:
CLRP3;P3清零,为报警电路做准备
MOVP1.2,#1;P2.7给高电平,OE高电平有效
MOVDISPLAY0,#0FFH;给数码管赋初值
MOVDISPLAY1,#0FFH
MOVDISPLAY2,#0FFH
MOVDPTR,#TABLE;跳转至表格
MOVTMOD,#02H;工作方式二8-bit定时/计数(自动重装初值)
MOVTH0,#0F5H;定时计数器高八位付初值
MOVTL0,#00H
MOVIE,#82H;EA=1,ET0=1溢出中断位允许中断
SETBTR0;启动定时器TR0开始运行
WAIT:
CLRST;转换启动信号STARK清零
SETBST;启动转换信号
CLRST
JNBEOC,$;EOC为转换结束线,高电平为转换结束
;当EOC=0时转移到本指令首地址
SETBOE;输出转换得到的数据
MOVADC,P1;OE=1时将AD信号存入ADC中
CLROE;输出数据线呈高阻态
给第一个数码管的值
MOVA,ADC
MOVB,#51;DOUT=VIN*51为AD转换得出数据
DIVAB;DOUT/51为DISPLAY2值
MOVDISPLAY2,A;给第一个数码管的值
报警程序
MOVR0,#2
SUBBA,R0
JCLOOP1;如果A大于R0(大于2)则转移至LOOP1
MOVP3,00H;否则
给第二,第三个数码管的值
LOOP2:
MOVA,B
MOVB,#5
DIVAB
MOVDISPLAY1,A;分别得到DISPLAY1DISPLAY0的值
MOVA,B
MOVDISPLAY0,A
LCALLDISP
SJMPWAIT;等待再次得到ADC
RETI
数码管点亮程序
DISP:
MOVA,DISPLAY0
MOVCA,@A+DPTR
CLRP1.6;位选第一个数码管低电平有效
MOVP0,A;点亮第一个数码管
NOP
NOP
NOP
NOP
NOP
NOP
SETBP1.6;重新置一(动态扫描)
MOVA,DISPLAY1
MOVCA,@A+DPTR
CLRP1.5
MOVP0,A;点亮第二个数码管
NOP
NOP
NOP
NOP
NOP
NOP
SETBP1.5
MOVA,DISPLAY2
MOVCA,@A+DPTR
CLRP1.4
ORLA,#80H;或指令点亮数码管点号
MOVP0,A;点亮第三个数管
NOP
NOP
NOP
NOP
NOP
NOP
SETBP1.4
RET
表格
TABLE:
DB3FH,06H,5BH,4FH,66H
DB6DH,7DH,07H,7FH,6FH
点亮报警电路数码管
LOOP1:
MOVP3.1,#1
LJMPLOOP2
END
温度报警器仿真图
心得体会:
通过此次课程设计,使我更加扎实的掌握了有关单片机方面的知识,在设计过程中虽然遇到了一些问题,但经过一次又一次的思考,一遍又一遍的检查终于找出了原因所在,也暴露出了前期我在这方面的知识欠缺和经验不足。
实践出真知,通过亲自动手操作,使我们掌握的知识不再是纸上谈兵。
过而能改,善莫大焉。
在课程设计过程中,我们不断发现错误,不断改正,不断领悟,不断获龋最终的检测调试环节,本身就是在践行“过而能改,善莫大焉”的知行观。
这次课程设计终于顺利完成了,在设计中遇到了很多问题,最后在老师的指导下,终于游逆而解。
在今后社会的发展和学习实践过程中,一定要不懈努力,不能遇到问题就想到要退缩,一定要不厌其烦的发现问题所在,然后一一进行解决,只有这样,才能成功的做成想做的事,才能在今后的道路上劈荆斩棘,而不是知难而退,那样永远不可能收获成功,收获喜悦,也永远不可能得到社会及他人对你的认可!