P30=0;P31=1; For(m=0;m<100;m++); P1=a[j]; P30=1;P31=0; For(n=0;n<100;n++); } }
第六 习题与思考题
1.为什么要消除按键的机械抖动?消除按键的机械抖动的方法有哪几种?原理是什么? 2.说明矩阵式键盘按键按下的识别原理。
3.用89c2051单片机的P1口,监测某一按键开关,使每按键一次,输出一个正脉冲(脉宽随意),画出电路并编出程序。
4.现用89C2051单片机的I/O口去检测开关S1、S2的通断状态,若S1接通,转去执行子程序SUB1;若S2接通,转去执行子程序SUB2;请画出电路连接图,并编制程序(要有消除开关抖动措施)。
5.设计一个键盘显示接口电路,要求用9个键盘(3×3)控制一位LED数码管,9个键盘依次代表数字键1---9,当按下某一数字键,LED数码管就显示这个数字(如按数字键5,LED数码管就显示5),若没有新的数字键按下,数码管显示值不变。请画出硬件控制线路图,编写控制软件。
6.利用89c2051单片机的P1.0-P1.3接四个发光二极管L1-L4,用来指示当前计数的数据;用P1.4-P1.7作为预置数据的输入端,接2个拨动开关K1、K4,用来作加计数和减计数开关。具体的电路原理图如下图所示
7.如图4.14.2所示,用AT89c2051的并行口P1接4×4矩阵键盘,以P1.0-P1.3作输入线,以P1.4-P1.7作输出线;在数码管上显示每个按键的“0-F”序号。
习题与思考题
1、 用89c2051单片机的P1口,监测某一按键开关,使每按键一次,输出一个正脉冲(脉
宽随意),画出电路并编出程序。 答: #include
11
sbit P3_7=P3^7;
unsigned char count; void delay10ms(void) {
unsigned char i,j; for(i=20;i>0;i--) for(j=248;j>0;j--); }
void main(void) {
while(1) {
if(P3_7= =0) {
delay10ms(); if(P3_7= =0) {
count++;
if(count= =16) {
count=0; }
P1= ~count;
while(P3_7= =0); //等待按键释放 } } } }
2、现用89C2051单片机的I/O口去检测开关S1、S2的通断状态,若S1接通,转去执行子程序SUB1;若S2接通,转去执行子程序SUB2;请画出电路连接图,并编制程序(要有消除开关抖动措施)。 #include
Unsigned a1[]={0x7f,0x3f,0x1f,0x0f,0x07,0x03,0x01,0x00}; Unsigned a2[]={0x01,0x03,0x07,0x0f,0x1f,0x3f,0x7f,0xff}; void delay10ms(void)
{
unsigned char i,j; for(i=20;i>0;i--) for(j=248;j>0;j--); }
Void sub1(void)
12
{
For(i=0;i<8;i++) {
P1=a1[i];
Delay 10ma(); } }
Void sub2(void) {
For(i=0;i<8;i++) {
P1=a2[i];
Delay 10ma(); } }
Main() {
While(1) {
If(P30==0) {
Delay 10ms(); If(P30==0) {
Sub1(); } }
If(P31==0) {
Delay 10ms(); If(P31==0) {
Sub2(); } } } } 4、利用89c2051单片机的P1.0-P1.3接四个发光二极管L1-L4,用来指示当前计数的数据;
13
用P1.4-P1.7作为预置数据的输入端,接四个拨动开关K1-K4,用P3.6/WR和P3.7/RD端口接两个轻触开关,用来作加计数和减计数开关。具体的电路原理图如下图所示
#include
unsigned char curcount;
void delay10ms(void) {
unsigned char i,j; for(i=20;i>0;i--) for(j=248;j>0;j--); }
void main(void) {
curcount=P3 & 0x0f; P1=~curcount; while(1) {
if(P3_6==0) {
delay10ms(); if(P3_6==0) {
if(curcount>=15) {
curcount=15; } else {
curcount++; }
P1=~curcount; while(P3_6==0); } }
if(P3_7==0) {
delay10ms(); if(P3_7==0) {
14
if(curcount<=0) {
curcount=0; } else {
curcount--; }
P1=~curcount; while(P3_7==0); } } } }
15
P3=FFH,P3.0=0 有键按下吗? 延时10ms 真得有键按下吗? 根据当前状态识别按键 P3=FFH,P3.1=0 有键按下吗? 延时10ms 真得有键按下吗? 根据当前状态识别按键 P3=FFH,P3.2=0 有键按下吗? 延时10ms 真得有键按下吗? 根据当前状态识别按键 P3=FFH,P3.3=0 有键按下吗? 延时10ms 真得有键按下吗? 根据当前状态识别按键 16