Ⅰ 单片机与单片机之间怎么通信
他们之间的通讯就是相互直接数据的传输。比如说,你要用一个单片机控制另外一个单片机,那么你就可以通过232总线连接然后用串口通信,前提是两个单片机都有发送接收程序,还有相应的指令,就是接收到这个信号,另外一个单片机要做什么。那样就可以用一个单片机控制另一个工作。形象化就是你打电话给你朋友跟他说话。
Ⅱ 两个单片机之间的无线传输
选择通讯模块完成传输
1:用rf905进行数据传输,两块单片机都通过串口将数据发送给905,然后通过905发送出去。
2:用PT2262发也可以,如果你不考虑成本的话,你可以用51的一个端口控制一个继电器当按键用
建议nrf24l01这个模块,spi协议,程序不是很难写
Ⅲ 两个单片机串口通信程序
两个单片机串口通信,用仿真来实现比较容易做,两个单片机的引脚TXD和RXD交叉连接即可。为了显示通信效果,P2口接两个数码管可显示接收的数据,P1口接两个四位数字开关,用于输入数据,然后从串口发送到另一单片机,两个单片机互发数据,电路相同,程序也相同。仿真图如下。
Ⅳ 单片机与单片机直接相连
这样连接有点问题的。首先就是四楼 摆渡还不知道 说的,还要把两个单片机的VSS都连接到一起。
即使这样,单片机之间用P2口之间传送数据还有一定的问题,就是两个单片机只能一直查找P2口是否有数据发送过来。如单片机A会给单片机B发送数据,那B怎么知道A何时发送数据给它,所以,单片机B的程序就必须其他操作什么都不做,只能一直循环检测P2口什么时候有数据变化。除非你自己编一套两者传输数据的协议。这样的话,不仅麻烦,而且占用的I/O口太多,并行通信的效率也太低。
最简单的方法就是使用异步串口通信,直接把两个单片机的TXD和RXD两个引脚交叉相连接,两者都以中断接收串口数据。省I/O口省代码。也就是A的TXD(P3.1)和B的RXD(P3.0)连接,A的RXD和B的TXD连接。还要把两者的VSS都连上。虽然看似比8个引脚相连的并行通信要慢(串行通信一个时间段只能通过一个位,而并行通信是一个字节)。但串行通信要比并行通信稳定多了。这也是现在的计算机上如USB之类的串行通信要比LPT的并行通信要实用得多。
Ⅳ 您好请问一下,两个单片机互相传数据的程序怎么写
两个单片机互相传数据,其实很简单的 就是两个单片机的串口通信,当然需要一个串口通信的协议,如指令码、数据长度、数据等等,就是什么指令需要怎么操作、操作数据是什么。如这是两个单片机简单通信操作的仿真实例可以作为参考。
#include <reg52.h> // 单片机1
#define uchar unsigned char
#include <stdio.h>
unsigned char* c;
sbit k0=P3^2;
sbit k1=P3^3;
sbit led1=P3^5;
uchar k;
bit y0,y1;
bit t,s;
uchar table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d};
void SendOneChar(char c) //发送字节到PC
{
TI=0;
SBUF = c;
while(!TI);
TI=0;
}
void SendString(char *st) //发送字符串到PC
{
while(*st)
{
SendOneChar(*st++);
}
}
void main()
{
SCON = 0x50; //SCON: mode 1, 8-bit UART, enable rcvr
TMOD = 0x20; //TMOD: timer 1, mode 2, 8-bit reload
PCON = 0x80; // 数据位8、停止位1。效验位无 (11.0592M)
TH1 = 0xF4; //TH1: reload value for [email protected]
TR1 = 1; //启动定时器1
ES = 1; //允许串口中断位
EA = 1; //允许总中断位
c=0;
s=1;
k=0;
P1 =~table[k];
while(1)
{
if(k0==0 && y0==0)
{
y0=1;
c = "az";
SendString(c); //发送字符串
}
if(k0==1 ) { y0=0; }
if(k1==0 && y1==0)
{
y1=1;
c = "as";
SendString(c); //发送字符串
}
if(k1==1 ) { y1=0; }
// for(i = 0; i < 4000; i++); //延迟一小段时间
}
}
void chuankou(void) interrupt 4
{
if(RI==1)
{
RI = 0;
if(t==1)
{
if(SBUF=='z') { k++;led1=~led1; }
s=1; t=0;
if(k==10) { k=0;}
P1 =~table[k];
}
if(SBUF=='a' && s==1) { t=1;s=0;}
}
}
------------------
#include <reg51.h> // 单片机2
#define uchar unsigned char
unsigned char* c;
sbit led1=P3^2; // 接收 az , P.2 输出低电平, P3.3 输出高电平。
sbit led2=P3^3; // 接收 aa , P.2 输出高电平, P3.3 输出低电平。
sbit k0=P3^5;
bit y0,t,s;
uchar k;
uchar table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d};
void SendOneChar(char c) //发送字节到PC
{
TI=0;
SBUF = c;
while(!TI);
TI=0;
}
void SendString(char *st) //发送字符串到PC
{
while(*st)
{
SendOneChar(*st++);
}
}
void main (void)
{
SCON = 0x50; // REN=1允许串行接受状态,串口工作模式1
TMOD = 0x21; // 定时器工作方式2
PCON = 0x80; // 数据位8、停止位1。效验位无 (11.0592M)
TH1 = 0xF4; // TH1 = 0xFD; 波特率 2400
TH0=(65536-54253)/256; // 50 mS
TL0=(65536-54253)%256;
TR1 = 1;
ES = 1; // 开串口中断
EA = 1; // 开总中断
// ET0=1;
// TR0=1;
s=1;
k=0;
P1 =~table[k];
while(1)
{
if(k0==0 && y0==0)
{
y0=1;
c = "az";
SendString(c); //发送字符串
}
if(k0==1 ) { y0=0; }
}
}
void chuankou(void) interrupt 4
{
if(RI==1)
{
RI = 0;
if(t==1)
{
if(SBUF=='z') {led1=0;led2=1; k++; }
if(SBUF=='s') {led1=1;led2=0; k--; }
s=1; t=0;
if(k==10) { k=0;}
if(k==255) { k=9; }
P1 =~table[k];
}
if(SBUF=='a' && s==1) { t=1;s=0;}
}
}
void T0_time()interrupt 1
{
TH0=(65536-54253)/256; // 50 mS
TL0=(65536-54253)%256;
k++;
if(k==10) // 这里修改时间
{
k=0;
led1=1;
led2=1;
}
}