實驗目的:學會用單片機與電腦之間通過串口通訊。實驗模塊:核心板;實驗內容:由串口調試助手以16進位向單片機發送一數據,如01,如果單片機接收到數據將會原樣返回給電腦,並且顯示在串口調試助手的接收框內。硬體電路圖:在應用單片機的串口和 PC 進行串列通信時,需要進行兩種不同的電平之間的轉換,需要應 ...
實驗目的:學會用單片機與電腦之間通過串口通訊。
實驗模塊:核心板;
實驗內容:由串口調試助手以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); //將讀到的數從串口發出
}
} }