俩个工程,一个发送 机,一个接收机。波特率设置为480。俩个单片机晶振频率不同,一个是11.0592MHZ,一个是2.768MHZ。
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
单片机源程序如下:
- #include <reg51.h>
- #include <intrins.h>
- #define uint unsigned int
- #define uchar unsigned char
- static char value;
- uint flag_key=0;
- void DelayMs(int z)// 1ms延时函数
- {
- int x,y;
- for (x=z;x>0;x--)
- for(y=110;y>0;y--);
- }
- /**********************按键扫描函数***************************************/
- uchar KeyScan2() //键盘扫描函数,使用行列反转扫描法
- {
- unsigned char cord_h,cord_l;//行列值中间变量
- P1=0x0f; //行线输出全为0
- cord_h=P1&0x0f; //读入列线值
- if(cord_h!=0x0f) //先检测有无按键按下
- {
- DelayMs(10); //去抖
- if((P1&0x0f)!=0x0f)
- {
- cord_h=P1&0x0f; //读入列线值
- P1=cord_h|0xf0; //输出当前列线值
- cord_l=P1&0xf0; //读入行线值
- while((P1&0xf0)!=0xf0);//等待松开并输出
- return(cord_h+cord_l);//键盘最后组合码值
- }
- }
- return(0xff); //返回该值
- }
- /**************根据扫描结果返回响应的值*************/
- //读取该函数返回值,运行不同的程序,达到按键控制的效果
- unsigned char KeyPro()
- {
- switch(KeyScan2())
- {
- case 0xee:flag_key=1;return 0xFE;break;//1 按下相应的键显示相对应的码值
- case 0xde:flag_key=1;return 0xFD;break;//2
- case 0xbe:flag_key=1;return 0xFB;break;//3
- case 0xed:flag_key=1;return 0xF7;break;//4
- case 0xdd:flag_key=1;return 0xEF;break;//5
- case 0xbd:flag_key=1;return 0XDF;break;//6
- case 0xeb:flag_key=1;return 0xBF;break;//7
- case 0xdb:flag_key=1;return 0x7F;break;//8
- case 0xbb:flag_key=1;return 0xff;break;//9
- default:return 0xff;break;
- }
- }
- //串口初始化函数
- void UARTInit()
- {
- EA = 1; //打开总中断
- ES = 1; //打开串口中断
- SM0 = 0; SM1 = 1;//串口工作方式1,8位UART波特率可变
- REN = 1;//串口允许接收
- TR1 = 1;//启动定时器1
- TMOD |= 0x20;//定时器1,工作模式2 8位自动重装
- TH1 = 0xC4;
- TL1 = 0xC4;//设置比特率480
- }
- void main()
- {
- UARTInit();//串口初始化
- KeyScan2();
- value=0xff;
- while(1)
- {
- value = KeyPro();
- if(flag_key==1)
- {
- SBUF = value;//写SBUF,把要发送的数据送给发送缓存器
- while(!TI);
- TI = 0;
- flag_key=0;
- }
- }
- }
复制代码
所有资料51hei提供下载:
串口通信点灯.zip
(92.13 KB, 下载次数: 47)
|