串口和定时器中断冲突
/********************初始化***********************/
void uart_init()
{
P0=0xff;//初始化单片机
P1=0xff;
P2=0xff;
P3=0xff;
uart_count=0;
SCON=0x50;//串口工作在模式1,8位AURT,使能接收
TMOD=0x21;//定时器1工作在模式2,8位自动重装;定时器0工作在模式1,16位定时器
TH1=0xfd;//波特率为9600,时钟为11.059MHZ
TL1=0xfd;
IE=0X96;//中断总使能,串口中断使能,外部中断1使能,定时器0中断使能
PS=1;//串口中断高优先级
TR1=1;//定时器0和1开始计数
TR0=1;
PT0=0;//定时器0低优先级
IT1=0;//外部中断1低电古触发
EX1=0;
}
/*******************串口接收中断*************************/
void uart_rec_inter() interrupt 4
{
while(RI)
{
RI=0;
uart_buf[uart_count]=SBUF;
uart_count++;
if(uart_count==1)
{
err_count=30;
uart_err=1;
};
if(uart_count==11)
{
uart_ready=1;
uart_count=0;
uart_err=0;
};
}
}
/*************************向串口发送一个字节*****************/
void uart_sendone(uchar ch)
{
SBUF=ch;
while(TI==0);
TI=0;
}
/**********向串口发送字符串,strlen为字符串长度***********/
void uart_sendstring(uchar *str,uint strlen)
{
uint k;
for(k=0;k <strlen;k++)
{
uart_sendone(*(str+k));
}
}
/************************校验和**************************/
void uart_checksum()
{
uint check_s;//校验和时,字节计数器
if((uart_buf[0]==0x5a)&&(uart_buf[1]==0x53))//首先校验第一和第二个字节是否正确
{
checksum=0;
for(check_s=0;check_s <10;check_s++)
{
checksum+=uart_buf[check_s];
}
if(checksum==uart_buf[10])
{
sum=1;
}
}
}
void timer0() interrupt 1
{
uchar sen_count;//读状态计数器
TH0=0xd8;//3ms f448 10ms d8f0 15ms c568 5ms ec78
TL0=0xf0;
TIME=0;
for(sen_count=0;sen_count <=3;sen_count++)
{
xc_en=0;
sen_en=1;
delay(5);
xc_buf[sen_count]=P0;//读3次行程开关状态
xc_en=1;
sen_en=0;
delay(5);
sen_buf[sen_count]=P0;//读3次传感器状态
};
if((xc_buf[0]==xc_buf[1])&&(xc_buf[0]==xc_buf[2]))//三次状态相同
{
if(xc_flag!=xc_buf[2])
{
if(((xc_flag&0x40)==0x40)&&((xc_buf[2]&0x40)==0))//判断推杆脉冲
{
//push.counter++;
if(time_run)//判断是否按时间运行
{uart_sendone(push_count);
if(push_count> 0)
{
if(--push_count <=0)
{
push_stop=1;//置位推杆停止标志位
}
}
}
/*if(push_run)//判断高度角光电传感器是否有效
{
if(((sen_flag&0xc0)!=sen)||(push.counter> =30))
{
push_run=0;
push_stop=1;
send_addr=0;
uart_buf[3]='M';
uart_buf[7]=push_str;
uart_buf[8]=push.ch[0];
uart_buf[9]=push.ch[1];
push_str=0;
push.counter=0;
trans_r=1;
}
}*/
};
if(((xc_flag&0x80)==0x80)&&((xc_buf[2]&0x80)==0))//判断转盘脉冲
{
//dial.counter++;
if(time_run)//判断是否按时间运行
{
if(dial_count> 0)
{
if(--dial_count <=0)
{RUN=0;
dial_stop=1;//置位转盘停止标志位
}
}
}
/*if(dial_run)//判断方位角光电传感器是否有效
{
if(((sen_flag&0x0c)!=0x04)||(dial.counter> =20))
{
dial_run=0;//清0
dial_stop=1;//置位电机停止标志
send_addr=0;//广播地址
uart_buf[3]='M';//命令为M
uart_buf[4]='R';
uart_buf[5]=dial.ch[0];
uart_buf[6]=dial.ch[1];
//dial_str=0;
dial.counter=0;
trans_r=1;
}
}*/
};
xc_flag=xc_buf[2];
if(time_run)
{
if((push_count|dial_count)==0)
{
time_run=0;
}
}
}
}
if((sen_buf[0]==sen_buf[1])&&(sen_buf[0]==sen_buf[2]))
{
sen_flag=sen_buf[2];
}
if(uart_err)
{
err_count--;
if(err_count==0)
{
uart_err=0;
uart_count=0;
uart_ready=0;
}
}
//RUN=1;
}
我用串口接收11字节数据,电机根据串口接收到的数据转动相应的脉冲。在定时器0中断中,根据电机转动时输出的脉冲数与接收到的比较,相等时就使电机停下。
但是一上电就一直处于定时器中断里,串口无法接收数据。
求高手帮忙指点下,都整2周了。
发表时间:2009年6月17日16:50:31