??專欄【51單片機(jī)】
??喜歡的詩(shī)句:更喜岷山千里雪 三軍過(guò)后盡開顏。
??音樂分享【Promise】
??大一同學(xué)小吉,歡迎并且感謝大家指出我的問題??
目錄
??串口通信
??代碼?
???串口初始化
?分析?
??????確定T1的工作方式
??TMOD=0X20;?
??????確定T1的初值
??TH1=0XF3;??TL1=0XF3;
??????波特率加倍(操作SMOD)
??PCON=0X80;
??????啟動(dòng)T1?
??TR1=1
??????確定串行口控制(編程SCON寄存器)
??SCON=0x50
??????打開中斷?
??ES=1;? EA=1?
??中斷分析
??串口通信控制LED燈
??效果
??代碼
?文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-582537.html
??串口通信
?
??代碼?
#include "reg52.h" //此文件中定義了單片機(jī)的一些特殊功能寄存器
typedef unsigned int u16; //對(duì)數(shù)據(jù)類型進(jìn)行聲明定義
typedef unsigned char u8;
void UsartInit()
{
SCON=0X50; //設(shè)置為工作方式1
TMOD=0X20; //設(shè)置計(jì)數(shù)器工作方式2
PCON=0X80; //波特率加倍
TH1=0XF3; //計(jì)數(shù)器初始值設(shè)置,注意波特率是4800的
TL1=0XF3;
ES=1; //打開接收中斷
EA=1; //打開總中斷
TR1=1; //打開計(jì)數(shù)器
}
void main()
{
UsartInit(); // 串口初始化
while(1);
}
void Usart() interrupt 4
{
u8 receiveData;
receiveData=SBUF; //出去接收到的數(shù)據(jù)
RI = 0; //清除接收中斷標(biāo)志位
SBUF=receiveData; //將接收到的數(shù)據(jù)放入到發(fā)送寄存器
while(!TI); //等待發(fā)送數(shù)據(jù)完成
TI=0; //清除發(fā)送完成標(biāo)志位
}
???串口初始化
void UsartInit()
{
?? ?SCON=0X50;?? ??? ??? ?//設(shè)置為工作方式1 ? ? ?看視頻P62 ?4:30
?? ?TMOD=0X20;?? ??? ??? ?//設(shè)置計(jì)數(shù)器工作方式2
?? ?PCON=0X80;?? ??? ??? ?//波特率加倍
?? ?TH1=0XF3;?? ??? ??? ??? ?//計(jì)數(shù)器初始值設(shè)置,注意波特率是4800的
?? ?TL1=0XF3;
?? ?ES=1;?? ??? ??? ??? ??? ??? ?//打開接收中斷
?? ?EA=1;?? ??? ??? ??? ??? ??? ?//打開總中斷
?? ?TR1=1;?? ??? ??? ??? ??? ?//打開計(jì)數(shù)器
}
?分析?
??????確定T1的工作方式
??TMOD=0X20;?
為什么是20
?
??
?M1 M0 這兩位控制的是工作方式,是方式2,M1 M0 是10
對(duì)應(yīng)到前面就是0010,那么高四位對(duì)應(yīng)的就是2
??????確定T1的初值
??TH1=0XF3;??TL1=0XF3;
根據(jù)下面的軟件,設(shè)置?TH1 TL1
?
?通過(guò)上圖,可以讀出是F3H
那么?TH1=0XF3;??TL1=0XF3;
??????波特率加倍(操作SMOD)
??PCON=0X80;
?
?通過(guò)上圖,發(fā)現(xiàn)SMOD是在PCON這個(gè)寄存器里面,
由于SMOD在最高位,二進(jìn)制中最高位一般表示符號(hào)位,所以SMOD不能進(jìn)行位操作
所以要對(duì)這整個(gè)寄存器進(jìn)行操作,
由于SMOD=0,波特率不加倍,否則加倍
所以設(shè)置PCON=0X80;就是1000 0000 相當(dāng)于對(duì)SMOD進(jìn)行操作
??????啟動(dòng)T1?
??TR1=1
就是編程TCON的TR1位,打開計(jì)數(shù)器
??????確定串行口控制(編程SCON寄存器)
??SCON=0x50
為什么是5
我們選擇方式1,那么波特率就是可變的,
由圖可知,方式1的SM0=0 SM1=1
SM2我們?cè)O(shè)置為0
REN,是允許串行接收位,我們?cè)O(shè)置為1
?
??
由下圖可知,后四位都是0
?
???所以高四位是5,所以是0x50?
??????打開中斷?
??ES=1;? EA=1?
ES=1;?? ??? ???串口中斷
EA=1; ????????打開總中斷
??中斷分析
void Usart() interrupt 4
{
?? ?u8 receiveData;?? ?receiveData=SBUF; ? ?//出去接收到的數(shù)據(jù)
?? ?RI = 0; ? ? ? ? ? ?//清除接收中斷標(biāo)志位
?? ?SBUF=receiveData; ? ?//將接收到的數(shù)據(jù)放入到發(fā)送寄存器
?? ?while(!TI);?? ??? ??? ? //等待發(fā)送數(shù)據(jù)完成
?? ?TI=0;?? ??? ??? ??? ??? ??? ? //清除發(fā)送完成標(biāo)志位
}
使用SBUF寄存器來(lái)存儲(chǔ)數(shù)據(jù)
為什么要RI=0 TI=0
?
?清零后,等待下一次的接收
發(fā)射完成后,TI為1,那么 !TI為0,就會(huì)跳出while循環(huán)
假設(shè)發(fā)射沒有完成,那么TI為0,就不會(huì)跳出while循環(huán)
??串口通信控制LED燈
??效果
串口通信控制LED燈
??代碼
#include "reg52.h" //此文件中定義了單片機(jī)的一些特殊功能寄存器
typedef unsigned int u16; //對(duì)數(shù)據(jù)類型進(jìn)行聲明定義
typedef unsigned char u8;
void UsartInit()
{
SCON=0X50; //設(shè)置為工作方式1
TMOD=0X20; //設(shè)置計(jì)數(shù)器工作方式2
PCON=0X80; //波特率加倍
TH1=0XF3; //計(jì)數(shù)器初始值設(shè)置,注意波特率是4800的
TL1=0XF3;
ES=1; //打開接收中斷
EA=1; //打開總中斷
TR1=1; //打開計(jì)數(shù)器
}
void main()
{
UsartInit(); // 串口初始化
while(1);
}
void UART_SendByte(unsigned char Byte)
{
SBUF = Byte;
while (!TI);
TI = 0;
}
void Usart() interrupt 4
{
if (RI == 1) //如果接收標(biāo)志位為1,接收到了數(shù)據(jù)
{
P2 = ~SBUF; //讀取數(shù)據(jù),取反后輸出到LED
UART_SendByte(SBUF); //將受到的數(shù)據(jù)發(fā)回串口
RI = 0; //接收標(biāo)志位清0
}
}
??如果大家有不明白的地方,或者文章有問題,歡迎大家在評(píng)論區(qū)討論,指正???文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-582537.html
?
到了這里,關(guān)于【51單片機(jī)】串口通信&&使用串口通信控制LED燈的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!