1、设计一个2*2的行列式键盘(同在P1口)电路并编写键扫描程序。
#include
unsigned char row,col=0,k =-1; P1=0xfc;
if((P1&0xfc)==0xfc) return(k); delay20ms(); if((P1&0xfc)==0xfc) return(k);
for(row=0;row<2;row++) {
P1=~(1< while(k&(1<<(col+2))) col++; k=row*2+col; P1=0xfc; while(P1&0xfc!=0xfc); break; } } return k; } 2、 编写一函数to_asc,把传送给它的低半字节数据转换成ASCII码,并将其返回。 unsigned char to_asc(char d) { d+=0x30; if(d>0x39) d+=7; return d; } 3、 使用89C52串行口以工作方式3进行串口通信,假定波特率为9600b/s,单片机晶振频率为11.0592MHz。请编写全双工通信程序,以中断方式接受和发送数据,并对数据进行奇偶校验。设发送的50个数据在片外数据区,地址从0x0010开始的区域,接收的数据保存0x80开始的区域,接收到‘$’后表示结束。 #include unsigned char xdata *SendBuffer=0x0010; unsigned char xdata *RecvBuffer=0x0080; unsigned char i,j; bit SendOver,RecvOver; void main() { TMOD=0x20; TH1=0xfd; Tl1=0xfd; TR1=1; SCON=0xc0; ES=1; EA=1; ACC=SendBuffer[i++]; TB8=P; SBUF=ACC; while(1); } void Serial() interrupt 4 { if(TI) { TI=0; ACC=SendBuffer[i++]; TB8=P; SBUF=ACC; if(i==50) SendOver=1; } else { RI=0 ACC=SBUF; if(RB8==P) { RecvBuffer[j++]=ACC; if(ACC=='$') RecvOver=1; } } } 4、写出单片机C语言程序中语句“TMOD=0x23;”的功能。 设置T以模式2定时,设置T0以模式3定时。 5、编写一函数,查找片外RAM区域中从0x0100开始的200个单元中出现的0xaa的次数,并将查找的结果从函数中返回。 unsigned char find(void) { unsigned char data i, d=0; unsigned char xdata *p; i=200; p=0x0100; while(i--) if(*(p++)==0xaa) d++; return d; } 6、对89C52单片机编写程序,使串行口以方式1查询方式自收自发(接收和发送都需要查询),波特率为4800b/s.设单片机的晶振为11.0592MHZ。 #include unsigned char c; TMOD=0x20; TH1=0xfa;