单片机课程设计.docx
- 文档编号:5173229
- 上传时间:2022-12-13
- 格式:DOCX
- 页数:23
- 大小:321.10KB
单片机课程设计.docx
《单片机课程设计.docx》由会员分享,可在线阅读,更多相关《单片机课程设计.docx(23页珍藏版)》请在冰豆网上搜索。
单片机课程设计
设计题目:
出租车计费器和温度报警系统
所在系:
电气与信息工程学院
班级:
电子信息1005班
学生姓名:
王晶学号:
10401200510
同组学生姓名:
李盼学号:
10401200507
同组学生姓名:
莫小飞学号:
10401200508
指导老师:
刘剑
完成时间:
二○一三年一月五号
单片机课程设计
(一)
出租车计费器的设计
一、设计任务:
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.设计一个255计数器:
0-255计数,计满后自动清0,重新计数(在数码管中显示)。
原理:
255可用8位二进制数表示,故本设计可直接采用可以重装载的计数器T1模式二进行计数。
然后对TL1的内容进行相应的二进制---十进制转换:
首先TL1的内容除以64H,所的商就是十进制的百位,然后用余数除以0AH,所得的商就是十进制数的十位,余数即相应的十进制的个位。
接着将相应的十进制数进行译码,并在LED数码管上显示出来。
每来一个脉冲其显示的结果加一,直加至255然后T1重新开始计数。
2设计一个50000计数器:
0-50000计数,计满后自动清0,重新计数(在数码管中显示)。
原理:
将TH1和TL1中的十六进制数转为BCD码,
入口:
HT1,TL1中是16位二进制数,其中TH1中是高8位;
出口:
R2R3R4中是BCD码,其中R2中是万位,R3中是千、百位,R4中是十、个位。
再转为对应的个.十.百.千.万位。
送到缓冲区。
接着调用显示子程序。
3.设计一个出租车计费系统:
起步价为5元(2km以内),2km后,0.8元/0.5km;要求每500m刷新计费一次,在8为数码管中,前3为显示数码管显示里程数,后3位数码管显示价钱(角,元,十元,百元)
原理:
计数器每计数100个外部脉冲就产生中断,里程加1百米,大于两千米百位就和5和0比较,如果相等就调用价格计算子程序,价格加0.8元。
然后返回中断,调用里程和价格显示子程序。
三、PROTEUS硬件电路图
1、255计数器
2、50000计数器
3、出租车计费系统
四、调试程序
1、255计数器
ORG0000H
AJMPSTART
ORG001BH
AJMPTINT1
ORG0030H
START:
MOVTMOD,#60H;计数工作方式2
MOVTH1,#00H;初值0
MOVTL1,#00H
SETBTR1
SETBET1
SETBEA
LOOP:
LCALLDISP
SJMPLOOP
TINT1:
RETI
DISP:
MOVA,TL1
MOVB,#64H
DIVAB;A为百位
MOVDPTR,#SEGTAB
MOVCA,@A+DPTR
MOVP2,#03H;位选4
MOVP0,A;送百位数据
ACALLDELAY
MOVA,B
MOVB,#0AH
DIVAB;A为十位,B为个位
MOVCA,@A+DPTR
MOVP2,#04H;位选5
MOVP0,A;送十位数据
ACALLDELAY
MOVA,B
MOVCA,@A+DPTR
MOVP2,#05H;位选6
MOVP0,A;送个位数据
ACALLDELAY
RET
DELAY:
MOVR5,#05H;延时1ms
LOOP1:
MOVR6,#0FFH
DJNZR6,$
DJNZR5,LOOP1
RET
SEGTAB:
DB3FH,06H,5BH,4FH,66H;0,1,2,3,4
DB6DH,7DH,07H,7FH,6FH;5,6,7,8,9
END
2、50000计数器
ORG0000H
AJMPSTART
ORG0030H
WANWEIEQU20H
QIANWEIEQU21H
BAIWEIEQU22H
SHIWEIEQU23H
GEWEIEQU24H
START:
MOVR0,#20H;显示缓冲数据
MOVR1,#01H;位选缓冲
MOVTMOD,#50H;计数工作方式1
MOVTH1,#00H;初值0
MOVTL1,#00H
SETBTR1
SETBET1
SETBEA
LOOP:
LCALLDISP
SJMPLOOP
DISP:
LCALLREAD
DISP1:
MOVP2,R1
MOVP0,@R0
LCALLDELAY
INCR0
INCR1
CJNER1,#06H,DISP
MOVR1,#01H
MOVR0,#20H
SJMPDISP1
READ:
MOVR5,TH1
MOVR6,TL1
CJNER5,#0C3H,READ1
CJNER6,#51H,READ1
MOVTH1,#00H;初值0
MOVTL1,#00H
;调用子程序把R5R6中的数字,转换成BCD码,送到R2R3R4
READ1:
LCALLTXBCD
MOVA,R4
MOVB,#16
DIVAB
;除以16,目的是分离出高、低四位
MOVDPTR,#SEGTAB
MOVCA,@A+DPTR
MOVSHIWEI,A;存放十位
MOVA,B
MOVCA,@A+DPTR
MOVGEWEI,A;存放个位
MOVA,R2
MOVCA,@A+DPTR
MOVWANWEI,A;存放万位
MOVA,R3
MOVB,#16
DIVAB
MOVCA,@A+DPTR
MOVQIANWEI,A
MOVA,B
MOVCA,@A+DPTR
MOVBAIWEI,A
RET
;两个字节的二进制数转换成BCD码的程序如下:
;功能:
16位二进制数变换成为BCD码;
;入口:
R5R6中是16位二进制数,其中R5中是高8位;
;出口:
R2R3R4中是BCD码,其中R2中是万位,R3中是千、百位,R4中是十、个位。
TXBCD:
CLRA
MOVR2,A;先清零
MOVR3,A
MOVR4,A
MOVR7,#16;共转换十六位数
READ2:
CLRC
MOVA,R6
;从待转换数的高端移出一位到Cy
RLCA
MOVR6,A
MOVA,R5
RLCA
MOVR5,A
MOVA,R4;送到BCD码的低端
ADDCA,R4
;带进位加。
自身相加,相当于左移一位
DAA;十进制调整,变成BCD码
MOVR4,A
MOVA,R3
ADDCA,R3
DAA
MOVR3,A
MOVA,R2
ADDCA,R2
MOVR2,A
DJNZR7,READ2;共转换十六位数
RET
DELAY:
MOVR5,#05H;延时1ms
LOOP2:
MOVR6,#0FFH
DJNZR6,$
DJNZR5,LOOP2
RET
SEGTAB:
DB3FH,06H,5BH,4FH,66H;0,1,2,3,4
DB6DH,7DH,07H,7FH,6FH;5,6,7,8,9
END
3、出租车计费系统
ORG0000H
AJMPSTART
ORG001BH
SJMPT1INT
ORG0030H
SHIQIANEQU20H
QIANMIEQU21H
BAIMIEQU22H
SHIYUANEQU24H
YUANEQU25H
JIAOEQU26H
;程序初始化
START:
CLRP2.3
MOVR3,#02H
MOVSHIQIAN,#00H
MOVQIANMI,#00H
MOVBAIMI,#00H
MOVSHIYUAN,#00H
MOVYUAN,#05H
MOVJIAO,#00H
MOVTMOD,#60H
MOVTH1,#9CH
MOVTL1,#9CH
SETBTR1
SETBET1
SETBEA
;主程序
MAIN:
LCALLDISPM
LCALLDISPL
SJMPMAIN
;中断处理程序
T1INT:
LCALLLONG
MOVA,QIANMI
CLRC
SUBBA,#02H
JNCT1;大于两千米转到T1
RETI
T1:
DJNZR3,T2
MOVR3,#01H
MOVA,BAIMI
CJNEA,#05H,NEXT
;和5相等,就更新价格,否则判断是否和0相等
LCALLMONEY
RETI
NEXT:
CJNEA,#00H,T2
;和0相等,更新价格,否则返回
LCALLMONEY
T2:
RETI
;显示里程
DISPL:
MOVR0,#20H
MOVA,@R0
MOVDPTR,#SEGTAB
MOVCA,@A+DPTR
MOVP2,#09H;位选
MOVP0,A;段选
LCALLDELAY
INCR0
MOVA,@R0
MOVCA,@A+DPTR
ADDA,#80H;显示小数点
MOVP2,#0AH;位选
MOVP0,A;段选
LCALLDELAY
INCR0
MOVA,@R0
MOVCA,@A+DPTR
MOVP2,#0BH;位选
MOVP0,A;段选
LCALLDELAY
RET
;显示价格
DISPM:
MOVR0,#24H
MOVA,@R0
MOVDPTR,#SEGTAB
MOVCA,@A+DPTR
MOVP2,#0DH
MOVP0,A;显示十元
LCALLDELAY
INCR0
MOVA,@R0
MOVCA,@A+DPTR
ADDA,#80H
MOVP2,#0EH
MOVP0,A;显示元
LCALLDELAY
INCR0
MOVA,@R0
MOVCA,@A+DPTR
MOVP2,#0FH;显示角
MOVP0,A
LCALLDELAY
RET
;价格计算子程序
MONEY:
MOVR6,28H
MOVA,R6
MOVDPTR,#NUM
MOVCA,@A+DPTR
MOVJIAO,A
INCR6
MOV28H,R6
CJNER6,#05H,M1
MOV28H,#00H
M1:
CJNEA,#08H,M2;等于8没有进位
SJMPM4
M2:
MOVA,YUAN
CJNEA,#09H,M3;等于9,进位
INCSHIYUAN
MOVYUAN,#00H
SJMPM4
M3:
INCYUAN
M4:
RET
NUM:
DB08H,06H,04H,02H,00H
;里程计算子程序
LONG:
MOVA,BAIMI
CJNEA,#09H,L1
;和9相等就置0,不等就跳到L1
MOVBAIMI,#00H
INCQIANMI
MOVA,QIANMI;千米加1
CJNEA,#0AH,L2
;等于10就置0,不等跳到L2
MOVQIANMI,#00H
INCSHIQIAN
L1:
INCBAIMI;百米加1
L2:
RET
;延时子程序
DELAY:
MOVR5,#05H;延时2.5ms
LOOP1:
MOVR6,#0FFH
DJNZR6,$
DJNZR5,LOOP1
RET
SEGTAB:
DB3FH,06H,5BH,4FH,66H;0,1,2,3,4
DB6DH,7DH,07H,7FH,6FH;5,6,7,8,9
END
单片机课程设计
(二)
温度报警系统的设计
一、设计任务:
设计一个温度报警系统:
温度显示范围为0——51度,当温度大于40度时,上限报警指示灯点亮,并驱动电机1转动;当温度小于于10度时,下限报警指示灯点亮,并驱动电机2转动;
二、设计思路
1、按键识别,判断启动按钮是否按下。
2、A/D转换,将ADC0809通道0的电压值(温度值)转换成数字量,并通过P0口读入。
(1)送启动脉冲。
(2)判断A/D转换是否结束(EOC是否为高电平)。
(3)是否可以取数(OE是否为高电平)。
3、二进制转换为十进制。
4、数码管动态扫描显示。
三、PROTEUS硬件电路图
1、温度显示范围为0——51度
2、当温度小于于10度时,下限报警指示灯D2点亮,并驱动电机2转动
3、当温度大于40度时,上限报警指示灯D1点亮,并驱动电机1转动
四、调试程序
#include
#include
#defineucharunsignedchar
#defineuintunsignedint
ucharTemp=0;
ucharbuffer=0;
ucharcount=0;
ucharpnts=0;
uchartens=0;
ucharunits=0;
sbitALE=P1^0;
sbitSTART=P1^1;
sbitOE=P1^2;
sbitEOC=P1^3;
sbitS1=P1^4;
sbitS2=P1^5;
sbitS3=P1^6;
sbitM1=P3^0;
sbitM2=P3^1;
sbitpuls=P3^0;
ucharLED[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};
voidDelayms(uintm)
{
uintl;
for(;m>0;m--)
{
for(l=0;l<125;l++)
{
;
}
}
}
voidDisplay(void)
{
uchari=0;
pnts=buffer%5;
tens=Temp%100/10;
units=Temp%100%10;
for(i=0;i<3;i++)
{
switch(i)
{
case0:
P2=LED[tens];
S1=1;
S2=0;
S3=0;
break;
case1:
P2=LED[units]&0x7F;
S1=0;
S2=1;
S3=0;
break;
case2:
P2=LED[pnts];
S1=0;
S2=0;
S3=1;
break;
}
Delayms(20);
S1=0;
S2=0;
S3=0;
}
count++;
return;
}
/*voidInitAdc0809(void)
{
START=0;
OE=0;
ALE=0;
_nop_();
_nop_();
ALE=1;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
ALE=0;
}*/
voidADC0809()
{
OE=0;
ALE=0;
START=0;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
ALE=1;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
START=1;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
ALE=0;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
START=0;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
while(!
EOC);
OE=1;
_nop_();
_nop_();
_nop_();
_nop_();
buffer=P0;
OE=0;
}
voidmain()
{
M1=0;
M2=0;
S1=0;
S2=0;
S3=0;
while
(1)
{ADC0809();
Display();
Temp=buffer/5;
if(buffer>200)
{
M1=1;
}
elseif(buffer<50)
{
M2=1;
}
else
{
M1=0;
M2=0;
}
}
}
五、心得体会
作为一名电子与信息工程专业的大三学生,我觉得做单片机课程设计是十分有意义的,而且是十分必要的。
在已度过的大学时间里,我们大多数接触的是专业课。
我们在课堂上掌握的仅仅是专业课的理论知识,如何去锻炼我们的实践能力?
如何把我们所学的专业基础课理论知识运用到实践中去呢?
我想做类似的课程设计就为我们提供了良好的实践平台。
完成这次的单片机课程设计花费将近一周时间,但是却从理论到实践,学到了很多的东西。
同时不仅巩固了以前所学过的知识。
通过这次课程设计使我懂得了理论与实际相结合是很重要的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正为社会服务,从而提高自己的实际动手能力和独立思考的能力。
在这次课程设计后我发现自己在一点一滴的努力中对单片机的兴趣也在逐渐增加。
这次的课程设计还让我学会了如何去培养我们的创新精神,从而不断地战胜自己,超越自己。
更重要的是,我在这一设计过程中,学会了坚持不懈,不轻言放弃。
开始的第一天就自己做的是0到255的计数器,对于数码管显示数据这部分不是很熟悉,在TH、TL里面放个初值,然后启动定时/计数器就可以开始计数了,然后到了255个后又重新开始,但是怎么把所记的脉冲数显示出来却总是不大懂。
于是把书好好看了遍,对数码管显示熟悉之后就开始了设计。
这次的单片机课程设计遇到的最多的问题就是在程序的编写上,尤其是0到5000计数时,在那里卡了好久,一直就是TL和TH两个寄存器里的数据取不出来,自然就无法送到数码管显示,因为两个寄存器里的数据加一起有十六位,我们所用的单片机是8位机,最大只能赋值256,超过256就会发生错误,为此试过好多种方法,但是都不行,最后用的BCD转换才解决得。
通过温度报警系统单片机课程设计,加深了我对单片机指令系统,中断系统,放大器放大倍数,模数转换有了深刻的理解,开始我对SJMP,LCALL这两种指令的返回点不清楚,我就把书上所有SJMP,LCALL指令对照起来看,然后再去同学,在她们的帮助下我对这些指令有了深刻的认识,在调试中断的时候,只产生了一次中断,原来中断没有返回;在调试换大器的放大倍数时候,是一份精细的工作,我整整用了一天的时间把它给弄好,完美满足了用户的需要,最后把能够更好的把此理论将理论应用到实际当中去,而且我还学会了如何去培养我们的创新精神,而且要有坚持不懈的精神。
还让我认识到单片机作为一门实践性很强的学科,动手能力是非常有必要而且必须的。
在这次课程设计中,遇到了不少问题,不过经过老师和寝室同学的指导,查阅各种资料,最后都一一解决了,比较顺利的完成了这次设计,在这里我感谢的莫小飞和李盼耐心指导和帮助。
在这短短的几天时间里,把之前学习的单片机只是都复习了一边,比之前有了一个更加清晰地理解,实践出真知这话真的一点不假,动过动手实践掌握的东西远比单纯课堂上听来的要深刻、要清晰。
通过这次的课程设计,我发现了遇到问题首先应该想的是如何自己解决,实在是想不到时候再通过自己去网上找资料,也可以在同学之间探讨,这样得来的远比直接问老师,听老师是如何解答的来得要深刻,要掌握的更扎实,在下次遇到类似问题的时候就可以有个清晰的解决问题的思路,以及此类问题是因何产生的也会有个比较清晰地认识。
回顾起此次单片机课程设计,我感慨颇多,最重要的是感触是:
遇到一个问题时,最重要的一件事就是马上思考检查问题出在哪边,而不是抱怨或者马上请教同学老师。
只有这样我们才能真正的学会单片机,才能越学越会。
自己的独立处理问题的能力才会得到提高。
还有无论编程中遇到什么问题,都不要怨天尤人。
无论自己的程序有多好,都不能骄傲。
只有这样做到不骄不躁,力量才会源源不断,才会有更多的灵感。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 单片机 课程设计