单片机课程设计.docx
《单片机课程设计.docx》由会员分享,可在线阅读,更多相关《单片机课程设计.docx(18页珍藏版)》请在冰豆网上搜索。
![单片机课程设计.docx](https://file1.bdocx.com/fileroot1/2023-2/1/f4b6e205-2920-4a67-a3b0-4e83c782e710/f4b6e205-2920-4a67-a3b0-4e83c782e7101.gif)
单片机课程设计
吉林大学珠海学院课程设计报告
专业测控技术与仪器
班级15班
学生姓名吴聪
课程名称单片机课程设计
任课老师刘立勋张弓
设计时间2014/11/15-2014/11/29
设计地点实验楼
吉林大学珠海学院电子信息系
2014年11月29日
一.设计内容及设计任务
二.本次课程设计已实现的功能
三.电路原理图及PCB丝印图(系统概述和细节描述)
四.软件环境及调配下载工具、软件流程图及设计思想、软件功能及模块描述、主要程序及注释
五.尚未完成工作的困难及解决思路
六.本次设计的收获心得
一.设计内容及设计任务
设计内容:
基于51构架单片机的电子沙漏设计
设计任务:
10-99S计时可设置
2显示数值永远向上
3A组倒计时B组正计时
4翻转后计时沙漏式反正
5水平放置停止计时
6计时溢出蜂鸣报警
7LED水滴效果
8设定数据掉电可保持*
9可设定加减模式、分钟模式*
10设计电子钟功能*
二.本次课程设计已实现的功能
本次课程设计我们组已完成0-99S计时可设置,显示数值永远向上,A组倒计时B组正计时,翻转后计时沙漏反正,水平放置停止计时,计时溢出蜂鸣报警,LED水滴效果等功能
三.电路原理图及PCB丝印图
系统概述:
该系统由MCU电路(STC89C52RC),蜂鸣器电路,串口下载电路,复位电路,晶振电路,感应开关电路,两个数码管电路,按键设置电路组成。
细节描述:
MCU电路:
STC89C52RC芯片有40个引脚,其中VCC引脚接+5V,VSS引脚接地,EA/V
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
MOVCA,@A+DPTR
MOVP0,A
CLRP1.1
LCALLDELAY
SETBP1.1
MOVA,#100
SUBBA,R0
MOVDPTR,#TAB1;B数码管的反向显示
MOVB,#10
DIVAB
MOVCA,@A+DPTR
MOVP0,A
CLRP3.7
LCALLDELAY
SETBP3.7
MOVA,B
MOVCA,@A+DPTR
MOVP0,A
CLRP3.6
LCALLDELAY
SETBP3.6
MAIN1:
JBP3.2,TIME02;判断板依然正立,若水银开关s1有变化,则退出预设,开始倒计时
JBP1.2,LOOP;按键加,
LCALLDEL10ms;放置按键抖动
JNBP1.2,LOOP;按键弹起
MOVA,R0
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
SUBBA,R0
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
movca,@a+dptr
movp0,a
clrp1.1
lcalldel
setbp1.1
movdptr,#tab1;----显示下面的数字
mova,r7
movb,#10
divab
movca,@a+dptr
movp0,a
clrp3.7
lcalldel
setbp3.7
mova,b
movca,@a+dptr
movp0,a
clrp3.6
lcalldel
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
movdptr,#tab;-----显示上面数字
mova,r7
movb,#10
divab
movca,@a+dptr
movp0,a
clrp3.6
lcalldel
setbp3.6
mova,b
movca,@a+dptr
movp0,a
clrp3.7
lcalldel
setbp3.7
movdptr,#tab1;-----显示下面数字
mova,r0
movb,#10
divab
movca,@a+dptr
movp0,a
clrp1.1
lcalldel
setbp1.1
mova,b
movca,@a+dptr
movp0,a
clrp1.0
lcalldel
setbp1.0
jbp3.3,loop5;反方向放置沙漏平放时停止计数
djnzr4,loop1
decr7
incr0
cplp2.7;灯沙漏动画效果
cplp2.6
cplp2.3
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;持续显示溢出停止时的数字
movb,#10
divab
movca,@a+dptr
movp0,a
clrp1.0
lcalldel
setbp1.0
mova,b
movca,@a+dptr
movp0,a
clrp1.1
lcalldel
setbp1.1
movdptr,#tab1
mova,r7
movb,#10
divab
movca,@a+dptr
movp0,a
clrp3.7
lcalldel
setbp3.7
mova,b
movca,@a+dptr
movp0,a
clrp3.6
lcalldel
setbp3.6
jbf0,del3;报警铃声
mov50h,#200
del2:
cplp3.5;1kz响100ms
lcalldelay;延时500us
djnz50h,del2
cplf0
sjmpbell
del3:
mov51h,#200
del4:
lcalldel8
cplp3.5;500kz响200ms
lcalldelay;延时1ms
lcalldelay
djnz51h,del4
cplf0
sjmpbell
a3:
ljmploop7
bell2:
movr0,65h;警报响起后,再次翻转,还可以从预设值起开始倒计时
mova,#99
subba,r0
movr7,a
jnbp3.2,a3;判断s1是否为0,0则转移
movdptr,#tab1;正向时溢出报警
mova,r1;持续显示溢出停止时的数字
movb,#10
divab
movca,@a+dptr
movp0,a
clrp1.1
lcalldel
setbp1.1
mova,b
movca,@a+dptr
movp0,a
clrp1.0
lcalldel
setbp1.0
movdptr,#tab
mova,r7
movb,#10
divab
movca,@a+dptr
movp0,a
clrp3.6
lcalldel
setbp3.6
mova,b
movca,@a+dptr
movp0,a
clrp3.7
lcalldel
setbp3.7
jbf0,del6;报警铃声
mov53h,#200
del5:
cplp3.5;1kz响100ms
lcalldelay;延时500us
djnz53h,del5
cplf0
sjmpbell2
del6:
mov54h,#200
del7:
lcalldel8
cplp3.5;500kz响200ms
lcalldelay;延时1ms
lcalldelay
djnz54h,del7
cplf0
sjmpbell2
delay:
mov52h,#246;延时500us
djnz52h,$
ret
del8:
cplp2.0;报警溢出时LED灯闪烁
cplp2.1
cplp2.2
cplp2.3
cplp2.4
cplp2.5
cplp2.6
cplp2.7
cplp1.5
cplp1.6
cplp1.7
ret
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;显示秒
MOVB,#10
DIVAB
MOVCA,@A+DPTR
MOVP0,A
CLRP1.0
LCALLDTIME
SETBP1.0
MOVA,B
MOVCA,@A+DPTR
MOVP0,A
CLRP1.1
LCALLDTIME
SETBP1.1
MOVA,R7;显示分
MOVDPTR,#TAB1
MOVB,#10
DIVAB
MOVCA,@A+DPTR
MOVP0,A
CLRP3.7
LCALLDTIME
SETBP3.7
MOVA,B
MOVCA,@A+DPTR
MOVP0,A
CLRP3.6
LCALLDTIME
SETBP3.6
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语言编写,会更容易检查出错误,更容易模块化,程序代码也会相对少一些。