以兩片單片機為例簡述單片機的串口通信 程序+仿真+詳細注釋
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
0.png (43.85 KB, 下載次數: 65)
下載附件
2018-7-27 23:47 上傳
0.png (52.87 KB, 下載次數: 61)
下載附件
2018-7-27 23:47 上傳
單片機源程序如下:
- #include<reg51.h>
- #define uchar unsigned char
- #define uint unsigned int
-
- uchar i=1,ACK=1;
- void delay(uint i) //延時函數
- {
- uchar j;
- while(i--)
- for(j=110;j>0;j--);
- }
- uchar kbscan() //鍵盤掃描函數
- {
- uchar sccode,recode; //定義行、列
- P1=0xf0; //高四位作為輸入先寫1
- if((P1&0xf0)!=0xf0) //判斷是否按鍵按下
- {
- delay(10); //延時消抖
- if((P1&0xf0)!=0xf0) //再次判斷判斷有沒有按鍵按下
- {
- sccode=0xfe;
- while((sccode&0x10)!=0)
- {
- P1=sccode;
- if((P1&0xf0)!=0xf0) //判斷當前行是否有按鍵按下
- {
- recode=P1&0xf0; //保留高四位輸入值
- sccode=sccode&0x0f; //保留第低四位的值
- return(recode+sccode);
- }
- else
- sccode=(sccode<<1)|0x01;
- }
- }
- }
- return 0;
- }
- send()interrupt 4 //串行口通信中斷
- {
- if(TI==1&&ACK==1)
- {
- TI=0;
- if(i==0|i==0x22|i==0x44|i==0x66|i==0x88|i==0xaa|i==0xcc|i==0xdd|i==0xee) //有按鍵按下,需要修改波特率
- {
- ACK=0;
- SBUF=i; //修改波特率
- }
- else if(i==11) //循環發送,發了十一個字符后重新發
- {
- i=1;
- SBUF=1;
- }
- else
- {
- i++;
- SBUF=i; //正常發送數據
- }
- }
- else if(RI==1) //接收回應的信號
- {
- RI=0;
- ACK=SBUF; //接收回應信號 修改初值 觸發串口通信中斷
- TI=1;
- TH1=TL1=i;
- i=1;
- }
- }
- void main()
- {
- TMOD=0x20; //定時器1 工作方式2
- TH1=0x00;
- TL1=0x00; //置初值
- TR1=1;
- EA=1;
- ES=1; //使T1開始工作;開總中斷、串行中斷
- SCON=0x50; //計數器1 工作方式1
- SBUF=i;
- while(1)
- {
- while(kbscan())
- {
- switch(kbscan()) //不同的按鍵對應不同的波特率
- {
- case 0xeb:i=0x00;break; // 1
- case 0xdb:i=0x22;break; // 2
- case 0xbb:i=0x44;break; // 3
- case 0xed:i=0x66;break; // 4
- case 0xdd:i=0x88;break; // 5
- case 0xbd:i=0xaa;break; // 6
- case 0xee:i=0xcc;break; // 7
- case 0xde:i=0xdd;break; // 8
- case 0xbe:i=0xee;break; // 9
- }
- }
- }
- }
復制代碼
所有資料51hei提供下載:
20161111144-李作鑫-串口通信.rar
(100.45 KB, 下載次數: 45)
2018-7-27 07:21 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|