心得:串口2只能使用“獨立波特率發生器”作為波特率發生器;
串口1可以用定時器1做波特率發生器,也可以選擇“獨立波特率發生器”作為波特率發生器。
stc12c5a.h stc12的頭文件從:http://www.zg4o1577.cn/mcu/3282.html 這里下載.
雙串口.c
//******************************(STC12串口2應用)*****************************************
// 馬梓熔
//2012-12-4
//***************************************************************************************
#include "STC12C5A.h"
#define uchar unsigned char
#define uint unsigned int
#define Buf_Max 40
uchar i;
uchar Rec_Buf[]="hello! mazirong\n"; //uchar Rec_Buf[Buf_Max]; 這樣寫上位寫什么 下位機接收什么,大大增加了靈活性
//********************延時函數
void delay(uint z)
{
uint i,j;
for(i=z;i>0;i--)
for(j=110;j>0;j--);
}
//********************串口2初始化
void Serial_Iint()
{
S2CON=0x50; //S2SM0 S2SM1=0 1 S2REN=1 //串口2的工作方式1,接收位允許
PCON=0x00; //波特率不加倍
AUXR=0x10; //BRTR=1,允許獨立波特率發生器運行
BRT=0XFD; //獨特波特率發生器定時器
EA=1;
IE2=0x01; //開串口2中斷
}
//*******************發送一個字符
void Send_Char(uchar a)
{
IE2=0x00;
S2BUF=a;
delay(200);
while(!(S2CON&0x02)); //while(!S2TI) 等待S2TI變為1
S2CON&=0xFD; //S2TI清0
IE2=0x01;
}
//*******************發送一個字符串
void Send_String(uchar *tab)
{
IE2=0x00;
while(*tab!='\0')
{
Send_Char(*tab++);
}
IE2=0x01;
}
//********************主函數
void main()
{
while(1)
{
Serial_Iint();
delay(1000);
Send_String(Rec_Buf);
delay(1000);
}
}
//********************串口2中斷函數
void Serial_2Int() interrupt 8
{
IE2=0x00; //關串口中斷,防止中斷的嵌套
if(S2CON&0x02) //如果是串口2發送中斷(S2TI)不進行處理
{
S2CON&=0xFD; //S2TI清0
}
if(S2CON&0x01)
{
S2CON&=0xFE; //S2RI清0
Rec_Buf[i]=S2BUF;
i++;
if(i>Buf_Max)
{
i=0;
}
}
IE2=0x01; //開啟串口中斷
}