串行口通信(二)

前言

上一篇就已經(jīng)介紹串行口通信相關(guān)概念,寄存器。對(duì)串行口通信已經(jīng)有一定的了解。還介紹串行口工作方式1,這個(gè)方式所用最多,務(wù)必會(huì)用?,F(xiàn)在來介紹工作方式0,2,3。下面來了解一下。

串行口方式0

串行口的工作方式0為移位寄存器I/O方式,可外接移位寄存器,一擴(kuò)展I/O口,也可外接同步I/O設(shè)備。
發(fā)送操作:當(dāng)執(zhí)行一條“SBUF=A”指令時(shí),啟動(dòng)發(fā)送操作,由TXD輸出移位脈沖,由RXD串行SBUF中的數(shù)據(jù)。發(fā)送完8位數(shù)據(jù)后自動(dòng)置TI=1.請(qǐng)求中斷。要繼續(xù)發(fā)送時(shí),TI必須有指令清零。
接收操作:REN是串行口接收允許控制位。REN=0時(shí)禁止接收;REN=1時(shí)允許接收。當(dāng)軟件將REN置“1”時(shí),即開始從RXD端口以fosc/12波特率輸入數(shù)據(jù),當(dāng)接收到8位數(shù)據(jù)時(shí),將中斷標(biāo)志RI置“1”。再次接收數(shù)據(jù)之前,必須用軟件將RI清0。
這個(gè)方式中,RXD為數(shù)據(jù)輸入輸出引腳,TXD為時(shí)鐘輸出引腳。主要用來拓展IO口。這個(gè)方式完成時(shí)需要借用外部移位寄存器。74ls164,74ls165兩個(gè)移位寄存器與串行口方式0相得益彰。下面來介紹這兩個(gè)寄存器與方式0的配合。

74ls164移位寄存器

概述

74LS164是8位邊沿觸發(fā)式移位寄存器,串行輸入數(shù)據(jù),然后并行輸出。數(shù)據(jù)通過兩個(gè)輸入端(DSA或DSB)之一串行輸入;任一輸入端可以用作高電平使能端,控制另一輸入端的數(shù)據(jù)輸入。兩個(gè)輸入端或者連接在一起,或者把不用的輸入端接高電平,一定不要懸空。

引腳功能

74LS164

DSA,DSB:數(shù)據(jù)輸入端
CP:時(shí)鐘輸入(低電平到高電平邊沿觸發(fā))
MR:中央復(fù)位輸入(低電平有效)
Q0~Q7:數(shù)據(jù)輸出端
GND:地
VCC:正電源

真值表

真值表

H = HIGH(高)電平
h = 先于低-至-高時(shí)鐘躍變一個(gè)建立時(shí)間 (set-up time) 的 HIGH(高)電平
L = LOW(低)電平
l = 先于低-至-高時(shí)鐘躍變一個(gè)建立時(shí)間 (set-up time) 的 LOW(低)電平
q = 小寫字母代表先于低-至-高時(shí)鐘躍變一個(gè)建立時(shí)間的參考輸入 (referenced input) 的狀態(tài)
↑ = 低-至-高時(shí)鐘躍變

數(shù)據(jù)通過DSA,DSB這兩個(gè)輸入端之一串行輸入;任一輸入端可以用作高電平使能端,控制另一輸入端的數(shù)據(jù)輸入。當(dāng)其中任意一個(gè)為低電平,則禁止新數(shù)據(jù)輸入;當(dāng)其中有一個(gè)為高電平,則另一個(gè)就允許輸入數(shù)據(jù)。 因此兩個(gè)輸入端或者連接在一起,或者把不用的輸入端接高電平,一定不要懸空。
當(dāng) MR為低電平時(shí),其它所有輸入端都無效,同時(shí)所有輸出端均為低電平。為高電平時(shí),允許數(shù)據(jù)一直輸出。

時(shí)序圖

時(shí)序圖

MR為高電平時(shí),數(shù)據(jù)輸入端一個(gè)為高電平,另一個(gè)輸入數(shù)據(jù),時(shí)鐘端一直輸入時(shí)鐘。輸出端就移位輸出數(shù)據(jù)。

使用

接法

輸入端接RXD,時(shí)鐘端接TXD,MR隨便接一控制端(P0口要上拉電阻),輸出端隨意,根據(jù)自己的需求。

#include<reg52.h>
sbit MR=P1^7;   //位定義
main()
{
    SCON=0X00;  //串口方式0.禁止接收數(shù)據(jù)
    IE=0X90;    //打開總中斷,串行口中斷
    MR=1;       //一直允許數(shù)據(jù)傳輸,
    while(1)
    SBUF=0X0F;  //發(fā)送數(shù)據(jù)
}
void interrupt_uart() interrupt 4
{
    TI=0;   //軟件置0
}

上面給出簡(jiǎn)單的示范,看懂程序后就可以自行設(shè)計(jì)更復(fù)雜的程序,可以想一下用它驅(qū)動(dòng)數(shù)碼管。

74LS165

74LS165芯片,它是 8 位并入串出移位寄存器 (使用移位寄存器芯片可以擴(kuò)展一個(gè)或多個(gè) 8 位并行 I/O 口)。

引腳

74LS165

SH/LD(shift/ load 移位 /置位):移位與置位控制端。高電平時(shí)表示移位, 低電平時(shí)表示置位。在開始移位之前,需要先從并行輸入端口讀入數(shù)據(jù),這時(shí)應(yīng)將 SH/LD置 0,并行口的 8 位數(shù)據(jù)將被置入 74LS165 內(nèi)部的 8 個(gè)觸發(fā)器,在 SH/LD 為 1時(shí),并行輸入被封鎖,移位操作開始。
INH (clock inhibit 時(shí)鐘抑制):時(shí)鐘禁止端。當(dāng) INH 為低電平時(shí),充許時(shí)鐘輸入。
CLK(clock) :時(shí)鐘輸入端
D0~D7:并行輸入端
SI(serial input 串行輸入):串行輸入端, 用于擴(kuò)展多個(gè) 74LS165 的首尾連接端。
SO( serial output):串行輸出端 .
QH:也是串行輸出端,它與 SO 是反相的關(guān)系,即 QH=SO.
VCC(16 引腳,在 proteus 中被隱藏 ):已經(jīng)默認(rèn)接 +5V 電源端 .
GND(8 引腳,在 proteus中被隱藏 ):已經(jīng)默認(rèn)接地

使用

接法

串行口輸出端接RXD,時(shí)鐘端接TXD,移位/置位端接控制端,時(shí)鐘抑制端接地,允許時(shí)鐘輸出。輸入端自行決定,剩下兩個(gè)端口沒有用到就空接。

#include<reg52.h>
unsigned int date;
sbit SH=P1^7;   //位定義
main()
{
    SCON=0X10;  //串口方式0.允許接收數(shù)據(jù)
    IE=0X90;    //打開總中斷,串行口中斷

    while(1)
    {
        SH=0;      //置位,將數(shù)據(jù)存進(jìn)芯片
        SH=1;      // 移位,將芯片數(shù)據(jù)移入rxd
        date=SBUF;  //讀取數(shù)據(jù)
    }
}                                   
void interrupt_uart() interrupt 4
{
    RI=0;   //軟件置0

}

簡(jiǎn)單程序,看懂就行,簡(jiǎn)單入門,需要什么功能自行添加。

總結(jié)

串行口方式0就只有這么多內(nèi)容,主要使用來拓展IO口,和外部移位寄存器一起使用。上面的程序簡(jiǎn)單易懂,主要是為了能快速看懂,當(dāng)然在實(shí)戰(zhàn)中不可能這么簡(jiǎn)單,但會(huì)用了,開發(fā)就不成問題。方式2和3只在波特率上存在區(qū)別,它們主要用在單片機(jī)的多機(jī)通訊,下一篇將詳細(xì)介紹。喜歡的朋友點(diǎn)個(gè)關(guān)注,轉(zhuǎn)發(fā)一下吧。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容