倆個工程,一個發送 機,一個接收機。波特率設置為480。倆個單片機晶振頻率不同,一個是11.0592MHZ,一個是2.768MHZ。
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
串口通信.png (91.47 KB, 下載次數: 52)
下載附件
2020-6-2 13:46 上傳
單片機源程序如下:
- #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.png (6.99 KB, 下載次數: 36)
下載附件
2020-6-2 17:42 上傳
所有資料51hei提供下載:
串口通信點燈.zip
(92.13 KB, 下載次數: 47)
2020-6-2 13:48 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|