打印

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

[复制链接]
2153|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 | 只看该作者

肯定可以

更低都可以,仔细看一下,是设置问题。。。

使用特权

评论回复
5
shegang|  楼主 | 2007-12-25 22:47 | 只看该作者

我用的是AT89C51RD2

我用的是AT89C51RD2,我明天上班把程序发上来请大家看看!

使用特权

评论回复
6
gyt| | 2007-12-26 11:32 | 只看该作者

越低越可以

使用特权

评论回复
7
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; 
   }
}

大家看看有什么不对?

使用特权

评论回复
8
huntington| | 2007-12-26 13:48 | 只看该作者

由代码得出个结论

楼主不会用中断...

使用特权

评论回复
9
shegang|  楼主 | 2007-12-26 14:47 | 只看该作者

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

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

我用的是atmel的AT89C51RD2

使用特权

评论回复
10
一无所知| | 2007-12-26 15:15 | 只看该作者

关于TI

TI为1时表示SBUF里的1字节数据发送完毕(TI被硬件置1),需要手动(软件)清零。
   你清了么?

使用特权

评论回复
11
twz8858877| | 2007-12-26 15:53 | 只看该作者

当然错了

TF1第一次=1时启动发送过程后定时器1没有再赋初值 =0,其后的溢出速率为{(11.0592/12*1000000)}/65536=14.0625,波特率=0.8789。

使用特权

评论回复
12
showyou| | 2007-12-26 16:19 | 只看该作者

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

我也忘了,当初还记得。有很多资料的

使用特权

评论回复
13
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;
}

 

使用特权

评论回复
14
cly1005| | 2007-12-26 20:13 | 只看该作者

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

使用特权

评论回复
15
shegang|  楼主 | 2007-12-27 10:27 | 只看该作者

对,确实TI忘了清零。

对,确实TI忘了清零。
谢谢大家的热心指导!
我在试试!

使用特权

评论回复
16
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!

使用特权

评论回复
17
hace1983| | 2007-12-28 21:44 | 只看该作者

又温习了一下定时器部分

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

3

主题

10

帖子

0

粉丝