1. 程式人生 > >使用51微控制器採用中斷方式進行串列埠通訊的學習記錄:

使用51微控制器採用中斷方式進行串列埠通訊的學習記錄:

使用51微控制器進行串列埠通訊的學習記錄之中斷方式:

1.51微控制器採用中斷方式的串列埠通訊過程及程式分析:

所謂中斷方式,就是串列埠收/發標志位出發中斷後,在中斷中執行既定操作,可通過函式呼叫來實現。

接收資料時 等待中斷->然後在中斷中接收資料

傳送資料時 傳送資料->等待中斷->然後在中斷中傳送資料

具體步驟如下:

確定T1的工作方式(程式設計TMOD暫存器);

計算T1的初值,裝載TH1TL1

啟動T1(程式設計TCON中的TR1位);

確定序列口控制(程式設計SCON暫存器);

序列口在中斷方式工作時,要進行中斷設定(程式設計IEIP暫存器)。

注:SCON 是一個特殊功能暫存器,用以設定序列口的工作方式、接收

/傳送控制以及設定狀態標誌:

    SM0SM1為工作方式選擇位,可選擇四種工作方式:

2.有關波特率的計算方法:

在序列通訊中,收發雙方對傳送或接收資料的速率要有約定。通過軟體可對微控制器序列口程式設計為四種工作方式,其中方式0和方式2的波特率是固定的,而方式1和方式3的波特率是可變的,由定時器T1的溢位率來決定。

序列口的四種工作方式對應三種波特率。由於輸入的移位時鐘的來源不同,所以,各種方式的波特率計算公式也不相同。

方式0的波特率 =  fosc/12

方式2的波特率 =2SMOD/64)· fosc

方式1的波特率 =2SMOD/32)·(T1溢位率)

方式3的波特率 =2SMOD/32

)·(T1溢位率)

T1作為波特率發生器時,最典型的用法是使T1工作在自動再裝入的8位定時器方式(即方式2,且TCONTR1=1,以啟動定時器)。這時溢位率取決於TH1中的計數值。

T1 溢位率 = fosc /{12×[256 -(TH1]}

注:PCON中只有一位SMOD與序列口工作有關, SMODPCON.7)  波特率倍增位。在序列口方式1、方式2、方式3時,波特率與SMOD有關,當SMOD=1時,波特率提高一倍。復位時,SMOD=0

    在微控制器的應用中,常用的晶振頻率為:12MHz11.0592MHz。所以,選用的波特率也相對固定。常用的序列口波特率以及各引數的關係如表所示。

3.80C51序列口的工作方式1

方式110位資料的非同步通訊口。TXD為資料傳送引腳,RXD為資料接收引腳,傳送一幀資料的格式如圖所示。其中1位起始位,8位資料位,1位停止位。

(1) 方式1輸出

2)方式1輸入

用軟體置REN1時,接收器以所選擇波特率的16倍速率取樣RXD引腳電平,檢測到RXD引腳輸入電平發生負跳變時,則說明起始位有效,將其移入輸入移位暫存器,並開始接收這一幀資訊的其餘位。接收過程中,資料從輸入移位暫存器右邊移入,起始位移至輸入移位暫存器最左邊時,控制電路進行最後一次移位。當RI=0,且SM2=0(或接收到的停止位為1)時,將接收到的9位資料的前8位資料裝入接收SBUF,第9位(停止位)進入RB8,並置RI=1,向CPU請求中斷。

4.定時/計數器的結構與原理

定時/計數器的實質是加1計數器(16位),由高8位和低8位兩個暫存器組成。TMOD是定時/計數器的工作方式暫存器,確定工作方式和功能;TCON是控制暫存器,控制T0T1的啟動和停止及設定溢位標誌。

1計數器輸入的計數脈衝有兩個來源,一個是由系統的時鐘振盪器輸出脈衝經12分頻後送來;一個是T0T1引腳輸入的外部脈衝源。每來一個脈衝計數器加1,當加到計數器為全1時,再輸入一個脈衝就使計數器回零,且計數器的溢位使TCONTF0TF11,向CPU發出中斷請求(定時/計數器中斷允許時)。如果定時/計數器工作於定時模式,則表示定時時間已到;如果工作於計數模式,則表示計數值已滿。

可見,由溢位時計數器的值減去計數初值才是加1計數器的計數值。

設定為定時器模式時,加1計數器是對內部機器週期計數(1個機器週期等於12個振盪週期,振盪週期也叫時鐘週期,時鐘週期即晶振的單位時間發出的脈衝數,如12MHZ=12×106次方,即每秒發出12000000脈衝訊號,那麼發出一個脈衝的時間就是時鐘週期,即1/12微秒;如11.0592MHZ=11.0592×106次方,即每秒發出11059200脈衝訊號,那麼發出一個脈衝的時間就是時鐘週期,即1/11.0592微秒)。計數值N乘以機器週期Tcy就是定時時間t

5.定時/計數器的控制

80C51微控制器定時/計數器的工作由兩個特殊功能暫存器控制。TMOD用於設定其工作方式;TCON用於控制其啟動和中斷申請。

1)工作方式暫存器TMOD

工作方式暫存器TMOD用於設定定時/計數器的工作方式,低四位用於T0,高四位用於T1。其格式如下:

M1M0:工作方式設定位。定時/計數器有四種工作方式,由M1M0進行設定:

6. 控制暫存器TCON

TCON的高4位用於控制定時/計數器的啟動和中斷申請。其格式如下:

TF1TCON.7):T1溢位中斷請求標誌位。T1計數溢位時由硬體自動置TF11CPU響應中斷後TF1由硬體自動清0T1工作時,CPU可隨時查詢TF1的狀態。所以,TF1可用作查詢測試的標誌。TF1也可以用軟體置1或清0,同硬體置1或清0的效果一樣。

TR1TCON.6):T1執行控制位。TR11時,T1開始工作;TR10時,T1停止工作。TR1由軟體置1或清0。所以,用軟體可控制定時/計數器的啟動與停止。

TF0TCON.5):T0溢位中斷請求標誌位,其功能與TF1類同。

TR0TCON.4):T0執行控制位,其功能與TR1類同。

7.定時器1的工作方式2

方式2為自動重灌初值的8位計數方式。

計數個數與計數初值的關係為:X = 28 - N

其中:X為要裝的初值 N為要定時/記數的次數。

注:工作方式2特別適合於用作較精確的脈衝訊號發生器。所以在進行串列埠通訊時一般選用定時器1工作在方式2 這種經典模式。

程式:

/*51微控制器採用中斷方式的串列埠通訊程式分析:

接收資料時 等待中斷->然後在中斷中接收資料

傳送資料時 傳送資料->等待中斷->然後在中斷中傳送資料

具體步驟如下:

確定T1的工作方式(程式設計TMOD暫存器);

計算T1的初值,裝載TH1、TL1;

啟動T1(程式設計TCON中的TR1位);

確定序列口控制(程式設計SCON暫存器);

序列口在中斷方式工作時,要進行中斷設定(程式設計IE、IP暫存器)。

*/

 

#include<reg52.h>

#define uchar unsigned char

 

uchar Temp,RIflag,TIflag;

 

//串列埠初始化函式

void serialportinit()

{

TMOD=0x20;//設定定時器1為工作方式2 8位自動重灌載 作用是產生波特率

TH1=0xfd;//設定波特率位9600bps

TL1=0xfd;

TR1=1;//開啟定時器1

 

//設定串列埠工作在方式1

//方式1: 8位非同步收發 波特率可變(由定時器控制) 收發一幀的資料為10位 一個起始位(0)8個數據位 1個停止位(1)

//先發送或接收最低位

SCON=0x50;//等價於 SM0=0; SM1=1; REN=1;

//SM0=0;

//SM1=1;

//REN=1;//允許序列接收位 允許序列口接收資料

 

PCON=0x00;//SMOD=0 波特率不加倍

 

EA=1;//開總中斷

ES=1;//開串列埠中斷  注意:如果使用查詢方式進行串列埠通訊時,要把串列埠中斷ES關閉、

}

 

//定義資料傳送函式

void sentTemp()

{

SBUF=Temp;//把Temp接收的資料再發送到傳送緩衝器SBUF中  

  //注意:51微控制器內部有兩個物理上獨立的接收、傳送緩衝器SBUF(屬於特殊功能暫存器) 兩個緩衝器共用一個特殊功能暫存器 位元組地址(99H?

while(!TI);//等待從機向主機發送資料完成

TI=0;//若傳送完成 把傳送中斷標誌位軟體清0 因為TI必須由軟體清零

}

void main()

{

serialportinit();

while(1)

{

if(RIflag==1)

{

ES=0;//關串列埠中斷

RIflag=0;//接收標誌位清0

sentTemp();//呼叫資料傳送函式

ES=1;//開串列埠中斷

}

}

}

 

//串列埠中斷服務函式

void serialportint() interrupt 4//串列埠中斷函式

{

if(RI)

{

RI=0;//接收中斷標誌位RI必須由軟體清0

Temp=SBUF;//把接收緩衝器中收到的資料賦值給led

P1=Temp;//通過開發板監測是否接收到主機發送的資料

RIflag=1;//接收標誌位置1 表示從機接收收據完成

}

}


相關推薦

使用51微控制器採用中斷方式進行串列通訊學習記錄

使用51微控制器進行串列埠通訊的學習記錄之中斷方式: 1.51微控制器採用中斷方式的串列埠通訊過程及程式分析: 所謂中斷方式,就是串列埠收/發標志位出發中斷後,在中斷中執行既定操作,可通過函式呼叫來實現。 接收資料時 等待中斷->然後在中斷中接收資料 傳送資料時 傳

利用WinAPI進行串列通訊程式設計

轉載於:https://blog.csdn.net/L_Andy/article/details/51131232 轉載只為了方便查詢,希望大家從源連線進行檢視! 總結來看串列埠通訊原理,(也可以說大多數通訊原理也是如此)。 通訊首先要有個通訊,可以簡單的把通訊看成一個

怎麼用VB.NET進行串列通訊-四川成都軟體開發定製APP程式設計

文-沙鷗-2018.11.9     1,前言 前一段時間一位認識的朋友找到我,知道我這裡是做工控自動化、電路板、控制器、儀器儀表、軟體APP開發定製的(業務QQ2531263726),於是跟我說要把一個指紋模組和他們公司的觸控式螢幕結合起來做成一個系統,發來了資料看了一下,

wince模擬器與PC進行串列通訊設定步驟(附詳細步驟圖解)

在網上一搜,關於wince模擬器與PC進行串列埠通訊的介紹很多,也有人說模擬器不能虛擬串列埠的,也有說必須用串列埠連線線把USB口和串列埠連線起來的,說法可謂種類繁多。結合搜尋到的資訊,我進行多次試驗,最終實現了WINCE模擬器串列埠與PC串列埠工具之間的通訊。現介紹一下步驟

halcon/mfc利用serialport類進行串列通訊

1.引言 串列埠通訊用mscomm控制元件在x64平臺下報錯,只能在Win32平臺下工作,所以想著換平臺,下載32位的halcon進行安裝。安裝時,不用解除安裝64位,安裝時提示安裝外掛,會自動檢測到runtimeclass x86,安裝好後相當於只是多了一個

NVIC中斷優先順序管理+串列通訊基本原理+串列通訊基於庫函式的配置例項

沒寫部落格的感悟:昨天沒有寫部落格,今天就倒黴了,得寫兩篇,果然不能偷懶,當天沒有做的事,無論如何你都得要做,為了改掉這個拖延的小毛病,給自己定了一條規則,無論多晚,哪怕沒有網沒有電也得寫完每天更新的部落格,以此勉勵。 今天主要總結和複習三個知識點,NVIC中斷優先順序管理

利用boost庫網路通訊協議進行串列通訊的問題

菜狗玩ROS最近遇到一個問題,叫做error: stray ‘\200’ in program,除錯多次發現是因為貼上網頁程式碼,導致帶有中文字元,將報錯的一行程式碼前的空格刪除再調整格式,便可以通過編譯。 然而問題又來啦,執行生成的讀取串列埠的節點時,遇到這樣一個問題:

虛擬串列完成主機與vmware下虛擬機器進行串列通訊

所需軟體: vspd :虛擬串列埠建立軟體。 xcom V2.0:串列埠助手。 詳細步驟如下: 1,下載及安裝vspd軟體,建立虛擬串列埠COM1,COM2。 2,開啟vmware在設定中新增物理

Python使用pyserial進行串列通訊

安裝pyserial pip install pyserial 檢視可用的埠 # coding:utf-8 import serial.tools.list_ports plist = list(serial.tools.list_ports.co

C#做一個簡單的進行串列通訊的上位機

1、上位機與下位機         上位機相當於一個軟體系統,可以用於接收資料、控制資料。即可以對接收到的資料直接傳送操控命令來操作資料。上位機可以接收下位機的訊號。下位機是一個控制器,是直接控制裝置獲取裝置狀況的計算機。上位機發出的命令首先給下位機,下位機再根據此命令解釋成相應時序訊號直接控制相應裝置。下

LabVIEW學習筆記(十一)——利用VISA進行串列通訊

前言:        在1993年,為了確保多廠商的儀器具有協同工作的能力以及降低包含了多廠商儀器的完整測試系統的開發時間,NI 聯合許多大公司開發出來了虛擬儀器軟體架構 ( Virtual Instruments Software Architecture,VISA )。

VSPD9.0基礎 建立一對互聯的虛擬串列,進行串列通訊的測試

    VSPD : Virtual Serial Port Driver 9.0       OS : Windows 10

Linux作業系統下的串列通訊學習筆記

一、什麼是串列埠通訊 串列埠通訊是指計算機主機與外設之間以及主機系統與主機系統之間資料的序列傳送。使用串列埠通訊時,傳送和接收到的每一個字元實際上都是一次一位的傳送的,每一位為1或者為0。 二、串列埠通訊的分類 串列埠通訊可以分為同步通訊和非同步通訊兩類。同步通訊是按照

串列通訊模組3串列通訊程式設計基礎(讀寫、關閉)

上一節總結了如何開啟串列埠並討論瞭如何配置串列埠,本節是在上一節的基礎上,進一步討論串列埠程式設計的基礎——如何進行檔案讀寫?如何關閉串列埠? 1. 讀寫串列埠 串列埠的讀寫操作和檔案的讀寫操作是一樣的,也是通過ReadFile()及WriteFile()函式來實現

51 微控制器UART 串列通訊[ 方式1 ]實現

1  51序列口結構 51微控制器的UART序列通訊是基於其序列口的可程式設計硬體結構,只要用正確的程式程式碼通過初始化序列口對應暫存器的形式將其序列硬體結構初始化,再編寫符合此序列口通訊的程式程式碼

51微控制器在Keil中使用printf進行串列輸出

        最近有同學在51微控制器的學習過程中困擾如何使用微控制器串列埠在上位機串列埠助手上輸出顯示的問題,其實很多開發環境都支援使用C語言裡面最常用的printf函式,Keil中也不例外,不僅僅是最常用的STC89C52、keil下其他51系列微控制器如STC12、

51微控制器串列通訊(一)

串列埠通訊好東西,但我沒用過。 下面照著普中科技的ppt搬運下。        隨著多微機系統的廣泛應用和計算機網路技術的普及,計算機的通訊功能愈來愈顯得重要。計算機通訊是指計算機與外部裝置或計算機與計算機之間的資訊交換。 通訊方式 有並行

教你如何在51微控制器上模擬串列通訊!!!

我們可以不使用微控制器本身帶有的串列埠,而自己用程式去模擬一個串列埠並達到和本身的串列埠具有同樣的功能, 首先,我們需要用到CH340串列埠模組,大家可以上某寶自行購買。 正面: 反面:   然後我們需要了解一下這串列埠模組上的引腳: 5V  :與VCC短路為5V TL

51微控制器學習——串列通訊

51微控制器的UART串列埠的結構由序列口控制暫存器SCON、傳送和接收電路三部分構成。 SCON位分配 位 7 6 5 4 3 2 1 0 符號

STM32-----採用DMA的方式實現串列收發資料

STM32-----採用DMA的方式實現串列埠收發資料 概述 想必看到這篇部落格的你已經知道了DMA的好處了吧,所以這兒就不過多地講述DMA對於緩解MCU壓力有多麼重要的用途,DMA在很多方面都可以使用,如IIC,SPI,USART等,這兒主要給出DMA