第07章 单片机应用系统中的按键与显示 习题解答.docx
《第07章 单片机应用系统中的按键与显示 习题解答.docx》由会员分享,可在线阅读,更多相关《第07章 单片机应用系统中的按键与显示 习题解答.docx(19页珍藏版)》请在冰点文库上搜索。
第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题答案