单片机出租车计费系统和0—9999计数器的课程设计

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

一、设计任务:
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位数码管显示价钱(角,元,十元,百元)。

二、各部分的详细设计
2.1 255计数器
设计原理和思路:80C51单片机中每个字节存储单元是8位的,每个字节可以存放从00000000—11111111,转化为10进制,就是0—255.所以本设计只需一个字节地址存放计数器里的值,再通过除法将其分配到三个单元,通过数码管分别显示“个”、“十”、“百”。

2.1.1 流程图:
图1 255计数流程图
2.1.2 程序:
ORG 0000H
AJMP START
ORG 0030H
START: MOV TMOD,#06H ;置定时器T0工作方式2 MOV TH0,#00H
MOV TL0,#00H
SETB TR0 ;启动计数
MAIN: MOV 30H,TL0 ;把TL0的数值赋给30H单元
MOV A,30H
MOV B,#100
DIV AB ;30H除以100
MOV 31H,A
MOV A,B
MOV B,#10
DIV AB
MOV 32H,A
MOV 33H,B
LCALL DISPLAY ;调用显示
AJMP MAIN
DISPLAY: MOV DPTR,#TAB
MOV P1,#01H ;P1位选
MOV A,31H
MOVC A,@A+DPTR
MOV P2,A ;P2段选
LCALL DELAY ;延时
MOV P1,#02H
MOV A,32H
MOVC A,@A+DPTR
MOV P2,A
LCALL DELAY
MOV P1,#04H
MOV A,33H
MOVC A,@A+DPTR
MOV P2,A
LCALL DELAY
RET
DELAY: MOV 50H,#10
MOV 51H,#40
XX: DJNZ 50H,xx
YY: DJNZ 51H,YY
RET
TAB:DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H
2.1.3 仿真效果图:
图2 255计数仿真图(一)
图3 255计数仿真图(二)2.2 50000计数器
设计原理和思路:80C51单片机的一个字节单元只能存储0—255,50000的计数,是通过分址寄存来实现的,个位和十位的数据用字节单元30H来存放,百位和千位的数据用字节单元31H来存放,万位的数据用字节单元32H来存放,当30H单元计到99时,清零,同时给31H加1,当31H单元计到99时,清零,同时给32H单元加1,到500000时,清零,重新计数显示。

2.2.1 流程图:
图4 50000计数流程图
2.2.2 程序:
ORG 0000H
AJMP START
ORG 000BH
LJMP ZHONGDUAN
ORG 0030H
START: MOV TMOD,#06H ;开T0方式2
MOV TH0,#0FFH ;高位赋FF MOV TL0,#0FFH ;低位FF
SETB EA
SETB ET0
SETB TR0
MAIN: LCALL DISPLAY
MOV A,30H
CJNE A,#100,XIAOYU99X ;是否小于99,是则显示 MOV 30H,#0 ;大于99,则清零
INC 31H ;31H即百位加一
MOV A,31H
CJNE A,#100,XIAOYU99Y
MOV 31H,#0
INC 32H
MOV A,32H
CJNE A,#5,XIAOYU5
MOV 32H,#0
AJMP MAIN
XIAOYU99X: MOV A,30H
MOV B,#10
DIV AB
MOV 50H,B
MOV 51H,A
AJMP MAIN
XIAOYU99Y: MOV A,31H
MOV B,#10
DIV AB
MOV 52H,B
MOV 53H,A
AJMP MAIN
XIAOYU5: MOV 54H,32H
AJMP MAIN ZHONGDUAN: INC 30H
RETI
DISPLAY: MOV DPTR,#TAB
MOV P1,#08H
MOV A,54H
MOVC A,@A+DPTR
MOV P2,A
LCALL DELAY
MOV P1,#10H
MOV A,53H
MOVC A,@A+DPTR
MOV P2,A
LCALL DELAY
MOV P1,#20H
MOV A,52H
MOVC A,@A+DPTR
MOV P2,A
LCALL DELAY
MOV P1,#40H
MOV A,51H
MOVC A,@A+DPTR
MOV P2,A
LCALL DELAY
MOV P1,#80H
MOV A,50H
MOVC A,@A+DPTR
MOV P2,A
LCALL DELAY
RET
DELAY: MOV 60H,#10
MOV 61H,#40
XX: DJNZ 60H,xx
YY: DJNZ 61H,YY
RET
TAB: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H 2.2.3 仿真效果图:
图5 50000计数仿真图(一)
图6 50000计数仿真图(二)2.3 出租车计费系统:
设计原理和思路:本设计通过定时器T0工作方式2产生溢出中断来显示出租车的路程和计费值,初始值为FFH,即每次来一个脉冲,中断一次,在中断程序中来改变存储单元的值,从而改变数码管的显示。

2.3.1 流程图:
图7 出租车系统流程图
2.3.2 程序:
ORG 0000H
AJMP START
ORG 000BH
LJMP ZHONGDUAN
ORG 0030H
START:
MOV 40H,#26 ;刚开始时,路程先减到25,再计
MOV 41H,#0
MOV 32H,#0
MOV 33H,#0
MOV 50H,#0
MOV R0,#0
MOV R1,#0
MOV R2,#0
MOV R3,#0
MOV R4,#0
MOV R5,#0
MOV R6,#5
MOV R7,#0
MOV TMOD,#06H
MOV TH0,#0FFH
MOV TL0,#0FFH
SETB EA
SETB ET0
SETB TR0
MAIN:
LCALL DISPLAY ;调用显示子程序
AJMP MAIN
ZHONGDUAN:
MOV A,40H ;最开始时是26,后面一直为0
LOOP1: JNZ PAN1 ;判断40H是否减到零,不是则转 MOV A,41H ;每次循环减5次才能往下执行
LOOP2: JNZ PAN2 ;判断是否减完5次
MOV A,32H
LOOP:
ADD A,#8 ;个位加8显示
CJNE A,#99,PANGAOWEI ;如果超过99,则百位加一
PANGAOWEI:JNC GAOWEICHULI
MOV B,#10
MOV 32H,A
DIV AB
MOV R6,A
MOV R7,B
MOV 41H,#6
RETI
GAOWEICHULI: INC 33H
MOV A,33H
MOV B,#10
DIV AB
MOV R4,A
MOV R5,B
MOV A,32H
SUBB A,#100
MOV 32H,A
MOV B,#10
DIV AB
MOV R6,A
MOV R7,B
RETI
PAN1: DEC 40H
MOV A,40H
CJNE A,#0,Y1
MOV 32H,#50
AJMP LOOP1
PAN2: DEC 41H
MOV A,41H
CJNE A,#0,Y1
AJMP LOOP2
Y1: INC 30H
MOV R3,30H
CJNE R3,#100,CHUSHU
MOV 30H,#00H
INC 31H
MOV R0,31H
MOV R1,#0
MOV R2,#0
RETI
CHUSHU: MOV A,30H
MOV B,#10
DIV AB
MOV R1,A
MOV R2,B
RETI
DISPLAY: MOV DPTR,#TAB
MOV P1,#01H
MOV A,R0
MOVC A,@A+DPTR
MOV P2,A
LCALL DELAY
MOV DPTR,#XIAOSHUDIAN
MOV P1,#02H
MOV A,R1
MOVC A,@A+DPTR
MOV P2,A
LCALL DELAY
MOV DPTR,#TAB
MOV P1,#04H
MOV A,R2
MOVC A,@A+DPTR
MOV P2,A
LCALL DELAY
MOV DPTR,#TAB2
MOV P1,#08H
MOV A,50H
MOVC A,@A+DPTR
MOV P2,A
LCALL DELAY
MOV DPTR,#TAB
MOV P1,#10H
MOV A,R4
MOVC A,@A+DPTR
MOV P2,A
LCALL DELAY
MOV P1,#20H
MOV A,R5
MOVC A,@A+DPTR
MOV P2,A
LCALL DELAY
MOV DPTR,#XIAOSHUDIAN
MOV P1,#40H
MOV A,R6
MOVC A,@A+DPTR
MOV P2,A
LCALL DELAY
MOV DPTR,#TAB
MOV P1,#80H
MOV A,R7
MOVC A,@A+DPTR
MOV P2,A
LCALL DELAY
RET
DELAY: MOV 50H,#10
MOV 51H,#4
XX: DJNZ 50H,xx
YY: DJNZ 51H,YY
RET
TAB: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H
XIAOSHUDIAN: DB 40H,79H,24H,30H,19H,12H,02H,78H,00H,10H;带小数点 TAB2: DB 0BFH
2.3.3 仿真效果图:
图8 出租车系统仿真图(一)
图9 出租车系统仿真图(二)
图10 出租车系统仿真图(三)
三、心得体会:
单片机课程设计终于如期完成,我很为自己能够独立编写程序,并将其调试成功而感到骄傲。

本学期学完单片机课程后,我虽然对单片机有了大致的了解,但对指令还不是很熟悉,只能编写些很简单的小程序。

在本课程设计初期,我拿到课题,不知该如何入手,但我下定了决心,一定要先把出租车的做出来。

在前三天,我几乎没怎么出门,从早上七点多到晚上十一点多,一直在编写、调试出租车的程序。

在第一天,我只是有个大概的思路,拿着课本参考,考虑用哪个定时器、什么工作方式、用什么方式来实现计数、数码管该如何显示、变量的选取又怎么选等诸多问题。

刚开始,我先把工作方式确定下来,采用的是T0工作方式2溢出中断,每中断就改变一次变量,从而改变数码管的显示。

沿着这些问题,我先把变量一一确定下来。

但数码管的动态扫描又该如何编写呢,我以前可从未用过动态扫描显示。

没法,我只好先看看课本,把原理看透,最后,我以循环的的方式编写了数码管部分的程序,并试图将8位数码管一一点亮,很遗憾,在Proteus仿真软件中,8位数码管所显示的数字全为“8”。

仔细检查了好几遍,感觉就是没错,问题到底出在哪,最后我请教了同寝室的徐大维同学,他说每个数码管点亮时要延时,不然人眼无法分辨,扫描速度太快了。

我试着添加了延时程序,最终解决了数码显示的问题。

用了两天时间把出租车系统思路和数码显示部分确定完后,我开始编写进入中断后所要执行的程序,我没有画流程图,只是在KEIL软件里一步一步地编。

出租车的前2千米的起步价是5元,后面是每500米加0.8元,我刚开始的程序是,让一个地址单元先放20,然后每中断一次减一次,直到为“0”,再每次判断另外一个存“5”的地址单元,使其循环减到“0”。

可就是在这段程序中,我碰到了非常棘手的问题:程序刚开始时减完了前20,后面如何不让它循环执行,而是只执行“5”的循环,我用了DJNZ指令,但结果未能实现。

就是这些环节,我用了一天的时间,一直未能解决,离老师验收设计结果只有一天了,我当时是焦急万分,甚至想放弃,编写个50000的计数器就算了。

就在这时,我和同寝室的李理同学讨论了“DJNZ”指令,它是减一的,当其减到零时,再次执行它时,还会从零再减吗,还是就一直保持为零不变?关键点就在这,我一直以为“DJNZ”和“DEC”这些指令都是减到“0”后,再次执行到它时就不再减了,可我错了,我试着用这些指令在KEIL里执行,然后看看寄存器的值,发现当“DJNZ direct,rel”执行到direct为零后,再次执行这条指令后,direct的值变为了“FF”,这说明我理解错这些指令了。

后面我将程序进行了改进,终于迎来了“山重水复疑无路,柳暗花明又一村”的好结局。

出租车系统的设计完成后,再设计255计数器和50000计数器就很简单了,我只用了一个小时就将这两个程序设计完并将它们调试成功。

本此设计,我通过自己的努力,最终将其独立完成。

我很为自己能够克服诸多困难,坚持到最后而感到自豪。

这次课程设计我学到了很多,同时,也增强了我学好单片机的信心。

我知道,现在只是初步地应用单片机,还有更复杂的功能我还没有学会,课程设计并非是一门课程的结束,而是一个开始,日后的专业还有更复杂的东西等着我。

但我相信,只要肯下功夫,努力坚持,敢于挑战,一定可以取得成功。

姓名:*** 2011-12-30。

相关文档
最新文档