IAP15F2K61S2的串口通信

IAP15F2K61S2的串口通信,第1张

IAP的串口通信如果你用keil的debug模式必须用串口2去通信

串口2的通信是这样的 115200bps 331776MHz

void UartInit(void)
{
S2CON = 0x50;
AUXR = 0x14;
T2L = 0xB8;
T2H = 0xFF;
EA = 1;
IE2=0x01;
}
void SendChar(u8 dat)
{
BusyFlag=1;
S2BUF=dat;
while(BusyFlag);
}
void Uart2(void)interrupt 8
{
if(S2CON&S2RI)
{
    S2CON&=~S2RI;
}
if(S2CON&S2TI)
{
    S2CON&=~S2TI;
    BusyFlag=0;
}
}

IAP的串口通信跟以前版本的串口通信差距很大,由于定时器1变成16位自动重装比以前版本定时器1的8位自动重装要好很多,所以方式也变化很多

void UartInit(void) //115200bps@331776MHz
{
SCON = 0x50; //8位数据,可变波特率
AUXR |= 0x40; //定时器1时钟为Fosc,即1T
AUXR &= 0xFE; //串口1选择定时器1为波特率发生器
TMOD &= 0x0F; //设定定时器1为16位自动重装方式
TL1 = 0xB8; //设定定时初值
TH1 = 0xFF; //设定定时初值
ET1 = 0; //禁止定时器1中断
TR1 = 1; //启动定时器1
ES=1;                   //开启串口中断
EA=1;                   //开启总中断
}

这是不使用debug模式的串口1通讯的初始化

看下了程序,应该是没什么问题的,虽然波特率设置成4800后,在时钟12MHz情况下有3%误差,但不至于影响通信,尤其只是做实验的前提下。如果使用串口调试助手调试,检查一下波特是否设置为4800,数据格式是否为8-N-1,即无校验位,8位数据和1位停止位。看看调试助手是否勾选了自动清除功能。同时可以查看Rx和Tx计数,如果这两个数字都不是0,证明串口收发正常,只是数据没被隐藏了。另外需要检查串口电缆是否损坏。

单片机串口通信的问题,其实你只有一个问题,就是:
P0=0XF0;
S2BUF=0xfc;
P0=S2BUF;
//为什么这里P0是0x00

你觉得P0应该等于0xfc对不对?之所以出乎你的预料,是因为S2BUF寄存器地址是一个,实际是两个寄存器,一个只读,一个只写。S2BUF=0xfc是写发送缓冲寄存器S2BUF,P0=S2BUF是读接收缓冲寄存器S2BUF,在没有接收的字符时,接收缓冲寄存器S2BUF是未知的,现在恰好是0,P0当然等于0X00。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12605403.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-26
下一篇 2023-05-26

发表评论

登录后才能评论

评论列表(0条)

保存