|
用max232芯片可以把2个单片机进行连接起来,实现双机通信试验,仿真原理图如下:
2个单片机的程序及双机通信仿真工程文件下载:
双机通信--双向通信.zip
(78.98 KB, 下载次数: 42)
甲机注意的问题:
对于双机通信而言,甲机和乙机初始化问题要格外注意:
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;
- }
- }
复制代码
|
评分
-
查看全部评分
|