微控制器 串列埠通訊實驗

2021-10-09 01:09:52 字數 4729 閱讀 7640

思考題:

設計兩個微控制器通過串列埠方式1進行全雙工資料通訊,要求將波特率設定為2400,晶振頻率為11.0592mhz,請分別編寫傳送程式和接收程式,接收端需使用液晶螢幕顯示接收內容,傳送端可迴圈傳送乙個字串(自己定義乙個字串,例如「welcome to wuhan」)。

(1)電路圖如下:

(2)設計思路:

1、電路:

兩個微控制器都是用p0口連線lcd1602資料線的0~7位,p20連線暫存器選擇位rs,p21連線讀寫選擇位rw,p2^2連線使能位e。然後甲機的rxd連乙機的txd,甲機的txd連乙機的rxd。需要注意的是:p0口,p2作為i/o口輸出的時候時輸出低電平為0輸出高電平為高組態(並非5v,相當於懸空狀態)。也就是說不能真正的輸出高電平,給所接的負載提供電流,因此必須接上拉電阻。

2、程式:

波特率2400,晶振頻率為11.0592mhz,t1工作在方式1,由公式x=256-(fosc/12)(2^smod/(322400)),可以算出初值th1=tl1=244=0xf4。有關lcd1602的相關函式此處就略了!!

2.1甲機傳送資料程式說明:

串列埠首先要初始化,選擇方式1,ren允許接收位置1,即scon=0x50;t1工作在方式2,即tmod=0x20;波特率不加倍,即pcon=0x00;設定初值th1=tl1=0xf4;啟動t1,即tr1=1。

然後串列埠傳送資料,cpu將資料寫入sbuf,即sbuf=dat;再搞乙個陷阱while(!ti)來判斷是否發完,下一步ti置0;

呼叫lcd1602的單字元顯示函式dis_char(address++,dat) (address剛開始為0x00)傳送下乙個資料時位址++,(傳送完乙個資料 就顯示乙個資料);顯示完第一行 就顯示第二行;顯示完第二行 清屏後又顯示第一行;傳送完一幀資料 位址就歸零 清屏 從頭再來。

注意這裡清屏之前要延時一下 ,等前面傳送的資料顯示完了,再清屏!具體請看**!!!

2.2乙機接收資料程式說明:

首先也是串列埠的初始化 ,跟樓上甲機是一樣的!

然後是串列埠接收資料,這裡是通過串列埠中斷來接收資料的(interrupt 4)。但是有個不足就是得事先知道傳送資料的第乙個字元;判斷當sbuf==傳送資料的第乙個字元時,這就說明剛接收完一幀資料或者馬上開始接收資料,那這時就將位址address置0並將螢幕清屏;然後讀sbuf中的資料,呼叫lcd1602的單字元顯示函式dis_char(address++,receive_char) ;再將ri軟體置0。最後同傳送的顯示格式一樣,顯示完第一行 就顯示第二行;顯示完第二行 清屏後又顯示第一行;接收完一幀資料 位址就歸零 清屏 從頭再來。

(3)傳送程式**:

/** 功能描述: 甲機發資料!」**/

#include

#include

#define uchar unsigned char

#define uint unsigned int

#define lcd_out p0

/***********埠定義********************************/

sbit rs=p2^0;

sbit rw=p2^1;

sbit e=p2^2;

/***********函式申明***********************************/

void

uart_init

(void);

void

uart_senddata

(uchar dat)

;void

uart_sendstring

(uchar *p)

;void

delay

(uint j)

;void

check_busy

(void);

void

write_command

(uchar com)

;void

write_data

(uchar dat)

;void

lcd_initial

(void);

void

dis_char

(uchar ad, uchar input)

;/***********變數定義********************************/

uchar address=

0x00

;//顯示位址

uchar sting=

"welcome to sichuan for hot pot!"

;void

main

(void)}

//串列埠初始化

void

uart_init

(void

)//串列埠傳送乙個位元組的資料

void

uart_senddata

(uchar dat)

}//串列埠傳送多位元組資料

void

uart_sendstring

(uchar *p)

}//1ms延時程式

void

delay

(uint j)

}//查忙程式

void

check_busy

(void

)while

(dt&

0x80);

e=0;}

//寫控制指令

void

write_command

(uchar com)

//寫資料指令

void

write_data

(uchar dat)

//液晶屏初始化

void

lcd_initial

(void

)// 輸出字元

void

dis_char

(uchar ad, uchar input)

(4)接受程式**:

/** 功能描述: 乙機收資料!」**/

#include

#include

#define uchar unsigned char

#define uint unsigned int

#define lcd_out p0

/***********埠定義********************************/

sbit rs=p2^0;

sbit rw=p2^1;

sbit e=p2^2;

/***********函式申明***********************************/

void

uart_init

(void);

void

delay

(uint j)

;void

check_busy

(void);

void

write_command

(uchar com)

;void

write_data

(uchar dat)

;void

lcd_initial

(void);

void

dis_char

(uchar ad, uchar input)

;/***********變數定義********************************/

uchar address=

0x00

;//顯示位址

uchar receive_char;

//接收的資料

void

main

(void)}

}//利用串列埠中斷來接收資料 並用lcd顯示資訊

void inter (

void

) interrupt 4

receive_char=sbuf;

dis_char

(address++

, receive_char)

;//接收乙個資料顯示乙個資料

ri=0;

//軟體清0

}//串列埠初始化

void

uart_init

(void

)//1ms延時程式

void

delay

(uint j)

}//查忙程式

void

check_busy

(void

)while

(dt&

0x80);

e=0;}

//寫控制指令

void

write_command

(uchar com)

//寫資料指令

void

write_data

(uchar dat)

//液晶屏初始化

void

lcd_initial

(void

)// 輸出字元

void

dis_char

(uchar ad, uchar input)

微控制器實驗 串列埠通訊實驗

實驗三 串列埠通訊實驗 內容 1 利用電腦串列埠與實驗台串列埠進行連線 2 根據幀格式定義 波特率定義,程式設計配置串列埠,並編寫控制程式 3 實現從電腦上輸入控制字元,由微控制器通過串列埠接收,並控制led顯示的功能 4 對所程式設計序進行除錯及驗證。要求 1 掌握波特率的概念 學會程式設計設定波...

STC 51 微控制器 串列埠通訊實驗

以後不再好高騖遠,要腳踏實地地做好每件事,要踏踏實實地學好微控制器。作為第乙個部落格,首先談談我寫的乙個51微控制器串列埠通訊程式。我用的是一款增強版51微控制器,型號為stc12le5a60s2。1 查詢方式,下面是我的源 微控制器型號 stc12le5a60s2 串列埠1,波特率發生器使用定時器...

51微控制器的串列埠通訊例項

question 以16進製制傳送乙個0 255之間的任一數,當微控制器收到後在數碼管上動態顯示出來,波特率自定。include define uchar unsigned char define uint unsigned int sbit duan p2 6 sbit wei p2 7 ucha...