找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4812|回复: 10
收起左侧

51 STC系列单片机可以接74HC595同时,再接MAX1241吗?

[复制链接]
ID:127087 发表于 2016-6-17 12:56 | 显示全部楼层 |阅读模式
我现在用一款STC12系列单片机,用74HC595作多位数码管的段码与位码控制,然后用MAX1241 高精度ADC转换芯片作重力传感器数据采样处理。但时我发现当MAX1241芯片的ADC转换程序启动后,595就不能显示。关闭ADC转换,给任意一个数到显示函数都是正常显示的。后来发现74HC595有一个CLK时钟信号,而MAX1241又有一个SCLK时钟信号,难道是时钟信号冲突了,难不成要把MAX1241另搞一个单片机处理,完事后直接发送给做595显示的单片机,有没有朋友遇到这种情况?求解答!
回复

使用道具 举报

ID:127087 发表于 2016-6-17 13:25 | 显示全部楼层
无标题.jpg

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

使用道具 举报

ID:7485 发表于 2016-6-17 16:41 | 显示全部楼层
没问题。
回复

使用道具 举报

ID:123289 发表于 2016-6-17 17:22 | 显示全部楼层
请附电路图上来,看看是不是硬设计冲突.
回复

使用道具 举报

ID:111634 发表于 2016-6-17 19:56 | 显示全部楼层
硬件电路虽然未刊全,但从5个595均有SER、SCK、RCK,并与MAX1241分开控制来看,电路无问题,可能是程序问题。
回复

使用道具 举报

ID:110895 发表于 2016-6-19 17:57 | 显示全部楼层
应该是软件问题。
回复

使用道具 举报

ID:127275 发表于 2016-6-19 21:50 | 显示全部楼层
请附电路图上来
回复

使用道具 举报

ID:127087 发表于 2016-6-20 09:51 | 显示全部楼层


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());
数码管不显示,是什么情况?哪里出了问题?请大家帮我看看程序。。。



回复

使用道具 举报

ID:127087 发表于 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()) ;  这时数码管无显示,问题出在哪儿?请大家看看,哪里有问题?
回复

使用道具 举报

ID:153199 发表于 2017-1-8 18:02 | 显示全部楼层
没问题。
回复

使用道具 举报

ID:109622 发表于 2017-5-26 21:10 | 显示全部楼层
楼主,我也正在搞MAX1241 AD转换,能给我发一份你的例程吗?感激不尽!751191958@qq.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表