出租车计程计价器的设计word文档Word格式.docx
《出租车计程计价器的设计word文档Word格式.docx》由会员分享,可在线阅读,更多相关《出租车计程计价器的设计word文档Word格式.docx(9页珍藏版)》请在冰豆网上搜索。
另外用31H,32H来存储计价值JJ的压缩BCD码,高字节放在32H中(百元,十元),低字节放在31H中(元,角),开始计价时30H为0,32H中为1(10元)31H中为25(二元五角)。
调用BCDZH将BCD码转成非压缩BCD码在调用DISP显示函数驱动数码管显示。
④在T0中断中若S>
3km则调用BCDJ24即以后每千米加2.4元,在调用BCDZH和DISP显示路程和价钱。
注意30H~32H中对应的非压缩BCD码存放在40H~45H(40H存放一千米,41H存放十千米,42H存放角,43H存放元,44H存放十元,45H存放百元)。
⑤程序中还用T1定时器来检测是否处于停车状态,由晶振频率fosc=12MHz,T1定时为50ms,每过5S(100*0.1)检测一次TL0中的数据是否与上次相同,若相同则认为停车状态,直到检测了9次(9*5=45S)则就要加6角,之后再调用BCDZH和DISP驱动显示器,显示计价计程,又清零重新记录停车时间。
⑥此程序中比较特殊在于,T0每次中断恰好走过250m,及恰好也是调用BCDJ6,这就省略了一些计算步骤。
三·
硬件系统说明和电路图原理
+5v
K1
ckmot
四·
程序模块主要流程图和源程序及注释
程序流程图
开始,设置S,JJ存储单元
系统初始状态化,状态码清零,S,JJ设置初值,T0计数,T1定时,R7,R3,R4,R5设置初值
调用DISP,等待中断,T0,T1,
进入中断设计,子程序BCDZH,BCDJ6,T0INT,T!
INT,又循环调用DISP
中断子程序:
T!
INT,T0INT
中断返回
程序
源程序代码:
QDJEQU125;
起步价12.5元
GLJEQU24;
每公里价2.4元
SEQU30H;
路程压缩BCD码存放30H
JJDZJEQU31H;
计价值低字节存放在31H压缩BCD码,元,角
JJGZJEQU32H;
计价值高字节存放在32H压缩BCD码,百元,十元
SGWEQU40H;
路程个位非压缩BCD码,km
SSWEQU41H;
路程十位非压缩BCD码,10km
JJJEQU42H;
计价值角位,非压缩BCD码
JJYEQU43H;
计价值元位,非压缩BCD码
JJSYEQU44H;
计价值十元位,非压缩BCD码
JJBYEQU45H;
计价值百元位,非压缩BCD码
ORG0000H;
程序开始
LJMPMAIN
ORG000BH
LJMPT0INT
ORG001BH
LJMPT1INT
MAIN:
MOVSP,#60H
MOVDPTR,#5FFFH;
显示初始化
MOVA,#0DCH
MOVX@DPTR,A
LP:
MOVXA,@DPTR
JNBACC.7,LP
MOVA,#00H
MOVA,#34H
MOVTMOD,#16H;
T0计数,模式二,T1定时,模式一
MOVTH0,#83H;
T0计数初值,每计到125,中断一次
MOVTL0,#83H
MOVTH1,#3CH;
T1定时初值,每50ms,中断一次
MOVTL1,#0B0H
MOVR7,#00H;
T0中断的次数,4次则路程加1km
MOVR3,#83H;
用于存放每次TLTLO中数
MOVR4,#00H;
T1中断子程序中100次,则5s检测车是否停车状态
MOVR5,#00H;
T1中断子程序中90次,则停车45s,加6角
SETBEA;
开启cpu中断,T0,T1中断
SETBET1
SETBET0
SETBPT0;
T0中断优先级高
CLRP1.1;
无乘客L0亮灯
MOVSGW,#00H;
显示位清零
MOVSSW,#00H
MOVJJJ,#00H
MOVJJY,#00H
MOVJJSY,#00H
MOVJJBY,#00H
;
ACALLDISP
JBP3.3,$;
有乘客时,开始启动T0计数,T1定时,开关K1控制
SETBTR0
SETBTR1
有乘客时L0灭灯
MOVS,#00H;
路程初始值0km
MOVJJGZJ,#01H;
计价初始值12.5元
MOVJJDZJ,#25H
ACALLBCDZH;
调用BCD转换程序,成非压缩BCD码
LL:
ACALLDISP;
调用显示程序,并等待中断
LJMPLL
;
将压缩BCD码转换成非压缩BCD码子程序如下
BCDZH:
PUSHPSW
SETBRS0;
选用工作寄存器组0
MOVR0,#S;
S的转换
MOVR1,#SGW
LPB:
MOVA,@R0
MOVR2,A
ANLA,#0FH;
保留低四位
MOV@R1,A
INCR1
MOVA,R2
ANLA,#0F0H;
保留高四位,
SWAPA
INCR0;
计价值的转?
INCR1
CJNER0,#33H,LPB
CLRRS0;
选回工作寄存器组0
POPPSW
RET
T0中断子程序
T0INT:
INCR7
CJNER7,#04H,LPT0;
路程不满1km,S不加1,转到LPTO
MOVA,S;
S+1
ADDA,#01H
DAA
MOVS,A
R7复0
LPT0:
S是否大于3km
CLRC
SUBBA,#03H
JCFH0;
S<
3,转到FH0
MOVA,S
SUBBA,#6
JCL3
ACALLBCDJ12
LJMPFH0
L3:
ACALLBCDJ6;
由于每次计数125,中断一次,125*2=250m,即中断一次加0.6元
FH0:
调用bcd码转换成非压缩bcd码,驱动数码管显示
RETI
BCDJ6子程序,T0中断一次250m就加6角,使用压缩BCD码
BCDJ6:
MOVA,JJDZJ
ADDA,#06H
MOVJJDZJ,A
MOVA,JJGZJ
ADDCA,#00H
MOVJJGZJ,A
附加的
BCDJ12:
ADDA,#12
DAA
MOVJJDZJ,A
MOVA,JJGZJ
ADDCA,#0
MOVJJGZJ,A
RET
T1中断子程序
T1INT:
PUSHPSW
MOVTH1,#3CH
INCR4
CJNER4,#64H,LY;
未到5s,转到LY
R4复0
MOVA,TL0
CLRC
SUBBA,R3;
5s检测是否停车,
JNZLY2;
A=0,R3=TL0,A!
=0->
LY2
INCR5
CJNER5,#09H,LY2;
是否停了45s
R5复0
停车45s加6角
ACALLBCDZH
LY2:
MOVR3,TL0;
用于存放每次TL0的值
LY:
显示子程序
DISP:
MOVR3,#06H;
显示的位数
MOVA,#92H;
输出写显示RAM命令字
指向8279命令口
MOVX@DPTR,A;
起始地址为0单元,自动加1
MOVR1,#SGW;
要显示数据的存放单元首地址
TY11:
MOVA,@R1
MOVDPTR,#CODE1;
#CODE1为查表偏移量
MOVCA,@A+DPTR;
查表得到段码
MOVDPTR,#5EFFH;
指向8279数据口
写入显示RAM
DJNZR3,TY11
CODE1:
DB0C0H,0F9H,0A4H,0B0H,99H;
段码表(共阳极)
DB92H,82H,0F8H,80H,90H,88H
DB83H,0C6H,0A1H,86H,8EH,8CH
DB0C1H,89H,0C7H,0BFH,91H
DB00H,0FFH
END
五·
课程设计总结
这次单片机课程设计对于自己来说,收获很多。
通过这次包括汇编编程和对硬件的操作在内的,由自己动手实践的,在体提高自己编程能力方面和对单片机硬件操作能力方面都有一个很大的提高。
由开始选题然后找到相关参考书,试着编写程序,到最后逐步的修改,碰到问题找老师和同学帮助(如如何提供外部脉冲来源,单步调式,设置断点等),最后能够在实验箱实现,这过程中收获颇多。
总之,这次课程设计即有加深对课本知识了解,也加强了自己操作和编程能力。
六·
参考书目
【1】王琼,单片机原理及应用实验教程。
合肥:
合肥工业大学出版社,2005【2】王琼,单片机原理及应用。
合肥工业大学出版社,2008
【3】张大明,单片机控制实