本帖最后由 lostzay 于 2011-12-26 20:45 编辑
现在的问题是(第34行)RB8一直是0啊,我用串口调试已经设置ODD了,理论上应该k为奇数,RB8就是0,k为偶数,RB8就是1吧
导致有时候根本无法发送k的值 ,第38行,
void init_serialcomm(void)//串口中断初始化函数
{
TMOD=0x20; //M1=1,M0=0 定时器1工作方式2(定时常数重装,8 位)
SCON=0xD0; //SM0=1,SM1=1,SM2=0,REN=1 串口工作方式3,允许接收
TH1=0xFD; //晶振11.0592时,波特率9600
PCON=0x80; //波特率倍增,9600*2=19200
TL1=TH1; //TL1计数,溢出后,TH1值送入TL1
TR1=1; //启动定时器1
TI=0;
ES=1; //允许串口中断
EA=1; //开总中断
}
void oddcheck(uchar tempchar)
{
uchar count;
uchar a;
uchar k=0;
a=tempchar;
TI=0;
for(count=0;count<8;count++) //8位数据检验
{
if(0x80 & a) //从最左边1位开始计算是否为1
{
k++; //如果是1,校验标志+1
}
a = a << 1 ;
}
if((k%2)^RB8) //校验标志是否和RB8一致,不一致则说明数据被正确接收
{
check_flag=1; //将串口数据标志置位
ES=0;
SBUF=k;
while(!TI);
TI=0;
ES=1;
}
}
void uart_interrupt(void) interrupt 4//串口中断函数
{
if(RI)// RI=1表示cpu收取数据完毕
{
RI=0; //复位
comm_inbuf_temp=SBUF;
oddcheck(comm_inbuf_temp);
}
else
TI=0;
}
|