内蒙古工业大学单片机实训蜂鸣器键盘数码管.docx

上传人:b****5 文档编号:6108695 上传时间:2023-01-03 格式:DOCX 页数:22 大小:171.46KB
下载 相关 举报
内蒙古工业大学单片机实训蜂鸣器键盘数码管.docx_第1页
第1页 / 共22页
内蒙古工业大学单片机实训蜂鸣器键盘数码管.docx_第2页
第2页 / 共22页
内蒙古工业大学单片机实训蜂鸣器键盘数码管.docx_第3页
第3页 / 共22页
内蒙古工业大学单片机实训蜂鸣器键盘数码管.docx_第4页
第4页 / 共22页
内蒙古工业大学单片机实训蜂鸣器键盘数码管.docx_第5页
第5页 / 共22页
点击查看更多>>
下载资源
资源描述

内蒙古工业大学单片机实训蜂鸣器键盘数码管.docx

《内蒙古工业大学单片机实训蜂鸣器键盘数码管.docx》由会员分享,可在线阅读,更多相关《内蒙古工业大学单片机实训蜂鸣器键盘数码管.docx(22页珍藏版)》请在冰豆网上搜索。

内蒙古工业大学单片机实训蜂鸣器键盘数码管.docx

内蒙古工业大学单片机实训蜂鸣器键盘数码管

学校代码:

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、《单片机应用及原理》教材主编:

李建忠西安电子科技大学出版社

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 考试认证 > 其它考试

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1