基於proteus軟件仿真AT89C52的雙機串口通信 附工程包

計算機與外界的信息交換稱爲通信,常用的通信方式有兩種:並行通信和串行通信。 51 單片機用 4 個接口與外界進行數據輸入與數據輸出就是並行通信,並行通信的特點是傳輸信號的速度快,但所用的信號線較多,成本高,傳輸的距離較近。串行通信的特點是隻用兩條信號線(一條信號線,再加一條地線作爲信號迴路)即可完成通信,成本低,傳輸的距離較遠。
51 單片機的串行接口是一個全雙工的接口,它可以作爲 UART (通用異步接受和發送器)用,也可以作爲同步移位寄存器用。 51 單片機串行接口的結構如下:
( 1 )數據緩衝器( SBUF )
接受或發送的數據都要先送到 SBUF 緩存。有兩個,一個緩存,另一個接受,用同一直接地址 99H, 發送時用指令將數據送到 SBUF 即可啓動發送;接收時用指令將 SBUF 中接收到的數據取出。
( 2 )串行控制寄存器( PCON )
SCON 用於串行通信方式的選擇,收發控制及狀態指示,各位含義如下:
SM0 SM1 SM2 REN TB8 RB8 TI RI

SM0,SM1: 串行接口工作方式選擇位,這兩位組合成 00 , 01 , 10 , 11 對應於工作方式 0 、 1 、 2 、 3 。
串行接口工作方式特點見下表
SM0 SM1 工作方式 功能 波特率
0 0 0 8 位同步移位寄存器(用於 I/O 擴展)f ORC /12
0 1 1 10 位異步串行通信( UART ) 可變( T1 溢出率 *2 SMOD /32 )
1 0 2 11 位異步串行通信( UART ) f ORC /64 或 f ORC /32
1 1 3 11 位異步串行通信( UART ) 可變( T1 溢出率 *2 SMOD /32 )

SM2 :多機通信控制位。
REN :接收允許控制位。軟件置 1 允許接收;軟件置 0 禁止接收。
TB8 :方式 2 或 3 時, TB8 爲要發送的第 9 位數據,根據需要由軟件置 1 或清 0 。
RB9 :在方式 2 或 3 時, RB8 位接收到的第 9 位數據,實際爲主機發送的第 9 位數據 TB8 ,使從機根據這一位來判斷主機發送的時呼叫地址還是要傳送的數據。
TI :發送中斷標誌。發送完一幀數據後由硬件自動置位,並申請中斷。必須要軟件清零後才能繼續發送。
RI :接收中斷標誌。接收完一幀數據後由硬件自動置位,並申請中斷。必須要軟件清零後才能繼續接收。
( 3 )輸入移位寄存器
接收的數據先串行進入輸入移位寄存器, 8 位數據全移入後,再並行送入接收 SBUF 中。
( 4 )波特率發生器
波特率發生器用來控制串行通信的數據傳輸速率的, 51 系列單片機用定時器 T1 作爲波特率發生器, T1 設置在定時方式。波特率時用來表示串行通信數據傳輸快慢程度的物理量,定義爲每秒鐘傳送的數據位數。
( 5 )電源控制寄存器 PCON
其最高位爲 SMOD 。
( 6 )波特率計算
當定時器 T1 工作在定時方式的時候,定時器 T1 溢出率 = ( T1 計數率) / (產生溢出所需機器週期)。由於是定時方式, T1 計數率 = f ORC /12 。產生溢出所需機器週期數 = 模 M- 計數初值 X 。

proteus建立工程如下:
在這裏插入圖片描述
運行時的截圖如下:
在這裏插入圖片描述
在這裏插入圖片描述
左邊爲主機,主機代碼爲:

#include <reg51.h>

//初始化串行口
void csh()
	{
	SM0=0;
	SM1=1;
	REN=1;
	TI=0;
	RI=0;
	PCON=0;
	TH1=0xF3;
	TL1=0XF3;
	TMOD=0X20;
	EA=1;
	ET1=0;
	ES=1;
	TR1=1;
	}

void main()
	{
	int i,j;
	char c=0;
	csh();
	while(1)
		{
		ES=0;
		TI=0;
		P0=c;
		SBUF=c;
		while(!TI)
		;
		TI=0;
		ES=1;
		for(j=0;j<50;j++)
		for(i=0;i<5000;i++)
		;
		c++;
		if (c>9)
		c=0;
		}
}

void intrr() interrupt 4
	{
	char temp;
	temp=SBUF;
	P2=temp;
	RI=0;
	}




右邊爲從機,代碼爲:

#include <reg51.h>

//初始化串行口
void csh()
	{
	SM0=0;
	SM1=1;
	REN=1;
	TI=0;
	RI=0;
	PCON=0;
	TH1=0xF3;
	TL1=0XF3;
	TMOD=0X20;
	EA=1;
	ET1=0;
	ES=1;
	TR1=1;
	}

void main()
	{
	csh();
	while(1)
		{
		;
		}
}

void intrr() interrupt 4
	{
	char temp;
	temp=SBUF;
	P2=temp;
	RI=0;
	temp++;
	if (temp>9)
	temp=0;
	ES=0;
	TI=0;
	P0=temp;
	SBUF=temp;
	while(!TI)
	;
	TI=0;
	ES=1;
	}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章