内蒙古工业大学单片机实训蜂鸣器键盘数码管.docx
《内蒙古工业大学单片机实训蜂鸣器键盘数码管.docx》由会员分享,可在线阅读,更多相关《内蒙古工业大学单片机实训蜂鸣器键盘数码管.docx(22页珍藏版)》请在冰豆网上搜索。
内蒙古工业大学单片机实训蜂鸣器键盘数码管
学校代码:
10128
单片机工程实践
(第3组)
题目:
电子秒表(任务一)
组长:
(自电10-2班)学号:
组员:
(自电10-2班)学号:
(自电10-2班)学号:
指导教师:
刘伟、裴岩、斯日古楞、杨传颖、韩海波、高鹏、郭慧(研)、胡元元(研)
设计时间:
2013年6月17日
2013年6月28日
一、设计目的:
(题目四号宋体字)
通过一个以8位单片机为核心的模拟量数字表的硬件调试过程,掌握具有A/D、七段LED显示、RS-485通信、Watchdog等接口电路的单片机应用系统的设计思想和方法。
学习应用系统软件的模块化设计方法,通过源程序的编辑、汇编或编译、链接、仿真调试,完成给定的任务。
通过上述过程提高学生工程实践能力和素质。
二、设计任务:
要求明确设计任务内容及任务分工等;(内容小四号宋体字)
★基本任务:
完成蜂鸣器、键盘、七段LED显示器的自检程序设计。
(1)蜂鸣器自检
要求:
利用程序实现两种以上声音。
(2)键盘自检
要求:
确定键盘正确。
(3)七段LED显示器自检
要求:
确定LED显示器每一段均正确。
主任务:
题目1:
电子秒表
难度系数:
8
框图(包括自检和任务的框图):
1、硬件编程框图及相关说明
2、主程序框图、子程序框图及相关说明
1、硬件编程框图及相关说明
喇叭自检硬件框图:
P2.3
P2.3置0后,喇叭会发声,P2.3置1后,喇叭不响。
键盘自检硬件框图:
P2.5-2.7
P2.7
LED自检硬件框图:
P2.75
…………
四、三个自检程序清单:
(1)蜂鸣器自检程序
主程序开始
注:
以下所有框图中的判断框顺序执行都是默认为“Y”
伪指令定义变量
把循环初值给R4
开蜂鸣器
延时
关闭蜂鸣器
延时
修改延时参数
R4=0吗?
Y
NO1EQU012H
NO2EQU0AH
NO3EQU20H
NO4EQU0AH;伪指令定义变量
START:
MOVR4,#NO4;赋初值控制循环次数
MOVR0,#NO1;赋初值用于修改延时参数
LOOP:
SETBP2.7;关喇叭
ACALLDELAY;调用延时
CLRP2.7;开喇叭
ACALLDELAY;调用延时
MOVA,R0
ADDA,#NO3;修改延时参数
MOVR0,A
DJNZR4,LOOP;R4为零时,转跳到LOOP
AJMPSTART;转跳到START
DELAY:
MOVA,R0;延时子程序
LP1:
MOVA,R0
MOVR3,A
LP2:
DJNZR3,LP2
DJNZR2,LP1
RET
2、七段LED显示器的自检程序
开始
选定第一位
显示第一位字段子程序
Beep子程序
四位计数器R4=4
送位选
R4=0吗?
显示字段子程序
Beep子程序
R4减1
WEI1:
CLRP2.5;选定第一位
CLRP2.6
CLRP2.7
LCALLDUAN1;调用第一位字段子程序
WEIXH:
MOVR4,#04H;后四位计数器初始化
MOVR3,#0
LOOP:
MOVDPTR,#WEI;送位首地址
MOVA,R3
MOVCA,@A+DPTR
MOVP2,A;送位选
LCALLDUAN;送字形
CALLBEEP;蜂鸣器响
INCR3
DJNZR4,LOOP;四位没有检查完继续检查
SJMPWEI1
DUAN:
MOVDPTR,#ZIDUAN;18个字段表的表首地址给dptr
MOVR0,#18H;a到h,1到f共18个字形计数器
LP:
MOVA,#0
MOVCA,@A+DPTR
MOVP0,A
LCALLDELAY
INCDPTR
DJNZR0,LP;18个字形显示完否则继续循环
RET
DUAN1:
MOVP0,#01H;送字形b
CALLDELAY
MOVP0,#04H;送字形c
CALLDELAY
MOVP0,#08H;送字形g
CALLDELAY
MOVP0,#80H;送字形1
CALLDELAY
MOVP0,#0CH
CALLDELAY
MOVP0,#8CH;送字形-1
CALLBEEP
CALLDELAY
RET
DELAY:
MOVR1,#20H;延时子程序
LP1:
MOVR2,#064H
LP2:
MOVR5,#032H
LP3:
DJNZR5,LP3
DJNZR2,LP2
DJNZR1,LP1
RET
BEEP:
CLRP2.3;蜂鸣器字程序
CALLDELAY
SETBP2.3
RET
WEI:
DB09FH,5FH,0CFH,3FH;位表
ZIDUAN:
DB01H,02H,04H,08H,10H,20H,40H,80H,
7EH,0CH,0B6H,9EH,0CCH,0DAH,0FAH,
0EH,0FEH,0DEH,0EEH,0F8H,72H,0BCH,0F2H,0E2H,;字形表
3、键盘自检程序
程序框图
开始
信号采集
有键按下
等待10ms
仍有键按下
蜂鸣器发声,显示第几个开关按下
按键是否释放
返回采集下一个按键
START:
MOVR0,#4H
LCALLSEL8;开三态门
MOVP1,#0FFH;开始采集信号
MOVA,P1
LCALLSEL7;关三态门
SJMPJP1
RET
JP1:
RRCA;带进位位循环,判断是否有键按下
JNCJP2
DJNZR0,JP1
SJMPSTART;无键按下跳回
RET
JP2:
CALLDELAY10
MOVR2,#4H
LCALLSEL8
MOVP1,#0FFH
MOVA,P1
LCALLSEL7
MOVR3,A;调用延时,再次采集按键
SJMPJP3
RET
JP3:
RRCA;利用带进位位右移判断是否有键按下
JNCJP4;有键按下执行JP4子程序
DJNZR2,JP3
JP4:
CLRP2.3
LCALLDELAY
SETBP2.3
XIANSHI:
MOVDPTR,#WEI
DECR2
MOVA,R2
MOVCA,@A+DPTR
MOVP2,A;选择LED
MOVDPTR,#ZIDUAN
MOVA,R2
MOVCA,@A+DPTR
MOVP0,A;显示字型
LCALLDELAY
JP5:
LCALLSEL8
MOVP1,#0FFH
MOVA,P1
LCALLSEL7
SWAPA;A寄存器内容高四位低四位交换
LL:
RLCA;带进位位循环左移
DJNZR2,LL
JNCJP5;键未松开,采集按键
SJMPSTART;键松开采集下一按键
RET
SEL7:
CLRP2.7;关闭采集
SETBP2.6
SETBP2.5
RET
SEL8:
SETBP2.7;开始采集
SETBP2.6
SETBP2.5
RET
DELAY10:
MOVR6,#64H;延时十毫秒子程序
L1:
MOVR7,#32H
L2:
DJNZR7,L2
DJNZR6,L1
RET
DELAY:
MOVR6,#0AFH;一般延时子程序
L3:
MOVR7,#08FH
L4:
DJNZR7,L4
DJNZR6,L3
RET
WEI:
DB09FH,05FH,0CFH,03FH;位选表
ZIDUAN:
DB0CCH,9EH,0B6H,0CH;数字显示表
五、主任务:
题目1:
电子秒表
一级框图
主程序开始
RETI
驱动跑表
K2跑表键按下次数=0?
驱动时钟
中断子程序
开始
键盘扫描、处理
显示标志位psw.5=0?
跑表显示
时钟显示
二级框图把一级框图细化为了方便表达所以进行模块化
模块一时钟显示模块
定时器重装启动
中断计数器加1
R0=100?
30h单元加1
30h单元=10?
30h单元清零,31h加1
31h单元=6?
31h单元清零,32h加1
32h单元=10?
32h单元清零,33h加1
33h单元=6?
30、31、32、33h单元清零
模块二跑表显示模块
K2键按下次数=1?
K2=2?
中断计数器加1
K2=3?
K2=4?
R0=100?
K2=5?
34h单元加1
K2计数器清零
34h单元=10?
34h单元清零,35h加1
34、35、36、37单元清零
35h单元=6?
35h单元清零,36h加1
36h单元=10?
36h单元清零,37h加1
37h单元=6?
37、34、35、36h单元清零
模块三键盘扫描模块
延时
K2按下吗?
切换显示PSW.5标志位取反
K1松开吗?
K1按下吗?
K1按下吗?
延时
K2按下吗?
K2按下计数器加1
K2松开吗?
模块四显示模块
选中时钟秒位
选中时钟秒位
切换显示标志位PSW.5=0?
送30H字型
送30H字型
延时
延时
选中时钟十秒位
选中时钟十秒位
送31H字型
送31H字型
延时
延时
选中时钟分位
选中时钟分位
送32H字型
送32H字型
选中时钟十分位
选中时钟十分位
送33H字型
送33H字型
延时
延时
ORG0000H;跳过中断
SJMPMAIN
ORG000BH;保留中断入口地址
SJMPINT0
SHI1EQU30H;符号定义,方便理解
SHI2EQU31H
SHI3EQU32H
SHI4EQU33H
PAO1EQU34H
PAO2EQU35H
PAO3EQU36H
PAO4EQU37H
MAIN:
MOVIE,#82H;开中断
MOVTMOD,#01H
MOVTH0,#0D8H
MOVTL0,#0F0H;定时器初始化
MOVSHI1,#0;存储区初始化
MOVSHI2,#0
MOVSHI3,#0
MOVSHI4,#0
MOVPAO1,#0
MOVPAO2,#0
MOVPAO3,#0
MOVPAO4,#0
MOVDPTR,#DUANMA
MOVR0,#0;时钟中断计数器
MOVR1,#0;跑表中断计数器
MOVR3,#0
SETBTCON.4;启动定时器
KEY1:
MOVp1,#0FFH;p1位输入口
CALLSEL8;开三态
MOVA,p1;读入数据
CALLSEL7;关三态
JBACC.3,KEY2
CALLKEYDELAY;消抖
MOVp1,#0FFH
CALLSEL8
MOVA,p1
CALLSEL7
JBACC.3,KEY2
P20:
MOVp1,#0FFH
CALLSEL8
MOVA,p1
CALLSEL7
JNBACC.3,P20;松手检测
CPLPSW.5;k1按下,给显示标志位取反
KEY2:
MOVp1,#0FFH;此段统计k2按下的次数
CALLSEL8
MOVA,p1
CALLSEL7
JBACC.2,p10
CALLKEYDELAY;消抖
MOVp1,#0FFH
CALLSEL8
MOVA,p1
CALLSEL7
JBACC.2,p10
P40:
MOVp1,#0FFH
CALLSEL8
MOVA,p1
CALLSEL7
JNBACC.2,P40;松手检测
INCR3;k2按下,给k2计数器加1
D1:
JBPSW.5,DD1;psw、5位1显示跑表缓冲区的数据。
否则显示时钟缓冲区的数据
CALLPLAYSHI
AJMPD1
DD1:
CALLPLAYPAO
AJMPD1
INT0:
MOVIE,#82H;中断子程序开始
MOVTMOD,#01H
MOVTH0,#0D8H
MOVTL0,#0F0H
SETBTCON.4;定时器重装并启动
INCR0;没中断一次,给计数器加1
CJNER0,#100,P10;中断满100次够1秒,才给时钟最低位加1
MOVR0,#00H;接下来是时钟调整段,本位满清零,给高位加1
MOVR2,#01H
MOVA,SHI1
ADDA,R2
MOVSHI1,A
CJNEA,#0AH,P10
MOVA,#0
MOVSHI1,A
MOVR2,#01H
MOVA,SHI2
ADDA,R2
MOVSHI2,A
CJNEA,#06H,P10
MOVA,#0
MOVSHI2,A
MOVR2,#01H
MOVA,SHI3
ADDA,R2
MOVSHI3,A
CJNEA,#0AH,P10
MOVA,#0
MOVSHI3,A
MOVR2,#01H
MOVA,SHI4
ADDA,R2
MOVSHI4,A
CJNEA,#06H,P10
MOVSHI1,#0
MOVSHI2,#0
MOVSHI3,#0
MOVSHI4,#0
P10:
CJNER3,#01,ZT;当k2按下一次的时候,让跑表跑起
INCR1;启动跑表以后单独给跑表统计中断次数
CJNER1,#100,JIESHU;中断满100够1秒,地位进1
MOVR1,#00H
MOVR2,#01H
MOVA,PAO1
ADDA,R2
MOVPAO1,A
CJNEA,#0AH,JIESHU;秒位满10本位清零,前位加1
MOVA,#0
MOVPAO1,A
MOVR2,#01H
MOVA,PAO2
ADDA,R2
MOVPAO2,A
CJNEA,#06H,JIESHU;十秒位满6.本位清零,前位加1
MOVA,#0
MOVPAO2,A
MOVR2,#01H
MOVA,PAO3
ADDA,R2
MOVPAO3,A
CJNEA,#0AH,JIESHU;分位满10,本位清零,前位加1
MOVA,#0
MOVPAO3,A
MOVR2,#01H
MOVA,PAO4
ADDA,R2
MOVPAO4,A
CJNEA,#06H,JIESHU;最高位满6,所有清零
MOVPAO1,#0
MOVPAO2,#0
MOVPAO3,#0
MOVPAO4,#0
AJMPJIESHU
ZT:
CJNER3,#2,JIXU;当k2按下第二次时暂停
AJMPJIESHU
JIXU:
CJNER3,#3,ZZT;当k2按下第三次时跑表继续
AJMPJIXUPAO
ZZT:
CJNER3,#4,QL;当k2按下第四次时跑表继续
AJMPJIESHU
QL:
CJNER3,#5,JIESHU;k2按下第五次跑表清零
MOVR3,#0
MOVPAO1,#0
MOVPAO2,#0
MOVPAO3,#0
MOVPAO4,#0
JIESHU:
RETI;中断子程序结束
DELAY:
MOVR7,#125;显示延时子程序
LP1:
MOVR6,#6
DJNZR6,$
DJNZR7,LP1
RET
KEYDELAY:
MOVR7,#250;键扫描延时子程序
K1:
MOVR6,#10
DJNZR6,$
DJNZR7,K1
RET
SEL7:
CLRP2.7;关三态子程序
SETBP2.6
SETBP2.5
RET
SEL8:
SETBP2.7;开三态子程序
SETBP2.6
SETBP2.5
RET
PLAYSHI:
MOVP0,#00H;显示时钟最低位
SETBP2.5
CLRP2.6
CLRP2.7
MOVA,SHI1
MOVCA,@A+DPTR
MOVP0,A
CALLDELAY
MOVP0,#00H;显示时钟第二位
CLRP2.5
SETBP2.6
SETBP2.7
MOVA,SHI2
MOVCA,@A+DPTR
MOVP0,A
CALLDELAY
MOVP0,#00H;显示时钟滴三位
CLRP2.5
SETBP2.6
CLRP2.7
MOVA,SHI3
MOVCA,@A+DPTR
MOVP0,A
CALLDELAY
MOVP0,#00H;显示时钟最高位
CLRP2.5
CLRP2.6
SETBP2.7
MOVA,SHI4
MOVCA,@A+DPTR
MOVP0,A
CALLDELAY
RET
PLAYPAO:
MOVP0,#00H;显示跑表最低位
SETBP2.5
CLRP2.6
CLRP2.7
MOVA,PAO1
MOVCA,@A+DPTR
MOVP0,A
CALLDELAY
MOVP0,#00H;显示跑表第二位
CLRP2.5
SETBP2.6
SETBP2.7
MOVA,PAO2
MOVCA,@A+DPTR
MOVP0,A
CALLDELAY
MOVP0,#00H;显示跑表第三位
CLRP2.5
SETBP2.6
CLRP2.7
MOVA,PAO3
MOVCA,@A+DPTR
MOVP0,A
CALLDELAY
MOVP0,#00H;显示跑表最高位
CLRP2.5
CLRP2.6
SETBP2.7
MOVA,PAO4
MOVCA,@A+DPTR
MOVP0,A
CALLDELAY
RET
DUANMA:
DB7EH,0CH,0B6H,9EH,0CCH,0DAH,0FAH,0EH,0FEH,0DEH;字形码值表
END
6、设计体会
一、为期两周的单片机实训真的让我学到了许多东西,尤其是对课堂上的知识进行了弥补,而且有对这门课有了新的认识,及了解,在学习这门理论课时,并没有感觉到他有多么难,但是到了实训上才感觉到运用这些知识并不是这么简单,而且还需要更多的知识补充。
单片机比起其他编程来说优点颇多,它硬件简单,而且可以做很多比较实际的事情,易于我们理解应用,而且编程简单。
通过我对多种编程语言的学习,我认为其实它们都是差不多的,主要是编程思路,就看编者是怎么去处理问题。
在这期间我深刻的认识到了理论知识和实践操作必须是相结合的,也是教
学环节中相当重要的一个环节,只有这样才能提高自己的实际操作能力,并且
可以从中培养自己的独立思考,勇于克服困难和团队的协作精神,这次的实训我学到许多的许多东西,会在我今后的单片机学习中让我获益匪浅。
-----雷锋1
二、单片机试训过程中遇到了许多的问题,最大的问题是不会画主程序流程图,不是划分得太细就是划分得态笼统,很难拿捏。
总的来说,做的的问题是不能实现模块化程序结构设计。
对模块化程序设计的理解不足。
通过实训,我觉得编程离不开硬件,在编程之前要对硬件电路十分来了解,知道每个器件的作用。
比如蜂鸣器的实验到底是清零响还是给高电平响,必须对三极管了解的一清二楚。
在次实验中,三极管只有饱和导通状态和截止状态,没有放大区状态。
单片机三点复位时候的状态在编程的时候要给与考虑。
编程要精良简洁,必须模块化。
每一个子程序完成一个简单的功能,保证每一个子程序代码都是健壮的。
虽然之前没有什么编程的经历,但是通过这次实训以后,不能再以没有经验为借口编出又臭又长的程序了,堆码可耻。
-----雷锋叔叔
三、关于利用计算机编程方面,我们学习过C语言编程,微型计算原理的编程,以及现在的单片机编程,虽然在智能仪表课程中有涉及单片机编程的知识,但只是皮毛,由于未有详细介绍我也未对其进行深入的了解。
通过单片机应用技术课程的学习,对这种编程的方法有了深入的了解。
至于语言的应用不过就是学习语言,了解每个语句的功能便可应用自如,并不是很难,毕竟我们十万机器的,不能被机器玩。
以上是我此次实训编程的看法,下面就简单的谈谈我的收获吧。
实训中我是同我们宿舍其他两人组队,实力还算可以,对程序都有自己的想法,所以过程中我们小组是先各自提出自己的想法,然后讨论谁的方法可行,比较好,我们就采用谁的,然后集体解决问题。
这不紧调动了每位组员的积极性,而且在编程过程中我们取长补短,使自己的实践能力有所增强。
总的来说我们组合作比较愉快,编程过程中没有多大压力,期间我对已学习的语言应用自如,我的语言沟通能力也有所提高,毕竟我需要把自己的思想让别人了解。
相信以后实践中我可以做的更好。
----雷锋2
七、参考资料
1、《单片机系统综合设计与实践》教材主编:
裴岩刘利民内蒙古大学出版社。
2、《单片机应用及原理》教材主编:
李建忠西安电子科技大学出版社