//本程序可实现用单片机来代替ps2键盘来给电脑输入数据. //您只需从单片机上引出2根线到电脑的ps/2接口就可实现 //本程序在51hei-5开发板上测试通过 //跳线设置:默认 //晶振:6M #include<reg51.h> //包含单片机寄存器的头文件 #include<intrins.h> //包含_nop_()函数定义的头文件 //#include"51hei.h" /******************************************************************************* 以下是引脚定义 *******************************************************************************/ sbit PS2CLK=P3^5; sbit PS2DAT=P2^7; /***************************************************** 函数功能:延时1ms (3j+2)*i=(3×33+2)×10=1010(微秒),可以认为是1毫秒 ***************************************************/ void delay1ms() { unsigned char i,j; for(i=0;i<10;i++) for(j=0;j<33;j++) ; } //====================================================================== //2051模拟PS2键盘和PC机通讯程序 6M下 发送程序代码//程序的完整版本及hex文件下载地址:http://www.51hei.com/ziliao/file/ps2dfe.rar
//====================================================================== PS2keytohost(unsigned char vale) { unsigned char h = 0; unsigned char i = 8; unsigned char J; unsigned char t; bit bparity =0 ; ACC = vale;//获取字节的奇偶信息 if(!P) //ACC中偶数时,P为0,但是PS2中时奇校验( 字节中的1的个数+校验位 = 奇数) { bparity = 1; } if(PS2CLK&&PS2DAT) //发送前检测PS2总线 { for(J = 12 ;J > 0;J--) {;}//6M,大约延时40uS后再检测 if(PS2CLK)//时钟线空闲 { if(PS2DAT)//数据线空闲 { //for(t = 10;t > 0;t--){;} //6M,大约延时20uS for(J = 11;J > 0;J--) //1共11个数据 { if(h == 0) // 送起始位 { PS2DAT = 0; h++; } else if(h == 1)//送8位数据位 { PS2DAT = vale & 0x01;//先LSB开始 vale >>= 1; i--; if(i == 0) //发送完成 { h++; } } else if(h == 2)//送校验位 { PS2DAT = bparity; h++; } else{ PS2DAT = 1; } //送停止位 for(t = 12;t > 0;t--){;} //6M,大约延时40uS PS2CLK = 0;//拉低时钟线,主机接收 for(t = 12;t > 0;t--){;} //6M,大约延时40uS PS2CLK = 1;//拉高时钟线,设备发送 if(!PS2CLK) //检测到时钟线变低 { //主机不要这次通讯 (很罕见) return(0);//返回 0 } for(t = 6;t > 0;t--){;} //6M,大约延时20uS }//for(J = 11;J > 0;J--) for(t = 12;t >0;t--){;} return(1);//返回 1 }//if(PS2DAT) }//if(PS2CLK) }//if(PS2CLK&&PS2DAT) }//end /***************************************************** 函数功能:主函数 ***************************************************/ void main(void) { PS2keytohost(0X1C); while(1) { delay1ms(); } }