c51编程中定时器0和串口通讯同时使用时的初始化问题

我的初始化是这么写的,
void init() //单片机串口初始化函数
{
TMOD=0x01;//设置定时器0为工作方式1
TH0 = (65536 - 100)/256;
TL0 = (65536 - 100)%256;
TH1=0xfd;
TL1=0xfd;//波特率产生
TR0=1; //开定时器
SCON=0x50;
PCON=0x80;
ES=1;//串口中断允许位
ET0=1;
}

然后定时器0工作正常,串口不能接收,不知道能不能发送(因为程序中没有设置发送命令,也没有测试),急求解法

你这个初始化不对,定时器0肯定可以工作,但是串口不会工作的,因为串口工作时候需要用到定时器1来作波特率发生器,你的TMOD=0X01;只设置了定时器0的工作方式1,没有设置定时器1,修改为这样的试试
void init() //单片机串口初始化函数
{
TMOD=0x21;//设置定时器0为工作方式1
TH0 = (65536 - 100)/256;
TL0 = (65536 - 100)%256;
TH1=0xfd;
TL1=0xfd;//波特率产生
TR0=1; //开定时器
TR1=1;
SCON=0x50;
PCON=0x80;
ES=1;//串口中断允许位
ET0=1;
}
温馨提示:内容为网友见解,仅供参考
第1个回答  2013-11-15
用定时器1做波特率发生器,但初始化中没有设置定时器1的初始化参数。
增加下面的内容试试
TMOD = TMOD & 0x0f | 0x20;//定时器1工作模式
TR1 = true; // 启动定时器1

C51单片机串口初始化
2^SMOD是2的SMOD次方,SMOD是波特率是否要加倍的控制位,默认是0,fosc就是晶振的值,X就是装入TH1的值,这里就是0xf3,然后你代进去算就可以的值约为2403,也就算是2400了。

为什么我c51单片机定时器数码管显示和串口不能同时实现?
注意c51单片机串口要用到定时器1作为波特率发生器。如果数码管显示也用定时器1就会冲突。

51单片机Keil C51下使用printf输出到串口,为何初始化了串口之后就可以使...
因为是这样的,在Keil\\C51\\LIB目录下有个putchar.c文件,printf函数会调用该文件中的 putchar函数,putchar里面的使用的寄存器都是标准51的(如TI,SBUF),它 们的地址是固定的,由此可知printf函数只针对串口0。如果想让printf函数支持串口1或串口2。。。那么修改putchar函数的寄存器即可,比如SBUF改为S...

C51,单片机T1,串口编程(请问如何设置TH1,TL1初值)
所以要调整你的16M,比如用11.0592M 18.432M等,波特率一般9600等常用波特率 保证计算的时候能除尽,这样精度就高,通讯出错的几率就低 另外我这有波特率计算器,需要的话留邮箱

C51单片机程序
上两行是定时器\/计数器T0的初值,因为T0是16位的,所以用TH0表示高八位,TL0表示低八位 TH1 = 0xfd;TL1 = 0xfd;T1初值 TMOD = 0x21;定时器\/计数器模式控制寄存器 如图 GATE=1时,由外部中断引脚INT0、INT1来启动定时器T0、T1 GATE=0时,仅由TR0,TR1置位分别启动定时器T0、T1。C\/T=0...

请教老师,在C51单片机的串口通讯中,使用mode2的固定比特率,定时器T1还...
C51的增强型就是C52嘛 增加了定时器2. P1.0口和定时器2没什么关系。不过如果定时器1或则0也对P1.0口控制的话,就要分析了。看题目:定时器2与定时器1没有直接联系,只是同时中断的时候,先执行T1。如果你想用定时器2作为固定波特率,而且还想作为外部计数器这不行的,但是定时器T1还可以。假如...

c51单片机 T1定时器是怎样实现串口通信的
T1定时器设置工作方式为2 ,这时T1采用的八位重装计数方式,设置计数初值,产生波特率。如果你用TH1 =0xfA; TL1 =0xfA; \/\/实现波特率9600(系统时钟11.0592MHZ)

单片机问题
理论上定时器0的中断优先级要比串口的高,你对中断优先级的理解有误。在默认情况下,单片机的5个中断源都是同级的优先级,只在同时申请中断时,先响应定时器T0的中断,但不等于T0的优先级比串口高,而是同级的。在响应了同级的中断时,是不能再响应其它同级的中断的。你的问题解决的办法是:在响应...

51单片机在设定串口传输时,初始化时为什么要把TI置一。程序如下:_百度...
令TI = 1;,表示发送完毕。这一语句,可以启动串口中断,在中断里面,可以继续发送下一个字符。当中断函数中,没有编写“继续发送”的程序段时,这个置一,就没有用了,可以删除。

c51,单片机从串口接收字符串,放到一个数组里面,然后在通过串口发出去...
串行口初始化波特率9600,定时器1,工作方式2 ***\/ void serial_init(void){ TMOD=0x20;\/\/计时器1作为比特率发生器,方式2 TH1=0xfd;TL1=0xfd; \/\/装入初值 TR1=1;\/\/计时中断允许 SM0=0;SM1=1;\/\/串行口工作于方式2 ES=1;\/\/串行口中断允许 REN=1;\/\/接收允许 EA=1;\/\/总中断允许 ...

相似回答