标题:
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
无标题.jpg
(168.32 KB, 下载次数: 83)
下载附件
2016-6-17 13:23 上传
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