找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3355|回复: 31
打印 上一主题 下一主题
收起左侧

温度计之小问题,求助高人

  [复制链接]
跳转到指定楼层
楼主
问题是数码管前二位不是太亮,我用了10K排阻,不亮与排阻有关吗?
                                                                多谢
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:197962 发表于 2017-5-23 00:52 来自手机 | 只看该作者
发的图怎么不全发

IMG_20170522_232633.jpg (26.25 KB, 下载次数: 78)

IMG_20170522_232633.jpg

IMG_20170522_232621.jpg (15.57 KB, 下载次数: 56)

IMG_20170522_232621.jpg

IMG_20170522_232510.jpg (36.51 KB, 下载次数: 83)

IMG_20170522_232510.jpg

IMG_20170522_232457.jpg (28.63 KB, 下载次数: 59)

IMG_20170522_232457.jpg

IMG_20170522_232434.jpg (26.41 KB, 下载次数: 54)

IMG_20170522_232434.jpg
回复

使用道具 举报

板凳
ID:96682 发表于 2017-5-23 13:50 | 只看该作者
在实物上对比一下,就知道接与不接有没有关系了
回复

使用道具 举报

地板
ID:7485 发表于 2017-5-23 14:08 | 只看该作者
如果是全部不是太亮,可能是排阻的问题。
你的问题则不然,最后一位太亮,是因为你的显示程序停在了最后一位上,没有关闭。直到下次显示第一位时才关闭,比其他两位亮的时间长所致。
回复

使用道具 举报

5#
ID:203876 发表于 2017-5-23 14:15 | 只看该作者
这背部的线路我也是醉了
回复

使用道具 举报

6#
ID:203875 发表于 2017-5-23 14:22 | 只看该作者
应该不是排阻问题
回复

使用道具 举报

7#
ID:170270 发表于 2017-5-23 14:46 | 只看该作者
显示时间问题 数码管2MS刷新一次 差距就不明显了 定时中断2MS 显示程序放中断里 就能解决
回复

使用道具 举报

8#
ID:7485 发表于 2017-5-23 17:31 | 只看该作者
把程序贴出来。开始显示的时候,你有“位”选择,同时就关闭了前面的一位的显示,而最后一位显示完后没有再选择其他的位,所以他就一直开着,直到下次再调用显示程序时才改变“位”,所以最后一位很亮。这是许多新手容易忽视的问题。

最后一位显示完后,将“位选”关闭即可。
回复

使用道具 举报

9#
ID:198608 发表于 2017-5-23 20:37 来自手机 | 只看该作者
加驱动
回复

使用道具 举报

10#
ID:7485 发表于 2017-5-24 11:10 | 只看该作者

什么意思?
回复

使用道具 举报

11#
ID:197962 发表于 2017-5-27 23:30 | 只看该作者

#include<reg52.h>
#include <intrins.h>
#define  uchar  unsigned  char
#define  uint   unsigned  int
sbit  DATA = P3^7; //DS18B20接入口
uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
char  bai,shi,ge; //定义变量
/*延时子函数*/
void delay(uint num)
{
while(num--) ;
}
/*************DS18b20温度传感器函数*********************/
Init_DS18B20(void)     //传感器初始化
{
  uchar x=0;
  DATA = 1;    //DQ复位
  delay(10);  //稍做延时
  DATA = 0;    //单片机将DQ拉低
  delay(80); //精确延时 大于 480us    //450
  DATA = 1;    //拉高总线
  delay(20);
  x=DATA;      //稍做延时后 如果x=0则初始化成功 x=1则初始化失败
  delay(30);
}
//读一个字节
ReadOneChar(void)
{
uchar i=0;
uchar dat = 0;
for (i=8;i>0;i--)
  {
    DATA = 0; // 给脉冲信号
    dat>>=1;
    DATA = 1; // 给脉冲信号
    if(DATA)
     dat|=0x80;
    delay(8);
  }
  return(dat);
}
//写一个字节
WriteOneChar(unsigned char dat)
{
  uchar i=0;
  for (i=8; i>0; i--)
  {
    DATA = 0;
    DATA = dat&0x01;
   delay(10);
   DATA = 1;
   dat>>=1;
  }
delay(8);
}
//读取温度
int ReadTemperature(void)
{
uchar a=0;
uchar b=0;
int t=0;
float tt=0;
Init_DS18B20();
WriteOneChar(0xCC); // 跳过读序号列号的操作
WriteOneChar(0x44); // 启动温度转换
Init_DS18B20();
WriteOneChar(0xCC); //跳过读序号列号的操作
WriteOneChar(0xBE); //读取温度寄存器等(共可读9个寄存器) 前两个就是温度
a=ReadOneChar();//低位
b=ReadOneChar();//高位
t=b;
t<<=8;
t=t|a;
tt=t*0.0625;
t= tt*10+0.5;
return(t);
}
/*显示子函数*/
void  display(int bai,int shi,int ge)
{
P3=0XFB; //显示小数点
P1=0X80; //显示小数点
delay(50);//显示小数点
P3=0xf7;
P1=table[bai];//显示千位
delay(50);//一小段延时动态显示
P3=0xfb;
P1=table[shi];//显示百位
delay(50);
P3=0xfd;
P1=table[ge];//显示十位
delay(50);
}
void  main()
{
int  temp;
while(1)
{  
  temp=ReadTemperature();//读温度
  bai=temp%1000/100;//显示百位
  shi=temp%100/10;//显示十位
  ge=temp%10;//显示个位
  
  display(bai,shi,ge);//显示函数
}  
}
//////////////////////////////
我又试了,不是排阻问题,程序如何修改?
多谢
回复

使用道具 举报

12#
ID:197962 发表于 2017-5-27 23:33 | 只看该作者

#include<reg52.h>
#include <intrins.h>
#define  uchar  unsigned  char
#define  uint   unsigned  int
sbit  DATA = P3^7; //DS18B20接入口
uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
char  bai,shi,ge; //定义变量
/*延时子函数*/
void delay(uint num)
{
while(num--) ;
}
/*************DS18b20温度传感器函数*********************/
Init_DS18B20(void)     //传感器初始化
{
  uchar x=0;
  DATA = 1;    //DQ复位
  delay(10);  //稍做延时
  DATA = 0;    //单片机将DQ拉低
  delay(80); //精确延时 大于 480us    //450
  DATA = 1;    //拉高总线
  delay(20);
  x=DATA;      //稍做延时后 如果x=0则初始化成功 x=1则初始化失败
  delay(30);
}
//读一个字节
ReadOneChar(void)
{
uchar i=0;
uchar dat = 0;
for (i=8;i>0;i--)
  {
    DATA = 0; // 给脉冲信号
    dat>>=1;
    DATA = 1; // 给脉冲信号
    if(DATA)
     dat|=0x80;
    delay(8);
  }
  return(dat);
}
//写一个字节
WriteOneChar(unsigned char dat)
{
  uchar i=0;
  for (i=8; i>0; i--)
  {
    DATA = 0;
    DATA = dat&0x01;
   delay(10);
   DATA = 1;
   dat>>=1;
  }
delay(8);
}
//读取温度
int ReadTemperature(void)
{
uchar a=0;
uchar b=0;
int t=0;
float tt=0;
Init_DS18B20();
WriteOneChar(0xCC); // 跳过读序号列号的操作
WriteOneChar(0x44); // 启动温度转换
Init_DS18B20();
WriteOneChar(0xCC); //跳过读序号列号的操作
WriteOneChar(0xBE); //读取温度寄存器等(共可读9个寄存器) 前两个就是温度
a=ReadOneChar();//低位
b=ReadOneChar();//高位
t=b;
t<<=8;
t=t|a;
tt=t*0.0625;
t= tt*10+0.5;
return(t);
}
/*显示子函数*/
void  display(int bai,int shi,int ge)
{
P3=0XFB; //显示小数点
P1=0X80; //显示小数点
delay(50);//显示小数点
P3=0xf7;
P1=table[bai];//显示千位
delay(50);//一小段延时动态显示
P3=0xfb;
P1=table[shi];//显示百位
delay(50);
P3=0xfd;
P1=table[ge];//显示十位
delay(50);
}
void  main()
{
int  temp;
while(1)
{  
  temp=ReadTemperature();//读温度
  bai=temp%1000/100;//显示百位
  shi=temp%100/10;//显示十位
  ge=temp%10;//显示个位
  
  display(bai,shi,ge);//显示函数
}  
}
/////////////////////////////
不是排阻问题,程序如何修改?
多谢
回复

使用道具 举报

13#
ID:205555 发表于 2017-5-28 09:22 | 只看该作者
不是阻排问题
回复

使用道具 举报

14#
ID:47933 发表于 2017-5-28 09:45 | 只看该作者
排阻没有问题,问题是排阻的值太大,可并联一个3k-10k的排阻,即可排除故障并大幅提高亮度。
这是我最近做试验刚得出的经验:
http://www.51hei.com/bbs/dpj-84657-1.html
回复

使用道具 举报

15#
ID:205617 发表于 2017-5-28 14:33 | 只看该作者
直接加个数字逻辑芯片就好了
回复

使用道具 举报

16#
ID:162136 发表于 2017-5-28 16:17 | 只看该作者
动态扫描时,每一位数码管点亮的时间差别太多,所以亮度差别很多,在亮度不够的数码管点亮程序后加上几毫秒的延时就可以了。
回复

使用道具 举报

17#
ID:185367 发表于 2017-5-28 17:28 | 只看该作者
P3扫描显示完毕之后清屏试试
回复

使用道具 举报

18#
ID:155507 发表于 2017-5-28 18:31 | 只看该作者
  1. #include<reg52.h>
  2. #include <intrins.h>
  3. #define  uchar  unsigned  char
  4. #define  uint   unsigned  int

  5. sbit  DATA = P3^7; //DS18B20接入口
  6. uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
  7. char  bai,shi,ge; //定义变量
  8. /*延时子函数*/
  9. void delay(uint num)
  10. {
  11.         while(num--) ;
  12. }
  13. /*************DS18b20温度传感器函数*********************/
  14. Init_DS18B20(void)     //传感器初始化
  15. {
  16.         uchar x=0;
  17.         DATA = 1;    //DQ复位
  18.         delay(10);  //稍做延时
  19.         DATA = 0;    //单片机将DQ拉低
  20.         delay(80); //精确延时 大于 480us    //450
  21.         DATA = 1;    //拉高总线
  22.         delay(20);
  23.         x=DATA;      //稍做延时后 如果x=0则初始化成功 x=1则初始化失败
  24.         delay(30);
  25. }
  26. //读一个字节
  27. ReadOneChar(void)
  28. {
  29.         uchar i=0;
  30.         uchar dat = 0;
  31.         for (i=8;i>0;i--)
  32.         {
  33.                 DATA = 0; // 给脉冲信号
  34.                 dat>>=1;
  35.                 DATA = 1; // 给脉冲信号
  36.                 if(DATA)
  37.                 dat|=0x80;
  38.                 delay(8);
  39.         }
  40.         return(dat);
  41. }
  42. //写一个字节
  43. WriteOneChar(unsigned char dat)
  44. {
  45.         uchar i=0;
  46.         for (i=8; i>0; i--)
  47.         {
  48.                 DATA = 0;
  49.                 DATA = dat&0x01;
  50.                 delay(10);
  51.                 DATA = 1;
  52.                 dat>>=1;
  53.         }
  54.         delay(8);
  55. }
  56. //读取温度
  57. int ReadTemperature(void)
  58. {
  59.         uchar a=0;
  60.         uchar b=0;
  61.         int t=0;
  62.         float tt=0;
  63.         Init_DS18B20();
  64.         WriteOneChar(0xCC); // 跳过读序号列号的操作
  65.         WriteOneChar(0x44); // 启动温度转换
  66.         Init_DS18B20();
  67.         WriteOneChar(0xCC); //跳过读序号列号的操作
  68.         WriteOneChar(0xBE); //读取温度寄存器等(共可读9个寄存器) 前两个就是温度
  69.         a=ReadOneChar();//低位
  70.         b=ReadOneChar();//高位
  71.         t=b;
  72.         t<<=8;
  73.         t=t|a;
  74.         tt=t*0.0625;
  75.         t= tt*10+0.5;
  76.         return(t);
  77. }
  78. /*显示子函数*/
  79. void  display(int bai,int shi,int ge)
  80. {
  81.         P3=0XFB; //显示小数点
  82.         P1=0X80; //显示小数点
  83.         delay(50);//显示小数点
  84.         P3=0xf7;
  85.         P1=table[bai];//显示千位
  86.         delay(50);//一小段延时动态显示
  87.         P1=0x00;//消隐
  88.         P3=0xfb;
  89.         P1=table[shi];//显示百位
  90.         delay(50);
  91.         P1=0x00;//消隐
  92.         P3=0xfd;
  93.         P1=table[ge];//显示十位
  94.         delay(50);
  95.         P1=0x00;//消隐
  96. }
  97. void  main()
  98. {
  99.         int  temp;
  100.         while(1)
  101.         {  
  102.                 temp=ReadTemperature();//读温度
  103.                 bai=temp%1000/100;//显示百位
  104.                 shi=temp%100/10;//显示十位
  105.                 ge=temp%10;//显示个位

  106.                 display(bai,shi,ge);//显示函数
  107.         }  
  108. }
  109. /////////////////////////////

复制代码
回复

使用道具 举报

19#
ID:205678 发表于 2017-5-28 18:41 | 只看该作者
我不知道啊
回复

使用道具 举报

20#
ID:205694 发表于 2017-5-28 20:02 | 只看该作者
有关的换成1k的试试
回复

使用道具 举报

21#
ID:205714 发表于 2017-5-28 21:18 | 只看该作者
10K电阻太大了啊
回复

使用道具 举报

22#
ID:205740 发表于 2017-5-28 23:37 | 只看该作者
换成2k试下
回复

使用道具 举报

23#
ID:205792 发表于 2017-5-29 11:21 | 只看该作者
跟排阻有关
回复

使用道具 举报

24#
ID:197962 发表于 2017-5-30 08:20 来自手机 | 只看该作者
多谢前辈关注,
问题完美解决。
硬件勿需变动,
软件仍要巧思。
伴汝携手同修,
渡我本初般若!

IMG_20170530_075854.jpg (32.6 KB, 下载次数: 61)

IMG_20170530_075854.jpg

IMG_20170530_072214.jpg (37.38 KB, 下载次数: 47)

IMG_20170530_072214.jpg
回复

使用道具 举报

25#
ID:206250 发表于 2017-5-31 09:31 | 只看该作者
不是排阻问题
回复

使用道具 举报

26#
ID:206263 发表于 2017-5-31 10:04 | 只看该作者
不是排阻问题。。
回复

使用道具 举报

27#
ID:206309 发表于 2017-5-31 11:50 | 只看该作者
屏新时间不一样,前两个显示的时间短。
回复

使用道具 举报

28#
ID:197962 发表于 2017-6-4 06:14 | 只看该作者
  103222 发表于 2017-5-23 00:52
发的图怎么不全发

换一高人程序便可,
自个脑力仍需精进。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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