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

單片機串口通信程序

發布時間:2022-04-01 14:27:46

① 51單片機串口收發程序

11,單片串口的收發程序鎮甘城子應該也是比較不錯的證件,能夠真誠地使用所有認為這個屬相應該比較廣一點兒也不所以我認為這跟屏幕放大。

② 高分求51單片機串口通信的程序

利用方式1實現單片機雙機通信,主頻為6M,波特率為2400bps,電路見圖5-10。當兩個單片機距離較近時,甲、乙兩機的發送端與接收端分別直接相聯,兩機共地。執行程序,甲機將亮燈信號發送給乙機,若通信正常,乙機接收到信號後點亮20個發光二極體。乙機採用查詢與中斷兩種工作方式。當然20個LED乙機可單獨控制,也可接受甲機的控制,並執行甲機指令,還需要進一步完善程序.
甲機發送程序:
org 0000h
sta: mov tmod,#20h ;設置波特率
mov tl1,#0FAh
mov th1,#0FAh
setb tr1
mov scon,#40h ;置工作方式1
clr ti
mov a,#00h
mov sbuf,a ;發送亮燈信號
wait: jbc ti,cont ;發送成功清標志
ajmp wait ;等待發送完畢
cont: sjmp sta ;重復發送
end

乙機查詢工作方式接收:

org 0000h
mov tmod,#20h ;設置通信波特率
mov tl1,#0FAh
mov th1,#0FAh
setb tr1
mov scon,#40h
clr ri
setb ren ;允許接收
wait: jbc ri,read ;接收成功清標志
ajmp wait ;接收未完等待
read: mov a ,sbuf
mov p1,a ;接收亮燈信號送P1口
sjmp $
end

乙機中斷工作方式接收
org 0000h
ajmp main
org 0023h
ajmp zd ;轉串口中斷程序
START: MOV TMOD,#20h
mov tl1,#0FAh
mov th1,#0FAh
setb tr1
mov scon,#50h
clr ri
mov ie,#90h ;開中斷

MAIN:sjmp $ 主程序
zd: clr ri ;清接收標志
;==============中斷程序還要再完善==============
mov a ,sbuf ;讀接收信號
mov p1,a
MOV R1,A ;將收到的信號送緩存
reti ;中斷返回
end

採用方式2 通信,數據幀格式是11位的,TB8為奇偶校驗位,接收過程要求判斷RB8,若出錯置F0標志為1,正確則置F0標志為0,然後返回。發送波特率375kbps,晶振為12MHz,所以SMOD=l。由於傳送數據的波特率與定時器無關,所以程序中無需對定時器編程.

send:
MOV SCON,#80H ;設置串列口為方式2
MOV PCON,#80H ;SMOD=l
MOV R0,#50H ;設數據塊指針
MOV R7,#20 ;設數據塊長度
STA: MOV A,@R0 ;取數據給A
MOV C,P
MOV TB8,C ;奇偶位P送給TB8,
MOV SBUF,A ;啟動發送
;====================================================
WAIT: JBC TI,CONT ;若發完一幀數據,清標志後發下一幀數據
AJMP WAIT ;未完等待
;=======================================================
CONT:INC R0 ;修改數據指針
DJNZ R7,STA ;循環發送至結束
RET
;========================================================
;乙機接收程序如下:
; 在進行雙機通信時,兩機應採用相同的工作方式和波特率。
;=============================================================
MOV SCON,#90H ;設置串列口為方式2,REN為1,允許接收
MOV PCON,#80H ;SMOD=1
MOV R0,#50H ;設置數據塊首址
MOV R7,#20 ;置數據塊長度
;=========================================================
WAIT:JBC RI,READ ;接收完一幀數據則RI清零並讀入數據
AJMP WAIT ;未完等待
;==========================================
READ:MOV A,SBUF ;讀入數據
JNB PSW.0,PZ ;收到數為偶數則轉
JNB RB8,ERR ;收到數為奇數,發端為偶數則通信出錯
SJMP RIGHT ;相符則正確
PZ:JB RB8,ERR ;收到數為偶數,發端為奇數則出錯
;========================================
RlGHT:MOV @R0,A ;通信正確,存放數據
INC R0 ;更改地址指針
DJNZ R7,WAIT ;數據塊接收完否,未完繼續
CLR PSW.5 ;通信正確,置F0為0
RET ;返回
ERROR:SETB PSW.5 ;通信出錯,置F0為l
RET ;返回

③ 51單片機串口通信程序(需要判斷)

#include<reg51.h>
#define uchar unsigned char
uchar com1[]={0xef,0x01,0xff,0xff,0xff,0xff,0x01,0x00,0x03,0x01,0x00,0x05};
uchar red1[]={0xef,0x01,0xff,0xff,0xff,0xff,0x07,0x00,0x03,0x02,0x00,0x0c};
uchar red2[]={0xef,0x01,0xff,0xff,0xff,0xff,0x07,0x00,0x03,0x02,0x00,0x0a};
uchar red3[]={0xef,0x01,0xff,0xff,0xff,0xff,0x07,0x00,0x03,0x02,0x80,0x0a};
sbit p17=P1^7;
sbit p10=P1^0;
sbit p11=P1^1;
sbit p12=P1^2;
main()
{
uchar i,rdat[12];
TMOD=0x20;
TH1=0xfd;
TL1=0xfd;
TR1=1;
SCON=0x50;
while(1)
{
for(i=0;i<12;i++)
{
SBUF=com1[i];
while(!TI);
TI=0;
}
i=0;
while(i<12)
{
if(RI)
{
RI=0;
rdat[i]=SBUF;
i++;
}
}
for(i=0;i<12;i++)
{
if(rdat[i]!=red1[i])p17=1;
}
for(i=0;i<12;i++)
{
SBUF=com1[i];
while(!TI);
TI=0;
}
i=0;
while(i<12)
{
if(RI)
{
RI=0;
rdat[i]=SBUF;
i++;
}
for(i=0;i<12;i++)
{
if(rdat[i]!=red2[i])p10=1;
else if(rdat[i]!=red2[i])p11=1;
else p12=1;
}
}
}
}

④ 編寫單片機串口收發數據的完整程序(C語言編寫)

我用的新唐晶元,8051內核,跟51差不多,望採納
void UART_Initial (void)
{
P02_Quasi_Mode; //Setting UART pin as Quasi mode for transmit
P16_Quasi_Mode; //Setting UART pin as Quasi mode for transmit

SCON_1 = 0x50; //UART1 Mode1,REN_1=1,TI_1=1
T3CON = 0x08; //T3PS2=0,T3PS1=0,T3PS0=0(Prescale=1), UART1 in MODE 1
clr_BRCK;
RH3 = HIBYTE(65536 - (1000000/u32Baudrate)-1); /*16 MHz */
RL3 = LOBYTE(65536 - (1000000/u32Baudrate)-1); /*16 MHz */
set_TR3; //Trigger Timer3
}
以上是初始化的
void Send_Data_To_UART1(UINT8 c)
{
TI_1 = 0;
SBUF_1 = c;
while(TI_1==0);
}
這個是發送
void UART_isr (void) interrupt 4 //串列中斷服務程序
{
if (RI_1==1)
{ /* if reception occur */
clr_RI_1; /* clear reception flag for next reception */
Receive_Date[c] = SBUF_1;
if (Receive_Date[0] == First_Date)
{
c++;
}
else if(Receive_Date_Size > 0 && Receive_Date_Size < 4)
{
c++;
}
else if(Receive_Date[c] == Last_Date && Receive_Date_Size ==4)
{
c = 0;
Flag_Receive_One = 1;
}
else
{
c = 0;
}
}
}
接收

⑤ 請問51單片機與51單片機之間的串口通信程序怎麼寫

1、查詢方式:
#include<reg51.h>
main()
{
unsigned char dat;
TMOD=0x20;
TH1=TL1=0xfd;
SCON=0x50;
TR1=1;
while(1)
{
if(RI)//接收
{
RI=0;
dat=SBUF;
}
SBUF=dat;//發送
while(!TI);
TI=0;
}
}
2、中斷方式:
#include<reg51.h>
unsigned char dat;
bit flag;
void uart_isr() interrupt 4
{
if(RI)//接收
{
RI=0;
dat=SBUF;
flag=1;
}
if(TI)TI=0;
}
main()
{
TMOD=0x20;
TH1=TL1=0xfd;
SCON=0x50;
TR1=1;
EA=1;
ES=1;
flag=0;
while(1)
{
if(flag)
{
SBUF=dat;
flag=0;
}
}
}

⑥ 怎樣編寫單片機的串口通信的程序

GCC只是一個編譯器,和別的編譯器一樣。 串口通訊程序一般都是這樣一個流程(AVR單片機正常工作的情況下): 1 配置時鍾,包括使能時鍾,配置串口波特率。 2 其他配置,包括校驗設置,使能串口等。 3 收發數據。主要過程為查詢串口標志位,然後根據串口標志位去判斷是否完成了收發數據。 按照這三個步驟去寫程序,應該很快就能完成一個通訊程序。

⑦ 51單片機串口通信的過程

單片機要用串口通信,用中斷是最好不過的了,因為單片機的內部運行速度非常快(相對串口來說的),發送後需要等好久,這段時間你可以安排它做別的事,當然你可以不用中斷,那就是由軟體來模擬串口進行,但這樣程序設計就更麻煩,單片機也不能做別的事了!

⑧ 單片機串口通信過程

void output(void)
{if (flag==1)
flag=0;
ES=0;
SBUF=put;
while(!TI);
TI=0;
ES=1;
}
錯誤在於此:「SBUF=put;」,你是一直在讓單片機串口發送put值(2),所以串口調試助手一直在接收數據。
改正的辦法是:把這個output函數刪去,我剛才用單片機開發板驗證了,這樣就能顯示串口發送的數字了。
還有什麼問題,可以Hi我。

⑨ 怎樣編寫單片機的串口通信的程序,一般的步驟是怎麼樣

編寫串口通訊程序步驟為:

1、設置波特率

2、設置串口工作方式

3、收發數據。

比如:

main()
{
unsignedchardat;
TMOD=0x20;
TH1=0xfd;
TL1=0xfd;
TR1=1;
SCON=0x50;
while(1)
{
while(RI==0);
RI=0;
dat=SBUF;
SBUF=~dat;
while(TI==0)
TI=0;
}
}

⑩ 如何實現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的時間,提高效率,

閱讀全文

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

熱點內容
id加密門禁卡可以復制到手機嗎 瀏覽:672
路由器如何控制某個app 瀏覽:43
C51編譯器在標准C的基礎上 瀏覽:260
銀行卡掉了可以辦車貸解壓嗎 瀏覽:317
沒解壓可以貸款嗎 瀏覽:517
最小pdf閱讀器 瀏覽:808
游戲被加密了怎樣用電腦打開 瀏覽:300
藍燈如何手動選擇伺服器 瀏覽:85
伺服器設置在中國意味什麼 瀏覽:571
單片機不能進行選擇控制 瀏覽:694
咕咚手錶如何綁定手機app 瀏覽:530
命令虛擬語氣 瀏覽:405
戴爾系統命令 瀏覽:583
怎樣壓縮視頻文件大小 瀏覽:686
51單片機信號發生器 瀏覽:56
米拍攝影哪個app好 瀏覽:88
天津致遠曙光伺服器雲伺服器 瀏覽:117
光子程序員怎麼獲得 瀏覽:535
中醫診斷學第九版pdf 瀏覽:498
python集成包 瀏覽:305