导航: 老古网老古论坛XMOS公共讨论区XMOS开源项目区单片机程序设计嵌入式系统广告区域
→请高手帮忙检查一个模拟发送接收SPI的一个PIC单片机程序!

* 89666: 请高手帮忙检查一个模拟发送接收SPI的一个PIC单片机程序!!!!

   xboxmylove 
xboxmylove发表的帖子 

 请高手帮忙检查一个模拟发送接收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

  
回复该帖

本主题共有 2 帖,分页:>>>>>该主题的所有内容[2]条

 *树形目录 只列出部分跟帖的标题以及简单的摘要信息 该主题的部分跟帖如下:

  96866.[详细]感觉有两个问题
摘要:1,片选的实时性,if(RA1==0)          需要用外部中断,要么发送需要足够的延时,保证检测到 片选信号时,spi数......(311字)
- [guozhun][823次] 2006年8月19日

[上一篇帖子]:我发的帖子呢,怎么失踪了????发了2次了!!
[下一篇帖子]:各位有没平价的数模转换IC,推荐下,谢谢我想在几栋楼之间进行语音通讯,我的想法是这样的。通过A/D把