我用PIC16F877A单片机做从机,电脑做主机,两个通讯先用485不通,最后用232,发现单片机能发送正确,但接受有时候正确,有时候就不正确,而且重复性特别差。以下是我的C语言程序。大家帮忙看看那有问题。谢谢!
#include <pic.h> __CONFIG(0x3531); #define _asm{"nop"} NOP() #define uchar unsigned char #define uint unsigned int uchar receive[8]; // 接收数据数组 uchar receive_count=0;// 接收数据个数计数 uchar send_count=0; // 发送数据个数计数 uchar flag; // =1,接收到8个数据 uchar a1,a2,a3,a4,a5,a6,a7,a0; //=========================延时1MS函数======================================= void delay(unsigned int n) { unsigned int i,j; for(i=0;i<n;i++) for(j=0;j<110;j++); } //SCI部件初始化子程序 void sciint() { TRISB = 0xc0; TRISC = 0x80; SPBRG=0x19; //将传输的波特率设置为9600 TXSTA=0x04;//B100 SYNC=0;BRGH=1 异步高速方式传输8bit数据 RCSTA=0x80;//SPEN=1;允许同步串行口工作 TXEN=0; CREN=1; //允许接收数据 } main () { sciint();//SCI部件初始化子程序 RCIF=0; INTCON=0x00; while(1) { while(1) { if(RCIF==1) break; } NOP(); receive[receive_count]=RCREG; //接收数据并存储 receive_count++; // 接收计数器加 RCIF=0; if(receive_count>7) // 如果已经接收到8个数据 { CREN=0; a0=receive[0]; a1=receive[1]; a2=receive[2]; a3=receive[3]; a4=receive[4]; a5=receive[5]; a6=receive[6]; a7=receive[7]; receive_count=0; // 接收计数器清0 flag=1; //置接收到数据标志 RB1=1; TXEN=1; //使能 } while(flag) { TXREG=receive[send_count]; send_count++; // 发送计数器加1 delay(10); while(1) { if(TXIF==1) break; } if(send_count>7) { TXEN=0; send_count=0; flag=0; CREN=1; //允许接收数据 } } } }
|