cumtgao 发表于 2011-9-26 18:08:58

STC单片机上用36M晶振 串口发送错误求救

各位大虾,最近在STC89C54上跑36M晶振,但发送串口时一直接收错误的数据 串口程序部分如下
/***条件编译区********************/
#define SEND_AD_DATA
/*********#define量********************/
#define FOSC 36000000L
#define BAUD 600
#ifdef SEND_AD_DATA
sfr T2MOD = 0xc9;

void Init_T2(void)
{
        SCON |= 0X50;
        T2CON |= 0X30
        T2MOD = 0X00; //默认设置就可以
        TL2 = RCAP2L = (65536 - (FOSC / 32 / BAUD));
        TH2 = RCAP2H = (65536 - (FOSC / 32 / BAUD)) >> 8;
        TR2 =    1;          //可位寻址 在寄存器T2CON中
        ES=   1;
}

void send_byte(unsigned int send_value)
{
        EA=0;
        SBUF = send_value>>8; //先发送高位
        while(!TI);
        TI=0;
        DELAY_Ms(1000);
        SBUF = send_value;
        while(!TI);
        TI = 0;
        EA=1;

}
#endif
请问我这样设置有问题么?有谁用过36M的给些调试建议,在此谢过。。。

cumtgao 发表于 2011-9-26 18:09:59

另外 硬件方面 晶振两旁没有加电容 并了个4.7K的电阻

728196 发表于 2011-9-26 18:18:06

51 单片机 做串口传输的时候 晶振用的应该是 11.0592M这种的!数整了 串口数据是有误差的!

flkflk 发表于 2011-9-26 18:26:56

回复【2楼】728196
51 单片机 做串口传输的时候 晶振用的应该是 11.0592m这种的!数整了 串口数据是有误差的!
-----------------------------------------------------------------------

还是要看什么整数,什么速率吧

cumtgao 发表于 2011-9-26 18:35:15

以前用12M的一直没有问题 最近用36M才通信错误

bbs2009 发表于 2011-9-26 18:41:45

cumtgao 发表于 2011-9-26 18:46:50

回复【5楼】bbs2009
-----------------------------------------------------------------------

这个。。。板子什么都做好了 程序部分也只有串口了不想再去大改动,还有我那个硬件连接 晶振旁边没有用电容只并了个4.7K电阻 是不是硬件有问题?

728196 发表于 2011-9-26 18:47:18

回复【4楼】cumtgao
-----------------------------------------------------------------------

你看一下 计算波特率的公式 就知道了12M 也是有误差率的肯能你用的速率低传的数据少的问题!

cumtgao 发表于 2011-9-26 18:54:13

回复【7楼】728196
-----------------------------------------------------------------------

TL2 = RCAP2L = (65536 - (FOSC / 32 / BAUD));
TH2 = RCAP2H = (65536 - (FOSC / 32 / BAUD)) >> 8;
这个计算公式应该没错 用过很多次了,波特率从600一直试到15200

piaoyun2030 发表于 2011-9-26 20:58:08

36M晶振对于波特率计算是有误差的,数据有可能错误,要用11.0592M这类的才行吧

bigeblis 发表于 2011-9-26 22:15:11

波特率用300试试
我前段时间调32M频率下的1T单片机串口通讯,一开始也是怎么都不行,后来设置波特率300后才通了,然后慢慢提高的。
最后稳定在方式2下,波特率正好是500K。
对了,我用的晶振是有源的

cumtgao 发表于 2011-9-26 22:46:38

回复【10楼】bigeblis
-----------------------------------------------------------------------

你说的慢慢提高是怎么个提高法?我现在调到600了都不行

cumtgao 发表于 2011-9-26 22:48:35

现在估计主要问题是晶振不稳定,因为用示波器测振荡频率时偶尔能发对一个字节

wgxold 发表于 2011-9-26 22:51:59

为啥并个k级的电阻?我记得是兆级的吧?不放心就用波形发生器生成个36m的输进去。另外这个u的最高输入频率是多少?

cumtgao 发表于 2011-9-26 23:00:06

回复【13楼】wgxold
-----------------------------------------------------------------------

4.7K是我在宏晶官网上看的,按照他那个手册接的电路除了串口不行外 其余的函数模块现在都没问题。

bigeblis 发表于 2011-9-26 23:00:08

回复【11楼】cumtgao
回复【10楼】bigeblis
-----------------------------------------------------------------------

你说的慢慢提高是怎么个提高法?我现在调到600了都不行
-----------------------------------------------------------------------

你用什么接收的?
我的设计是若干片C51通讯,一主N从的那种。一开始直接测试,发现不能建立连接。于是用主芯片发数据给PC,最终把波特率降低到300才使波特率误差降低到允许范围成功通讯。
然后我就用这个波特率去修改通讯协议,成功后,提高波特率测试(因为担心波特率高了有干扰误码的问题),最终稳定在方式2,波特率是固定的主时钟/64,也就是500K。
你说你在晶振上并4.7K电阻我很奇怪,怎么会并这么小的电阻,应该是兆欧级别的吧?另外如此高频率的晶振,你不加谐振电容?示波器观察晶振波形稳定么?

bigeblis 发表于 2011-9-26 23:03:42

STC的DATASHEET里哪里有写晶振上并4.7K电阻啊?我看都是对地加4.7P的电容,再就是建议33M以上使用有源晶振,从OSC1输入。

cumtgao 发表于 2011-9-26 23:04:26

回复【15楼】bigeblis
-----------------------------------------------------------------------

宏晶网上手册上就说不用增加谐振电容,我现在就只和PC机通信。或许那个电阻是太小了吧 我看别的电路都是兆欧级别,但是看数据手册上用4.7K,所以才采用4.7来试的。明天增加电容和改大电阻试试看,因为用示波器测波形时虽然波形很杂,但偶尔能发对一两个字节,可能并大电阻会好点。

cumtgao 发表于 2011-9-26 23:09:07

回复【16楼】bigeblis
-----------------------------------------------------------------------

等 等 我截个图
http://cache.amobbs.com/bbs_upload782111/files_46/ourdev_679918UVIYWL.jpg
(原文件名:未命名.jpg)

上面就是接4.7K的

bigeblis 发表于 2011-9-27 19:55:51

我看的DATASHEET里没有写这个。。。。。。。
STC的手册看来版本很多啊

gwdong 发表于 2011-9-28 13:11:29

电阻不要并,里面已经有电阻了. 电容用30P.....它那个莫名其妙.

xjsfxiongwei 发表于 2011-9-29 00:01:03

误码率太高了,MCU接收会有问题

cumtgao 发表于 2011-11-17 14:16:10

嘿嘿,经过半个多月调试,总算跑起来了。不过现场产品会不会出问题再看,以后不用51跑高速程序了。看来得转向ARM,54说是可以跑80M现在36M在6T模式下跑得就好艰难。。。。
页: [1]
查看完整版本: STC单片机上用36M晶振 串口发送错误求救