内蒙古工业大学单片机实训蜂鸣器按键数码管显示.docx
- 文档编号:27236037
- 上传时间:2023-06-28
- 格式:DOCX
- 页数:30
- 大小:483.06KB
内蒙古工业大学单片机实训蜂鸣器按键数码管显示.docx
《内蒙古工业大学单片机实训蜂鸣器按键数码管显示.docx》由会员分享,可在线阅读,更多相关《内蒙古工业大学单片机实训蜂鸣器按键数码管显示.docx(30页珍藏版)》请在冰豆网上搜索。
内蒙古工业大学单片机实训蜂鸣器按键数码管显示
学校代码:
10128
单片机项目实践
好好学习不准抄袭!
!
!
题目:
仪表参数设定<任务二)
组长:
指导教师:
刘伟、裴岩、斯日古楞、杨传颖、韩海波、高鹏、郭慧<研)、胡元元<研)
设计时间:
2018年6月17日~2018年6月29日
一、设计目的:
通过一个以8位单片机为核心的模拟量数字表的硬件调试过程,掌握具有七段LED显示、蜂鸣器自检、键盘自检的单片机应用系统的设计思想和方法。
同时用单片机实现一个模拟的乒乓球游戏机。
学习应用系统软件的模块化设计方法,通过源程序的编辑、汇编或编译、链接、仿真调试,完成给定的任务。
通过上述过程提高学生项目实践能力和素质。
二、设计任务:
要求明确设计任务内容及任务分工等;<内容小四号宋体字)
1、基本任务:
完成蜂鸣器、键盘、七段LED显示器、AD7109的自检程序设计。
<1)蜂鸣器自检
要求:
利用程序实现两种以上声音。
<2)键盘自检
要求:
确定键盘正确。
<3)七段LED显示器自检
要求:
确定LED显示器每一段均正确。
。
主任务:
题目10:
乒乓球游戏机
难度系数:
9
功能:
1、用5个LED显示器作为乒乓球台,用LED显示器的中间横线“一”代表乒乓球
2、用两个按键代表球拍。
3、比赛规则:
当“一”到了最左侧LED时,左侧要及时击球,右侧同理。
4、输赢判断:
当乒乓球到达某一侧时,若提前或滞后按键<击球),则为输,用声音和显示来表示。
5、球速要随着比赛回合的增加而加快,击球判断时间逐渐减小。
6*、可以显示比分。
硬件环境:
键盘、LED显示器、喇叭等
2.任务分工:
组长:
张勤伟负责主程序的编写以及定时计数器有关控制反应时间以及球速的编写及调用
组员:
武松负责编写键盘采集程序编写
组员:
张子阳负责编写各程序所用延时子程序和蜂鸣器的程序的编写
三、框图:
要求包括自检任务和主任务的框图
1、硬件编程框图及相关说明
喇叭自检硬件框图:
P2.3置0后,喇叭会发声,P2.3置1后,喇叭不响。
键盘自检硬件框图:
K1,K2,K3,K4的开关值对应P1口的低4位,而自检开关由高4位控制。
然而,此程序要求保护自检开关,检验K1,K2,K3,K4的正确性。
调用SEL8可以打开74HC245L的三态门。
然后将最终表现结果巧妙的利用LED或喇叭表现出来。
七段LED显示器自检硬件框图:
P0口负责字型口,P2口负责字位口,实验中的数码管都是共阳极的。
通过中断控制模数转换,采集模拟的电压量,转换为用LED显示出来的数字信号量。
2、主程序框图、子程序框图及相关说明
1)乒乓球主程序框图:
2)子程序框图
判断发球权框图
乒乓球做一程序<右移同理)
接球过程框图:
显示分数框图:
开始
取分数
将分数的十位数与个位
数放入缓存区
显示个位数
延时
喇叭自检的程序框图:
注释:
每次循环给R0.R1,R2赋初值0A0H,延时1,延时2,延时3根据标准音符频率得到。
LED自检程序框图
键盘自检程序框图
四、程序清单:
乒乓球游戏机程序
score_leftequ30h。
定义左侧分数缓存区
uint_leftequ31h。
左侧得分的个位缓存区
decade_leftequ32h。
左侧得分的十位缓存区
score_rightequ33h。
定义右侧分数缓存区
uint_rightequ34h。
定义右侧的分缓存区
decade_rightequ35h。
定义右侧分数十位缓存区
speedequ36h。
定义球移动速度缓存区
speed2equ37h
scoreequ38h。
为发球的次数开辟缓存区
beepbitp2.3。
定义蜂鸣器端口
k1bitp1.0。
定义k1位
k2bitp1.1。
定义k2位
k3bitp1.2。
定义k3位
k4bitp1.3。
定义k4位
org00h
ajmpmain
org0bh
ajmptime。
time为定时器0子程序
org30h。
错开中断入口地址
main:
init:
MOVp1,#0ffh
MOVp0,#00h
SETBp2.3。
关闭蜂鸣器
movscore_left,#0h。
初始化分数
movuint_left,#0h。
初始化左侧分数个位
movdecade_left,#0h
movscore_right,#0h。
初始化右侧分数
movuint_right,#0h。
初始化右侧个位分数
movdecade_right,#0h。
初始化右侧分数十位
movspeed,#60。
初始化球的移动速度
movTMOD,#01h。
设置定时计数器方式1
movTH0,#0b1h
movTL0,#0e0h。
定时20ms
movn,#50
movIE,#82h。
开总中断和定时计数器0中断
movR7,#0h。
初始化R7
start:
jbp1.2,start。
启动判断开关
lcalldelay2。
延时去抖动
jbp1.2,start。
如果k3键按下则继续执行,否则返回
jbjufaq,clrfaqiu。
判断谁的发球权
setbfaqiu
jbfaqiu,yd_left:
判断A,B谁发球
yd_right
yd_left:
movp0,#80h。
送入“一”
cjnea,#11,led_left1
lcallscore_display_left
led_left1:
acallsel5
acalldelay
acallsel8
yd_left2:
jbk1,yd_left3。
如果k1不按下则
lcalldelay2
jbk1,yd_left2
lcallyd_left_fail
yd_left3:
acallsel4
acalldelay
acallsel8
yd_left4:
jbk1,yd_left5
lcalldelay2
jbk1,yd_left4
lcallyd_left_fail。
如果在此时按下k1键则跳入输判断子程序
yd_left5:
acallsel3
acalldelay
acallsel8
yd_left6:
jbk1,yd_left7
lcalldelay2
jbk1,yd_left6
lcallyd_left_fail。
yd_left7:
acallsel2
acalldelay
acallsel8
yd_left8:
jbk1,yd_left9
lcalldelay2
jbk1,yd_left8
lcallled_left_fail
yd_left9:
acallsel1
acalldelay
acallsel8
yd_left10:
jbp1.0,yd_left11。
如果没有按下键则重新从左发球
lcalldelay2
jbp1.0,yd_left10
lcalltime。
如果接住球启动定时器加速球的速度
ljmpyd_right
yd_left11:
incscore_right
lcallfail_buzzer
clrTR0
ljmpled_left
。
*******************************
。
此程序实现乒乓球右移动程序
。
*****************************
yd_right:
movp0,#80h。
送入“一”
cjnea,#11,led_right1
lcallscore_display_left
yd_right1:
acallsel1
acalldelay
acallsel8
yd_right2:
jbk4,yd_right3
lcalldelay2
jbk4,yd_right2
lcallyd_right_fail
yd_right3:
acallsel2
acalldelay
acallsel8
yd_right4:
jbk4,yd_right5
lcalldelay2
jbk4,yd_right4
lcallyd_right_fail
yd_right5:
acallsel3
acalldelay
acallsel8
yd_right6:
jbk4,yd_right7
lcalldelay2
jbk4,yd_right6
lcallyd_right_fail
yd_right7:
acallsel4
acalldelay
acallsel8
yd_right8:
jbk4,yd_right9
lcalldelay2
jbk4,yd_right8
lcallyd_right_fail
yd_right9:
acallsel5
acalldelay
acallsel8
nop
yd_right10:
jbp1.3,yd_right。
如果没有按下则重新从有发球
lcalldelay2
jbp1.3,yd_right10
nop
lcalltime。
如果接住球则启动定时计数器
ljmpled_left
yd_right11:
incscore_left
lcallfail_buzzer
clrTR0
ljmpyd_right
。
************************************
。
功能:
对输球进行处理的子程序
。
返回值:
右侧分数
。
************************
yd_left_fail:
lcallfail_buzzer
incscore_right
clrTR0
ajmpyd_left
yd_right_fail:
lcallfail_buzzer
incscore_left
clrTR0
ajmpyd_right
。
************************************************************************
。
下面为所有用到的的子程序
。
*************************************************************
sel5:
setbp2.5
clrp2.6
clrp2.7
ret
sel4:
clrp2.5
setbp2.6
setbp2.7
ret
sel3:
clrp2.5
setbp2.6
clrp2.7
ret
sel2:
clrp2.5
clrp2.6
setbp2.7
ret
sel1:
clrp2.5
clrp2.6
clrp2.7
ret
sel8:
setbp2.5。
开三态门74hc245
setbp2.6
setbp2.7
ret
。
****************************************
。
分数显示程序
。
本段程序用来将采集的分数显示到数码管上
。
******************************************
。
接住球的蜂鸣器程序
win_buzzer:
movr4,#60
movp0,#0ch。
在蜂鸣器响的同时让"1"也亮
win_buzzer1:
cplbeep
acalldelay1
djnzr4,win_buzzer1
ret
。
未接住蜂鸣器的程序
fail_buzzer:
movr4,#60
fail_buzzer1:
cplbeep
acalldelay2
djnzr4,fail_buzzer1
ret
。
****************************************
。
分数显示程序
。
本段程序用来将采集的左侧击球分数显示到数码管上
。
******************************************
score_display_left:
mova,score_left。
movb,#10
divab
movuint_left,b。
将分数的个位送入相应的缓冲区
movdecade_left,a。
将十位送入相应的缓冲区
movDPTR,#tab
mova,uint_left。
将个位数送入到a中
movca,@a+DPTR
acallsel3。
开个位显示
movp0,a。
显示个位数
lcalldelay1
movp0,#00h。
关显示以去除虚亮
mova,decade_left
movca,@a+DPTR
acallsel2。
开十位显示
movp0,a。
显示十位数
lcalldelay1
movp0,#00h。
关显示以去除虚亮
sore_display_right:
mova,score_right。
movb,#10
divab
movuint_right,b。
将分数的个位送入相应的缓冲区
movdecade_right,a。
将十位送入相应的缓冲区
movDPTR,#tab
mova,uint_right。
将个位数送入到a中
movca,@a+DPTR
acallsel5。
开个位显示
movp0,a。
显示个位数
lcalldelay1
movp0,#00h。
关显示以去除虚亮
mova,decade_right
movca,@a+DPTR
acallsel4。
开十位显示
movp0,a。
显示十位数
lcalldelay1
movp0,#00h。
关显示以去除虚亮
ajmpscore_display_left
ret
。
********************************
。
定时计数程序中断子程序
。
为球移动速度进行定时,控制反应时间
。
***********************
time:
pushACC
pushPSW
incr7
cjner7,#11,exit
djnzn,time
exit
decn
decspeed
movr7,#00h
exit:
movTH0,#0b1h。
重装初值
movTL0,#0e0h。
popPSW
popACC
reti
delay:
movr6,speed
d1:
movr5,#100
d2:
movr4,#60
djnzr4,$
djnzr5,d2
djnzr6,d1
ret
delay1:
movr0,#20
d3:
movr1,#20
djnzr1,$
djnzr0,d3
ret
delay2:
movr2,#50
d4:
movr3,#20
djnzr3,$
djnzr2,d4
ret
tab:
db7eh,0ch,0b6h,9eh,0cch,0dah,0fah,0eh,0feh,0deh。
数码管显示0,1,2,3,4,5,6,7,8,9
end
喇叭自检程序清单:
BEEP:
MOVR0,#0DFH
MOVR1,#0DFH
MOVR2,#0DFH
LOOP1:
SETBP2.3
ACALLDELAY1
CLRP2.3
ACALLDELAY1
DJNZR0,LOOP1
LOOP2:
SETBP2.3
ACALLDELAY2
CLRP2.3
ACALLDELAY2
DJNZR1,LOOP2
LOOP3:
SETBP2.3
ACALLDELAY3
CLRP2.3
ACALLDELAY3
DJNZR2,LOOP3
SJMPBEEP
DELAY1:
MOVR6,#02H
N1:
MOVR7,#07BH
N2:
DJNZR7,N2
DJNZR6,N1
RET
DELAY2:
MOVR4,#02H
N3:
MOVR5,#0AFH
N4:
DJNZR5,N4
DJNZR4,N3
RET
DELAY3:
MOVR3,#02H
N5:
MOVR4,#0DFH
N6:
DJNZR4,N6
DJNZR3,N5
RET
LED自检程序清单:
键盘自检程序清单:
KR245:
MOVP0,#0
LCALLSEL8
MOVP1,#0FFH
MOVA,P1
ANLA,#0FH
CJNEA,#0FH,ZWZ1
SJMPKR245
ZWZ1:
LCALLDELAY10
MOVP1,#0FFH
MOVA,P1
ANLA,#0FH
CJNEA,#0FH,ZW1
SJMPKR245
ZW1:
LCALLSEL7
CJNEA,#0DH,ZW2
SJMPZ2
ZW2:
JCZW3
SJMPZ1
ZW3:
CJNEA,#07H,Z3
SJMPZ4
Z1:
LCALLW1
LCALLLED
SJMPKR245
W1:
LCALLSEL1
MOVP0,#0CH
LCALLBEEP
RET
Z2:
LCALLW2
LCALLLED
SJMPKR245
W2:
LCALLSEL2
MOVP0,#0B6H
LCALLBEEP
LCALLBEEP
RET
Z3:
LCALLW3
LCALLLED
SJMPKR245
W3:
LCALLSEL3
MOVP0,#9EH
LCALLBEEP
LCALLBEEP
LCALLBEEP
RET
Z4:
LCALLW4
LCALLLED
LJMPKR245
W4:
LCALLSEL4
MOVP0,#0CCH
LCALLBEEP
LCALLBEEP
LCALLBEEP
LCALLBEEP
RET
BEEP:
CLRP2.3
LCALLDELAY1
SETBP2.3
LCALLDELAY1
RET
LED:
MOVR0,#07H
LOOP1:
LCALLDELAY
DJNZR0,LOOP1
RET
DELAY:
MOVR6,#0DEH
LOOP3:
DJNZR7,LOOP3
RET
DELAY10:
MOVR6,#14H
LOOP4:
MOVR7,#0F8H
LOOP5:
DJNZR7,LOOP5
DJNZR6,LOOP4
RET
DELAY1:
MOVR6,#0A9H
LOOP6:
MOVR7,#0B0H
LOOP7:
DJNZR7,LOOP7
DJNZR6,LOOP6
RET
SEL1:
CLRP2.7
CLRP2.6
CLRP2.5
RET
SEL2:
SETBP2.7
CLRP2.6
CLRP2.5
RET
SEL3:
CLRP2.7
SETBP2.6
CLRP2.5
RET
SEL4:
SETBP2.7
SETBP2.6
CLRP2.5
RET
SEL7:
CLRP2.7
SETBP2.6
SETBP2.5
RET
SEL8:
SETBP2.7
SETBP2.6
SETBP2.5
RET
要求有明确的程序注解、程序清单可分两栏打印
五、设计体会
要求每个人根据自己的不同情况分别写出本人的设计体会,不得少于300字。
顺序装订
体会:
1实践和想象的结果很不一样。
第一次做蜂鸣器的时候就收到了打击,前一天作了大量的准备,程序和计算,包括每个步骤,对每个指令都一一讨论,第二天来花了不到一小时,蜂鸣器响了,结果还符合要求。
检查的时候老师的第一个问题就难住了我<是我做程序解释和问题的回答的),第一次作为组长以及自己的责任,还有对自己负责的角度,老师问了一个计算时间的问题,看似简单的问题,“根据指令的多少来计算,循环的次数就是r6*r7,再乘以开关次数2,以及指令周期相当于机械周期的数目。
”老师问了一句,你们之前的计算是多少,“我要的是你们的结果”,500到880ms,老师初略的估算了一下,说我们的结果没有总的次数,相乘后频率就是20来秒了。
至今我还不了解老师的意思,一直认为声音的频率怎么会和开端的次数联系起来的。
2第二天使我们的问题的大暴露的时候,没有创新是不行的。
“哎,你们可惜了,没有什么特点?
”听后我们组都懵了,怎么都忙碌了一天了老师说的意思就是这个程序就要失败了,很不甘心啊。
之后老师问了几个非常简单的问题“第一条指令是什么意思,movP0,#0FF是什么意思?
小数点是固定的?
还是程序决定的?
”问到这么简单的东西就是大事不妙啊,并且都不切题,我答了个输入,结果是输出,细想是连接线路工作原理不明白,对象没弄清楚。
后面的问题更是出乎意料。
最后老师问想打多少分,我们高估了自己的实力没有认识自己的优缺点啊。
3第三天的时候,就是锻炼自己的理解和动手及反应力了,对老师要我们调节时间,键盘才符合实际情况。
当时是同组解决的,通过删掉一些延时以及减小数值,最后很完美,老师给了65分,虽然结果不很高,但锻炼自己的处理紧急任务的能力啊。
七、参考资料
1、《单片机系统综合设计与实践》教材主编:
裴岩刘利民内蒙古大学出版社。
2、《MCS-51单片机原理及应用》参考书主编:
焦玉全东南大学出版社。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 内蒙古 工业大学 单片机 蜂鸣器 按键 数码管 显示