C51單片機(jī)06(串行通信)_第1頁
C51單片機(jī)06(串行通信)_第2頁
C51單片機(jī)06(串行通信)_第3頁
C51單片機(jī)06(串行通信)_第4頁
C51單片機(jī)06(串行通信)_第5頁
已閱讀5頁,還剩54頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

第6章串行異步通信接口單片機(jī)單片機(jī)的串行異步通信接口對于單片機(jī),從外部觀察,與串行接口有關(guān)的只有RXD、TXD兩條線123456789101112131415161718192021222324252627282930313233343536373839401011001110110011RXDTXDC51串行口功能與結(jié)構(gòu)方式0——同步移位寄存器方式(波特率直接由系統(tǒng)時(shí)鐘產(chǎn)生)方式1——8位異步通信方式(波特率由定時(shí)器T1決定)方式2——9位異步通信方式(波特率直接由系統(tǒng)時(shí)鐘產(chǎn)生)方式3——9位異步通信方式(波特率由定時(shí)器T1決定)MCS-51串行口結(jié)構(gòu)1011001110110011串行口的特殊功能寄存器從用戶編程的角度觀察:收發(fā)數(shù)據(jù)寄存器SBUF地址為99H串口控制寄存器SCON地址為98H電源控制寄存器PCON地址為87H串行口數(shù)據(jù)寄存器SBUF兩個(gè)獨(dú)立的物理寄存器,發(fā)、收共用地址CPU向SBUF寫數(shù)據(jù),寫入發(fā)送數(shù)據(jù)寄存器在發(fā)送時(shí)鐘控制下,先發(fā)送一個(gè)低電平起始位低位在前,高位在后,逐個(gè)發(fā)送數(shù)據(jù)位最后發(fā)送一個(gè)高電平停止位發(fā)送完數(shù)據(jù)位后,發(fā)送中斷標(biāo)志TI置“1”CPU讀SBUF,讀的是接收數(shù)據(jù)寄存器檢測起始位接收數(shù)據(jù)位,移入移位寄存器接收有效,接收中斷標(biāo)志RI置“1”串行口控制寄存器SCON定義串行口的工作方式,進(jìn)行接收、發(fā)送控制和監(jiān)控串行口的工作過程SM0SM1——工作方式選擇SM2——多機(jī)通信控制REN——允許接收控制TB8——發(fā)送數(shù)據(jù)的第9位RB8——接收數(shù)據(jù)的第9位TI——發(fā)送中斷標(biāo)志RI——接收中斷標(biāo)志SM0SM1SM2RENTB8RB8TIRID7D6D5D4D3D2D1D0系統(tǒng)復(fù)位時(shí)SCON全部清零發(fā)送中斷標(biāo)志TI方式0時(shí),當(dāng)發(fā)送數(shù)據(jù)第8位結(jié)束后,由內(nèi)部硬件使TI置位方式1、2、3時(shí),在停止位開始發(fā)送時(shí)由內(nèi)部硬件使TI置位TI置位,產(chǎn)生內(nèi)部中斷interrupt4,通知CPU開始發(fā)送下一個(gè)數(shù)據(jù)CPU響應(yīng)中斷后,TI不能自動清零,必須用軟件清零接收中斷標(biāo)志RI方式0時(shí),當(dāng)接收數(shù)據(jù)第8位結(jié)束后,由內(nèi)部硬件使RI置位方式1、2、3時(shí),若接收有效,由內(nèi)部硬件使RI置位RI置位,產(chǎn)生內(nèi)部中斷interrupt4,通知CPU從接收數(shù)據(jù)寄存器中取走數(shù)據(jù)CPU響應(yīng)中斷后,RI不能自動清零,必須用軟件清零電源控制寄存器PCON主要用于電源控制SMOD——波特率加倍位,用于對串行口的波特率控制SMODD7D6D5D4D3D2D1D05.3.3串行口的工作方式SM0SM1方式功能波特率000移位寄存器fosc/120118位異步通信取決于定時(shí)器T11029位異步通信fosc/32或fosc/641139位異步通信取決于定時(shí)器T1方式0——移位寄存器用來外接移位寄存器,用作擴(kuò)展I/O接口串行數(shù)據(jù)通過RXD輸入、輸出同步時(shí)鐘通過TXD輸出發(fā)送和接收數(shù)據(jù)時(shí)低位在前、高位在后,長度8位波特率固定為fosc/12方式0發(fā)送過程TI=0時(shí),CPU執(zhí)行一條向SBUF寫數(shù)據(jù)的指令,啟動發(fā)送過程經(jīng)過一個(gè)機(jī)器周期,寫入發(fā)送數(shù)據(jù)寄存器的數(shù)據(jù)按低位在前、高全在后的順序,從RXD依次發(fā)送,同步時(shí)鐘從TXD送出8位數(shù)據(jù)(一幀)發(fā)送完畢,標(biāo)志位TI置1,向CPU申請中斷如要再次發(fā)送數(shù)據(jù),必須用軟件將TI清0方式0接收過程RI=0,將REN置1,啟動一次接收過程串行數(shù)據(jù)通過RXD接收,同步移位脈沖通過TXD輸出RXD上的串行數(shù)據(jù)依次移入移位寄存器8位數(shù)據(jù)(一幀)全部移入后,接收控制器將8位數(shù)據(jù)并行送入SBUF硬件使中斷標(biāo)志RI置1,向CPU申請中斷CPU響應(yīng)中斷后,從接收數(shù)據(jù)寄存器SBUF中取出數(shù)據(jù),然后用軟件使RI清0方式1——8位異步通信幀信息結(jié)構(gòu):1個(gè)起始位8個(gè)數(shù)據(jù)位1個(gè)停止位TXD發(fā)送數(shù)據(jù)RXD接收數(shù)據(jù)波特率=2SMOD×(T1的溢出率)/32方式1的發(fā)送過程TI=0,CPU執(zhí)行一條向SBUF寫數(shù)據(jù)的指令,啟動發(fā)送過程數(shù)據(jù)由TXD引腳送出在發(fā)送時(shí)鐘作用下,先通過TXD送出一個(gè)低電平的起始位,然后依次送出8位數(shù)據(jù),其后是一個(gè)高電平的停止位一幀數(shù)據(jù)發(fā)送完畢,發(fā)送中斷標(biāo)志TI置1,向CPU申請中斷方式1的接收過程REN置1,接收器開始工作,以所選波特率的16倍速率對RXD引腳上的電平進(jìn)行采樣發(fā)現(xiàn)起始位(負(fù)跳變),開始接收數(shù)據(jù),在接收移位脈沖控制下依次把接收的數(shù)據(jù)移入移位寄存器8位數(shù)據(jù)及停止位全部接收后,置RI=1,向CPU申請中斷方式2、方式3——9位異步通信幀信息結(jié)構(gòu):1個(gè)低電平起始位9個(gè)數(shù)據(jù)位1個(gè)高電平停止位TXD發(fā)送數(shù)據(jù)端RXD接收數(shù)據(jù)端方式2波特率:fosc/32或者fosc/64方式3波特率: =2SMOD×(T1的溢出率)/325.3.4串行口的編程及應(yīng)用串行口工作方式設(shè)置的說明SCON=0x50;方式1:TI=0,CPU執(zhí)行一條向SBUF寫數(shù)據(jù)的指令,啟動發(fā)送過程一幀數(shù)據(jù)發(fā)送完畢,發(fā)送中斷標(biāo)志TI置1,向CPU申請中斷SM0SM1SM2RENTB8RB8TIRID7D6D5D4D3D2D1D001010000從單片機(jī)發(fā)送一個(gè)字符到PC(查詢方式)//經(jīng)串口把數(shù)據(jù)從單片機(jī)發(fā)送到計(jì)算機(jī)的“串口助手”并顯示在“接收/鍵盤發(fā)送緩沖區(qū)”#include<reg52.h>

voidcom_init(void) //初始化串口子程序{PCON=0x00; //波特率不加倍

SCON=0x50; //串行口工作在方式1,波特率由定時(shí)器T1決定

TMOD=0x20; //定時(shí)器T1工作在方式2(8位自動重置定時(shí)器)

TH1=0xFd;TL1=0xFd; //晶振11.0592MHz,波特率9600TR1=1; //定時(shí)器1啟動 }從單片機(jī)發(fā)送一個(gè)字符到PC(查詢方式)voidMain(){

com_init(); SBUF=68; //把大寫字母D送入發(fā)送緩沖區(qū)

while(!TI); //發(fā)送完畢,TI自動置位

while(1); //循環(huán)等待}思考怎樣才能連續(xù)不斷地向PC發(fā)送一個(gè)字符?#include<reg52.h>#defineucharunsignedcharvoidcom_init(void) //初始化串口子程序{PCON=0x00; //波特率不加倍

SCON=0x50; //串行口工作在方式1,波特率由定時(shí)器T1決定

TMOD=0x20; //定時(shí)器T1工作在方式2(8位自動重置定時(shí)器)

TH1=0xFd;TL1=0xFd; //晶振11.0592MHz,波特率9600TR1=1; //定時(shí)器1啟動 }voiddelay(uchar

milisec) //延時(shí)程序{

uchar

i,j;

for(i=0;i<milisec;i++)

for(j=0;j<150;j++);}voidMain(){

com_init(); SBUF=68; //把大寫字母D送入發(fā)送緩沖區(qū)

while(1) {

if(TI==1) //如果一個(gè)字符發(fā)送完畢

{ SBUF=68; //重新裝入發(fā)送緩沖器

TI=0; //發(fā)送標(biāo)志

delay(500); //延遲一段時(shí)間,便于觀察

} }}從單片機(jī)發(fā)送一個(gè)字符串到PC//經(jīng)串口發(fā)送一個(gè)字符串到計(jì)算機(jī)“串口助手”從單片機(jī)發(fā)送一個(gè)字符串到PC#include<reg52.h>#defineucharunsignedcharvoidcom_init(void) //初始化串口{ PCON=0x00; //波特率不加倍

SCON=0x50; //串口設(shè)置為方式1,8位數(shù)據(jù)

TMOD=0x20; //定時(shí)器T1設(shè)置為方式2 TH1=0xFd;TL1=0xFd; //晶振11.0592,波特率9600TR1=1; //定時(shí)器T1啟動 }使用指針的實(shí)現(xiàn)方法voidMain(){

ucharcodeBuffer[]="WelcomeToTheMCUWorld.";

uchar*p=Buffer; //指向待發(fā)送數(shù)據(jù)首地址

com_init(); //初始化異步通信端口

while(1) { SBUF=*p; //把一個(gè)字符送入發(fā)送緩沖區(qū),開始發(fā)送

while(!TI); //循環(huán)檢測TI標(biāo)志,直到TI=1,發(fā)送完成

p++; //指針指向下一個(gè)待發(fā)送字符

if(*p=='\0')break; //若遇到字符串結(jié)尾標(biāo)志‘\0’,結(jié)束循環(huán)

TI=0; //TI清零,準(zhǔn)備再向SBUF寫入一個(gè)字符

} while(1);}程序下載之后,必須重新啟動才能看到結(jié)果不使用指針的實(shí)現(xiàn)方法voidMain(){

uchari=0;

ucharcodeBuffer[]="WelcomeToTheMCUWorld.";

com_init(); while(1) { SBUF=Buffer[i];

while(!TI); i++;

if(Buffer[i]=='\0')break; TI=0; } while(1);}異步通信程序下載異步通信程序下載異步通信程序下載異步通信程序下載練習(xí)在單片機(jī)上多次按下4*4鍵盤陣列中的鍵,通過串行口把鍵位置碼依次上傳到PC機(jī)“串口助手”的“接收/鍵盤發(fā)送緩沖區(qū)”內(nèi)從PC發(fā)送一個(gè)十六進(jìn)制數(shù)字到單片機(jī)在“串口助手”的“單字符串發(fā)送區(qū)”輸入一個(gè)十六進(jìn)制數(shù)字,單擊“發(fā)送字符/數(shù)據(jù)”按鈕,這個(gè)數(shù)字就下載到單片機(jī),并在數(shù)碼管LED0上顯示若在“單字符串發(fā)送區(qū)”一次輸入多個(gè)十六進(jìn)制數(shù)字,只能穩(wěn)定顯示最后一個(gè)從PC發(fā)送一個(gè)十六進(jìn)制數(shù)字到單片機(jī)從PC發(fā)送一個(gè)十六進(jìn)制數(shù)字到單片機(jī)#include<reg52.h>unsignedcharcodetable[16]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};voidcom_init(void) //串口初始化{PCON=0x00;SCON=0x50; //串口方式1 TMOD=0x20; //定時(shí)器T1設(shè)置為方式2(8位自動重置)TH1=0xFd; //晶振11.0592MHz,波特率9600TL1=0xFd;TR1=1; //啟動定時(shí)器1}從PC發(fā)送一個(gè)十六進(jìn)制數(shù)字到單片機(jī)voidMain() //采用查詢方式{

com_init(); //串口初始化

P2=0; //準(zhǔn)備在LED0顯示數(shù)字

while(1) {

if(RI==1) //接收到有效字符

{ P0=table[SBUF]; //獲取數(shù)碼管段位碼

RI=0; //清RI,準(zhǔn)備下次接收

} }}“串口助手”的“單字符發(fā)送區(qū)”輸入字符,若選擇“十六進(jìn)制發(fā)送”,則只有0~F為有效數(shù)字,其它字符均為非法接收的字符保存在SBUF練習(xí)(查詢方式)在“串口助手”的“單字符發(fā)送區(qū)”逐個(gè)輸入十六進(jìn)制數(shù)字,按從左到右的順序依次顯示在單片機(jī)的數(shù)碼管LED0~7上,單片機(jī)最多允許接收8個(gè)數(shù)字#include<reg52.h>ucharcodetable[16]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};uchari,j,number[8]={0};voiddelay(uchar

milisec){

uchar

x,y;

for(x=0;x<milisec;x++)

for(y=0;y<150;y++);}voidcom_init(void) //串口初始化{PCON=0x00;SCON=0x50; //串口方式1 TMOD=0x20; //定時(shí)器T1設(shè)置為方式2TH1=0xFd;//晶振11.0592MHz,波特率9600TL1=0xFd;TR1=1; //啟動定時(shí)器1 RI=0;}voidMain(){ delay(100); com_init(); //延時(shí)100ms,串行口初始化

i=0; P0=0; P2=7; //清除LED顯示殘留

while(1) {

if(RI==1&&i<=7) {

number[i]=SBUF; //獲取串口輸入的數(shù)據(jù),保存到數(shù)組

i++; RI=0; //清除接收中斷標(biāo)志,準(zhǔn)備下次接收

}

for(j=0;j<i;j++) //在LED0~7顯示輸入數(shù)據(jù)

{ P0=table[number[j]]; P2=j; delay(2); } }} 練習(xí)(中斷方式)在“串口助手”的“單字符發(fā)送區(qū)”逐個(gè)輸入ASCII字符0~9,按從右到左的順序依次顯示在單片機(jī)的數(shù)碼管LED0~7上,若輸入字符超過8個(gè),則從LED右端重新開始#include<reg52.h>#defineucharunsignedcharucharcodetable[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};ucharnumber[8]={0}; //從串口接收的數(shù)據(jù)voiddelay(uchari) //1ms延時(shí){

uchar

x,j;

for(j=0;j<i;j++)

for(x=0;x<=148;x++); }voiddata_input(void)interrupt4{ staticuchari=7; //重新進(jìn)入時(shí)i的值不變

EA=0;

if(RI==1) //收到一個(gè)數(shù)據(jù)

{

number[i]=SBUF-48; //串口接收的是ASCII碼

RI=0; //清除接收中斷標(biāo)志

if(i==0)i=8; i--; } EA=1;}voidcom_init(void){PCON=0x00;SCON=0x50; TMOD=0x20; TH1=0xFd; //設(shè)置波特率9600TL1=0xFd;TR1=1; //啟動定時(shí)器1 ES=1; //開串口中斷

EA=1; //開總中斷 }voidMain(){

uchari=0; delay(100); //穩(wěn)定100ms

com_init(); //串行口初始化

P2=0; while(1) { P0=table[number[i]]; P2=i++; delay(1);

if(i==8)i=0; }}練習(xí)從PC機(jī)用串口助手發(fā)送一個(gè)字符X,單片機(jī)收到字符后,向PC機(jī)返回“IgotX”#include<reg52.h>#defineucharunsignedcharucharflag=0,a,i;ucharcodetable[]="Igot";voidcom_init(void) //初始化串口{ PCON=0x00; //波特率不加倍

SCON=0x50; //串口設(shè)置為方式1,8位數(shù)據(jù)

TMOD=0x20; //定時(shí)器T1設(shè)置為方式2 TH1=0xFd;TL1=0xFd; //晶振11.0592,波特率9600TR1=1; //定時(shí)器T1啟動

ES=1; //串行口中斷允許

EA=1; //總控中斷允許}voidMain(){

com_init(); //初始化串行通信端口

while(1) {

if(flag==1) //如果收到串口輸入字符

{ ES=0; //關(guān)閉串行口中斷

for(i=0;i<6;i++) { SBUF=table[i];

while(!TI);TI=0; } SBUF=a; //把串口輸入字符送到發(fā)送緩存

while(!TI);TI=0; //等待發(fā)送結(jié)束

ES=1; //開放串行口中斷

flag=0; //清除收到標(biāo)志

} }}voidserial()interrupt4 //中斷服務(wù)程序{ a=SBUF; //串口輸入字符保存到變量a flag=1; //設(shè)置收到標(biāo)志

RI=0; //清除接收標(biāo)志,準(zhǔn)備下次接收}串口電平轉(zhuǎn)換(MAX232)串口與

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論