實驗目的:學會用單片機與計算機之間通過串口通訊,
實驗模塊:核心板;
實驗內容:由串口除錯助手以16進制向單片機發送一資料,如01,如果單片機接收到資料將會原樣回傳給計算機,并且顯示在串口除錯助手的接收框內,硬體電路圖:在應用單片機的串口和 PC 進行串行通信時,需要進行兩種不同的電平之間的轉換,需要應用MAX232芯片將從0V和 5V的TTL電平轉換到3V~15V或-3V~-15V的 RS-232C 電平,串口通信的資料傳輸程序如下:MAX232 的 10 腳 T2IN 接單片機 TXD 端 P3.1,TTL 電平從單片機的 TXD 端發出,經過 MAX232 轉換為RS-232 電平后從 MAX232 的 14 腳 T1OUT 發出,再連接到串口座的第 2 腳 TXD,至此計算機端接收到資料,PC 機發送資料時從 PC 機串口座上的第 3 腳 RXD 端

實驗代碼:
/***************************************************************************************************
硬體連接: 用2位杜邦線分別將J9_0與J5_R1及J9_1與J5_D1連接(下載完程式后),用串口線將PC和開發板上的串口1連接,
***************************************************************************************************/
#include "reg51.h" //包含頭檔案 #define uchar unsigned char
#define uint unsigned int
uchar ch; //用于存放串口接收到的資料
bit read_flag= 0 ; //取數標志位 //**************************************************************************************************
//初始化串口
//**************************************************************************************************
void init_com( void ) {
SCON = 0x50; // 設定通信方式為方式1,允許接收,相當于REN = 1; SM1 = 1;
PCON = 0x00; //SMOD=0,該陳述句可去掉
IE |= 0x90 ; //打開串口中斷, 相當于 EA = 1;ES = 1; //以下4句設定T1
TMOD = 0x20; // 定時器1作業于8位自動多載模式, 用于產生波特率
TH1=0xE6; //定時器0賦初值,TH1=(256 - (12000000 / (32 * 12 * 1200)))=230;
TL1=0xE6; //TL1=(256 - (12000000 / (32 * 12 * 1200)))=230;
TR1 = 1; //啟動T1
}
//**************************************************************************************************
//串口中斷函式
//**************************************************************************************************
void serial () interrupt 4 using 3 {
if (RI) {
RI = 0 ; //此步必不可少,因為硬體不能將其置0
ch=SBUF; //從SBUF中取出資料
read_flag= 1 ; //就置位取數標志
} }
//**************************************************************************************************
//串口發送函式
//**************************************************************************************************
void send_char( unsigned char ch1) {
SBUF=ch1; //將待發資料放到SBUF
while (TI== 0); //等待TI=1(表示幀發送結束)發送
TI= 0 ; //此步必不可少,因為硬體不能將其置0 }
//**************************************************************************************************
//主函式
//**************************************************************************************************
void main(void)
{
init_com( ) ;
while(1)
{
/*
查詢方式實作通信,當系統較小時采取,
使用該方式必須將下面的中斷方式屏蔽,
IE = 0x00 ; //關閉所有中斷,以防止中斷影響
while(RI == 0);
RI = 0;
ch = SBUF; // 從緩沖區中把接收的字符放入c中
SBUF = ch; // 要發送的字符放入緩沖區
while(TI == 0);
TI = 0;
*/ //中斷方式實作通信 當系統較大時采取
if (read_flag) //如果取數標志已置位,就將讀到的數從串口發出 {
read_flag= 0 ; //取數標志清0
send_char(ch); //將讀到的數從串口發出
}
} }
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/6492.html
標籤:嵌入式
上一篇:痞子衡嵌入式:走進二維碼(QR Code)的世界(2)- 初體驗(PyQt5.11+MyQR2.3+ZXing+OpenCV4.2.0)
