#include unsigned char xdata table[5]; unsigned char code tab[]={0x03,0x9f,0x25,0x0d, 0x99,0x49,0x41,0x1f, 0x01,0x09,0x05,0xc1, 0x63,0x85,0x61,0x71,0xff}; sbit ctrl=P1^2; sbit DATA=P1^0; sbit CLK=P1^1; void show(unsigned char m)//LED显示子程序 { unsigned char i,d; d=tab[m]; for(i=0;i<8;i++) { DATA=d&0x01; CLK=0; CLK=1; d=d>>1; } } void interrupt0(void) interrupt 0 using 0//串行中断程序 { unsigned char cm0,cm1,sum0,sum1,i; lab: sum0=0; ctrl=1;//将MAX485设置为发送方式 SBUF=0xFF;//发送数据申请 while(TI!=1); ctrl=0; //将MAX485设置为接收方式 TI=0; while(RI!=1); cm0=SBUF;//接收申请确认信号 RI=0; if(cm0==0xff) { i=0; ctrl=0; while(RI!=1); cm1=SBUF; //接收第一个数据 RI=0; while(cm1!=0xf0) { table[i]=cm1; while(RI!=1); cm1=SBUF;//接收后续的数据 RI=0; i++; } for(i=0;i<4;i++) sum0=sum0+table[i];//计算校验和 sum1=table[4];//获取收到的校验和 if(sum0==sum1) { ctrl=1; SBUF=0xf0; //发送数据确认信号 while(TI!=1); TI=0; for(i=0;i<4;i++) show(table[i]); } else goto lab; } else goto lab; ctrl=1;//将MAX485设置为发送方式 return ; } void main(void) { SCON = 0x50; //串口方式1,允许接收 TMOD = 0x20; //定时器1 定时方式2 PCON=0x80; //设SMOD=1; TH1 = 0xFA; //11.0592MHz 9600 波特率 TL1 = 0xFA; TR1 = 1; //启动定时器 EX0=1; //开外部中断0 IT0=0; EA=1; //开总中断 ctrl=1;//将MAX485设置为发送方式 while(1); //等待中断 } 附录二、从机源程序 #include unsigned char xdata table[]={0,0,0,0}; sbit replay=P1^0; sbit warn0=P1^1; sbit CTRL=P1^2; sbit DATA=P1^3; sbit CLK=P1^4; unsigned char code tab[]={0x03,0x9f,0x25,0x0d, //显示用的码表 0x99,0x49,0x41,0x1f, 0x01,0x09,0x05,0xc1, 0x63,0x85,0x61,0x71,0xff}; void delay(void) //键盘扫描延时10ms程序 { unsigned char i,j; for(i=20;i>0;i--) for(j=248;j>0;j--); } void show(unsigned char m)//LED显示子程序 { unsigned char i,d; d=tab[m]; for(i=0;i<8;i++) { DATA=d&0x01; CLK=0; CLK=1; d=d>>1; } } void ser(void) interrupt 4 using 0//串行中断程序 { unsigned char cm,sum,i; sum=0; replay=1; warn0=1; cm=SBUF; RI=0; if(cm==0xf0)//判断是否为主机返回的确认信号 { replay=0; //表示已正确发送完一组数据 goto end; } else if(cm!=0xff)//判断是否为主机的数据申请 { warn0=0; //通信命令错误提示 goto end; } else { CTRL=1; //置MAX485为发送方式 SBUF=0xff;//发送申请确认信号 while(TI!=1); TI=0; for(i=0;i<4;i++) { SBUF=table[i]; //发送数据 while(TI!=1); TI=0; sum=sum+table[i];//计算校验和 } SBUF=sum; //发送校验和 while(TI!=1); TI=0; SBUF=0xf0;//发送结束标志 while(TI!=1); TI=0; } end: CTRL=0; //置MAX485为接收方式 return; } void main(void) { unsigned char key,X,Y,temp; SCON = 0x50; //串口方式1,允许接收 TMOD = 0x20; //定时器1 定时方式2 PCON=0x80; //设SMOD=1; TH1 = 0xFA; //11.0592MHz 9600 波特率 TL1 = 0xFA; TR1 = 1; //启动定时器 ES=1; //开串行中断 EA=1; //开总中断 CTRL=0; //置MAX485为接收方式 replay=1; warn0=1; while(1) //键盘扫描 { P2=0xff; //键盘初始化 P2=0xf0; if (P2!=0xf0) { delay(); //延时去抖 if (P2!=0xf0) { X=P2; //读键盘 P2=0x0f; Y=P2; P2=X|Y; temp=P2; switch(temp) { case 0xee:key=0;break; case 0xde:key=1;break; case 0xbe:key=2;break; case 0x7e:key=3;break; case 0xed:key=4;break; case 0xdd:key=5;break; case 0xbd:key=6;break; case 0x7d:key=7;break; case 0xeb:key=8;break; case 0xdb:key=9;break; case 0xbb:key=10;break; case 0x7b:key=11;break; case 0xe7:key=12;break; case 0xd7:key=13;break; case 0xb7:key=14;break; case 0x77:key=15;break; } for(X=0;X<4;X++) //存储最近读的按键码 table[X]=table[X+1]; table[3]=key; P2=0xf0; temp=P2; for(X=0;X<4;X++) show(table[X]); while(temp!=0xf0) {P2=0xf0;temp=P2;} } } else key=16; } } 附录三、电路原理图 显示部分电路 主要部分电路下载本文