新聞中心

EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 串行通訊(單片機(jī))

串行通訊(單片機(jī))

作者: 時(shí)間:2016-11-24 來源:網(wǎng)絡(luò) 收藏
#include

#include
#include "config.h"

本文引用地址:http://m.butianyuan.cn/article/201611/320669.htm

#defineucharunsigned char
#define uintunsigned int
#define BEEPP0_5

ucharReceiveBuf;//定義接受緩沖區(qū)
ucharSendBuf[] = {11, 22};//將發(fā)送的數(shù)組放在數(shù)組SendBuf[]中

// 延時(shí)函數(shù)
void delay(uint n)
{
uint i, j;
for(i = n; i > 0; i--)
for(j = 115; j > 0; j--);
}

//串行口的初始化函數(shù)
void series_init()
{
SCON = 0X50;//串口工作方式1,允許接收
TMOD = 0X20;//定時(shí)器T1工作方式2
TH1 = 0XFD; TL1 = 0XFD;//定時(shí)初值
PCON &= 0X00;//SMOD=0
TR1 = 1;//開啟定時(shí)器1
EA = 1;//開總中斷
ES = 1;//開串行中斷
}

void main(void)
{
series_init();
for(;;){//等待中斷
}
}

void series() interrupt 4
{

RI = 0;//接收中斷清零
ES = 0;//暫時(shí)關(guān)閉串口中斷
ReceiveBuf = SBUF;//將接收到得數(shù)據(jù)保存到ReceiveBuf中
if(islower(ReceiveBuf) || isupper(ReceiveBuf) || isdigit(ReceiveBuf)){
SBUF = ReceiveBuf;//將接收到的字符發(fā)送出去
while(!TI);//等待發(fā)送完畢
TI = 0;//發(fā)送完畢,TI(發(fā)送中斷標(biāo)志)清0
BEEP = 1;
delay(100);
BEEP = 0;
}
ES = 1;//打開串口中斷
}

串行中斷程序的編寫步驟:

1. 設(shè)置串行口工作方式

2. 設(shè)置定時(shí)器T1工作方式,定時(shí)器T1作為波特率發(fā)生器,一般選用方式2,因?yàn)槠淇梢宰詣?dòng)裝入初值功能,可以使波特率更加穩(wěn)定

3. 設(shè)置定時(shí)初值

4. 設(shè)置波特率倍增位,不能位尋址,可以通過PCON設(shè)置,最高位就是SMOD倍增位,1時(shí)倍增

5. 開定時(shí)器和中斷

6. 串行中斷程序中,首先接收中斷清零,關(guān)閉串口中斷

7. 取出接收到 的數(shù)據(jù)進(jìn)行處理然后發(fā)送

8.發(fā)送完后打開串行中斷繼續(xù)接收數(shù)據(jù)



關(guān)鍵詞: 串行通訊單片

評(píng)論


技術(shù)專區(qū)

關(guān)閉