请高手帮忙检查一个模拟发送接收SPI的一个PIC单片机程序!!!!
点击浏览该文件
发送程序绝对正常!!!!!!
SPI---C51模拟发送,PIC16F73模拟接收,用PROTEUS模拟仿真!!!为减少代码!!!我把PROTEUS模拟正确的代码加以改动,结果出现了错误,上面附有2中接收代码!
但是不论PROTEUS如何,接收的程序烧进片子后,总无法正常接收主机控制器的数据并显示!!!
极度郁闷中........我把这些发到这里,请大家帮忙指点一二,群众的力量是无限的!!!!!!!!!!
模拟接收错误的那个C程序有注释!!!!
模拟接受正确的的那个C程序,烧进硬件,出现的错误有点类似模拟接收错误的那个C在PROTEUS里面的情况!!!!!!!!!
下面这个是错误的哪个C程序!!!
#include <pic.h>
__CONFIG(0x3FA7); //配置字
volatile unsigned char DIS[5]={0x3f,0x3f,0x3f,0x3f,0x3f};//显示赋0;
const unsigned char tab[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//定义LED段码0~9
unsigned char ptr=0; //定义一个动态扫描指针
void inittimer() //初始化定时器0和看门狗
{ OPTION=0x0f;
INTCON=0xA0;
ADCON1=0x07;
}
void initport() //初始化接口
{ TRISA=0x03;
TRISB=0x01;
TRISC=0x00;
}
void receive() //接收函数
{ unsigned char a,i,j,ensel,point,check;
if(RA1==0) //SPI的使能
{ T0IE=0; //关定时器0
for(i=5;i> 0;i--) //5组数据
{a=0;
for(j=6;j> 0;j--) //每组数据6位
{while(!RB0); //判断CLK是否为高
NOP();
NOP();
NOP();
NOP();
NOP();
if(RA0==1)a|=0x01; //如果传过来的位是高,就地位补1;传过来的是低则不变
a < <=1; //左移1位准备接下一位
while(RB0);//判断CLK是否为低
}a> > =1; //由于只需要五次左移,而循环六次,所以右移一次
if(i==5){check=a; //我的第一组数据高2位是判断用哪个4*8数码管,低4位判断小数点的位子
ensel=check&0xf0; //取高位判断哪个数码管
point=check&0x0f;} //取低位判断小数点
if(ensel=0x00) //选0号数码管
{DIS[i]=tab[a];}
else if(ensel=0x10)//选1号数码管
{DIS[i+5]=tab[a];}
CLRWDT(); //清除看门狗
}
while(!RA1); //判断使能是否关了
T0IE=1; //开定时器0
TMR0=0xff;
if(point==0x04)DIS[2]|=0x80; //我只有0号数码观才有小数点,这个是XX。XX
else if(point==0x02)DIS[3]|=0x80; //这个是XXX。X
}
}
void main()
{ CLRWDT();
inittimer();
initport();
while(1)
{ receive();
}
}
void interrupt tro(void)
{ if(T0IE&&T0IF){
T0IF=0;
switch(ptr)
{ case 0:RB4=0;RB1=1;PORTC=DIS[4];ptr++;break; //中断定时扫描,开位选之前先关上次选中的位选
case 1:RB1=0;RB2=1;PORTC=DIS[3];ptr++;break;
case 2:RB2=0;RB3=1;PORTC=DIS[2];ptr++;break;
case 3:RB3=0;RB4=1;PORTC=DIS[1];ptr++;break;
case 4:RB4=0;RA2=1;PORTC=DIS[9];ptr++;break;
case 5:RA2=0;RA3=1;PORTC=DIS[8];ptr++;break;
case 6:RA3=0;RA4=1;PORTC=DIS[7];ptr++;break;
case 7:RA4=0;RA5=1;PORTC=DIS[6];ptr++;break;
}if(ptr==8){ptr=0;}CLRWDT();
}
}
请高手们帮忙看看啊
发表时间:2006年3月3日17:15:41