1、51微控制器SCON=0xDA,工作在方式3.(方式2也可以)
串列埠 1 模式 3:
波特率是可變的,其它和模式2 相同
11 位資料透過TxD/P3.1 傳送,透過RxD/P3.0 接收。一幀資料包含一個起始位(0),8 個數據位(低位在
先),一個可程式設計的第9 位,和一個停止位(1)。傳送時,第9 位資料位來自特殊功能暫存器SCON 的
TB8 位.接收時,第9 位進入特殊功能暫存器SCON 的RB8 位。
SMOD
串列埠1波特率在模式3 = ( 2 / 32 ) x BRT獨立波特率發生器的溢位率
當SMOD = 0時,串列埠1波特率 = BRT 獨立波特率發生器的溢位率 / 32,
當SMOD = 1時,串列埠1波特率 = BRT 獨立波特率發生器的溢位率 / 16,
BRT獨立波特率發生器的溢位率 = Fosc/12/( 256 - BRT ),當BRTx12 = 0時,
BRT獨立波特率發生器的溢位率 = Fosc / ( 256 - BRT ),當BRTx12 = 1時
TB8:傳送時校驗位,可以奇校驗或偶校驗(直接置0或1),然後再發送。
RB8:接收時校驗位,判斷接資料是否正確。
2、程式
/*****************************************
*串列埠1中斷
*****************************************/
void RXD_Int_Service() interrupt 4
{
uint8 ch;
if(RI)
RI=0;
Usart1.RxdDly=6; //超過0.3S清空計數
Usart1.RxdBuf[Usart1.RxdCnt]=ch;
Usart1.RxdCnt++;
if(Usart1.RxdCnt>=10)
Usart1.RxdTrue=1; //接收正確。
Usart1.RxdNum=Usart1.RxdCnt;
Usart1.RxdCnt=0;
}
if(TI)//防止傳送中斷
TI=0;
void Timer0_InSevice() interrupt 1
TH0=0xdc; //定義50ms 正常值0xfe 0x0c ,修正值:0xfe 0x16;
TL0=0x00; //11.0592MHz晶振
if(Usart1.RxdDly)
Usart1.RxdDly--; //0.3S沒有接收到資料,清0計數。
if(Usart1.RxdDly==0)
Usart1.RxdCnt =0; //記數清0.
1、51微控制器SCON=0xDA,工作在方式3.(方式2也可以)
串列埠 1 模式 3:
波特率是可變的,其它和模式2 相同
11 位資料透過TxD/P3.1 傳送,透過RxD/P3.0 接收。一幀資料包含一個起始位(0),8 個數據位(低位在
先),一個可程式設計的第9 位,和一個停止位(1)。傳送時,第9 位資料位來自特殊功能暫存器SCON 的
TB8 位.接收時,第9 位進入特殊功能暫存器SCON 的RB8 位。
SMOD
串列埠1波特率在模式3 = ( 2 / 32 ) x BRT獨立波特率發生器的溢位率
當SMOD = 0時,串列埠1波特率 = BRT 獨立波特率發生器的溢位率 / 32,
當SMOD = 1時,串列埠1波特率 = BRT 獨立波特率發生器的溢位率 / 16,
BRT獨立波特率發生器的溢位率 = Fosc/12/( 256 - BRT ),當BRTx12 = 0時,
BRT獨立波特率發生器的溢位率 = Fosc / ( 256 - BRT ),當BRTx12 = 1時
TB8:傳送時校驗位,可以奇校驗或偶校驗(直接置0或1),然後再發送。
RB8:接收時校驗位,判斷接資料是否正確。
2、程式
/*****************************************
*串列埠1中斷
*****************************************/
void RXD_Int_Service() interrupt 4
{
uint8 ch;
if(RI)
{
RI=0;
Usart1.RxdDly=6; //超過0.3S清空計數
Usart1.RxdBuf[Usart1.RxdCnt]=ch;
Usart1.RxdCnt++;
if(Usart1.RxdCnt>=10)
{
Usart1.RxdTrue=1; //接收正確。
Usart1.RxdNum=Usart1.RxdCnt;
Usart1.RxdCnt=0;
}
}
if(TI)//防止傳送中斷
{
TI=0;
}
}
void Timer0_InSevice() interrupt 1
{
TH0=0xdc; //定義50ms 正常值0xfe 0x0c ,修正值:0xfe 0x16;
TL0=0x00; //11.0592MHz晶振
if(Usart1.RxdDly)
{
Usart1.RxdDly--; //0.3S沒有接收到資料,清0計數。
if(Usart1.RxdDly==0)
{
Usart1.RxdCnt =0; //記數清0.
}
}
}