1. 程式人生 > >【藍橋杯微控制器組】(6)uart

【藍橋杯微控制器組】(6)uart

(1)波特率的概念:1bps = 1 bit/s

(2)板載資源有兩個串列埠,僅UART1可以通過USB連線電腦

(3)四種方式波特率計算公式:(fosc:晶振頻率 )

方式1:baud = fosc / 12;

方式2:baud = (2^smod / 32) * (T1溢位率)

方式3:baud = (2^smod / 64) * fosc

方式4:baud = (2^smod / 32) * (T1溢位率)

(4)SMOD的設定位於PCON(電源管理暫存器中)PCON_D7

SMOD = 1 波特率加倍PCON &= 0x7f

SMOD = 0  波特率不變PCON |= 0x80

(5)T1溢位率為T1定時器溢位的頻率,即:T1溢位一次所需要的時間的倒數 

溢位率 = 1 / ( N * (12 / fosc))

(6)使用T1做時鐘源的時候應當使用方式2,以避免重灌計時器初值帶來的時延,否則會產生累積誤差。

(7)計算計數器初值方法(方式1):

設初值為x, T1 = (256 - x) * ( 12 / fosc)

baud = ( 2 ^ SMOD) / 32 * T1

需要使用的暫存器:SCON 序列口暫存器(可位定址)

SCON D7 D6 D5 D4 D3 D2 D1 D0
SM0 SM1 SM2 REN TB8 RB8 TI RI

SM0/SM1:工作方式選擇位

SM0 SM1 方式 功能說明
0 0 0 同步移位暫存器方式(用於拓展I/O口)
0 1 1 10位非同步收發(1開始位,8位資料,1停止位)波特率可變(T1控制)
1 0 2 11位非同步收發(9位資料)波特率固定
1 1 3 11位非同步收發(9位資料)波特率可變(T1控制)

一般使用方式1

SM2:多機通訊控制位,SM2 = 1:收到的RB8(第9位資料)進入SBUF,並激活RI,引起中斷

SM2 = 0:收到的RB8被丟棄

REN:接收使能

TB8 / RB8:傳送、接收到的第9位資料

TI :傳送結束標誌(在傳送最後一位停止位開始時TI硬體置1,需要手動清零

RI:接收中斷標誌(在接受到最後一位停止位中間,RI硬體置1,需要手動清零

程式設計步驟:

(1)設定T1工作方式(方式2)

(2)為TH1 TL1裝初值,開計數器

(3)為串列埠設定所使用的時鐘源

sfr AUXR  = 0x8e;	
AUXR &= 0xBF;		//定時器1時鐘為Fosc/12,即12T
AUXR &= 0xFE;		//串列埠1選擇定時器1為波特率發生器

(4)設定SCON工作方式(主要:SM0 SM1 REN)

(5)開中斷(總中斷與串列埠中斷)

P.S:善於使用STC - ISP中自帶的波特率計算器

傳送函式:

(1)送字元入SBUF

(2)等待TI變為1(while( ! TI ); )

(3)清零TI

接收中斷:

(1)清零RI

(2)收SBUF中的資料

自己寫的分片程式碼初始化:

void t1_init()
{
	TMOD = 0x20;		//M1 = 1; M0 = 0
	
	TH1 = 0xfd;
	TL1 = 0xfd;
	
	EA = 1;
	TR1 = 1	;
}

void uart_init()
{
	AUXR &= 0xBF;		//定時器1時鐘為Fosc/12,即12T
	AUXR &= 0xFE;		//串列埠1選擇定時器1為波特率發生器

	SM0 = 0;
	SM1 = 1;		//方式1
	REN = 1;		//RECEIVE INTERRUPT

	ES = 1;			//uart interrupt
	EA = 1;
}
STC - ISP計算的初始化程式碼:
void UartInit(void)		//[email protected]
{
	PCON &= 0x7F;		//波特率不倍速
	SCON = 0x50;		//8位資料,可變波特率
	AUXR &= 0xBF;		//定時器1時鐘為Fosc/12,即12T
	AUXR &= 0xFE;		//串列埠1選擇定時器1為波特率發生器
	TMOD &= 0x0F;		//清除定時器1模式位
	TMOD |= 0x20;		//設定定時器1為8位自動重灌方式
	TL1 = 0xFD;		//設定定時初值
	TH1 = 0xFD;		//設定定時器重灌值
	ET1 = 0;		//禁止定時器1中斷
	TR1 = 1;		//啟動定時器1
}

傳送函式:
void trans_char(char t)
{
	SBUF = t;
	while(!TI);
	TI = 0;
}

void trans_str(char t[])
{
	char *p;
	p = t;
	while(*p != '\0')
	{
		trans_char(*p);
		p++;
	}	
}

中斷:
void uart_isr() interrupt 4
{	

	RI = 0;
	rechar = SBUF;
	trans_char(rechar);	  	//驗證

}

P.S:在開發板上需要講J13跳線至MM

相關推薦

藍橋微控制器6uart

(1)波特率的概念:1bps = 1 bit/s (2)板載資源有兩個串列埠,僅UART1可以通過USB連線電腦 (3)四種方式波特率計算公式:(fosc:晶振頻率 ) 方式1:baud = fosc / 12; 方式2:baud = (2^smod / 32) * (T1

藍橋微控制器實時時鐘RTCDS1302

1、暫存器表 注意: (1)ds1302.h中提供的暫存器地址是寫地址,讀暫存器時需要將地址加一 (2) #define ds1302_control_addr 0x8Ee //防寫命令字單元地址對應上圖倒數第二行:BIT7 = 0(取消防寫)、BIT7 = 1(上

藍橋|微控制器| I2C通訊官方程式碼 + EEPROM

     之前我寫的I2C通訊協議是基於“金沙灘”的教程,程式碼比較繁瑣,為了能在之後的比賽中提高效率,本次就以官方提供的I2C通訊協議來實現單位元組的存取,同時也當作對I2C協議的複習。該協議有關主機(微控制器)與從機(板子上焊的晶片AT24C02)之間的資料傳輸。首先我們

暴力自動生成排列2015第六屆藍橋省賽 C/C++ B 題解第三題

第三題題目三羊獻瑞觀察下面的加法算式:       祥 瑞 生 輝  +   三 羊 獻 瑞-------------------   三 羊 生 瑞 氣(如果有對齊問題,可以參看【圖1.jpg】)其中

蒻爆了的NOIP系列--普及複賽6NOIP2015普及複賽題解

這只是一個作業,如果有幫到您的,我只能說。。。這不科學。。。 ————————————華麗的分割線———————————— 第一題: 這題很水雙重for列舉直n次輸出當然你要數論我也沒辦法

藍橋學習記錄6不定方程的解法

一次不定方程 4 * x - 5 * y = 7;ax + by = c;         a = 4 , b = -5 , c = 7; ax = c - by; 1 .先求一個特殊解    x0  

python基礎之 04

Python 的元組與列表類似,不同之處在於元組的元素不能修改。 元組使用小括號,列表使用方括號。 元組建立很簡單,只需要在括號中新增元素,並使用逗號隔開即可。   tup1 = ('Google', 'Runoob', 1997, 2000);   元組

2016年 藍橋 C語言B本科 考試題

煤球數目 171700 #include<cstdio> int main() { int a[100],sum=0; a[0]=1; for(int i=1;i<100;i++) a[i]=a[i-1]+(i+1); for(in

Spring Boot6、Profile

Profile是Spring對不同環境提供不同配置功能的支援,可通過啟用、指定引數等方式快速切換環境。1、多Profile檔案(Properties格式)在主配置檔案編寫的時候,檔名可以是applica

程式設計師眼中的統計學6幾何分佈、二項分佈及泊松分佈:堅持離散

/** * 在n次伯努利試驗中,試驗r次才得到第一次成功的機率 P(X=r)=pq^{r-1} * @param p double型保留一位小數,表示成功的概率 * @param q double型保留一位小數,表示失敗的概率即1-p * @param r 整型,實驗次數 *

2016年藍橋B初賽第七屆

第一題: 簡單的求和題。 #include<iostream> #include<cmath> using namespace std; int a[110]; int main(){ int i; int

藍橋C語言 基礎練習 數列排序

問題描述  給定一個長度為n的數列,將這個數列按從小到大的順序排列。1<=n<=200輸入格式  第一行為一個整數n。  第二行包含n個整數,為待排序的數,每個整數的絕對值小於10000。輸出格式  輸出一行,按從小到大的順序輸出排序後的數列。樣例輸入58 3 6

2018年藍橋B初賽第九屆

昨天去南京理工大學參加了藍橋杯,總體感覺比去年難了不少,後面島嶼的題目自己寫的有點可惜。就當一次鍛鍊吧,大三我還會來的。 1.標題:第幾天 2000年的1月1日,是那一年的第1天。 那麼,2000年的5月4日,是那一年的第幾天? 答案:125 2:明碼 漢字的字

藍橋C語言Fibonacci數列問題

問題描述Fibonacci數列的遞推公式為:Fn=Fn-1+Fn-2,其中F1=F2=1。當n比較大時,Fn也非常大,現在我們想知道,Fn除以10007的餘數是多少。輸入格式輸入包含一個整數n。輸出格式輸出一行,包含一個整數,表示Fn除以10007的餘數。說明:在本題中,答案

2017年藍橋B初賽第八屆

第一題: 資料處理的題目,簡單題目 第一步,將資料複製到txt文件中 第二步,將資料從txt複製到excel中 第三步,現將資料分列。資料—>分列即可 第四步,替換,ctrl+H.替

nodejs原理&原始碼賞析6深度剖析cluster模組原始碼與node.js多程序

目錄 一. 引言 二.server.listen方法 三.cluster._getServer( )方法 四.跨程序通訊工具方法Utils 五.act:queryServer訊息

c++對象內存模型內存布局

dbd 對象大小 成員函數 .cn eof 註意 .cpp als his 總結:1、按1繼承順序先排布基於每個父類結構。2、該結構包括:基於該父類的虛表、該父類的虛基類表、父類的父類的成員變量、父類的成員變量。3、多重繼承且連續繼承時,虛函數表按繼承順序排布函數與虛函數。

藍橋-加法變乘法java

tac chm init system area 需要 out nor clas 藍橋杯第六屆省賽題目-加法變乘法(java) 題目: 我們都知道:1+2+3+ ... + 49 = 1225 現在要求你把其中兩個不相鄰的加號變成乘號,使得結果為2015 比如:

微信小遊戲小遊戲開發調試--關於找不到app.json入口文件

com png info alt 微信開發者 遊戲 進入 http 找不到 經了解發現 小程序必須要有app.json 小遊戲必須的文件只有2個 game.js  小遊戲入口文件 game.json  小遊戲配置文件 所以不是工程文件缺失,解決方案如下: 進入微信開發者工具

痞子衡嵌入式:飛思卡爾i.MX RT系列微控制器啟動篇6- Bootable image格式與加載(elftosb/.bd/.bin)

before 詳細介紹 tab true 加載完成 table sdp 推薦 包含   大家好,我是痞子衡,是正經搞技術的痞子。今天痞子衡給大家介紹的是飛思卡爾i.MX RT系列MCU的Bootable image格式與加載過程。   在i.MXRT啟動系列第三篇文章 飛