导航:首页 > 操作系统 > 两单片机通信程序

两单片机通信程序

发布时间:2022-07-15 01:37:50

Ⅰ 两个51单片机之间的通讯程序

这个取决于你要传输的数据格式,我给你一个相当于库函数的东西,要传输什么数据就调这里的函数好了。
###################################################################
/*
文件名:uart.h
作者:北京交通大学 思源0702 杨孜
更改时间:2009 9 21

程序描述: STC12C5A60S2的串口头文件,适用于所有标准51单片机。
功能: 实现了字符串(字节数组)的发送,和单字节接受。
限制: 其中的接受部分还无法将信息传出去。所以用的时候需要定义全局变量,用于接收中断中的信息。
晶振:11.0592M更改须重新计算定时器值
*/
#ifndef _uart_h
#define _uart_h

#include "STC51.h"

/*
SCON: SM0 SM1 SM2 REN TB8 RB8 TI RI
TCON: TF1 TR1 TF0 TR0 IE1 IT1 IE0 IT0
TMOD: GATE1 C/T M1 M0 GATE0 C/T M1 M0
TL0
TH0
TL1
TH1
IE: EA - ET2 ES ET1 EX1 ET0 EX0
PCON: SMOD SMOD0 - POF GF1 GF0 PD IDL
x=256-f*(SMOD+1)/384/波特率
本次试验:晶振:11.0592,倍频,定时器1初值0xff,SMOD=1,则波特率为115200

*/
/////////////////////////////////////////////////////////
/*
函数声明
*/
void uart_initial();
void uart_testbusy();
void uart_write(uch *s,uch a);
void uart_writesingle(uch a);
/////////////////////////////////////////////////////////
/*
全局变量声明
*/
uch uart_busy;
uch *uart_s; //字符串指针,接受时只接受命令,所以不涉及RXbuffer
uch uart_p; //字符数量
//////////////////////////////////////////////////////////////////////////////////
/*
功能:用于串口与PC通信,10位异步奇偶校验
入口:
返回:无
说明:模式1、2、3有波特率加倍
模式0:f/12
模式2:f/64
模式1、3:f/32/12/(256-x)
*/
void uart_initial()
{
uart_busy=0;
SCON=0x50; //串口模式1,10位异步无奇偶校验,与PC通信,准备好接受(RI=0)
// PCON|=0x80; //倍频

TMOD|=0x20; //定时器模式2,自动装填
TL1=0xfd;
TH1=0xfd; //19200 晶振:11.0592(与51一样)
TR1=1; //开始计时
IE&=0xf7; //关定时器1的中断
IE|=0x90; //打开串口中断
uart_p=0;
}
void uart_testbusy() //这里以后改成查询缓冲区是否满。
{
uint i=65535;
while(i--)
{
if(!uart_busy)
{
return;
}
}
//这里添加超时处理语句
}
void uart_write(uch *s,uch geshu)
{
uart_s=s;
uart_p=geshu-1; //在中断中检测此位时,已经发了一个字节。
uart_writesingle(s[0]);
}
void uart_writeuint(uint a)
{
uch b;
b=(uch)(a>>8);
uart_writesingle(b);
b=(uch)(a & 0x00ff);
uart_writesingle(b);
}
void uart_writesingle(uch a)
{
uart_testbusy();
uart_busy=1;
SBUF=a;
}
void uart() interrupt 4
{
ES=0;

if(TI==1)
{
TI=0;
if(uart_p)
{
uart_p--;
SBUF=*(++uart_s);
}
else
{
uart_busy=0;
}
}
else if(RI==1)
{
RI=0;
uart_busy=0;
switch(SBUF)
{
case 1:uart_write(hello,11); //这里怎么把信息传出去?
};
}
ES=1;
}
////////////////////////////////////////////////////////////////////////////////////
#endif

Ⅱ 单片机双机通信程序

双机器通信很容易的。如果用Proteus仿真的话还得安装虚拟端口软件。

Ⅲ 单片机与单片机之间如何进行串行通信

1、将两个单片机的RXD与TXD相连
2、根据需要传输的数据编写传输协议
3、编写串行通信程序,将自己需要发送的数据按照协议进行发送
4、编写接收程序,按照协议进行接收
5、将两个程序分别写入两个单片机,运行。

Ⅳ 单片机 双机通信 程序

双机通信不需要安装虚拟端口软件
,两机通过txd
<==>
rxd
直接通信。
#include
#define
uchar
unsigned
char;
#define
uint
unsigneed
int;
uchar
a0,a1,a2,a3,temp,i;
uchar
code
tab[
]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
sbit
p2_0=p2^0;
sbit
p2_1=p2^1;
sbit
p2_2=p2^2;
sbit
p2_3=p2^3;
void
delay(int
ms)
{
while(ms--)
for(i=0;i<123;i++);
}
void
inituart()
{
tmod=0x20;
//m1=1,m0=0
定时器1工作方式2(定时常数重装,8
位)
scon=0x50;
//sm0=0,sm1=1,ren=1
串口工作方式1,允许接收
th1=0xfd;
//晶振11.0592时,波特率9600
tl1=th1;
//tl1计数,溢出后,th1值送入tl1
ea=1;
//开总中断
es=1;
//允许串口中断
tr1=1;
//启动定时器1
}
void
disp()
{
a0=temp%2;
a1=temp/2%2;
a2=temp/2/2%2;
a3=temp/2/2/2%2;
p2_0=0;
p0=tab[a0];
delay(1);
p2_0=1;
p2_1=0;
p0=tab[a1];
delay(1);
p2_1=1;
p2_2=0;
p0=tab[a2];
delay(1);
p2_2=1;
p2_3=0;
p0=tab[a3];
delay(1);
p2_3=1;
}
void
main()
{
inituart();
//调用串口初始化子程序
while(1)
{
disp();
sbuf=p1;
while(ti==0);
ti=0;
}
}
void
uartinterrupt(
)
interrupt
4
{
if(ri)
{
ri=0;
temp=sbuf;
}
}

Ⅳ 单片机之间如何实现通信

两个单片机之间串口通信,如果是用proteus仿真,最简单了,两个单片机的rxd,txd交叉连接就行了。要是实物最好用rs232连接通信,距离可以达到几十米。再远点距离,用rs485连接通信。总之,方法很多的,也很灵活的。

Ⅵ 单片机点对点通信(两单片机通过自带串口通信)程序

以前在网上好像看到一份

#include<reg51.h>//client
#defineucharunsignedchar
#defineuintunsignedint
voiddelay(int);
voidreceive(void);
voidinit(void);
uchari,sum;
intj;
ucharTAB[16]={
0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//定义数码表

voidmain(void)//主程序
{
init();
receive();
}
voidinit(void)//程序初始化
{
EA=1;
ES=1;
TMOD=0x20;
TH1=0xfd;
TL1=0xfd;
PCON=0x00;
SCON=0x50;
TR1=1;
}
voiddelay(intx)//延时子程序
{
inti,j;
for(i=0;i<x;i++)
for(j=1;j<=150;j++);
}
voidreceive(void)
{
ucharTABS[16];
do
{
while(!RI); //想要一个下降沿来触发,下面类同
RI=0;
}
while((SBUF^0xaa)!=0);//等待主机发送AAH
SBUF=0xbb;//从机收到BBH后向主机回复BBH
while(!TI);
TI=0;



while(1)
{
sum=0;
for(i=0;i<=15;i++)
{
while(!RI);
RI=0;
TABS[i]=SBUF;//接收数据保存
sum+=TABS[i];//求接收校验和
}

while(!RI);
RI=0;

if((SBUF^sum)==0)//判断发送与接收的校验和是否相等
{
SBUF=0x00;//校验和相等发送00H给主机
while(!TI);
TI=0;
break;//跳出接收循环
}
else
{
SBUF=0xff;//校验和不等发送FFH给主机
while(!TI);
TI=0;//发送成功清零进入下一次接收循环
}
}



while(1)//显示输出
{
for(i=0;i<=15;i++)
{
P1=TABS[i];
delay(500);
}
}
}
--------------------------------------------------------------------
#include<reg51.h>//server
#defineucharunsignedchar//定义数据类型
voidinit();//定义子程序
voidsend();
ucharTAB[16]={
0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//定义数码表

uchari,sum;
intj;


voidmain(void)
{
init();
send();
}
voidinit(void)
{
EA=1;//开CPU中断
ES=1;//允许串行口中断
TMOD=0x20;//设定时器T1为方式2
TH1=0xfd;//赋初值
TL1=0xfd;
PCON=0x00;//令SMOD=0波特率不倍增
SCON=0x50;//串行口为方式1
TR1=1;//启动T1
}


voidsend(void)//发送子程序
{
do
{
SBUF=0xaa;//主机送AAH给从机
while(!TI);//等待一帧发送结束
TI=0;//发送完后清零
while(!RI);//等待一帧接收结束
RI=0;//接收完后清零
}
while((SBUF^0xbb)!=0);//等待从机回答返回BBH后继续
do
{
sum=0;//清校验和
for(i=0;i<=15;i++)
{
SBUF=TAB[i];//主机发送数据
sum+=TAB[i];//求检验和
while(!TI);
TI=0;
}
SBUF=sum;//发送校验和
while(!TI);
TI=0;
while(!RI);
RI=0;
}
while(SBUF!=0);//等待
}

Ⅶ 两个单片机串口通信程序

两个单片机串口通信,用仿真来实现比较容易做,两个单片机的引脚TXD和RXD交叉连接即可。为了显示通信效果,P2口接两个数码管可显示接收的数据,P1口接两个四位数字开关,用于输入数据,然后从串口发送到另一单片机,两个单片机互发数据,电路相同,程序也相同。仿真图如下。

Ⅷ 两个51单片机串口通信程序

串行发送程序 Tx.asm :
PCON, #00H ;; 波特率不倍增
SETB TR1 ;; 启动定时器T1
MOV IE, #0 ;; 禁止任何中断
CALL DLY125 ;; 延时125ms
;;--------------------------------------------
T_X: ;; 透传发送字串

ACALL DSPLED ;; P2.0控制LED闪亮
MOV R3, #4 ;; 待发送字符个数
MOV DPTR, #TAB_TX ;; 数据表首址
TX_LP1: CLR A
MOVC A, @A+DPTR ;; A←数据表的1个字符
CLR TI ;; TI清零,允许发送
MOV SBUF,A ;; 发送1个字符
JNB TI, $ ;; 等待1个字符帧发送结束
DJNZ R3, TX_next
CALL DLY500 ;; 延时500ms
SJMP T_X ;; 重复发送
TX_next: ;; 发送另一字符
INC DPTR ;; 数据表指针移动
SJMP TX_LP1
;;--------------------------------------------
DSPLED: ;;开机或复位,P2.0控制LED闪亮6遍

MOV R2, #6 ;; 循环次数
LEDLP1: CLR P2.0 ;; LED亮
CALL DLY125 ;; 延时125ms
SETB P2.0 ;; LED灭
CALL DLY125
DJNZ R2,LEDLP1 ;; 循环
RET
;;----------------------------------------------
DLY125: ;; 延时125ms
DLY125A: MOV R5,#250
DLY125B: MOV R6,#250
DJNZ R6,$
DJNZ R5,DLY125B
RET
;; 250*250*2μs=125 000μs =125ms
;;----------------------------------------------
DLY500: ;; 延时500ms
MOV R7,#4
DLY500A: MOV R6,#250
DLY500B: MOV R5,#250
DJNZ R5,$
DJNZ R6,DLY500B
DJNZ R7,DLY500A
RET
;; 4*250*250*2μs=500 000μs =500ms
;;-------------------------------------------------

TAB_TX: DB 38H,30H,35H,31H, ...

;; 8 0 5 1 ...
;;----------------------------------------------
END

Ⅸ 如何实现2个51单片机之间通过串口通信的源程序

汇编编写的模拟串口通信程序

T2作为波特率控制
UART_RXD 是硬中断0或1口,如果能进入中断,说明该线有一个起始位产生,进入中断后调
用下面的接收程序。退出硬中断之前还需要将硬中断标志重新复位。
UART_TXD是任何其它IO即可。

UART_SEND:
PUSH IE
PUSH DPH
PUSH DPL
PUSH PSW
PUSH 00H
PUSH ACC
CLR EA
SETB UART_TXD ;START BIT

MOV R0,A
CLR TR2 ;TR2置1,计数器2启动,时间计数启动。
MOV A,RCAP2L;计数器2重新装载值
MOV TL2,A ;置计数器2初值 ;T2需要重新装载
MOV A,DPH
MOV A,RCAP2H
MOV TH2,A
MOV A,R0

SETB TR2 ;TR2置1,计数器
JNB TF2,$
CLR TF2
JNB TF2,$
CLR TF2

CLR UART_TXD ;START BIT
JNB TF2,$
CLR TF2
JNB TF2,$
CLR TF2

MOV R0,#08H
UART_SEND_LOOP:
RRC A
MOV UART_TXD,C ;8 BIT
JNB TF2,$
CLR TF2
JNB TF2,$
CLR TF2
DJNZ R0,UART_SEND_LOOP

SETB UART_TXD ;END BIT
JNB TF2,$
CLR TF2
JNB TF2,$
CLR TF2

POP ACC
POP 00H
POP PSW
POP DPL
POP DPH
POP IE
RET

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
UART_REC:
PUSH IE
PUSH DPH
PUSH DPL
CLR EA

CLR TR2 ;TR2置1,计数器2启动,时间计数启动。
MOV A,RCAP2L;计数器2重新装载值
MOV TL2,A ;置计数器2初值 ;T2需要重新装载
MOV A,DPH
MOV A,RCAP2H
MOV TH2,A

JB UART_RXD,$ ;REC
SETB TR2 ;TR2置1,计数器2启动,时间计数启动。
JNB TF2,$
CLR TF2 ;0.5 BIT

JNB TF2,$
CLR TF2 ;1 BIT

JNB TF2,$
CLR TF2 ;1.5 BIT
MOV C,UART_RXD
MOV ACC.0,C

JNB TF2,$
CLR TF2

JNB TF2,$
CLR TF2 ;2.5
MOV C,UART_RXD
MOV ACC.1,C

JNB TF2,$
CLR TF2

JNB TF2,$
CLR TF2 ;3.5
MOV C,UART_RXD
MOV ACC.2,C

JNB TF2,$
CLR TF2

JNB TF2,$
CLR TF2 ;4.5
MOV C,UART_RXD
MOV ACC.3,C

JNB TF2,$
CLR TF2

JNB TF2,$
CLR TF2 ;5.5
MOV C,UART_RXD
MOV ACC.4,C

JNB TF2,$
CLR TF2

JNB TF2,$
CLR TF2 ;6.5
MOV C,UART_RXD
MOV ACC.5,C

JNB TF2,$
CLR TF2

JNB TF2,$
CLR TF2 ;7.5
MOV C,UART_RXD
MOV ACC.6,C

JNB TF2,$
CLR TF2

JNB TF2,$
CLR TF2 ;8.5
MOV C,UART_RXD
MOV ACC.7,C

JNB TF2,$
CLR TF2 ;9.5
JNB UART_RXD,$ ;等待停止位,并重新复位计数器
SETB UART_RXD

POP DPL
POP DPH
POP IE
RET
补充回答:
串口调试

1. 发送:向总线上发命令
2. 接收:从总线接收命令,并分析是地址还是数据。
3. 定时发送:从内存中取数并向主机发送.

经过调试,以上功能基本实现,可以通过上位机对单片机进行实时控制。

程序如下:

//这是一个单片机C51串口接收(中断)和发送例程,可以用来测试51单片机的中断接收
//和查询发送,发送没有必要用中断,因为程序的开销是一样的

#include <reg51.h>
#include<stdio.h>
#include <string.h>

#define INBUF_LEN 4 //数据长度
unsigned char inbuf1[INBUF_LEN];

unsigned char checksum,count3 , flag,temp,ch;

bit read_flag=0;
sbit cp=P1^1;
sbit DIR=P1^2;

int i;

unsigned int xdata *RAMDATA; /*定义RAM地址指针*/
unsigned char a[6] ={0x11,0x22,0x33,0x44,0x55,0x66} ;

void init_serialcomm(void)
{
SCON=0x50; //在11.0592MHz下,设置串行口波特率为9600,方式1,并允许接收
PCON=0x00;
ES=1;
TMOD=0x21; //定时器工作于方式2,自动装载方式
TH0=(65536-1000)%256;
TL0=(65536-1000)/256;
TL1=0xfd;
TH1=0xfd;
ET0=1;
TR0=1;
TR1=1;
// TI=0;
EA=1;
// TI=1;
RAMDATA=0x1F45;
}

void serial () interrupt 4 using 3
{
if(RI)
{ RI=0;
ch=SBUF;
TI=1; //置SBUF空
switch(ch)
{
case 0x01 :printf("A"); TI=0;break;
case 0x02 :printf("B"); TI=0;break;
case 0x03 :printf("C"); TI=0;break;
case 0x04 :printf("D"); TI=0;break;
default :printf("fg"); TI=0;break;
}
}
}

//向串口发送一个字符
void timer0() interrupt 1 using 3{
// char i;
flag++;
TH0=0x00;
TL0=0x00;
if(flag==10)
{// cp=!cp;
// for(i=0;i<6;i++)
P2=0x25;
TI=1;
temp=*RAMDATA;
printf("%c",temp);
TI=0;
// RAMDATA--;
flag=0;
}
}

//主程序
main()
{
init_serialcomm(); //初始化串口
//向6264中送数据
{
*RAMDATA=0x33;
}
while(1)

{
*RAMDATA=0x33;;
}
}

调试需要注意的问题:

1. 发送过程:在发送时必须保证TI=1:即发送缓冲器为空,否则将导致数据发不出去,如果想强制发送可以用:TI=1.具体发送数据:利用printf(“abcd”);函数直接发送即可。
2. 接收过程:在接收时多选用中断方式,这样可以节约CPU的时间,提高效率,

Ⅹ 两个51单片机串口通讯程序

<p>甲机发送(拨码开关):</p>
<p>ORG 00H</p>
<p>AJMP MAIN</p>
<p>ORG 30H</p>
<p>MAIN: </p>
<p>MOV SCON,#50H ;8位发送,接收</p>
<p>MOV TMOD,#20H ;定时器1方式2,8 位自动重装。</p>
<p>MOV TH1,#0FAH ;11.0592MHz,4800bps</p>
<p>MOV TL1,#0FAH</p>
<p>SETB TR1</p>
<p> </p>
<p>MAIN1:</p>
<p>MOV A,P1</p>
<p>CJNE A,20H,SEND_0</p>
<p>AJMP MAIN1</p>
<p>SEND_0:</p>
<p>ACALL SEND</p>
<p>AJMP MAIN1</p>
<p> </p>
<p>SEND:</p>
<p>MOV 20H,A</p>
<p>MOV SBUF,A</p>
<p>JBC TI,SEND</p>
<p>RET</p>
<p>END</p>
<p> </p>
<p> </p>
<p>乙机接收(LED显示):</p>
<p>ORG 00H</p>
<p>AJMP MAIN</p>
<p>ORG 30H</p>
<p>MAIN: </p>
<p>MOV SCON,#50H ;串口工作方式1,允许接收。</p>
<p>MOV TMOD,#20H ;定时器1工作方式2,8 位计数,自动重装定时常数</p>
<p>MOV TH1,#0FAH ;11.0592MHz,4800bps</p>
<p>MOV TL1,#0FAH</p>
<p>SETB TR1</p>
<p>RECE: </p>
<p>JB RI,MAIN1 ;收完RI机器置1,转数据处理。</p>
<p>AJMP $-3 
;没收完继续 </p>
<p>MAIN1: </p>
<p>MOV A,SBUF</p>
<p>MOV P2,A</p>
<p>CLR RI</p>
<p>AJMP RECE 
;继续接收 </p>
<p> </p>
<p>END</p>
<p> </p>
<p> </p>
<p></p>
<p> </p>

阅读全文

与两单片机通信程序相关的资料

热点内容
苹果手机文档安卓上怎么打开 浏览:525
如何做淘宝代理服务器 浏览:662
gz压缩文件夹 浏览:177
字母h从右往左跑的c语言编程 浏览:127
安卓手机如何拥有苹果手机横条 浏览:765
业余编程语言哪个好学 浏览:137
按照文件夹分个压缩 浏览:104
航空工业出版社单片机原理及应用 浏览:758
如何在电信app上绑定亲情号 浏览:376
安卓的怎么用原相机拍月亮 浏览:805
配音秀为什么显示服务器去配音了 浏览:755
c盘清理压缩旧文件 浏览:325
app怎么交付 浏览:343
图虫app怎么才能转到金币 浏览:175
如何做征文app 浏览:446
用什么app管理斐讯 浏览:169
安卓如何下载宝可梦剑盾 浏览:166
编译器开发属于哪个方向 浏览:940
megawin单片机 浏览:687
以色列加密货币监督 浏览:909