单片机课程设计出租车计费系统255计数50000计数.docx

上传人:b****9 文档编号:23416791 上传时间:2023-05-16 格式:DOCX 页数:21 大小:308.60KB
下载 相关 举报
单片机课程设计出租车计费系统255计数50000计数.docx_第1页
第1页 / 共21页
单片机课程设计出租车计费系统255计数50000计数.docx_第2页
第2页 / 共21页
单片机课程设计出租车计费系统255计数50000计数.docx_第3页
第3页 / 共21页
单片机课程设计出租车计费系统255计数50000计数.docx_第4页
第4页 / 共21页
单片机课程设计出租车计费系统255计数50000计数.docx_第5页
第5页 / 共21页
点击查看更多>>
下载资源
资源描述

单片机课程设计出租车计费系统255计数50000计数.docx

《单片机课程设计出租车计费系统255计数50000计数.docx》由会员分享,可在线阅读,更多相关《单片机课程设计出租车计费系统255计数50000计数.docx(21页珍藏版)》请在冰豆网上搜索。

单片机课程设计出租车计费系统255计数50000计数.docx

单片机课程设计出租车计费系统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

温度报警器仿真图

心得体会:

通过此次课程设计,使我更加扎实的掌握了有关单片机方面的知识,在设计过程中虽然遇到了一些问题,但经过一次又一次的思考,一遍又一遍的检查终于找出了原因所在,也暴露出了前期我在这方面的知识欠缺和经验不足。

实践出真知,通过亲自动手操作,使我们掌握的知识不再是纸上谈兵。

过而能改,善莫大焉。

在课程设计过程中,我们不断发现错误,不断改正,不断领悟,不断获龋最终的检测调试环节,本身就是在践行“过而能改,善莫大焉”的知行观。

这次课程设计终于顺利完成了,在设计中遇到了很多问题,最后在老师的指导下,终于游逆而解。

在今后社会的发展和学习实践过程中,一定要不懈努力,不能遇到问题就想到要退缩,一定要不厌其烦的发现问题所在,然后一一进行解决,只有这样,才能成功的做成想做的事,才能在今后的道路上劈荆斩棘,而不是知难而退,那样永远不可能收获成功,收获喜悦,也永远不可能得到社会及他人对你的认可!

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

当前位置:首页 > 工程科技 > 建筑土木

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

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