定时器T0产生PWM波,T1控制波特率串口通信。可是加上T0,串口就没有数据接收,T0正常产生波。把T0初始化函数去掉,串口就正常接收数据。用的是STC89C52。
void timer_init()
{
TMOD=0x21;
SCON=0X53;
TH1=0xfd;
TL1=0xfd;
ET1=1;
TR1=1;
TH0=0xFF;
TL0=0xF6;
ET0=1;
TR0=1;
ES=1;
EA=1;
}
void timer0_int() interrupt 1
{
TR0=0; //设置定时器初值期间,关闭定时器
TH0=0xFF;
TL0=0xF6;
TR0=1;
time++;
if(time<50) //count为占空比
{
PWM=1; //输出高电平
}
else
PWM=0;
if(time>=100)
{
time=0;
}
}
void ser() interrupt 4
{
if (RI)
{
RI=0;
Re_buf[counter]=SBUF;
if(counter==0&&Re_buf[0]!=0x55) return; //第0号数据不是帧头
counter++;
if(counter==11) //接收到11个数据
{
counter=0; //重新赋值,准备下一帧数据的接收
switch(Re_buf [1])
{
case 0x53:
ucStrAngle[0]=Re_buf[2];
ucStrAngle[1]=Re_buf[3];
ucStrAngle[2]=Re_buf[4];
ucStrAngle[3]=Re_buf[5];
ucStrAngle[4]=Re_buf[6];
ucStrAngle[5]=Re_buf[7];
break;
}
}
}
Vax = ((short)(ucStrAngle[1]<<8| ucStrAngle[0]))/32768.0*180;
if(Vax>0)
{
x=1;
xx=0;
}
else if(Vax<=0)
{
x=0;
xx=1;
}
}
ç¨åºéè¦åäºä¿®æ¹ï¼ä¿®æ¹å¦ä¸ï¼
void timer_init()51单片机定时和串口冲突?
T0中断太频繁了,因为同级中断,T0优先,所以总抢占中断,串口被边缘话了。修改一下程序:void timer_init(){ TMOD=0x22;SCON=0X50;TH1=0xfd;TL1=0xfd;TR1=1;TH0=246;TL0=246;ET0=1;TR0=1;ES=1;EA=1;PS=1; } void timer0_int() interrupt 1 {time++;if(time<50)\/\/count为占空比...
关于51单片机的串口和定时器共用冲突
串口需要定时器1或定时器2作为波特率发生器哦,这个定时器要工作在方式2,不能中断。按照你说的,应该没有这个问题,串口不会影响T0的。代码不完全,看不出来呢
51单片机定时器和串口通讯冲突怎么办?
void init_t0() \/\/定时器0,PWM产生 { TMOD|=0x01;TH0=0xfc; \/\/1ms延时常数 TL0=0xff; \/\/频率调节 PT0=1;EA=1;ET0=1;TR0=1;} void init_int() \/\/串口、定时器初始化 { TMOD|=0x20; \/\/定时器T1,方式二 TH1=0xfd; \/\/波特率2400 TL1=0xfd;TR1=1; ...
51单片机定时器0和定时器1使用冲突
SM0=0;SM1=1;当 REN=1; 执行完后,单片机完全符合串口方式0,同步移位方式,如果你这时板子接在电脑串口上,不管你电脑有没有发串口数据,单片机RXD脚已经在接收了,而且你没写串口中断,RI不清0,那就在串口中断里出不来了,下面的程序都做不到,所以你定时器0不动,关了T1就等于关了串口,...
51单片机定时器0中断会不会影响串口中断
会。在51单片机机器中,若用户在使用时发现其定时器跳转到了0,并且出现中断的现象,那么是会影响串口的,并且是会导致其也发生中断的,在这时只需要重新进行定时,即可解决该问题。
51单片机T0工作于方式3的时候,这时T1口不能用作定时器和中断,是因为会...
51单片机T0工作于方式3的时候,T0占用了T1的资源。这时,用 T1 计数、定时,也都还可以,但是,T1 不能中断了,只能用查询的方法。T1,此时仅仅适合于用于控制串口的波特率。控制波特率时,T1,一般都是设置为方式2。想关闭T1定时器,是不是TMOD要设为0x33?对。如果,想要 T1 停止工作,把 T1 设...
51单片机的串口中断与定时
在串口收\/发数据时,要用定时器T1产生波特率,并不是用来定时的,也不能开定时器T1的中断。TH1和TL1的初值是决定串口波特率的,而且是根据晶振频率和串口波特率计算的。你接外部传感器,是用串口向单片机发送数据吗?波特率是多少?单片机串口接收的波特率必须与它相同才行的。并不是按定时器什么定时时间发送...
STC51单片机同时使用定时器0定时器1和串口
用 T1 控制波特率,此期间,T1 就不能用来中断了。其实,想要实现定时,有一个 T0 足以满足各种需求。T1,就不应该用来做定时用。T2,是有的。
51单片机串口中断和产生波特率的定时器中断为什么不能同时开启?
利用51单片机的定时器1的溢出率产生波特率,并不需要打开 T1 的中断。如果打开了,你就应该编写相应的中断程序。如果,你没有写中断程序,那么,它中断后,自然就会给你添乱。
51单片机中断精确定时和9600波特率的串口通讯能兼得吗?
你好!你语句顺序有些问题,把TR0=1;放到下面,还有IE|= 0x90是开ET1,EX0吧,可你没开EA=1;仅代表个人观点,不喜勿喷,谢谢。