本帖最后由 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;
-
- }
|