国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

STC15系列單片機學(xué)習(xí)4:串口通訊

這篇具有很好參考價值的文章主要介紹了STC15系列單片機學(xué)習(xí)4:串口通訊。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

一、STC15系列單片機的串口個數(shù)

在使用單片機的串口前,得先知道所使用的單片機有幾個串口,再結(jié)合你的硬件電路圖來使用哪個串口。

以下是STC15各系列單片機的串口數(shù)量,STC15W4K32S4系列有4個串口

stc15w4k32s 串口通信,STC15系列單片機,單片機,51單片機,嵌入式硬件,學(xué)習(xí)

二、串口的工作模式

工作模式0:同步移位寄存器(官方建議初學(xué)者不學(xué))

工作模式1:8位串口,波特率可變

工作模式2:9位串口,波特率固定(官方建議不學(xué)習(xí))

工作模式3:9位串口,波特率可變

三、與串口工作相關(guān)的寄存器

以串口1為例,與串口1相關(guān)的寄存器

stc15w4k32s 串口通信,STC15系列單片機,單片機,51單片機,嵌入式硬件,學(xué)習(xí)

1、串行控制寄存器

STC15系列單片機串口1的控制相關(guān)的寄存器有SCON和PCON;

stc15w4k32s 串口通信,STC15系列單片機,單片機,51單片機,嵌入式硬件,學(xué)習(xí)

通過SCON寄存器中的SM0和SM1位來設(shè)置工作方式,設(shè)置如下表格所示,最常用的是工作方式1?

stc15w4k32s 串口通信,STC15系列單片機,單片機,51單片機,嵌入式硬件,學(xué)習(xí)

REN:串口接收使能位,REN = 1,啟動串口接收,開始接收信息,REN = 0,禁止接收數(shù)據(jù);

TB8:工作在9位UART模式才有效,也就是方式2和3,表示要發(fā)送的第9位;也就是奇偶校驗位,8位UART不需要用這個位;

RB9:工作在9位UART模式才有效,也就是方式2和3,表示要接收的第9位;也就是奇偶校驗位,8位UART不需要用這個位;

TI:發(fā)送中斷請求標志位,在方式1,2,3中,在停止位開始發(fā)送的時候,單片機將TI位,置1,也就是TI = 1,向CPU發(fā)出中斷申請,響應(yīng)中斷后,TI必須由軟件清零,也就是用戶要在代碼中寫上TI = 0;

RI:接收中斷請求標志位,在方式1,2,3中,串行接收到停止位的終點時刻,單片機將RI位,置1,也就是RI = 1,向CPU發(fā)出中斷申請,響應(yīng)中斷后,RI必須由軟件清零,也就是用戶要在代碼中寫上RI = 0;

電源控制寄存器PCON用來設(shè)置串口1的波特率是否加倍,PCON中與串口1相關(guān)的位只有SMOD和SMOD0

stc15w4k32s 串口通信,STC15系列單片機,單片機,51單片機,嵌入式硬件,學(xué)習(xí)

SMOD:波特率選擇位,當SMOD = 1,串口波特率加倍;當SMOD = 0,波特率不加倍,默認是SMOD = 0;

SMOD0:幀錯誤檢測有效控制位。這個位能決定SCON寄存器中SM0/FE位的功能,SMOD0 = 1時,SM0/FE位的功能是FE(幀錯誤檢測),SMOD0 = 0時,SM0/FE位的功能是SM0功能,復(fù)位時SMOD0 = 0;

2、串行口數(shù)據(jù)緩沖寄存器SBUF

數(shù)據(jù)緩沖寄存器器,分為數(shù)據(jù)接收緩沖器數(shù)據(jù)發(fā)送緩沖器,它們可以同時工作,也就是說,串口可以同時發(fā)送數(shù)據(jù)和接收數(shù)據(jù)。

數(shù)據(jù)接收緩沖器只能讀出,不能寫入;

數(shù)據(jù)發(fā)送緩沖器只能寫入,不能讀出;

數(shù)據(jù)接收緩沖器與數(shù)據(jù)發(fā)送緩沖器的地址是一樣的,比如

串口1的數(shù)據(jù)接收與發(fā)送緩沖器的地址都是99H,在官方頭文件中定義的名字都是SBUF;

串口發(fā)送數(shù)據(jù):

單片機只要執(zhí)行了寫SBUF命令,(匯編指令:MOV? ? SBUF, A)或者 (C語言指令SBUF = XX),要發(fā)送的數(shù)據(jù)(一個字節(jié))就會裝入相同的9位移位寄存器,前面8位是數(shù)據(jù)字節(jié),第9位可以根據(jù)工作模式來設(shè)置,9位串口設(shè)置為TB的值,8位串口設(shè)置為1;

串口接收數(shù)據(jù):

串口的接收急促器本身就是一個輸入移位寄存器,串口在工作模式1,2,3,移位寄存器為9位,當一幀數(shù)據(jù)接收完畢,移位寄存器中的數(shù)據(jù)字節(jié)(前8位)裝入數(shù)據(jù)接收緩沖器SBUF,第9位裝入SCON寄存器的RB8位。當一幀數(shù)據(jù)從移位寄存器裝入SBUF后,可立即開始接收下一幀數(shù)據(jù),用戶應(yīng)該在下一幀數(shù)據(jù)接收結(jié)束前將數(shù)據(jù)從SBUF中取走,否則數(shù)據(jù)就被覆蓋了。

3、輔助寄存器AUXR

stc15w4k32s 串口通信,STC15系列單片機,單片機,51單片機,嵌入式硬件,學(xué)習(xí)

官方推薦用定時器T2作為串口1的波特率發(fā)生器,那就從了他吧,相關(guān)的AUXR寄存器位是T2x12和S1ST2.

T2x12:定時器2速度控制位,T2x12 = 0,12T 模式,T2x12 = 1,1T 模式,

S1ST2:串口1選擇哪個定時器作為波特率發(fā)生器控制位,S1ST2 = 0,選擇定時1作為串口 1的波特率發(fā)生器,S1ST2 = 1,選擇定時2作為串口 1的波特率發(fā)生器。默認S1ST2 = 1;

4、定時器2的寄存器T2H,T2L

定時器2的寄存器T2H和寄存器T2L是定時器用來保存重裝時間。

5、與串口1中斷相關(guān)的寄存器位ES,PS

stc15w4k32s 串口通信,STC15系列單片機,單片機,51單片機,嵌入式硬件,學(xué)習(xí)

EA:CPU的中斷總開關(guān)控制位,EA= 1,使能中斷,EA= 0,禁止所有中斷;

ES:串行口中斷允許控制位,ES = 1,允許串口中斷;ES= 0,禁止串口中斷;

stc15w4k32s 串口通信,STC15系列單片機,單片機,51單片機,嵌入式硬件,學(xué)習(xí)

?PS:串口1的中斷優(yōu)先級控制位,PS=0,串口1的中斷優(yōu)先級為0,最低優(yōu)先級;PS= 1,串口1的中斷優(yōu)先級為1,最高優(yōu)先級

6、控制串口1相關(guān)引腳的寄存器AUXR1

stc15w4k32s 串口通信,STC15系列單片機,單片機,51單片機,嵌入式硬件,學(xué)習(xí)

四、用戶在程序中如何使用串口

以串口1為例,使用串口的步驟如下

1、設(shè)置串口1的工作模式,使用串行控制寄存器SCON中的SM0和SM1這兩位來設(shè)置工作模式;

2、設(shè)置串口1的波特率,使用定時器2的寄存器T2H和T2L;

3、設(shè)置定時器2的速度1T還是12T,使用輔助寄存器AUXR中的T2x12位;

4、啟動定時器2,通過設(shè)置T2R位為1,定時器2就開始計數(shù);

5、設(shè)置串口1的中斷優(yōu)先級,并打開中斷,打開中斷需要打開PS、ES、EA這些控制位;

6、如果串口1是接收數(shù)據(jù),將REN位設(shè)置為1就可以;如果串口1是發(fā)送數(shù)據(jù),將數(shù)據(jù)送入SBUF就可以;

7、數(shù)據(jù)接收完成,標志位RI自動置1;數(shù)據(jù)發(fā)送完成,標志位TI自動置1;RI和TI都需要軟件清0;

波特率的計算

串口1的波特率 = 定時器T2的溢出率 / 4;

STC15系列單片機我們一般用它工作在1T模式,這個通過AUXR來設(shè)置,

定時器2的溢出率 = SYSclk / (65536-[RL_TH2, RL+TL2]);

則串口1的波特率 =?SYSclk / (65536-[RL_TH2, RL+TL2])/4

五、串口1工作模式1:8位UART,波特率可變

stc15w4k32s 串口通信,STC15系列單片機,單片機,51單片機,嵌入式硬件,學(xué)習(xí)

stc15w4k32s 串口通信,STC15系列單片機,單片機,51單片機,嵌入式硬件,學(xué)習(xí)

六、串口1的工作模式3: 9位UART,波特率可變

stc15w4k32s 串口通信,STC15系列單片機,單片機,51單片機,嵌入式硬件,學(xué)習(xí)

stc15w4k32s 串口通信,STC15系列單片機,單片機,51單片機,嵌入式硬件,學(xué)習(xí)

?

七、串口應(yīng)用代碼示例

程序示例2:?

#include <STC15.H> 
#include <intrins.h>

#define FOSC    11059200L

#define BAUD    115200
#define NONE_PARITY         0
#define ODD_PARTITY         1
#define EVEN_PARTITY        2
#define MARK_PARTITY        3
#define SPACE_PARTITY       4
#define PARITYBIT           EVEN_PARTITY

typedef unsigned char BYTE;
typedef unsigned int WORD;

bit busy;

BYTE flag = 0;

void SendDate(BYTE dat);
void SendString(char *s);



void main(void)
{
#if(PARITYBIT == NONE_PARITY)
    SCON = 0x50;//8位可變波特率
#elif(PARITYBIT == ODD_PARTITY)||(PARITYBIT == EVEN_PARTITY)||(PARITYBIT == MARK_PARTITY)
    SCON = 0xDA;//9位可變波特率,校驗初始位為1
#elif(PARITYBIT == SPACE_PARTITY)
    SCON = 0xDa;//9位可變波特率,校驗初始位為0
#endif
    
    T2L = (65536-(FOSC/4/BAUD));
    T2H = (65536-(FOSC/4/BAUD)) >> 8;
    AUXR = 0x14;//T2為1T模式,并啟動定時器2
    AUXR |= 0x01;//選擇T2作為串口1的波特率發(fā)生器
    
    ES = 1;//使能串口1中斷
    EA = 1; //打開中斷總開關(guān)
    
    while(1)
    {
        if(flag == 1)
        {
            SendString("STC15W4K\r\n");
            flag = 0;
        
        }  
    }
}

void Uart_ISR() interrupt 4
{
    if(RI)
    {
        RI = 0;//清除RI位
        flag = 1;      
    }
    if(TI)
    {
        TI = 0; //清除TI
        busy = 0; //清除忙標志位
    }
}


void SendData(BYTE dat)
{
    while(busy);//等待前面的數(shù)據(jù)發(fā)送完成
    ACC = dat;//獲取校驗位P,PSW.0
    if(P)
    {
    #if(PARITYBIT == ODD_PARTITY)
        TB8 = 0;//設(shè)置校驗位為0
    #elif(PARITYBIT == EVEN_PARTITY)
        TB8 = 1;//設(shè)置校驗位為1
    #endif       
    }
    else
    {
    #if(PARITYBIT == ODD_PARTITY)
        TB8 = 1;//設(shè)置校驗位為1
    #elif(PARITYBIT == EVEN_PARTITY)
        TB8 = 0;//設(shè)置校驗位為0
    #endif    
    }
    
    busy = 1;
    SBUF = ACC; //寫數(shù)據(jù)到UART數(shù)據(jù)寄存器
}

void SendString(char *s)
{
    while(*s) //檢查字符串結(jié)束標志
    {
        SendData(*s++); //發(fā)送當前字符
    }
}

程序?qū)嵗?:文章來源地址http://www.zghlxwxcb.cn/news/detail-849788.html

#include <STC15.H> //包含頭文件,一般情況不需要改動,頭文件包含特殊功能寄存器的定義
#include <intrins.h>

/*------------------------------------------------
                   函數(shù)聲明
------------------------------------------------*/


/*************	功能說明	**************

串口1全雙工中斷方式收發(fā)通訊程序。本例程使用11.0592MHZ時鐘,如要改變,請修改下面的"定義主時鐘"的值并重新編譯。

串口設(shè)置為:115200,8,n,1.

通過PC向MCU發(fā)送數(shù)據(jù), MCU收到后通過串口把收到的數(shù)據(jù)原樣返回.

******************************************/

/*************	本地常量聲明	**************/
//#define MAIN_Fosc		22118400L	//定義主時鐘
#define MAIN_Fosc		11059200L	//定義主時鐘
#define	RX1_Lenth		32			//串口接收緩沖長度
#define	BaudRate1		115200UL	//選擇波特率


#define	Timer1_Reload	(65536UL -(MAIN_Fosc / 4 / BaudRate1))		//Timer 1 重裝值, 對應(yīng)300KHZ
#define	Timer2_Reload	(65536UL -(MAIN_Fosc / 4 / BaudRate1))		//Timer 2 重裝值, 對應(yīng)300KHZ

#define		S1_DoubleRate()		PCON |= 0x80
#define		S1_SHIFT()			SCON &= 0x3f
#define		S1_8bit()			SCON  = (SCON & 0x3f) | 0x40
#define		S1_9bit()			SCON  = (SCON & 0x3f) | 0xc0
#define		S1_RX_Enable()		SCON |= 0x10
#define		S1_USE_P30P31()		P_SW1 &= ~0xc0					//UART1 使用P30 P31口	默認
#define		S1_USE_P36P37()		P_SW1 = (P_SW1 & ~0xc0) | 0x40	//UART1 使用P36 P37口
#define		S1_USE_P16P17()		P_SW1 = (P_SW1 & ~0xc0) | 0x80	//UART1 使用P16 P17口
#define		S1_TXD_RXD_SHORT()	PCON2 |=  (1<<4)	//將TXD與RXD連接中繼輸出
#define		S1_TXD_RXD_OPEN()	PCON2 &= ~(1<<4)	//將TXD與RXD連接中繼斷開	默認
#define 	S1_BRT_UseTimer2()	AUXR |=  1
#define 	S1_BRT_UseTimer1()	AUXR &= ~1



/*************	本地變量聲明	**************/
unsigned char	RX1_Buffer[RX1_Lenth];	//接收緩沖
unsigned char	TX1_Cnt;	//發(fā)送計數(shù)
unsigned char	RX1_Cnt;	//接收計數(shù)
bit	B_TX1_Busy;	//發(fā)送忙標志


/*************	本地函數(shù)聲明	**************/



/**********************************************/
void main(void)
{
	B_TX1_Busy = 0;
	RX1_Cnt = 0;
	TX1_Cnt = 0;

	//S1_8bit();				//8位數(shù)據(jù)
    SCON  = (SCON & 0x3f) | 0x40;
      
	//S1_USE_P30P31();		//UART1 使用P30 P31口	默認
    P_SW1 &= ~0xc0;	

	AUXR &= ~(1<<4);	//Timer stop  波特率使用Timer2產(chǎn)生
	AUXR |= 0x01;		//串口1的波特率發(fā)生器使用Timer2
	AUXR |=  (1<<2);	//Timer2 set as 1T mode
	T2H = Timer2_Reload >> 8;
	T2L = Timer2_Reload;
	AUXR |=  (1<<4);	//Timer run enable

	REN = 1;	//允許接收
	ES  = 1;	//允許中斷

	EA = 1;		//允許全局中斷
	
	while (1)
	{
		if(TX1_Cnt != RX1_Cnt) //收到過數(shù)據(jù)
		{
			if(!B_TX1_Busy)	//發(fā)送空閑
			{
				B_TX1_Busy = 1;		//標志發(fā)送忙
				SBUF = RX1_Buffer[TX1_Cnt];	//發(fā)一個字節(jié)
				if(++TX1_Cnt >= RX1_Lenth)	TX1_Cnt = 0;	//避免溢出處理
			}
		}
	}
}



/********************* UART1中斷函數(shù)************************/
void UART1_interrupt (void) interrupt 4
{
	if(RI)
	{
		RI = 0;
		RX1_Buffer[RX1_Cnt] = SBUF;		//保存一個字節(jié)
		if((++RX1_Cnt) >= RX1_Lenth)
        {
            RX1_Cnt = 0;	//避免溢出處理
        }            
	}

	if(TI)
	{
		TI = 0;
		B_TX1_Busy = 0;		//清除發(fā)送忙標志
	}
}
 

到了這里,關(guān)于STC15系列單片機學(xué)習(xí)4:串口通訊的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔相關(guān)法律責任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • STC15系列單片機:定時器/計數(shù)器16位自動重裝載模式

    STC15系列單片機:定時器/計數(shù)器16位自動重裝載模式

    STC15系列單片機內(nèi)部有5個16位定時器/計數(shù)器,分別是T0、T1、T2、T3、T4。 定時器與計數(shù)器,東西還是同一個東西,只是用法和功效不一樣,就好比黃瓜,既可以內(nèi)服也可以外敷,黃瓜還是那個黃瓜,作用就不一樣了。 就拿T0來說,T0用于定時,那T0就是定時器,如果T0用于計數(shù)

    2024年01月25日
    瀏覽(23)
  • STC8H系列單片機IAP實現(xiàn)不停電下載(通過串口)

    STC8H系列單片機IAP實現(xiàn)不停電下載(通過串口)

    在使用串口往STC單片機燒錄程序時,需要冷啟動,先點擊下載再上電。這樣做有一定的缺點。首先,一些特殊的外圍電路要求一直保持有電狀態(tài),有些客戶需求我們能遠程操控設(shè)備就可以升級程序,而不需要去現(xiàn)場斷電設(shè)備。其次,頻繁的斷電上電操作也比較麻煩。 STC 單片

    2024年02月03日
    瀏覽(28)
  • STC15單片機-低功耗設(shè)計

    STC15單片機-低功耗設(shè)計

    STC15省電模式(數(shù)據(jù)手冊有介紹) STC15系列單片機可以運行3種省電模式以降低功耗,它們分別是: 低速模式 , 空閑模式 和 掉電模式 。 正常工作模式下,STC15系列單片機的典型功耗是2.7mA ~7mA,而掉電模式下的典型功耗是0.1uA,空閑模式下的典型功耗是1.8mA 低速模式由時鐘分

    2024年02月05日
    瀏覽(19)
  • 【STC15單片機】動態(tài)數(shù)碼管

    【STC15單片機】動態(tài)數(shù)碼管

    目錄 點亮一位數(shù)碼管 動態(tài)數(shù)碼管 100s倒計時 動態(tài)數(shù)碼管封裝代碼 段選:選中哪一位數(shù)碼管 位選:選中的數(shù)碼管要顯示的內(nèi)容 這是我對段選位選的理解,就是選中某個位置,賦值字形碼,顯示想要的圖形 如果只想讓第一個數(shù)碼管顯示,就只需要讓com1 = 1即可,其他comx都=0 如

    2024年02月13日
    瀏覽(23)
  • 【STC15單片機】簡單的矩陣鍵盤代碼

    【STC15單片機】簡單的矩陣鍵盤代碼

    單片機型號說明:IAP15F2K61S2 新建工程時單片機型號選擇 STC15F2K60S2 51單片機矩陣鍵盤代碼 本程序燒寫到51單片機應(yīng)該是正常使用的,手頭沒有51開發(fā)板了,暫時沒測試 這個程序燒寫到15單片機,前兩列按鍵不能正常使用 只需要在判斷第一列按鍵那部分程序,前面加上P42 = 0;

    2024年02月05日
    瀏覽(24)
  • 藍橋杯STC15F2K60S2單片機 CCP/PCA/PWM模塊的學(xué)習(xí)與使用

    藍橋杯STC15F2K60S2單片機 CCP/PCA/PWM模塊的學(xué)習(xí)與使用

    有道是 “一花獨放不是春,萬紫千紅春滿園” 我們不能只滿足于 眼前所謂的 “夠用、能用” 的少量知識,而不去深入學(xué)習(xí)探究,進而不慎封鎖了自己的見識 和 更多 創(chuàng)新開發(fā)上的可能性。 曾經(jīng)僅滿足于學(xué)習(xí)了藍橋杯單片機的三個外部晶振 定時器: 定時器0、1、2. 就認為完

    2024年02月08日
    瀏覽(18)
  • 學(xué)習(xí)筆記|串口通信的基礎(chǔ)知識|同步/異步|RS232|常見的串口軟件的參數(shù)|STC32G單片機視頻開發(fā)教程(沖哥)|第二十集:串口通信基礎(chǔ)

    學(xué)習(xí)筆記|串口通信的基礎(chǔ)知識|同步/異步|RS232|常見的串口軟件的參數(shù)|STC32G單片機視頻開發(fā)教程(沖哥)|第二十集:串口通信基礎(chǔ)

    百度百科:串口通信的概念 什么是通信? 例如U盤和電腦,我們電腦需要往U盤存東西,而U盤上只有四個觸點,除去一個電源一個地,只剩下兩個引腳了。此時我們坑定不能像點亮LED那樣單純的給他兩個引腳上輸出個高低電平就能寫數(shù)據(jù)了對吧??偛恢劣谳敵鲆粋€高電平就能

    2024年02月07日
    瀏覽(100)
  • 基于STC15單片機的智能密碼鎖(矩陣按鍵輸入)設(shè)計

    基于STC15單片機的智能密碼鎖(矩陣按鍵輸入)設(shè)計

    目錄 一、項目背景 二、功能需求 ?三、功能組成 四、總結(jié) ????????智能門鎖是一種基于現(xiàn)代智能化技術(shù),與傳統(tǒng)門鎖進行比較的創(chuàng)新型的電子門鎖產(chǎn)品。傳統(tǒng)門鎖通常采用鑰匙旋轉(zhuǎn)來開啟門鎖,但傳統(tǒng)門鎖存在鑰匙遺失、易被復(fù)制等問題,特別是具有主動性質(zhì)的人員如

    2024年02月03日
    瀏覽(42)
  • 微機課設(shè) | 基于STC15單片機的簡易數(shù)字密碼鎖設(shè)計

    微機課設(shè) | 基于STC15單片機的簡易數(shù)字密碼鎖設(shè)計

    在日常的生活和工作中,住宅與部門的安全防范、單位的文件檔案、財務(wù)報表以及一些個人資料的保存多以加鎖的辦法來解決。若使用傳統(tǒng)的機械式鑰匙開鎖,人們常需攜帶多把鑰匙,?使用極不方便,?且鑰匙丟失后安全性即大打折扣。在安全技術(shù)防范領(lǐng)域,具有防盜報警功能的

    2024年02月04日
    瀏覽(25)
  • 電腦通過串口助手和51單片機串口通訊

    電腦通過串口助手和51單片機串口通訊

    今天有時間把電腦和51單片機之間的串口通訊搞定了,電腦發(fā)送的串口數(shù)據(jù),單片機能夠正常接收并顯示到oled屏幕上,特此記錄一下,防止后面自己忘記了怎么搞得了。 先來兩個圖片看看結(jié)果吧! 下面是串口3.c的文件全部內(nèi)容: 下面是oled.h的全部內(nèi)容: 下面是oled.c的全部內(nèi)

    2024年02月07日
    瀏覽(23)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包