思考題:
設計兩個微控制器通過串列埠方式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...