标题: 51 STC系列单片机可以接74HC595同时,再接MAX1241吗? [打印本页]

作者: CSBO    时间: 2016-6-17 12:56
标题: 51 STC系列单片机可以接74HC595同时,再接MAX1241吗?
我现在用一款STC12系列单片机,用74HC595作多位数码管的段码与位码控制,然后用MAX1241 高精度ADC转换芯片作重力传感器数据采样处理。但时我发现当MAX1241芯片的ADC转换程序启动后,595就不能显示。关闭ADC转换,给任意一个数到显示函数都是正常显示的。后来发现74HC595有一个CLK时钟信号,而MAX1241又有一个SCLK时钟信号,难道是时钟信号冲突了,难不成要把MAX1241另搞一个单片机处理,完事后直接发送给做595显示的单片机,有没有朋友遇到这种情况?求解答!
作者: CSBO    时间: 2016-6-17 13:25


MAX1241 有三个引脚接STC单片机,有5个595的SER,SCK,RCK也接在STC单片机上。595用来控制数码管显示的。MAX1241用来做ADC转换用的。

作者: ahshmj    时间: 2016-6-17 16:41
没问题。
作者: yzwzfyz    时间: 2016-6-17 17:22
请附电路图上来,看看是不是硬设计冲突.
作者: zl2168    时间: 2016-6-17 19:56
硬件电路虽然未刊全,但从5个595均有SER、SCK、RCK,并与MAX1241分开控制来看,电路无问题,可能是程序问题。
作者: liuyimao485812    时间: 2016-6-19 17:57
应该是软件问题。
作者: 755170611    时间: 2016-6-19 21:50
请附电路图上来
作者: CSBO    时间: 2016-6-20 09:51
liuyimao485812 发表于 2016-6-19 17:57
应该是软件问题。


void send_595_U3(u8 Data2)   //u3 控制段
{
u8 j;
RCK2 = 0;
delay(10);
SCK2 = 0;
for(j=0;j<=7;j++)
{
  SCK2 = 0;
  if(((0x80>>j)&Data2)==0)
    SER2 = 0;
  else
   SER2 = 1;
  SCK2 = 1;
}
RCK2 = 1;
}

void send_595_U7(u8 Data4)  //U7控制位
{
u8 M;
RCK4 = 0;
delay(10);
SCK4 = 0;
for(M=0;M<=7;M++)
{
  SCK4 = 0;
  if(((0x80>>M)&Data4)==0)
    SER4 = 0;
  else
   SER4 = 1;
  SCK4 = 1;
}
RCK4 = 1;
}   



u16 Disp_tg(u16 num1)     //显示体重
{
  u16 dis_buf1[3];
  if(num1>=0&&num1<10)
  {
          //dis_buf[3]=LEDMAP[(num1/1000)%10];
        dis_buf1[2]=LEDMAP[(num1/100)%10];
        dis_buf1[1]=LEDMAP[(num1/10)%10];
        dis_buf1[0]=LEDMAP[num1%10];

     send_595_U3(dis_buf1[0]);  //显示个位段码
     send_595_U7(0xbf);        //开通个位的位码
     delay(110);
     send_595_U7(0xff);        //关闭个位消隐
    }
  else if(num1>=10&&num1<=99)
    {
              //dis_buf[3]=LEDMAP[(num1/1000)%10];
       dis_buf1[2]=LEDMAP[(num1/100)%10];
          dis_buf1[1]=LEDMAP[(num1/10)%10];
       dis_buf1[0]=LEDMAP[num1%10];

        send_595_U3(dis_buf1[0]); //显示个位段码
        send_595_U7(0xbf);       //开通个位的位码
        delay(110);
     send_595_U7(0xff);    //关闭个位消隐

     send_595_U3(dis_buf1[1]);  //显示十位段码
     send_595_U7(0xdf);        //开十位通的位码
     delay(110);
     send_595_U7(0xff);     //关闭十位消隐
    }
  else if(num1>=100&&num1<=999)
    {
    //dis_buf[3]=LEDMAP[(num1/1000)%10];
    dis_buf1[2]=LEDMAP[(num1/100)%10];
    dis_buf1[1]=LEDMAP[(num1/10)%10];
    dis_buf1[0]=LEDMAP[num1%10];

    send_595_U3(dis_buf1[0]);      //显示个位段码
    send_595_U7(0xbf);            //开通个位的位码
    delay(110);
    send_595_U7(0xff);     //关闭个位消隐

    send_595_U3(dis_buf1[1]&0x7f);    //显示十位段码
    send_595_U7(0xdf);          //开通十位的位码
    delay(110);
    send_595_U7(0xff);      //关闭十位消隐
    send_595_U3(dis_buf1[2]);    //显示百位段码
    send_595_U7(0xef);          //开通百位的位码
    delay(110);
    send_595_U7(0xff);     //关闭百位消隐
   }
    return num1;
}

u16 ReadADC_data()   //读MAX1241 ADC转换数据
{
u16 ADC_Data;
u8 i;
SCLK=0;
CS=0;
ADC_Data=0;
while(!DOUT);
SCLK=1;
SCLK=0;
for(i=0;i<12;i++)
{
  SCLK=1;
  ADC_Data<<=1;
  ADC_Data|=DOUT;
  SCLK=0;
}
   CS=1;
   SCLK=0;
   return  ADC_Data;

}

上面的程序比如说我要显示一个体重数:59.8 ,则我在显示调用时用:Disp_tg(598);  即可显示:59.8   但我调用:Disp_tg(ReadADC_data());
数码管不显示,是什么情况?哪里出了问题?请大家帮我看看程序。。。




作者: CSBO    时间: 2016-6-20 10:04
u16 Disp_tg(u16 num1)     //显示体重
{
  u16 dis_buf1[3];
  if(num1>=0&&num1<10)
  {
          //dis_buf[3]=LEDMAP[(num1/1000)%10];
        dis_buf1[2]=LEDMAP[(num1/100)%10];
        dis_buf1[1]=LEDMAP[(num1/10)%10];
        dis_buf1[0]=LEDMAP[num1%10];

     send_595_U3(dis_buf1[0]);  //显示个位段码
     send_595_U7(0xbf);        //开通个位的位码
     delay(110);
     send_595_U7(0xff);        //关闭个位消隐
    }
  else if(num1>=10&&num1<=99)
    {
              //dis_buf[3]=LEDMAP[(num1/1000)%10];
       dis_buf1[2]=LEDMAP[(num1/100)%10];
          dis_buf1[1]=LEDMAP[(num1/10)%10];
       dis_buf1[0]=LEDMAP[num1%10];

        send_595_U3(dis_buf1[0]); //显示个位段码
        send_595_U7(0xbf);       //开通个位的位码
        delay(110);
     send_595_U7(0xff);    //关闭个位消隐

     send_595_U3(dis_buf1[1]);  //显示十位段码
     send_595_U7(0xdf);        //开十位通的位码
     delay(110);
     send_595_U7(0xff);     //关闭十位消隐
    }
  else if(num1>=100&&num1<=999)
    {
    //dis_buf[3]=LEDMAP[(num1/1000)%10];
    dis_buf1[2]=LEDMAP[(num1/100)%10];
    dis_buf1[1]=LEDMAP[(num1/10)%10];
    dis_buf1[0]=LEDMAP[num1%10];

    send_595_U3(dis_buf1[0]);      //显示个位段码
    send_595_U7(0xbf);            //开通个位的位码
    delay(110);
    send_595_U7(0xff);     //关闭个位消隐

    send_595_U3(dis_buf1[1]&0x7f);    //显示十位段码
    send_595_U7(0xdf);          //开通十位的位码
    delay(110);
    send_595_U7(0xff);      //关闭十位消隐
    send_595_U3(dis_buf1[2]);    //显示百位段码
    send_595_U7(0xef);          //开通百位的位码
    delay(110);
    send_595_U7(0xff);     //关闭百位消隐
   }
    return num1;
}



u16 ReadADC_data()    //读取MAX1241 重力转换数据
{
u16 ADC_Data;
u8 i;
SCLK=0;
CS=0;
ADC_Data=0;
while(!DOUT);
SCLK=1;
SCLK=0;
for(i=0;i<12;i++)
{
  SCLK=1;
  ADC_Data<<=1;
  ADC_Data|=DOUT;
  SCLK=0;
}
   CS=1;
   SCLK=0;
   return  ADC_Data;

}

在主程序我调用单个 显示程序没有任何问题,比如我想显示59.8。 :Disp_tg(598) ; 即可立马显示正常,但当我再调用1241转换数据:
Disp_tg(ReadADC_data()) ;  这时数码管无显示,问题出在哪儿?请大家看看,哪里有问题?

作者: liuzhaoxin1020    时间: 2017-1-8 18:02
没问题。
作者: 751191958    时间: 2017-5-26 21:10
楼主,我也正在搞MAX1241 AD转换,能给我发一份你的例程吗?感激不尽!751191958@qq.com




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1