STC89C52串口應(yīng)用實(shí)例
硬件設(shè)計(jì)
一般單片機(jī)的串口通信都需要通過MAX232 進(jìn)行電平轉(zhuǎn)換然后進(jìn)行數(shù)據(jù)通信的,當(dāng)然STC89C52RC 單片機(jī)也不例外。
圖中的連接方式是常用的的一種零Modem 方式的最簡(jiǎn)單連接即3 線連接方式:只使用RXD、TXD 和GND 這三根連線,如下圖
由于RS232 的邏輯“0”電平規(guī)定為+5~+15V,邏輯“1”電平規(guī)定為-15~-5V,因此不能直接連接
與TTL/CMOS 電路連接,必須進(jìn)行電平轉(zhuǎn)換。
電平轉(zhuǎn)換可以使用三極管等分離器件實(shí)現(xiàn),也可以采用專用的電平轉(zhuǎn)換芯片,MAX232 就是其中典型
的一種。MAX232 不僅能夠?qū)崿F(xiàn)電平的轉(zhuǎn)換,同時(shí)也實(shí)現(xiàn)了邏輯的相互轉(zhuǎn)換即正邏輯轉(zhuǎn)為負(fù)邏輯。
#include "stc.h" //加載"stc.h"頭文件
void Delay(void) //定義Delay 函數(shù),延時(shí)500ms
{
unsigned char i,j; //聲明變量i,j
for(i=0;i<255;i++) //進(jìn)行循環(huán)操作,以達(dá)到延時(shí)的效果
for(j=0;j<255;j++);
for(i=0;i<255;i++) //進(jìn)行循環(huán)操作,以達(dá)到延時(shí)的效果
for(j=0;j<255;j++);
for(i=0;i<255;i++) //進(jìn)行循環(huán)操作,以達(dá)到延時(shí)的效果
for(j=0;j<140;j++);
}
void UARTInit(void) //定義串口初始化函數(shù)
{
SCON =0x40; //8 位數(shù)據(jù)位
T2CON=0x34; //由T/C2 作為波特率發(fā)生器
RCAP2L=0xD9; //波特率為9600 的低8 位
RCAP2H=0xFF; //波特率為9600 的高8 位
}
void UARTSendByte(unsigned char byte)//串口發(fā)送單字節(jié)函數(shù)
{
SBUF=byte; //緩沖區(qū)裝載要發(fā)送的字節(jié)
while(TI==0); //等待發(fā)送完畢,TI 標(biāo)志位會(huì)置1
TI=0; //清零發(fā)送完成標(biāo)志位
}
void main(void) //進(jìn)入Main 函數(shù)
{
unsigned char i=0; //聲明變量i
UARTInit(); //串口初始化
while(1) //進(jìn)入死循環(huán)
{
UARTSendByte(i); //串口發(fā)送單字節(jié)數(shù)據(jù)
Delay(); //延時(shí)500ms
i++; //i 自加1
if(i>255)i=0; //若i>255,i=0
}
}
重點(diǎn):
熟悉單片機(jī)串口相關(guān)寄存器的配置,如 SCON、T2CON、RCAP2L、RCAP2H。
波特率的計(jì)算公式要重點(diǎn)注意,同時(shí)波特率時(shí)鐘發(fā)生器既可以由T/C1發(fā)生,又可以從 T/C2發(fā)生。
串口數(shù)據(jù)發(fā)送是否完成,只要查看 TI(發(fā)送中斷標(biāo)志位)是否置 1就可以了,最后要記得的是要將 TI
(發(fā)送中斷標(biāo)志位)清零。