|
用max232芯片可以把2個單片機進行連接起來,實現雙機通信試驗,仿真原理圖如下:
2個單片機的程序及雙機通信仿真工程文件下載:
雙機通信--雙向通信.zip
(78.98 KB, 下載次數: 42)
2016-9-11 23:37 上傳
點擊文件名下載附件
甲機注意的問題:
對于雙機通信而言,甲機和乙機初始化問題要格外注意:
voidinit() {
TMOD=0x20;
TH1=0XFD;
TL1=0XFD;
SCON=0X50;
TR1=1;
EA=1;
ES=1;
}
以后就直接對SCON進行賦值。這樣既省事,有正確。
還有就是發送函數模塊化:
void put(uchar c)
{
SBUF=c;
while(!TI);
TI=0;
}
記得以后這樣用。
最后一個問題,也是本程序的亮點
voidser() interrupt 4 {
if(RI==1)
{
a=SBUF;
RI=0;
P2=table[a];
}
}
由于當發送中斷發生的時候、接收中斷發生的時候。中斷號都是4,都會進入中斷子程序,這里就通過if(RI===1)
很巧妙的解決了這個問題。也就是說,只有接收中斷發生后才會執行if內部的程序。
-----------------------------------------------------------
乙機:
乙機注意的問題與甲機一樣,也是接收和發送。
程序: - #include<reg52.h>
- #define uchar unsigned char
- #define uint unsigned int
- uchar code table[]={
- 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
- sbit led0=P0^0;
- sbit led1=P0^3;
- sbit key=P1^0;
- uchar count,a;
- void delay(uint z)
- {
- uint i,j;
- for(i=z;i>0;i--)
- for(j=110;j>0;j--);
- }
- void put(uchar c)
- {
- SBUF=c;
- while(!TI);
- TI=0;
- }
- void init()
- {
- TMOD=0x20;
- TH1=0XFD;
- TL1=0XFD;
- SCON=0X50;
- TR1=1;
- EA=1;
- ES=1;
- }
- void main()
- {
- P2=0x00;
- init();
- while(1)
- {
- if(key==0)
- {
- delay(10);
- if(key==0)
- {
- while(!key);
- count++;
- if(count==5)
- count=1;
- }
- }
- switch(count)
- {
- case 1:
- put('A');
- led0=~led0;
- led1=1;
- break;
- case 2:
- put('B');
- led1=~led1;
- led0=1;
- break;
- case 3:
- put('C');
- led0=~led0;
- led1=~led1;
- break;
- case 4:
- put('D');
- led0=0;
- led1=0;
- break;
- }
- delay(100);
- }
- }
- void ser() interrupt 4
- {
- if(RI==1)
- {
- a=SBUF;
- RI=0;
- P2=table[a];
- }
- }
復制代碼- #include<reg52.h>
- #define uchar unsigned char
- #define uint unsigned int
- sbit led0=P0^0;
- sbit led1=P0^3;
- sbit key=P1^0;
- uchar a;
- char count=-1;
- void delay(uint z)
- {
- uint i,j;
- for(i=z;i>0;i--)
- for(j=110;j>0;j--);
- }
- void put(uchar c)
- {
- SBUF=c;
- while(!TI);
- TI=0;
- }
- void init()
- {
- TMOD=0X20;
- TH1=0XFD;
- TL1=0XFD;
- TR1=1;
- SCON=0X50;
- EA=1;
- ES=1;
- }
- void main()
- {
- init();
- while(1)
- {
- if(key==0)
- {
- delay(10);
- if(key==0)
- {
- while(!key);
- count++;
- if(count==10)
- count=0;
- put(count);
- }
- }
- switch(a)
- {
- case 'A':
- led0=~led0;
- led1=1;
- break;
- case 'B':
- led1=~led1;
- led0=1;
- break;
- case 'C':
- led0=~led0;
- led1=~led1;
- break;
- case 'D':
- led0=0;
- led1=0;
- }
- delay(100);
- }
- }
- void ser() interrupt 4
- {
- if(RI==1)
- {
- RI=0;
- a=SBUF;
- }
- }
復制代碼
|
評分
-
查看全部評分
|