找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索

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

查看数: 6050 | 评论数: 10 | 收藏 0
关灯 | 提示:支持键盘翻页<-左 右->
    组图打开中,请稍候......
发布时间: 2016-6-17 12:56

正文摘要:

我现在用一款STC12系列单片机,用74HC595作多位数码管的段码与位码控制,然后用MAX1241 高精度ADC转换芯片作重力传感器数据采样处理。但时我发现当MAX1241芯片的ADC转换程序启动后,595就不能显示。关闭ADC转换,给 ...

回复

ID:109622 发表于 2017-5-26 21:10
楼主,我也正在搞MAX1241 AD转换,能给我发一份你的例程吗?感激不尽!751191958@qq.com
ID:153199 发表于 2017-1-8 18:02
没问题。
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: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:127275 发表于 2016-6-19 21:50
请附电路图上来
ID:110895 发表于 2016-6-19 17:57
应该是软件问题。
ID:111634 发表于 2016-6-17 19:56
硬件电路虽然未刊全,但从5个595均有SER、SCK、RCK,并与MAX1241分开控制来看,电路无问题,可能是程序问题。
ID:123289 发表于 2016-6-17 17:22
请附电路图上来,看看是不是硬设计冲突.
ID:7485 发表于 2016-6-17 16:41
没问题。

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

Powered by 单片机教程网

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