基本知識:
( 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 ,
仿真圖:

完整代碼:
單片機1的代碼:
#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;
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;
}
}
單片機2的代碼:
#include <reg51.h>
//3?ê??ˉ′?DD?ú
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;
switch(temp){
case 0: P1=0x00;break;
case 1: P1=0xfe;break;
case 2: P1=0xfd;break;
case 3: P1=0xfb;break;
case 4: P1=0xf7;break;
case 5: P1=0xef;break;
case 6: P1=0xdf;break;
case 7: P1=0xbf;break;
case 8: P1=0x7f;break;
}
RI=0;
}
仿真效果:

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/258808.html
標籤:其他
