|
給大家分享一個(gè)51單片機(jī)雙機(jī)通信,用串口實(shí)現(xiàn),有單片機(jī)主機(jī)程序和叢機(jī)程序的源代碼。
下面是proteus仿真原理圖:
主機(jī)程序:
- #include<reg51.h>
- unsigned char i=1;
- unsigned char ACK=1;
- void delay() //延時(shí)函數(shù)
- {
- unsigned char i,j;
- for(i=255;i>0;i--)
- for(j=100;j>0;j--){}
- }
- unsigned char kbscan() //鍵盤掃描函數(shù)
- {
- unsigned char sccode,recode; //定義行、列
- P1=0xf0; //高四位作為輸入先寫1
- if((P1&0xf0)!=0xf0) //判斷是否按鍵按下
- {
- delay(); //延時(shí)消抖
- if((P1&0xf0)!=0xf0) //再次判斷判斷有沒有按鍵按下
- {
- sccode=0xfe;
- while((sccode&0x10)!=0)
- {
- P1=sccode;
- if((P1&0xf0)!=0xf0) //判斷當(dāng)前行是否有按鍵按下
- {
- 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; //發(fā)送數(shù)據(jù)
- }
- else if(i==11) //循環(huán)發(fā)送,發(fā)了十一個(gè)字符后重新發(fā)
- {
- i=1;
- SBUF=1;
- }
- else
- {
- i++;
- SBUF=i; //發(fā)送數(shù)據(jù)
- }
- }
- else if(RI==1) //接收回應(yīng)的信號(hào)
- {
- RI=0;
- ACK=SBUF; //接收回應(yīng)信號(hào) 修改初值 觸發(fā)串口通信中斷
- TI=1;
- TH1=TL1=i;
- i=1;
- }
- }
- void main()
- {
- TMOD=0x20;
- TH1=0x00;TL1=0x00; //置初值
- TR1=1;EA=1;ES=1; //使T1開始工作;開總中斷、串行中斷
- SCON=0x50; //使T1工作在工作方式1
- SBUF=i;
- while(1)
- {
- while(kbscan())
- {
- switch(kbscan()) //不同的按鍵對(duì)應(yīng)不同的波特率
- {
- case 0xeb:i=0x00;break;
- case 0xdb:i=0x22;break;
- case 0xbb:i=0x44;break;
- case 0xed:i=0x66;break;
- case 0xdd:i=0x88;break;
- case 0xbd:i=0xaa;break;
- case 0xee:i=0xcc;break;
- case 0xde:i=0xdd;break;
- case 0xbe:i=0xee;break;
- }
- }
- }
- }
復(fù)制代碼
叢機(jī)程序:
下載:
串口通信仿真.zip
(90.41 KB, 下載次數(shù): 363)
2017-4-5 01:10 上傳
點(diǎn)擊文件名下載附件
|
評(píng)分
-
查看全部評(píng)分
|