P3=0x01; for(i=0;i<5;i++) {
if(P17==1) P1=tab1[i]; else P1=tab2[i]; P3<<=1;
for(j=0;j<=25000;j++); } } }
3、设计一60秒倒计时时钟电路,时间到,P3.7输出报警,画出电路原理图并编写程序。 答: #include
sbit P17=P1^7;
unsigned char a[]={0x3f,0x6f,0x7f,0x07,0x7d,0x6d,0x66,0x4f,0x5b,0x06}; unsigned char i,j,k,m,n; unsigned char count1,count2; void Timer(void) interrupt 1 {
count1++; if(count1==20) { i++; count2++; count1=0; }
if(count2==10) { i=0;
9
count2=0; } if(i==1) { j++; }
if((i==1)&&(j==10)) { j=0; }
if((j==0)&&(i==0)) {
for(k=0;k<20000:k++) { P37=0;
for(m=0;m<100;m++); P37=1;
for(n=0;n<100;n++); }
TH0=(65536-50000)/256;TL0=(65536-50000)%6;} Main() { P37=1; EA=1; ET0=1; TR0=1; TMOD=0X01;
TH0=(65536-50000)/256; TL0=(65536-50000)%6 While(1) { P1=a[i];
10
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