導航:首頁 > 操作系統 > 兩單片機通信程序

兩單片機通信程序

發布時間: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>

閱讀全文

與兩單片機通信程序相關的資料

熱點內容
樹莓派都用python不用c 瀏覽:755
access文件夾樹的構造 瀏覽:660
安卓多指操作怎麼設置 瀏覽:656
linux樹形目錄 瀏覽:727
平方根的簡單演算法 瀏覽:898
千牛訂單頁面信息加密取消 瀏覽:558
單片機自製紅外遙控燈 瀏覽:719
伺服器最小配置怎麼弄 瀏覽:853
ibm伺服器硬體如何升級 瀏覽:923
全球程序員節點贊 瀏覽:986
php函數傳遞數組 瀏覽:631
人工峰群演算法的目標函數 瀏覽:468
如何刪加密文檔 瀏覽:105
塗鴉app一鍵執行如何刪除 瀏覽:756
安卓手機如何打開fr3文件 瀏覽:743
壓縮袋8絲和14絲是什麼意思 瀏覽:647
程序員大咖java 瀏覽:70
蘋果手機文檔安卓上怎麼打開 瀏覽:527
如何做淘寶代理伺服器 瀏覽:672
gz壓縮文件夾 瀏覽:179