首先需要配置寄存器:
下面這里SCON配0x40和0x50都可以,因?yàn)闀簳r(shí)還不需要接受信息,所以REN置1置0都可
void Uart_Init(void) //4800bps@11.0592MHz
{
PCON |= 0x80; //使能波特率倍速位SMOD
SCON = 0x50; //8位數(shù)據(jù),可變波特率
TMOD &= 0x0F; //清除定時(shí)器1模式位
TMOD |= 0x20; //設(shè)定定時(shí)器1為8位自動(dòng)重裝方式
TL1 = 0xF4; //設(shè)定定時(shí)初值
TH1 = 0xF4; //設(shè)定定時(shí)器重裝值
ET1 = 0; //禁止定時(shí)器1中斷
TR1 = 1; //啟動(dòng)定時(shí)器1
}
在main中調(diào)用SendByte函數(shù),每按下一次復(fù)位鍵,接收緩沖區(qū)就會(huì)收到一個(gè)11
這就是單向發(fā)送的一個(gè)簡(jiǎn)單實(shí)例,接下來(lái)實(shí)現(xiàn)每隔一秒發(fā)送一個(gè)遞增的數(shù)據(jù),只需要添加一個(gè)全局變量Sec,再把SendByte放到循環(huán)中即可
#include <REGX52.H>
#include "Delay.h"
unsigned char Sec;
void Uart_Init(void) //4800bps@11.0592MHz
{
PCON |= 0x80; //使能波特率倍速位SMOD
SCON = 0x50; //8位數(shù)據(jù),可變波特率
TMOD &= 0x0F; //清除定時(shí)器1模式位
TMOD |= 0x20; //設(shè)定定時(shí)器1為8位自動(dòng)重裝方式
TL1 = 0xF4; //設(shè)定定時(shí)初值
TH1 = 0xF4; //設(shè)定定時(shí)器重裝值
ET1 = 0; //禁止定時(shí)器1中斷
TR1 = 1; //啟動(dòng)定時(shí)器1
}
void Uart_SendByte(unsigned char Byte)
{
SBUF = Byte; //寫入
while(TI == 0); //直到發(fā)送成功,TI變成1,跳出循環(huán)
TI = 0; //復(fù)位
}
void main()
{
Uart_Init();
while(1)
{
Uart_SendByte(Sec);
Sec ++;
Delay(1000);
}
}
最后需要做的是把這個(gè)串口模塊化,方便以后直接使用
下面實(shí)現(xiàn)電腦端向單片機(jī)發(fā)送數(shù)據(jù),單片機(jī)需要利用中斷來(lái)檢測(cè)是否有數(shù)據(jù)發(fā)送過(guò)來(lái),在中斷函數(shù)里面來(lái)進(jìn)行數(shù)據(jù)處理,接收功能需要把SCON的REN給置1,所以SCON = 0x50,中斷系統(tǒng)需要重新配置
所以ES = 1;
EA = 1;
最后一個(gè)優(yōu)先級(jí)開關(guān)可以先不管
寫在Uart串口控制的初始化函數(shù)里
最后還要在main.c寫中斷函數(shù) 函數(shù)名后面要跟上interrupt 4代表串口接收/發(fā)送中斷
在接收到信息之后RI會(huì)置1,此時(shí)進(jìn)行處理,結(jié)束之后記得手動(dòng)清零
#include <REGX52.H>
#include "Delay.h"
#include "Uart.h"
unsigned char Sec;
void main()
{
Uart_Init();
while(1)
{
}
}
void Uart_Routine() interrupt 4
{
if(RI == 1) //串口接收到數(shù)據(jù)后會(huì)自動(dòng)將RI置1
{
P2 = SBUF; //讀取緩沖區(qū)
RI = 0;
}
}
此時(shí)在輸入?yún)^(qū)發(fā)送0f,左邊全滅右邊全亮啦
插入一條提醒:一個(gè)函數(shù)不能即在主函數(shù)中調(diào)用又在中斷函數(shù)中調(diào)用!
在中斷函數(shù)中調(diào)用SendByte即可讓單片機(jī)在讀取電腦發(fā)來(lái)的數(shù)據(jù)的同時(shí),還能將這個(gè)數(shù)據(jù)Send回來(lái)文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-622056.html
void Uart_Routine() interrupt 4
{
if(RI == 1) //串口接收到數(shù)據(jù)后會(huì)自動(dòng)將RI置1
{
P2 = SBUF; //讀取緩沖區(qū)
Uart_SendByte(SBUF);
RI = 0;
}
}
最后把串口中斷函數(shù)放到之前的Uart模塊里面,方便以后使用。。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-622056.html
到了這里,關(guān)于51單片機(jī)學(xué)習(xí)--串口通信的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!