对单片机感兴趣可以看下,以下是在KEIL C51程序,是否看出有问题。
#define BAUD_RATE 9600
#define CPU_CLOCK 27000000
TH2 =(65536-(CPU_CLOCK/(BAUD_RATE*32))&0xFF00)>>8;
TL2 =(65536-(CPU_CLOCK/(BAUD_RATE*32))&0x00FF)>>0;
它丫的就是算不对。这个是在串口初始时设置波特率的。开始没想到这个运算会有问题,就在其它设置的地方找啊找。弄得非常郁闷。后来手工赋了个初始值给TH2和TL2结果就可以了。才知道是这里的问题。不知有没有高手已经看出问题在哪里了。如果有请留个言,说不定哪天还有其它问题想请教一下,大家交个朋友。将运算换成以下方式也不会有问题了。现在就应该比较明了了。不知大家有没有想到了。我在看法在页尾,说得不对欢迎砸砖头。哈哈。
TH2 =(65536-(CPU_CLOCK/BAUD_RATE/32)&0xFF00)>>8;
TL2 =(65536-(CPU_CLOCK/BAUD_RATE/32)&0x00FF)>>0;
总而言之就是数据类型的问题。9600*32已经已经是0x4B000了。因为9600和32都是常量且小于0xFFFF,编译器给它们运算的结果分配的空间是2个字节的。多余部分就被扔掉了,只剩下0xB000。丫的,应该就是这么回事了。要是把BAUD_RATE变在一个4字节的变量再去做运算是可以得到正确的结果的。
用户518079 2011-3-9 23:10