51单片机串口中断波特率为9600接收数据不正确

1.逗比,不要开启定时器1中断!!


2.参照下面这一篇博客,为什么单片机串口设置9600波特率的时候总是接收不到正确数据


因为12Mhz的单片机9600波特通信设置T1初值为FD时有8.51%的误差,而允许误差为4.5%以下!!


解决方法:用4800波特率,置SMOD为1通信,此时误差只有0.16%!!


http://bbs.ednchina.com/BLOG_ARTICLE_216278.HTM

  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是51单片机串口通讯波特率9600的代码: ```c #include<reg51.h> #define FOSC 11059200L // 定义晶振频 #define BAUD 9600 // 定义波特率 sbit LED = P1^0; // LED 引脚 void init_uart() // 串口初始化函数 { SCON = 0x50; // SCON: 模式 1, 8-bit UART, enable 接收 TMOD &= 0x0F; // TMOD: 定时器 1 模式设为 8-bit 自动重装载 TMOD |= 0x20; TH1 = TL1 = -(FOSC/12/32/BAUD); // 设置波特率重装载值 TR1 = 1; // 启动定时器 1 ES = 1; // 使能串口中断 EA = 1; // 使能总中断 } void uart_send_char(unsigned char c) // 发送字符函数 { SBUF = c; // 将要发送的字符存入 SBUF while(!TI); // 等待发送完成 TI = 0; // 清除发送完成标志 } void main() { init_uart(); // 初始化串口 while(1) { LED = !LED; // LED 闪烁 uart_send_char('H'); // 发送字符 'H' uart_send_char('e'); // 发送字符 'e' uart_send_char('l'); // 发送字符 'l' uart_send_char('l'); // 发送字符 'l' uart_send_char('o'); // 发送字符 'o' uart_send_char('\r'); // 发送回车符 uart_send_char('\n'); // 发送换行符 Delay(1000); // 延时 1 秒 } } void uart_interrupt() interrupt 4 using 1 // 串口中断函数 { if(RI) // 判断是否接收到数据 { RI = 0; // 清除接收中断标志 unsigned char c = SBUF; // 读取接收到的数据 uart_send_char(c); // 将接收到的数据发回去 } } ``` 需要注意的是,以上代码使用了中断方式进行串口通讯,需要在使用之前开启中断。另外,发送字符时需要等待发送完成,否则会导致数据错误。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值