单片机课程设计Word文件下载.docx
《单片机课程设计Word文件下载.docx》由会员分享,可在线阅读,更多相关《单片机课程设计Word文件下载.docx(18页珍藏版)》请在冰豆网上搜索。
PP引脚接+5V,并行I/O口中P0口的8个引脚分别接到数码管A,B,C,D,E,F,G,DP端口,用来控制要显示的数字。
P2口的8个引脚接到DS1-DS88个发光二极管,而P1.5,P1.6,P1.7分别接DS9-DS113个发光二极管,用来控制发光二极管的亮灭。
P1.0,P1.1,P3.6,P3.7分别通过4个三极管控制4个数码管,当其中某位为低电平时,那个位所控制的数码管就会点亮。
XTAL1和XTAL2分别接到复位电路的两端。
P3.2,P3.3引脚分别接到两个水银开关,P3.0,P3.1分别接到串口下载电路的RX端和TX端。
P1.2引脚接到按键电路的KEY1端,P3.5引脚接到蜂鸣器电路的BELL端,RST引脚接到复位电路的RST端。
晶振电路:
由两个33pF的电容和一个12M的晶体振荡器组成,为单片机提供时钟
号,单片机的工作速度为每秒12M。
复位电路:
+5V电压通过10uf电解电容接到单片机的RST引脚,并下拉一个10K电阻。
电容在上电瞬间给RST端提供一段时间(大于2个机器周期)的高电平,就能使单片机复位,等电容充电结束,RST变为低电平(<
=0.5v),又恢复正常工作。
蜂鸣器电路:
1K电阻接到三极管(PNP)的基极,集电极接+5V电压,发射极接蜂鸣器的一端,另一端接地。
1K电阻是限流电阻,防止电流过大烧坏单片机。
当P3.5口为低电平时,三极管导通,有源蜂鸣器接电导通,发出响声。
当P3.5口为高电平时,三极管截止,有源蜂鸣器未接电,无响声。
串口下载电路:
由STC-ISP四端接口和J2两端接口组成,J2一端接5V电源,一端接
STC-ISP的第1端口,TX和RX分别接到第2,3端口,第4端口接地。
TX,RX
端口作为程序下载端口。
J2两端口上有一个短路帽,当短路帽接上则
单片机上电,否则则断电。
感应开关电路:
+5V电压接一个10K电阻再连接到水银开关的一端,另一端口接地。
当水银开关接通时,P3.2,P3.3口为低电平,否则为高电平。
可以由此来触发数码的正反向倒计时。
设置按键电路:
+5V电压接一个10K电阻再连接到按键开关的一端,另一端口接地。
当按键按下时,P1.2口为低电平,否则为高电平。
可以由此来设置
数码的长短按模式和加减模式等。
LED灯电路:
分别由DS0-DS1111个LED二极管(共阳极)一端共同接在+5V电压,
另一端分别接11个1K电阻然后接到单片机的11个端口。
当相应的端口为低电平时,则点亮LED灯,否则灯灭。
数码管电路:
每个数码管分别由一个三极管(PNP)控制,数码的一端接到三极管的发射极,然后三极管的基极通过一个1K电阻接到单片机的一个引脚上
三极管的集电极接+5V电压。
当单片机相应的端口为低电平则点亮相应的数码管,否则数码管灭。
而数码管的显示数字是由P0口来控制。
从而实现数码管的动态显示。
四.软件环境及调配下载工具、软件流程图及设计思想、软件功能及模块描述、主要程序及注释。
1.软件环境:
KeiluVision4
2.调配下载工具:
STC-ISPv6.80
3.软件流程图:
4.程序代码:
ORG0000H
LJMPMAIN
ORG0100H
ADD11:
LJMPADD1
TIME01:
LJMPTIME0
MAIN:
SETBF0;
主程序开始
JNBP3.2,ADD11;
根据水银开关状态判断板的放置状况。
正立时,进入预设
JNBP3.3,TIME01;
倒立时,进入倒计时
LJMPTIME;
平放时,分秒显示
ADD1:
JNBF0,TIME01;
用F0区别预设和倒计时
MOVP2,#11000000B
MOVR0,#00;
预设初值为0
LJMPMAIN1
LOOP:
;
预设值显示
MOVDPTR,#TAB;
A数码管的正向显示
MOVA,R0
MOVB,#10
DIVAB
MOVCA,@A+DPTR
MOVP0,A
CLRP1.0
LCALLDELAY
SETBP1.0
MOVA,B
CLRP1.1
LCALLDELAY
SETBP1.1
MOVA,#100
SUBBA,R0
MOVDPTR,#TAB1;
B数码管的反向显示
DIVAB
CLRP3.7
SETBP3.7
MOVA,B
CLRP3.6
SETBP3.6
MAIN1:
JBP3.2,TIME02;
判断板依然正立,若水银开关s1有变化,则退出预设,开始倒计时
JBP1.2,LOOP;
按键加,
LCALLDEL10ms;
放置按键抖动
JNBP1.2,LOOP;
按键弹起
ADDA,#1
MOVR0,A
MOV65H,A;
R0的内容加1
CJNER0,#99,LOOP;
当预设值为99时,则清零,重新从零开始加一
MOVR0,#00
LCALLLOOP
TIME02:
CPLF0
TIME0:
JBF0,LOOP;
倒计时
MOVp2,#11110000b
clrp1.5
clrp1.6
clrp1.7
MOVA,#99
MOVR7,A
loop0:
jbp3.2,loop1;
---判断水银开关s1,为1则转移
loop4:
jnbp3.3,loop1;
倒计时,板正立时,A,B数码管显示
movdptr,#tab;
----显示上面的数字
mova,r0
movb,#10
divab
movca,@a+dptr
movp0,a
clrp1.0
lcalldel
setbp1.0
mova,b
clrp1.1
setbp1.1
movdptr,#tab1;
----显示下面的数字
mova,r7
clrp3.7
setbp3.7
clrp3.6
setbp3.6
jbp3.2,loop4;
-----沙漏平放停止计数
djnzr4,A1;
---稳定数字显示
decr0
incr7
cplp2.7;
灯沙漏动画效果
cplp2.6
cplp2.3
cplp2.4
cjner0,#0,A1;
---进行判断
lcallloop2;
------正向溢出报警
loop1:
jbp3.3,A1;
----判断水银开关s2,为1则转移
loop5:
JBF0,A1;
倒计时,板倒立时,A,B数码管显示
jnbp3.2,A1
-----显示上面数字
setbp3.6
movdptr,#tab1;
-----显示下面数字
setbp1.1
jbp3.3,loop5;
反方向放置沙漏平放时停止计数
djnzr4,loop1
decr7
incr0
cplp2.7;
cplp2.4
cjner7,#0,loop1;
反向溢出时报警
ljmpbell2
loop2:
ljmpbell
loop7:
jnbp3.3,loop1
A1:
LJMPloop0
del:
movr5,#95;
数码管延时
d1:
movr6,#4
djnzr6,$
djnzr5,d1
ret
bell:
movr0,65h;
警报响起后,再次翻转,还可以从预设值起开始倒计时
mova,#99
subba,r0
movr7,a
jnbp3.3,loop7;
判断s2是否为0,0则转移,跳出警报
movdptr,#tab;
正向时溢出报警
mova,r0;
持续显示溢出停止时的数字
setbp1.1
movdptr,#tab1
jbf0,del3;
报警铃声
mov50h,#200
del2:
cplp3.5;
1kz响100ms
lcalldelay;
延时500us
djnz50h,del2
cplf0
sjmpbell
del3:
mov51h,#200
del4:
lcalldel8
cplp3.5;
500kz响200ms
延时1ms
lcalldelay
djnz51h,del4
a3:
ljmploop7
bell2:
movr0,65h;
jnbp3.2,a3;
判断s1是否为0,0则转移
mova,r1;
setbp1.0
movdptr,#tab
setbp3.7
jbf0,del6;
mov53h,#200
del5:
djnz53h,del5
sjmpbell2
del6:
mov54h,#200
del7:
djnz54h,del7
delay:
mov52h,#246;
djnz52h,$
del8:
cplp2.0;
报警溢出时LED灯闪烁
cplp2.1
cplp2.2
cplp2.5
cplp2.7
cplp1.5
cplp1.6
cplp1.7
DEL10ms:
;
按键时间
MOVR5,#10;
20次;
10.262ms=20*511+2*20+1
DEL_1:
MOVR6,#255;
255次;
511us=255*2+1
DJNZR6,$
DJNZR5,DEL_1
RET
TIME:
MOVR7,#00H;
MOVR6,#00H
MOV63H,#00011111b
SETBP1.5
SETBP1.6
SETBP1.7
SEE:
MOVR5,#2
SEE1:
MOVR4,#250
SEE2:
MOVDPTR,#TAB;
把数表的首地址赋给DPTR
MOVA,R6;
显示秒
LCALLDTIME
LCALLDTIME
MOVA,R7;
显示分
MOVDPTR,#TAB1
DJNZR4,SEE2
DJNZR5,SEE1
movA,63H;
每隔一秒,LED灯变化一次
RLA
MOV63H,A
MOVP2,A
INCR6
CJNER6,#10,SEE
MOVR6,#60;
满60秒,秒清零,分加一
INCR7
SJMPSEE
DTIME:
MOV60H,#250;
数码管动态显示
DJNZ60H,$
RET
TAB:
DB11000000B,11111001B,10100100B,10110000B,10011001B,10010010B,10000010B,11111000B,10000000B,10010000B;
-----数码管正码
TAB1:
DB11000000B,11001111B,10100100B,10000110B,10001011B,10010010B,10010000B,11000111B,10000000B,10000010B;
----数码管反码
End
尚未完成的工作:
因为这次任务我们是首次使用汇编语言编写程序,对程序编写的技巧没有完全掌握,存在一些编写错误,无法在适当的地方使用恰当的汇编语言,导致程序调试过程麻烦。
所以目前我们组尚未完成的工作是单片机断电保持功能,数码管减模式,电子闹钟模式。
解决思路:
数码管的减模式可以由水平开关和设置按键两部分结合从
而实现数码管的减模式。
可以利用STC89C52RC芯片里已集成的EEPROM(电可擦除可编程只读存储器),EEPROM在写入时能自动完成擦除,可以直接使用单片机系统的+5V电源,使用MOVX@DPTR,AMOVX@Ri,A指令等将要存储的变量写入EEPROM,这样便能实现掉电保持。
通过利用单片机的定时器TO/T1来实现电子闹钟的设计,
每满1秒,则“秒”单元中的内容加1;
“秒”单元满60.则“分”单元中内容加1,从而实现分秒模式,再加一个按键功能,实现用户想要设定的时间,然后电子沙漏就能定时闹铃。
通过此次单片机课程设计,使我对单片机系统有了更深的认识,懂得了单片机的基本工作原理,其中包括构成一个最小系统所需要的晶振电路,复位电路,STC89C52RC各个引脚功能和如何使用汇编语言实现各个模块的功能,知道数码管动态显示的原理和如何利用外部开关实现数码管的正反向计数和停止计数。
此外,通过这次课程设计,我深深体会到了确定整体程序流程图的重要性,只有有了规范,详细的程序流程图,才不会导致在编程过程出现程序累赘,程序杂乱,不易理解。
这样编写出来的程序才更容易模块化,便于理解,便于今后系统升级,不会浪费多余的时间在重新理解程序结构。
以后在编写较大的程序时尽量使用C语言编写,会更容易检查出错误,更容易模块化,程序代码也会相对少一些。