你的串口中断应当判缺判消断一下是发送还冲闷是接收……
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.
}
}
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)