Timer 在AT89S52、4Mhz晶体上以9600波特发送数据

Timer 在AT89S52、4Mhz晶体上以9600波特发送数据,timer,serial-port,microcontroller,Timer,Serial Port,Microcontroller,伙伴们 我想用AT89S52传输数据,我的晶体是4MHz, 我是否在下面编写正确的波特率代码? 或者你们中有谁知道如何计算波特率 非常感谢 void transmit_data() { TMOD = 0x20; TH1 = 0xfd; PCON &= 0x7f; SCON = 0x50; TCON =0x40; while(1) { printf("a"); // transmit a along with CR & LF. } }用一

伙伴们

我想用AT89S52传输数据,我的晶体是4MHz, 我是否在下面编写正确的波特率代码? 或者你们中有谁知道如何计算波特率

非常感谢

void transmit_data()
 {
    TMOD = 0x20;
    TH1 = 0xfd;
    PCON &= 0x7f;
SCON = 0x50;
TCON =0x40;
while(1)
  {
    printf("a"); // transmit a along with CR & LF.
  }

}用一些猜测值对其进行编码,并在循环中发送0xAA。用示波器查看tx o/p,测量位宽度,然后出错…'优化除数值。与查找/阅读/消化庞大的用户手册和计算相比,这有一些优势:

1) 要快一点,除非你运气好

2) 如果根本没有输出,在花很长时间思考波特率的错误之前,您可以修复不可靠的硬件和/或错误的UART初始化和/或寄存器地址和/或引脚分配

3) 即使用户手动波特率公式“小于100%正确”,它也始终有效


4) 当您可以看到输出正确但仍然没有通信时,您可以将其归咎于电缆和/或DCE/DTE和/或超级终端和/或所有其他阻止RS232工作的东西。

以下是一个计算器:
不幸的是,它显示了对于标准波特率来说,4 MHz晶体选择是多么糟糕。

对于9600 baut,我能得到的最好的方法是使用11.0592Mhz晶体…0%的误差裕度

你知道如何用4Mhz时钟计算波特率吗?感谢S0x55,它也是大写U。如果你的电源是关闭的,你可以连接到一台计算机,并尝试降低波特率,直到它工作。不保证,但有助于解决常见错误,如不知道硬件中的除以2或4。我可以看到模拟在Keil上工作,但当我将笔记本电脑的串行端口连接到电路的串行端口时,我看不到结果,我如何知道MAX 232是否工作?如果没有范围,您可以通过电阻器(guess-4.7K)连接LED,穿过引脚2和引脚7(tx数据和gnd)。如果交替输出的值应为秒0x00和秒0xFF,则LED应闪烁。如果LED闪烁太快或太慢,说明波特率太快/太慢。上面的代码应该使用哪个“串行时钟除数”?谢谢,也许我可以换成11Mhz或24Mhz晶体如果你使用计算器页面顶部描述的配置和11.0592 Mhz晶体,重新加载值应该是0FDh