打印

串口程序,发的和收的不一致,郁闷!

[复制链接]
4215|22
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
wjk_0713|  楼主 | 2012-2-8 10:32 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
系统频率是24.5Mhz,使用的是UART的模式1进行串口通讯,源程序如下:
main()
{
    SCON    = 0x50;    //Set UART as mode1 and enable reception.
    TMOD    = 0x20;    //Initialize Timer1 as mode2.
    PCON    = 0x80;    //Set SMOD =1
    TL1        = 0x96;    //Set Boud rate as 1200bit/s
    TH1        = 0x96;
    //TL1        = 0xEF;    //Set Boud rate as 1200bit/s
    //TH1        = 0xEF;
    ES        = 0;    //Disable Uart Interrupt(Optional)
    TR1        = 1;    //Start Timer1 Counter
    while(1)
    {
        SBUF    = temp;    //Send 0xaa to TX.
        while(~TI);        //Wait uart finishs transfer data
        TI=0;            //Clear TX Flag.
    }
}
现在有2个问题:
(1) 按照波特率计算公式: X=256-(fosc*(SMOD+1)/(12*32*bps)) 计算出来的TH1装入值是0x96,可是例程的TH1装入值是0xEF。不知道是我计算错了,还是例程计算错了。
(2)我分别用两个TH1装入值烧录程序,但是在串口都没有得到想要的0xaa这个值,串口读出“樻”这个字符,后者串口读出“((++”这样的字符。

知道的说下问题在哪儿啊

相关帖子

沙发
wjk_0713|  楼主 | 2012-2-8 10:33 | 只看该作者
补充下,temp赋值为0xaa

使用特权

评论回复
板凳
wjk_0713|  楼主 | 2012-2-8 10:39 | 只看该作者
再补充下:就收串口发送的数据用的是Session,设置如下:

Port:             COM4
Baud rate:    1200
Data bits:      8
Parity:            None
stop bits:       1

使用特权

评论回复
地板
zj314995534| | 2012-2-8 11:47 | 只看该作者
在main函数中的做如下更改:
//这段是借用工具自动生成的,确保你单片机是12T,就是普通的51.。
    TMOD = 0x20;
    SCON = 0x50;
    TH1 = 0xCF;
    TL1 = TH1;
    PCON = 0x00;
    EA = 1;
    ES = 1;
    TR1 = 1;

使用特权

评论回复
5
putty1005| | 2012-2-8 12:28 | 只看该作者
新手 观望

使用特权

评论回复
6
wjk_0713|  楼主 | 2012-2-8 12:36 | 只看该作者
谢谢4楼,我刚看了下资料,我用的是1T的芯片,请问1T的计算公式还是我上面写的吗?

使用特权

评论回复
7
zj314995534| | 2012-2-8 12:44 | 只看该作者
1T肯定不一样的。你用的是系统内部的时钟吗?由于时钟频率比较高,而且还是1T模式的还用1200波特率则误差较大了。建议用9600波特率。初始化程序如下:
TMOD = 0x20;
    SCON = 0x50;
    TH1 = 0xB0;
    TL1 = TH1;
    PCON = 0x00;
    EA = 1;
    ES = 1;
    TR1 = 1;

使用特权

评论回复
8
putty1005| | 2012-2-8 12:44 | 只看该作者
while(1);
   {
            if(flag==1)
                { ES=0;
                  flag=0;
                  SBUF=a;
                  while(TI!=0);
                  TI=0;
                  ES=1;
            }
       
  }
}
}

void ser() interrupt 4
{
  RI=0;
  P0=SBUF;
  a=SBUF;
  flag=1;
}

初值用串口计算器就好啦 干嘛自己手算呢

使用特权

评论回复
9
wjk_0713|  楼主 | 2012-2-8 12:50 | 只看该作者
我想搞清楚 波特率 是怎么来的, 1T和12T的计算公式 有区别吗?
12T:  X=256-(fosc*(SMOD+1)/(12*32*bps))
1T  :  ?
1T是把上面的12*32改成1*32吗?

使用特权

评论回复
10
wjk_0713|  楼主 | 2012-2-8 13:29 | 只看该作者
我用的是系统内部的时钟( 24.5Mhz)
木有人知道吗?我想搞清楚 例程里面的 0xEF 是怎么计算出来的!

使用特权

评论回复
11
sjc_sugar| | 2012-2-8 13:35 | 只看该作者
你把显示的字符按照HEX格式显示,和自己发的数据对比下!

使用特权

评论回复
12
wjk_0713|  楼主 | 2012-2-8 13:45 | 只看该作者
LS 对比了 不一样啊! 一开始就说明了? 我现在最想知道 1T和12T 算波特率的区别?  公式有何不同?

使用特权

评论回复
13
airwill| | 2012-2-8 13:56 | 只看该作者
按照公式不会错, 例程可能晶振不同, 而值不同.

使用特权

评论回复
14
wjk_0713|  楼主 | 2012-2-8 14:05 | 只看该作者
13楼,你是说,X=256-(fosc*(SMOD+1)/(12*32*bps)) 这个公式 既适合12T 也 适合 1T的?  
我看了例程的频率的频率用的是 内部时钟频率/2,就是说24.5Mhz/2,但是 将这个值带入上面的公式计算出来的X是0xCB,也不是0xEF,我就纳闷了?

使用特权

评论回复
15
hyhmh| | 2012-2-8 14:13 | 只看该作者
由于MCS51系列 MCU 扩展的厂商比较多,必须 标明 芯片型号 才好判断。
可能LZ的MCU 还有其它 特殊功能寄存器。
如STC12C5412AD 有:
           CLK_DIV = 0x00;
// AUXR   T0x12  T1x12 UART_M0x6 EADCI, ESPI ELVDI -  -
        AUXR = 0x40;   // #01000000B            ;T0=12T.T1=1T
具体的定义 各有不同。

使用特权

评论回复
16
wjk_0713|  楼主 | 2012-2-8 14:36 | 只看该作者
15楼让你一说我有点乱了。
有点乱!我在重新理一遍:
主频:24.5Mhz,
IOSCCON是默认值 0x09 (选用内部时钟频率,CLK_DIV是001,即SYSCLK/2)
SCON设定为0x50,即Set UART as mode1
TMOD设定为0x20;        即set Timer1 as mode2
PCON设定为0x80;        即Set SMOD =1
CKCON是默认值0x01; 即Set T1M =1,Timer1 uses a divide-by-12 of the system clock

以上就是全部关于频率的设置了吧?
如果是以上设置,要得到1200bit/s的波特率  TH1应该是多少?

使用特权

评论回复
17
zj314995534| | 2012-2-8 15:15 | 只看该作者
送你一个**版软件,学习51必备,qq:314995534。
不要纠结了,1T和12T就是12倍的关系。
是否1T看有些需要通过特殊功能寄存器AUXR来设置你的单片机运行模式。
看看你选的单片机是否有AUXR寄存器。有的话,头文件最好能对起来,编译软件要不会报错的。

使用特权

评论回复
18
wjk_0713|  楼主 | 2012-2-8 15:40 | 只看该作者
再问个问题:系统时钟频率fosc是指分频后的还是就是芯片本来的内部时钟频率,就上面来说 fosc是24.5Mhz还是24.5/2Mhz

使用特权

评论回复
19
chenyg69| | 2012-2-8 17:43 | 只看该作者
没有资料,就用示波器看一眼吧 :)

使用特权

评论回复
20
wjk_0713|  楼主 | 2012-2-8 18:06 | 只看该作者
终于找到原因了,示波器是好东西,例程他妈的是错的,我叉叉个偶偶!谢谢各位回复的朋友哈!

使用特权

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

本版积分规则

0

主题

19

帖子

0

粉丝