极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 19020|回复: 13

求助大神,帮忙看看这个4位数码管

[复制链接]
发表于 2015-11-25 11:37:04 | 显示全部楼层 |阅读模式
做一个温度计,从网上买了个4位数码管,它是用两个74HC595控制的。不太懂这个控制方式。弄了个DS18B的温度传感器,现在温度能正常显示,但数码管不能随温度变化而改变数值,按一下板上的重启键后能显示成当前温度,然后不管温度怎么变数码管都不改变现实。程序是从网上东拼西凑的。大神帮看看怎么回事?

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复

使用道具 举报

 楼主| 发表于 2015-11-25 11:40:22 | 显示全部楼层
#include <DallasTemperature.h>
#include <OneWire.h>
#define ONE_WIRE_BUS 9
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
unsigned char LED_0F[] =
{// 0 1 2 34 5 6 78 9 A bC d E F -
0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x8C,0xBF,0xC6,0xA1,0x86,0xFF,0xbf
};
unsigned char LED[4];//用于LED的4位显示缓存
int SCLK = 4;
int RCLK = 3;
int DIO = 2; //这里定义了那三个脚
int a;
int b;
int c;
void setup ()
{
pinMode(SCLK,OUTPUT);
pinMode(RCLK,OUTPUT);
pinMode(DIO,OUTPUT); //让三个脚都是输出状态
sensors.begin();
Serial.begin(9600);
}
void loop()
{
Temperatures();
LED[0]=12;
LED[1]=b;
LED[2]=a;
LED[3]=16;
while(1)
{
LED4_Display ();
}
delay(1000);
}
void Temperatures()
{
sensors.requestTemperatures();
c=sensors.getTempCByIndex(0);
a=c/10;
b=c%10;
Serial.println(c);
delay(1000);
}
void LED4_Display (void)
{
unsigned char *led_table; // 查表指针
unsigned char i;
//显示第1位
led_table = LED_0F + LED[0];
i = *led_table;
LED_OUT(i);
LED_OUT(0x01);
digitalWrite(RCLK,LOW);
digitalWrite(RCLK,HIGH);
//显示第2位
led_table = LED_0F + LED[1];
i = *led_table;
LED_OUT(i);
LED_OUT(0x02);
digitalWrite(RCLK,LOW);
digitalWrite(RCLK,HIGH);
//显示第3位
led_table = LED_0F + LED[2];
i = *led_table;
LED_OUT(i);
LED_OUT(0x04);
digitalWrite(RCLK,LOW);
digitalWrite(RCLK,HIGH);
//显示第4位
led_table = LED_0F + LED[3];
i = *led_table;
LED_OUT(i);
LED_OUT(0x08);
digitalWrite(RCLK,LOW);
digitalWrite(RCLK,HIGH);

}

void LED_OUT(unsigned char X)
{
unsigned char i;
for(i=8;i>=1;i--)
{
if (X&0x80)
{
digitalWrite(DIO,HIGH);
}
else
{
digitalWrite(DIO,LOW);
}
X<<=1;
digitalWrite(SCLK,LOW);
digitalWrite(SCLK,HIGH);
}
}
回复 支持 反对

使用道具 举报

发表于 2015-11-25 14:50:30 | 显示全部楼层
while(1)
{
LED4_Display ();
}

while(1)
{

}
拿掉,剩下
LED4_Display ();
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-11-25 17:27:54 | 显示全部楼层
林定祥 发表于 2015-11-25 14:50
while(1)
{
LED4_Display ();

拿掉后不能一直显示,一闪一闪的频率很快。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-11-26 11:29:23 | 显示全部楼层
林定祥 发表于 2015-11-25 14:50
while(1)
{
LED4_Display ();

这个while(1)是个死循环,拿掉了倒是能时时测得温度而且能时时显示,但数码管闪的厉害,无论怎么写延时也不好使。怎么弄呢?
回复 支持 反对

使用道具 举报

发表于 2015-11-26 14:45:51 | 显示全部楼层
miblsy 发表于 2015-11-26 11:29
这个while(1)是个死循环,拿掉了倒是能时时测得温度而且能时时显示,但数码管闪的厉害,无论怎么写延时也 ...

LED_OUT(0x01);
LED_OUT(0x02);
LED_OUT(0x04);
LED_OUT(0x08);
这几句不知干什么的,撤了看看
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-11-26 15:17:56 | 显示全部楼层
林定祥 发表于 2015-11-26 14:45
LED_OUT(0x01);
LED_OUT(0x02);
LED_OUT(0x04);

试了一下,这4个代码应该是4个共阴端连接在一个74HC595上,用来位选的,没有这4个就都显示到一块了。
回复 支持 反对

使用道具 举报

发表于 2015-11-26 16:05:14 | 显示全部楼层
本帖最后由 nick_zm 于 2015-11-26 16:15 编辑

你如果用了74HC595就不应该闪,while(1)去掉,delay()去掉。加个条件语句,设置一个变量记录上次测温时间,使用millis()获取当前时刻,判断比上次测温度时大于一秒或两秒(ds18b20采样时间)再执行测温
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-11-26 16:46:40 | 显示全部楼层
nick_zm 发表于 2015-11-26 16:05
你如果用了74HC595就不应该闪,while(1)去掉,delay()去掉。加个条件语句,设置一个变量记录上次测温时间,使 ...

我试了一下,发现貌似是arduino的运行速度不够,我把loop里的其他程序都去掉了,就剩下LED—display,发现不闪了,但也测不了温度了。
回复 支持 反对

使用道具 举报

发表于 2015-11-27 11:13:54 | 显示全部楼层
miblsy 发表于 2015-11-26 16:46
我试了一下,发现貌似是arduino的运行速度不够,我把loop里的其他程序都去掉了,就剩下LED—display,发现 ...

不知道RCLOK和SCLOK和595的SH和ST怎么连线和什么关系,595的原理是ST低电平SH一个脉冲送一位数,把个串口数送完了,ST变高送入的数出现在端口,同时串口送数无效.是否你的ST和SH搞混了.
回复 支持 反对

使用道具 举报

发表于 2015-11-27 11:19:23 | 显示全部楼层
miblsy 发表于 2015-11-25 11:40
#include
#include
#define ONE_WIRE_BUS 9


led_table = LED_0F + LED[0];
i = *led_table;
LED_OUT(i);
LED_OUT(0x01);
digitalWrite(RCLK,LOW);
digitalWrite(RCLK,HIGH);
改成
led_table = LED_0F + LED[0];
i = *led_table;
digitalWrite(RCLK,LOW);
LED_OUT(i);
LED_OUT(0x01);
digitalWrite(RCLK,HIGH);
或者将
digitalWrite(RCLK,LOW);
.
.
.

digitalWrite(RCLK,HIGH);
放在LED-OUT中
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-11-30 22:46:00 | 显示全部楼层
林定祥 发表于 2015-11-27 11:19

led_table = LED_0F + LED[0];
i = *led_table;

改天试试,现在用LCD代替数码管了,实在搞不懂这个数码管。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-12-2 20:07:37 | 显示全部楼层
林定祥 发表于 2015-11-27 11:19

led_table = LED_0F + LED[0];
i = *led_table;

试了下,依然不好使,数码管闪的很快。
回复 支持 反对

使用道具 举报

发表于 2015-12-4 23:09:17 | 显示全部楼层
数码管没有变化,是因为while(1)写死了。delay需要尽量短。
回复 支持 反对

使用道具 举报

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

本版积分规则

Archiver|联系我们|极客工坊

GMT+8, 2026-6-15 08:26 , Processed in 0.039547 second(s), 21 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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