请教51的波特率问题!(我把程序传上来了)

[复制链接]
3273|16
 楼主| shegang 发表于 2007-12-25 20:13 | 显示全部楼层 |阅读模式
我现在用11.0592的晶振。波特率为110HZ。
只能用定时器1的方式1模式。
但发现通讯不正常,大概2秒左右才传一位。不知是什么问题?(基本的设置都没有问题的)
好多关于波特率的介绍都是方式2的自动装载的,方式1的波特率设置讲的较少。
我想问问,如用方式1来做波特率发生器和方式2有什么不同?程序要注意哪些地方?

int main(void)
{
  ES=0;
  EA=0;
  SCON   = 0x50;      
  TMOD   = 0x10;
  PCON  &= 0x7F;
  TR1 = 1;
  while(1)
  {             
    TL1 = 0xFA;
    TH1 = 0xFF;
    while(TF1==0);
    SBUF=0xA5;
    while(TI==0);
    TF1=0; 
   }
}
大家看看有什么不对?
cly1005 发表于 2007-12-25 20:41 | 显示全部楼层

110HZ??

用的什么单片机--按你的设置
波特率不可能低于117.9Hz
cly1005 发表于 2007-12-25 20:49 | 显示全部楼层

当俺瞎说的,倒是可以----可能是重载值有问题吧

ayb_ice 发表于 2007-12-25 22:02 | 显示全部楼层

肯定可以

更低都可以,仔细看一下,是设置问题。。。
 楼主| shegang 发表于 2007-12-25 22:47 | 显示全部楼层

我用的是AT89C51RD2

我用的是AT89C51RD2,我明天上班把程序发上来请大家看看!
gyt 发表于 2007-12-26 11:32 | 显示全部楼层

越低越可以

 楼主| shegang 发表于 2007-12-26 13:14 | 显示全部楼层

我把程序传上来了

int main(void)
{
  ES=0;
  EA=0;
  TR1 = 1;
  SCON   = 0x50;      
  TMOD   = 0x10;
  while(1)
  {             
    TL1 = 0xFA;
    TH1 = 0xFF;
    PCON  &= 0x7F;
    while(TF1==0);
    SBUF=0xA5;
    while(TI==0);
    TF1=0; 
   }
}

大家看看有什么不对?
huntington 发表于 2007-12-26 13:48 | 显示全部楼层

由代码得出个结论

楼主不会用中断...
 楼主| shegang 发表于 2007-12-26 14:47 | 显示全部楼层

我就不想用中断,不是不会!

我就不想用中断,不是不会!
(我的看法中断多了不是什么好事,尽量避免)
而且我问的是我这段代码这样做是否可以?如果错,错在什么地方?
你中断无非是在中断程序里继续喂初值罢了,我用这种方式喂为何不可?
如果只能用中断,请告诉我原因,谢谢!

我用的是atmel的AT89C51RD2
一无所知 发表于 2007-12-26 15:15 | 显示全部楼层

关于TI

TI为1时表示SBUF里的1字节数据发送完毕(TI被硬件置1),需要手动(软件)清零。
   你清了么?
twz8858877 发表于 2007-12-26 15:53 | 显示全部楼层

当然错了

TF1第一次=1时启动发送过程后定时器1没有再赋初值 =0,其后的溢出速率为{(11.0592/12*1000000)}/65536=14.0625,波特率=0.8789。
showyou 发表于 2007-12-26 16:19 | 显示全部楼层

回复主题:请教51的波特率问题!(

我也忘了,当初还记得。有很多资料的
cly1005 发表于 2007-12-26 20:06 | 显示全部楼层

11楼的说得对

传1bit定时器要溢出32*2^SMOD
程序在执行while(TI==0);时定时器没有重载
可以改成
while(1){    
    PCON  &= 0x7F;         
    while(TF1==0);
    TF1=0; 
    TL1 = 0xFA;
    TH1 = 0xFF;
    SBUF=0xA5;
    while(TI==0){
      if(TF1){
         TF1=0; 
         TL1 = 0xFA;
         TH1 = 0xFF;
      }
    } 
    TI=0;
}

 

cly1005 发表于 2007-12-26 20:13 | 显示全部楼层

不好意思,打错了,是1bit溢出32/2^SMOD

 楼主| shegang 发表于 2007-12-27 10:27 | 显示全部楼层

对,确实TI忘了清零。

对,确实TI忘了清零。
谢谢大家的热心指导!
我在试试!
 楼主| shegang 发表于 2007-12-27 11:37 | 显示全部楼层

参照cly1005给我改的程序,我又改了一下,通过测试了。

参照cly1005给我改的程序,我又改了一下,通过测试了。

int main(void)
{
  ES=0;
  EA=0;
  SCON   = 0x50;
  TMOD   = 0x10;
  PCON  &= 0x7F;
  TR1 = 1;
  while(1)
  {
    PCON  &= 0x7F;
    TL1 = 0xFA;
    TH1 = 0xFe;
TXD:
    while(TF1==0);
    SBUF=0xAA;
    while(TI==0)
     {     
        if(TF1)
          {
            TF1=0; 
            TL1 = 0xFA;
            TH1 = 0xFe;
          }
     }    
    TI=0;
    goto TXD;
   }
}

再次谢谢大家的指导,特别感谢cly1005!
hace1983 发表于 2007-12-28 21:44 | 显示全部楼层

又温习了一下定时器部分

您需要登录后才可以回帖 登录 | 注册

本版积分规则

3

主题

10

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部