本帖最后由 烟雨蒙蒙 于 2011-7-22 11:19 编辑
我用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 receiv[8]={1,2,3,4,5,6,7,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;允许同步串行口工作
RB1=0;
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;
RB1=0;
CREN=1; //允许接收数据
}
}
}
} |