第07章 单片机应用系统中的按键与显示 习题解答.docx

上传人:b****7 文档编号:10319720 上传时间:2023-02-10 格式:DOCX 页数:19 大小:220.16KB
下载 相关 举报
第07章 单片机应用系统中的按键与显示 习题解答.docx_第1页
第1页 / 共19页
第07章 单片机应用系统中的按键与显示 习题解答.docx_第2页
第2页 / 共19页
第07章 单片机应用系统中的按键与显示 习题解答.docx_第3页
第3页 / 共19页
第07章 单片机应用系统中的按键与显示 习题解答.docx_第4页
第4页 / 共19页
第07章 单片机应用系统中的按键与显示 习题解答.docx_第5页
第5页 / 共19页
点击查看更多>>
下载资源
资源描述

第07章 单片机应用系统中的按键与显示 习题解答.docx

《第07章 单片机应用系统中的按键与显示 习题解答.docx》由会员分享,可在线阅读,更多相关《第07章 单片机应用系统中的按键与显示 习题解答.docx(19页珍藏版)》请在冰豆网上搜索。

第07章 单片机应用系统中的按键与显示 习题解答.docx

第07章单片机应用系统中的按键与显示习题解答

第7章单片机应用系统中的按键与显示习题解答

一、填空题

1.键盘抖动可以使用硬件和软件两种办法消除。

2.液晶显示的优点是:

液晶显示的优点是:

与数码管相比,显示内容多,可显示数字、字符,甚至汉字和图形。

3.键盘中断扫描方式的特点是提高了CPU的工作效率。

4.数字5的共阴极七段LED显示代码是6DH,数字5的共阳极七段LED显示代码是92H。

5.液晶显示模块(LCM)是指将液晶显示模块(LCM)是指将控制器、驱动器、显示器集成在一起的器件。

二、简答题

1.何谓LED静态显示?

何谓LED动态显示?

两种显示方式各有何优缺点?

答:

LED静态显示是指数码管显示某一字符时,相应的发光二极管恒定导通或恒定截止,公共端恒定接地(共阴极)或接正电源(共阳极)。

LED动态显示是一位一位地轮流点亮各位数码管的显示方式,每位数码管点亮的时间大约在lms左右。

但由于LED具有余辉特性以及人眼也有视觉暂留特性,使人看起来就好像在同时显示不同的字符一样。

静态显示的优点是,显示控制程序简单,显示亮度大,节约单片机工作时间。

静态显示的缺点是,在显示位数较多时,静态显示占用的I/O口线较多,或者需要增加额外的硬件电路,硬件成本较高。

动态显示的优点是,可以大大简化硬件线路。

动态显示的缺点是,要循环执行显示程序,对各个数码管进行动态扫描,消耗单片机较多的运行时间;在显示器位数较多或刷新间隔较大时,会有一定的闪烁现象,显示亮度较暗。

2.简述用RS触发器消除按键抖动的基本原理。

答:

RS触发器消除按键抖动的常用电路如图7-3所示。

图中用两个与非门构成一个RS触发器。

当按键未被按下而处于A处时,触发器输出为“1”。

当按键按下处于B处时,输出为“0”。

此时即使由于按键的机械弹性,因抖动产生瞬间断开,只要按键不返回原始状态A,双稳态电路的状态就不改变,输出保持为“0”,不会产生抖动。

3.设有一个单片机应用系统用三个LED数码管显示运行结果,电路如图7-22所示。

显示数据的显示代码已分别存储在内部RAM32H~30H中(百位在32H)。

编写程序,实现静态显示。

图7-22简答题3的图

答:

汇编语言参考答案:

(此图中,请将74164的Q0~Q7接数码管的Dp~a,或对显示内容从高到低逐位转换)

ORG0000H;在0000H单元存放转移指令

SJMPMAIN;转移到主程序

ORG0030H;程序从0030H开始

MAIN:

MOV32H,#5;百位

MOV31H,#4;十位

MOV30H,#3;个位

MOVSCON,#00H;初始化串行口方式0

START:

MOVDPTR,#TAB;字形表的入口地址

MOVR0,#30H;显示数的初始地址

LOOP:

MOVA,@R0;取待显示数据

MOVCA,@A+DPTR;查表获取字型码

MOVSBUF,A;送串口显示

JNBTI,$;等待发送完毕

CLRTI;清发送标志

INCR0;地址加一,准备取下一个待显示数

CJNER0,#33H,LOOP;判断3个数据是否显示完

SJMP$;显示结束

TAB:

DB0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H;段码表

;0123456789对应内容

END;程序结束

C语言参考答案:

#include//预处理命令,定义SFR的头文件

charcodeTAB[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};

//段码表

unsignedcodedis_code[3]={0x5,0x4,0x3};//待显示数据

main()

{

inti,dis;//定义变量i,dis

SCON=0x00;//初始化串行口方式0

for(i=2;i>=0;i--)//3位显示循环

{

dis=dis_code[i];//取待显示位数

SBUF=TAB[dis];//取待显示数的字型码

while(TI==0);//等待发送完毕

TI=0;//清发送标志

}

while

(1);//显示结束

}

Proteus仿真图如下所示:

4.设有一个LED数码管动态显示电路如图7-23所示。

已知显示代码存储在内部RAM30H开始的8个单元中,编写程序,动态显示给定的信息。

图7-23简答题4的图

答:

汇编语言参考答案:

(用Proteus仿真画图的时候,P0口需接上拉电阻)

ORG0000H;在0000H单元存放转移指令

SJMPMAIN;转移到主程序

ORG0030H;程序从0030H开始

MAIN:

MOV30H,#00H;给内部RAM30H开始的8个单元内容赋值

MOV31H,#01H

MOV32H,#02H

MOV33H,#03H

MOV34H,#04H

MOV35H,#05H

MOV36H,#06H

MOV37H,#07H

MOVDPTR,#TAB;共阴字形表的入口地址

LOOP:

MOVR0,#30H;待显示数的首地址

MOVR1,#00H;控制位选信号

LOOP1:

MOVP1,R1;送位选信号

MOVA,@R0;取待显示数

MOVCA,@A+DPTR;取待显示数据的字型码

CLRP2.7;选通74LS377允许控制端

MOVP0,A;送字形

LCALLDELAY;调用延时

INCR1;选通下一位

INCR0;地址加一,准备取下一个待显示数

CJNER0,#38H,LOOP1;判断8个数据是偶显示完

SJMPLOOP;重新开始显示

DELAY:

MOVR5,#10;延时程序,给R5赋值

DEL0:

MOVR6,#1;给R6赋值

DEL1:

MOVR7,#20;给R7赋值

DEL2:

DJNZR7,DEL2;R7减1不等于0继续执行该行

DJNZR6,DEL1;R6减1不等于0跳到DEL1处

DJNZR5,DEL0;R5减1不等于0跳到DEL0处

RET;子程序返回

TAB:

DB3FH,06H,05BH,04FH,66H,6DH,7DH,07H;段码表

;01234567对应内容

DB7FH,6FH,77H,7CH,39H,5EH,79H,71H

;89ABCDEF

END

C语言参考答案:

#include//预处理命令,定义SFR的头文件

sbitP2_7=P2^7;

charcodeTAB[16]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,

0x77,0x7c,0x39,0x5e,0x79,0x71};//段码表

unsignedcodedis_code[8]={0x0,0x1,0x2,0x3,0x4,0x5,0x6,0x7};//待显示数据

voiddelay1ms(void)//延时1ms函数

{

unsignedchartemp=249;//声明变量temp,并赋值249

while(--temp);//temp是否减到0,否则继续执行该行

temp=249;//给变量temp赋值

while(--temp);//temp是否减到0,否则继续执行该行

}

voidmain(void)//主函数

{

inti,dis;//定义变量i的数据类型

do{//dowhile组成循环

unsignedchardsSe1=0x00;//定义变量dsSe1,并赋值0

for(i=0;i<8;i++)//8位显示循环

{

P1=dsSe1;//送字位

dis=dis_code[i];//取待显示数

P2_7=0;//选通74LS377允许控制端

P0=TAB[dis];//取待显示数的字形

delay1ms();//延时1ms

dsSe1++;//字位加1,选送下一位

}

}

while

(1);

}

Proteus仿真图如下所示:

5.有一个单片机显示电路如图7-24所示。

图中4511是BCD码锁存/七段LED译码器/驱动器,当其输入为BCD码时,输出为七段LED数码管显示代码。

设要显示的BCD码数据存储在内部RAM30H~32H中。

编写程序,实现指定数据的静态显示。

图7-24简答题5的图

答:

汇编语言参考答案:

ORG0000H;在0000H单元存放转移指令

SJMPMAIN;转移到主程序

ORG0030H;程序从0030H开始

MAIN:

MOV32H,#5;百位

MOV31H,#4;十位

MOV30H,#3;个位

LOOP:

MOVA,30H;取个位

ORLA,#0E0H;清P1.4位,选通个位显示

MOVP1,A;送个位显示

MOVA,31H;取十位

ORLA,#0D0H;清P1.5位,选通十位显示

MOVP1,A;送十位显示

MOVA,32H;取百位

ORLA,#0B0H;清P1.6位,选通白位显示

MOVP1,A;送百位显示

SJMP$;等待

END;程序结束

C语言参考答案:

#include//预处理命令,定义SFR的头文件

unsignedcodedis_code[3]={0x5,0x4,0x3};//待显示数据

voidmain(void)//主函数

{

P1=dis_code[2]|0xe0;//显示个位

P1=dis_code[1]|0xd0;//显示十位

P1=dis_code[0]|0xb0;//显示百位

while

(1);

}

Proteus仿真图如下所示:

三、Proteus仿真

1.在Proteus下,仿真实现7.7节内容。

答:

全自动洗衣机洗衣流程Proteus仿真

设洗衣机洗衣流程有三道程序:

进水、洗涤、甩干。

按下“启动”键,开始洗衣流程。

首先进水,“进水”指示灯亮,用LED发光二极管指示;定时10秒,用2位LED数码管显示。

然后洗涤,“洗涤”指示灯亮,定时10秒。

最后甩干,“甩干”指示灯亮,定时10秒。

洗衣流程结束后,扬声器发声提示。

电路如图7-20所示。

图7-20洗衣流程控制原理

汇编语言参考程序如下:

ORG0000H;在0000H单元存放转移指令

LJMPMAIN;转移到主程序

ORG000BH;定时/计数器T0的中断入口地址

LJMPTime0;转到定时/计数器T0的中断服务程序Time0

ORG0100H;主程序从0100H开始

MAIN:

JBP1.7,MAIN;判按键是否按下,为0即按下,顺序执行,否则等待。

LCALLDISPLAY;有键按下,延时去抖动

JBP1.7,MAIN;再判有键按下

MOVP1,#0EH;确定键按下,A灯亮,开始放水定时

MOVR0,#00H;R0放3个阶段的工作标志

MOVR1,#00H;R1放定时器的中断计数

SETBEA;开中断总开关

SETBET0;开定时/计数器T0

MOVTMOD,#01H;设定时/计数器T0工作方式1

MOVTH0,#3CH;定时50ms高8位初值

MOVTL0,#0B0H;定时50ms低8位初值

SETBTR0;启动定时/计数器T0

SJMP$;等待定时

;定时/计数器T0中断服务程序

Time0:

CJNER0,#00H,L1;R0的内容为标志,若R0=0,执行第1阶段定时(放水功能)

INCR1;R1内容加1

MOVA,R1;R1的内容送到A

MOVB,#20;B寄存器送立即数20

DIVAB;计算时间秒

MOVB,#10;B寄存器送立即数10

DIVAB;秒分成个位和十位

MOVDPTR,#DTAB;字形表头地址送DPTR

MOVCA,@A+DPTR;秒十位查字形码

MOVP0,A;十位字形送P0口显示

MOVA,B;秒个位送A寄存器

MOVCA,@A+DPTR;秒个位查字形码

MOVP2,A;个位字形送P2口显示

CJNER1,#200,L4;若累计满200次,即计时满10s

MOVP1,#0DH;A灯灭,结束放水,B灯亮,开始洗涤

MOVR1,#00H;R1内容清0,重新从0开始计数

INCR0;R0内容加1,准备第2阶段的定时

SJMPL4;转L4,送初值,中断返回

L1:

CJNER0,#01H,L2;若R0=1,执行第2阶段定时(洗涤功能)

INCR1;R1内容加1

MOVA,R1;R1的内容送到A

MOVB,#20;B寄存器送立即数20

DIVAB;计算时间秒

MOVB,#10;B寄存器送立即数10

DIVAB;秒分成个位和十位

MOVDPTR,#DTAB;字形表头地址送DPTR

MOVCA,@A+DPTR;秒十位查字形码

MOVP0,A;十位字形送P0口显示

MOVA,B;秒个位送A寄存器

MOVCA,@A+DPTR;秒个位查字形码

MOVP2,A;个位字形送P2口显示

CJNER1,#200,L4;若累计满200次,即计时满10s

MOVP1,#0BH;B灯灭,结束洗涤,C灯亮,开始甩干

MOVR1,#00H;R1内容清0,重新从0开始计数

INCR0;R0内容加1,准备第3阶段的定时

SJMPL4;转L4,送初值,中断返回

L2:

CJNER0,#02H,L3;若R0=2,执行第3阶段定时(甩干功能)

INCR1;R1内容加1

MOVA,R1;R1的内容送到A

MOVB,#20;B寄存器送立即数20

DIVAB;计算时间秒

MOVB,#10;B寄存器送立即数10

DIVAB;秒分成个位和十位

MOVDPTR,#DTAB;字形表头地址送DPTR

MOVCA,@A+DPTR;秒十位查字形码

MOVP0,A;十位字形送P0口显示

MOVA,B;秒个位送A寄存器

MOVCA,@A+DPTR;秒个位查字形码

MOVP2,A;个位字形送P2口显示

CJNER1,#200,L4;若累计满200次,即计时满10s

MOVR1,#00H;将Countor清0,重新从0开始计数

INCR0;R0内容加1,准备第4阶段的工作

L3:

MOVP1,#07H;灯全灭,洗衣机结束工作

CPLP3.7;扬声器提醒

MOVP2,#0C0H;个位显示清零

MOVP0,#0C0H;十位显示清零

L4:

MOVTH0,#3CH;初值寄存器的高8位重新赋初值

MOVTL0,#0B0H;初值寄存器的低8位重新赋初值

RETI;中断返回

DISPLAY:

MOVR7,#10;延时子程序,送外循环时间常数

D1:

MOVR6,#255;送内循环时间常数

DJNZR6,$;内循环接送判断

DJNZR7,D1;外循环接送判断

RET;子程序返回

DTAB:

DB0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,;数码管字形码

DB80H,90H,88H,83H,0C6H,0A1H,86H,8EH

END;汇编结束

C语言参考程序如下:

#include//包含51单片机寄存器定义的头文件

#defineucharunsignedchar//定义缩写字符uchar

sbitP17=P1^7;//将P17位定义为P1.7引脚

sbitP37=P3^7;//将P37位定义为P3.7引脚

unsignedcharCountor,temp;//设置全局变量,储存定时器T0中断次数

unsignedcharf=0;//设置全局变量,作为区分不同阶段的定时

ucharcodeledvalue[17]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};

voiddelay1()//延时函数

{

intq;//定义变量q

for(q=0;q<500;q++);//循环500次

}

voidmain(void)//主函数

{

if(P17==0)//若P1.7=0,说明键按下,执行语句,否则一直等待。

{

delay1();//有键按下,延时去抖动

if(P17==0)//再判有键按下

{

P1=0x0e;//A灯亮,开始放水定时

EA=1;//开总中断

ET0=1;//定时器T0中断允许

TMOD=0x01;//使用定时器T0的模式1

TH0=(65536-46083)/256;//定时器T0的高8位赋初值,定时50ms

TL0=(65536-46083)%256;//定时器T0的低8位赋初值

TR0=1;//启动定时器T0

}

while

(1);//无限循环等待中断

}

}

voidTime0(void)interrupt1using1//"interrupt"声明函数为中断服务函数

{TL0=(65536-46083)%256;//定时器T0的低8位重新赋初值

TH0=(65536-46083)/256;//定时器T0的高8位重新赋初值

if(f==0)//f为标志变量,若f=0,执行第1阶段定时(放水功能)

{

Countor++;//Countor加1

temp=Countor/20;//计算秒

P2=ledvalue[temp%10];//显示秒个位

P0=ledvalue[temp/10];//显示秒十位

if(Countor==200)//若累计满200次,即计时满10s

{

P1=0x0d;//A灯灭,结束放水,B灯亮,开始洗涤

Countor=0;//将Countor清0,重新从0开始计数

f++;//f加1,准备第2阶段的定时

}

}

if(f==1)//若f=1,执行第2阶段定时(洗涤功能)

{

Countor++;//Countor加1

temp=Countor/20;//计算秒

P2=ledvalue[temp%10];//显示秒个位

P0=ledvalue[temp/10];//显示秒十位

if(Countor==200)//若累计满200次,即计时满10S

{

P1=0x0B;//B灯灭,结束洗涤,C灯亮,开始甩干

Countor=0;//将Countor清0,重新从0开始计数

f++;//f加1,准备第3阶段的定时

}

}

if(f==2)//若f=2,执行第3阶段定时(甩干功能)

{

Countor++;//Countor加1

temp=Countor/20;//计算秒

P2=ledvalue[temp%10];//显示秒个位

P0=ledvalue[temp/10];//显示秒十位

if(Countor==200)//若累计满200次,即计时满10S

{

P1=0x07;//灯全灭,洗衣机结束工作

Countor=0;//将Countor清0,重新从0开始计数

f++;//f加1,准备进入第4阶段。

}

}

if(f==3)//若f=3,执行进入第4阶段工作(扬声器提醒)

{

P1=0x07;//灯全灭,洗衣机结束工作

P37=~P37;//扬声器提醒

Countor=0;//将Countor清0,重新从0开始计数

P2=ledvalue[0];//秒个位清零

P0=ledvalue[0];//秒十位清零

}

}

2.在Proteus下,仿真实现简答题第4题内容。

答:

参见第4题答案

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

当前位置:首页 > PPT模板 > 商务科技

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

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