串行口通信(二)之串行口方式0
前言
上一篇就已經介紹串行口通信相關概念,寄存器。對串行口通信已經有一定的了解。還介紹串行口工作方式1,這個方式所用最多,務必會用。現在來介紹工作方式0,2,3。下面來了解一下。
串行口方式0
串行口的工作方式0為移位寄存器I/O方式,可外接移位寄存器,一擴展I/O口,也可外接同步I/O設備。
發送操作:當執行一條“SBUF=A”指令時,啟動發送操作,由TXD輸出移位脈沖,由RXD串行SBUF中的數據。發送完8位數據後自動置TI=1.請求中斷。要繼續發送時,TI必須有指令清零。
接收操作:REN是串行口接收允許控制位。REN=0時禁止接收;REN=1時允許接收。當軟件將REN置“1”時,即開始從RXD端口以fosc/12波特率輸入數據,當接收到8位數據時,將中斷標誌RI置“1”。再次接收數據之前,必須用軟件將RI清0。
這個方式中,RXD為數據輸入輸出引腳,TXD為時鐘輸出引腳。主要用來拓展IO口。這個方式完成時需要借用外部移位寄存器。74ls164,74ls165兩個移位寄存器與串行口方式0相得益彰。下面來介紹這兩個寄存器與方式0的配合。
74ls164移位寄存器
概述
74LS164是8位邊沿觸發式移位寄存器,串行輸入數據,然後並行輸出。數據通過兩個輸入端(DSA或DSB)之一串行輸入;任一輸入端可以用作高電平使能端,控制另一輸入端的數據輸入。兩個輸入端或者連接在一起,或者把不用的輸入端接高電平,一定不要懸空。
引腳功能
74LS164
DSA,DSB:數據輸入端
CP:時鐘輸入(低電平到高電平邊沿觸發)
MR:中央復位輸入(低電平有效)
Q0~Q7:數據輸出端
GND:地
VCC:正電源
真值表
真值表
H = HIGH(高)電平
h = 先於低-至-高時鐘躍變一個建立時間 (set-up time) 的 HIGH(高)電平
L = LOW(低)電平
l = 先於低-至-高時鐘躍變一個建立時間 (set-up time) 的 LOW(低)電平
q = 小寫字母代表先於低-至-高時鐘躍變一個建立時間的參考輸入 (referenced input) 的狀態
↑ = 低-至-高時鐘躍變
數據通過DSA,DSB這兩個輸入端之一串行輸入;任一輸入端可以用作高電平使能端,控制另一輸入端的數據輸入。當其中任意一個為低電平,則禁止新數據輸入;當其中有一個為高電平,則另一個就允許輸入數據。 因此兩個輸入端或者連接在一起,或者把不用的輸入端接高電平,一定不要懸空。
當 MR為低電平時,其它所有輸入端都無效,同時所有輸出端均為低電平。為高電平時,允許數據一直輸出。
時序圖
時序圖
MR為高電平時,數據輸入端一個為高電平,另一個輸入數據,時鐘端一直輸入時鐘。輸出端就移位輸出數據。
使用
接法
輸入端接RXD,時鐘端接TXD,MR隨便接一控制端(P0口要上拉電阻),輸出端隨意,根據自己的需求。
#include<reg52.h>
sbit MR=P1^7; //位定義
main()
{
SCON=0X00; //串口方式0.禁止接收數據
IE=0X90; //打開總中斷,串行口中斷
MR=1; //一直允許數據傳輸,
while(1)
SBUF=0X0F; //發送數據
}
void interrupt_uart() interrupt 4
{
TI=0; //軟件置0
}
上面給出簡單的示範,看懂程序後就可以自行設計更復雜的程序,可以想一下用它驅動數碼管。
74LS165
74LS165芯片,它是 8 位並入串出移位寄存器 (使用移位寄存器芯片可以擴展一個或多個 8 位並行 I/O 口)。
引腳
74LS165
SH/LD(shift/ load 移位 /置位):移位與置位控制端。高電平時表示移位, 低電平時表示置位。在開始移位之前,需要先從並行輸入端口讀入數據,這時應將 SH/LD置 0,並行口的 8 位數據將被置入 74LS165 內部的 8 個觸發器,在 SH/LD 為 1時,並行輸入被封鎖,移位操作開始。
INH (clock inhibit 時鐘抑制):時鐘禁止端。當 INH 為低電平時,充許時鐘輸入。
CLK(clock) :時鐘輸入端
D0~D7:並行輸入端
SI(serial input 串行輸入):串行輸入端, 用於擴展多個 74LS165 的首尾連接端。
SO( serial output):串行輸出端 .
QH:也是串行輸出端,它與 SO 是反相的關系,即 QH=SO.
VCC(16 引腳,在 proteus 中被隱藏 ):已經默認接 +5V 電源端 .
GND(8 引腳,在 proteus中被隱藏 ):已經默認接地
使用
接法
串行口輸出端接RXD,時鐘端接TXD,移位/置位端接控制端,時鐘抑制端接地,允許時鐘輸出。輸入端自行決定,剩下兩個端口沒有用到就空接。
#include<reg52.h>
unsigned int date;
sbit SH=P1^7; //位定義
main()
{
SCON=0X10; //串口方式0.允許接收數據
IE=0X90; //打開總中斷,串行口中斷
while(1)
{
SH=0; //置位,將數據存進芯片
SH=1; // 移位,將芯片數據移入rxd
date=SBUF; //讀取數據
}
}
void interrupt_uart() interrupt 4
{
RI=0; //軟件置0
}
簡單程序,看懂就行,簡單入門,需要什麽功能自行添加。
總結
串行口方式0就只有這麽多內容,主要使用來拓展IO口,和外部移位寄存器一起使用。上面的程序簡單易懂,主要是為了能快速看懂,當然在實戰中不可能這麽簡單,但會用了,開發就不成問題。方式2和3只在波特率上存在區別,它們主要用在單片機的多機通訊,下一篇將詳細介紹。喜歡的朋友點個關註,轉發一下吧。
串行口通信(二)之串行口方式0