找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2120|回复: 35
收起左侧

1寸LED时钟修改的热敏电阻温度计显示带有鬼影 附单片机程序

  [复制链接]
ID:17109 发表于 2021-12-28 16:21 | 显示全部楼层 |阅读模式
原来是用4位LED显示的时钟修改的热敏电阻温度计
修改成通电就显示温度计 4位LED显示正常,     修改去除. ds1302.c和ds1302.h .  热敏电阻温度显示带有鬼影    把     原来的程序   和修改的程序   放上给大家看看是那里出问题  那位师博能  看  修改后的程序那里出问题的,修改上传一下谢谢
原来的程序显示.jpg 修改的程序显示.jpg

单片机源程序如下:
  1. #include <reg51.h>
  2. #include <math.h>
  3. #include "ADC.H"

  4. sbit LED1      = P3 ^ 7;//数码管1
  5. sbit LED2      = P3 ^ 6;//数码管2
  6. sbit LED3      = P3 ^ 5;//数码管3
  7. sbit LED4      = P3 ^ 4;//数码管4

  8. //为了编程方便定义的位变量
  9. sbit a0   = ACC ^ 0;
  10. sbit a1   = ACC ^ 1;
  11. sbit a2   = ACC ^ 2;
  12. sbit a3   = ACC ^ 3;
  13. sbit a4   = ACC ^ 4;
  14. sbit a5   = ACC ^ 5;
  15. sbit a6   = ACC ^ 6;
  16. sbit a7   = ACC ^ 7;

  17. sfr AUXR        =   0x8E;   //0000,0000 辅助寄存器
  18. sfr P3M1        =   0xB1;
  19. sfr P3M0        =   0xB2;

  20. bit flag,dot_Bell=1;//闹钟调时闪烁标志位
  21. unsigned char id=1;
  22. unsigned char disbuff[4]        ={0};
  23. unsigned char time=0;
  24. unsigned int temp[1];
  25. unsigned int temp_num = 0;

  26. unsigned char code LEDData1 [ ] = {  0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff }; //正0-9LED数值
  27. unsigned char code LEDData2 [ ] = {  0xc0,0xcf,0xA4,0x86,0x8B,0x92,0x90,0xc7,0x80,0x82,0xff }; //反0-9LED数值

  28. void Delayms(unsigned int di) //延时
  29. {
  30.         unsigned int da,db;
  31.          for(da=0;da<di;da++)
  32.                    for(db=0;db<10;db++);
  33. }

  34. void Display(void)  //扫描方式led1~led4循环点亮
  35. {
  36.    time++;
  37.    if(time==1)
  38.    {  
  39.                          if(dot_Bell)
  40.                  {
  41.                                  P2=LEDData1[disbuff[0]]&0x7f;// 0x7F点亮DP小数点
  42.                                  LED1=0; LED4=1;
  43.                  }
  44.                          else
  45.                  {
  46.                                  P2=LEDData1[disbuff[0]];
  47.                                  LED1=0; LED4=1;
  48.                  }
  49.    }

  50.    if(time==2)
  51.    {
  52.                                 if(id>=3)
  53.                         {
  54.                          P2=(LEDData2[disbuff[1]])&0x7F;
  55.                                  LED1=1; LED2=0;
  56.                         }
  57.                         else
  58.                                 if(flag)
  59.                          {
  60.                                  P2=(LEDData2[disbuff[1]])&0x7F;
  61.                                  LED1=1; LED2=0;
  62.                          }
  63.                  else
  64.                  {
  65.                          P2=LEDData2[disbuff[1]];
  66.                                  LED1=1; LED2=0;
  67.                  }
  68.    }

  69.    if(time==3)
  70.    {
  71.      if(id>=3)
  72.           {
  73.          P2=LEDData1[disbuff[2]]&0x7f;
  74.          LED2=1; LED3=0;
  75.       }

  76.       else               
  77.       if(flag)
  78.           {
  79.          P2=LEDData1[disbuff[2]]&0x7f;
  80.          LED2=1; LED3=0;
  81.       }
  82.           else
  83.           {
  84.          P2=LEDData1[disbuff[2]];
  85.          LED2=1; LED3=0;
  86.       }
  87.         }
  88.          
  89.    if(time==4)
  90.    {
  91.      time=0;
  92.      if(disbuff[3]==0)
  93.     {
  94.       P2=LEDData1[10];
  95.       LED3=1; LED4=0;
  96.     }
  97.      else
  98.     {
  99.                 P2=LEDData1[disbuff[3]];
  100.         LED3=1; LED4=0;
  101.         }
  102.    }
  103. }



  104. /******************************************************************************/

  105. void Timer1Init(void)                //20毫秒@12.000MHz
  106. {
  107.         AUXR &= 0xBF;                //定时器时钟12T模式
  108.         TMOD &= 0x0F;                //设置定时器模式        
  109.         TL1 = 0xE0;                //设置定时初值
  110.         TH1 = 0xB1;                //设置定时初值
  111.         TF1 = 0;                //清除TF1标志
  112.         TR1 = 1;                //定时器1开始计时        
  113. }

  114. /******************************************************************************/


  115. void Timer1(void) interrupt 3 using 1
  116. {
  117.         temp_num++;
  118.         if(temp_num > 40)
  119.         {
  120.                 temp_num = 0;
  121.         }
  122.         
  123. }

  124. void ADC_convert(void)
  125. {
  126.         ET0 = 0;
  127.         if(temp_num == 0)
  128.         {
  129.                 GetADCResult(6,&temp[0]);
  130.           temp[0]=(unsigned int) ((1/(log(((float)temp[0]*4700/(1024-(float)temp[0]))/10000)/3950+1/298.15)-273.15)*100);
  131.                 temp_num = 1;
  132.         }
  133.                         
  134.         P2 = LEDData1[temp[0]/1000]; //千位
  135.         LED4 = 0;
  136.         Delayms(50);
  137.         LED4 = 1;
  138.         P2 = (LEDData1[temp[0]%1000/100])&0x7F;//百位
  139.         LED3 = 0;
  140.         Delayms(50);
  141.         LED3 = 1;
  142.         P2 = LEDData2[temp[0]%1000%100/10];//十位
  143.         LED2 = 0;
  144.         Delayms(50);
  145.         LED2 = 1;
  146.         P2 = 0xa7;//c
  147.         LED1 = 0;
  148.   Delayms(50);
  149.         LED1 = 1;
  150.         ET1 = 1;//启动定时器1
  151. }

  152. /******************************************************************************/
  153. void main(void)//主函数
  154. {

  155.   P3M1=0x00;
  156.         P3M0=0x08;
  157.         InitADC(); //初始化ADC
  158.         Timer1Init();
  159.         EA=1;
  160.         while(1)//主循环
  161.          {         
  162.                   Display();
  163.              switch( id )
  164.               {
  165.                                         case 1:ADC_convert();break;//显示温度        
  166.                  default:break;        
  167.               }
  168.         }//while
  169. }//main
复制代码

原来的程序.rar

593.54 KB, 下载次数: 21

修改的程序.zip

76.13 KB, 下载次数: 14

回复

使用道具 举报

ID:301191 发表于 2021-12-29 05:13 | 显示全部楼层
顶一下
回复

使用道具 举报

ID:844772 发表于 2021-12-29 08:57 | 显示全部楼层
剔除了时间,那就把 main()里的 Display();删除,ADC_convert();本身就能显示啊。
回复

使用道具 举报

ID:213173 发表于 2021-12-29 09:35 | 显示全部楼层
楼主显示函数写得有点复杂,自己也会看花眼,先简化再加一句消隐即可。 无标题.jpg

  1. #include <reg51.h>
  2. #include <math.h>
  3. #include "ADC.H"
  4. /*
  5. sbit LED1      = P3 ^ 7;//数码管1
  6. sbit LED2      = P3 ^ 6;//数码管2
  7. sbit LED3      = P3 ^ 5;//数码管3
  8. sbit LED4      = P3 ^ 4;//数码管4
  9. */
  10. sfr AUXR        =   0x8E;   //0000,0000 辅助寄存器
  11. sfr P3M1        =   0xB1;
  12. sfr P3M0        =   0xB2;

  13. unsigned char time=0;
  14. unsigned char code LEDData1[ ] = {  0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff }; //正0-9LED数值
  15. unsigned char code LEDData2[ ] = {  0xc0,0xcf,0xa4,0x86,0x8B,0x92,0x90,0xc7,0x80,0x82,0xff }; //反0-9LED数值
  16. unsigned char data disbuff[4];
  17. unsigned int  temp[1];

  18. /******************************************************************************/
  19. void Timer1Init(void)                //2毫秒@12.000MHz
  20. {
  21.         AUXR |= 0x40;                //定时器时钟1T模式
  22.         TMOD &= 0x0F;                //设置定时器模式
  23.         TL1 = 0x40;                //设置定时初始值
  24.         TH1 = 0xA2;                //设置定时初始值
  25.         TF1 = 0;                //清除TF1标志
  26.         TR1 = 1;                //定时器1开始计时
  27. }

  28. void ADC_convert(void)
  29. {
  30.         if(temp_num == 0)
  31.         {
  32.                 GetADCResult(6,&temp[0]);
  33.                 Temp=(unsigned int) ((1/(log(((float)temp[0]*4700/(1024-(float)temp[0]))/10000)/3950+1/298.15)-273.15)*100);
  34.                 temp_num = 1;
  35.         }
  36. }

  37. void Display(void)  //扫描方式led1~led4循环点亮
  38. {
  39.         disbuff[0]=0x70;//.C
  40.         disbuff[1]=LEDData2[temp[0]/10%10];
  41.         disbuff[2]=LEDData1[temp[0]/100%10]&0x7f;
  42.         disbuff[3]=LEDData1[temp[0]/1000%10];

  43.         P3|=0xf0;//消隐
  44.         P2=disbuff[time];//段码
  45.         P3&=~(0x10<<time);//位码

  46.         time=++time%4;
  47. }
  48. /******************************************************************************/
  49. void main(void)//主函数
  50. {
  51.         P3M1=0x00;
  52.         P3M0=0x08;
  53.         InitADC(); //初始化ADC
  54.         Timer1Init();
  55.         while(1)//主循环
  56.         {         
  57.                 if(TF1)//查询T1中断请求标志
  58.                 {
  59.                         TF1=0;//清0 TF1标志
  60.                         ADC_convert()//读取ADC并转换为温度值
  61.                         Display();//动态数码管显示
  62.                 }
  63.         }//while
  64. }//main
复制代码



回复

使用道具 举报

ID:488334 发表于 2021-12-29 10:32 | 显示全部楼层
建议你显示和温度数值处理分开做,显示就做显示,放在一定的时间内例如1ms。main函数里面的while(1ms标志位)循环加一个1ms的标志位,1ms时间够程序跑完的,数码管也可以均匀亮度,如果觉得亮度不够,就改成100us,甚至可以10us放在中断里面显示。
回复

使用道具 举报

ID:17109 发表于 2021-12-29 20:54 来自手机 | 显示全部楼层
wulin 发表于 2021-12-29 09:35
楼主显示函数写得有点复杂,自己也会看花眼,先简化再加一句消隐即可。

师傅你好,可以编译打包发上吗?谢谢
回复

使用道具 举报

ID:883242 发表于 2021-12-29 21:00 | 显示全部楼层
ll13536121668 发表于 2021-12-29 20:54
师傅你好,可以编译打包发上吗?谢谢

按下“复制代码”,然后新建一个空文件,Ctrl-V即可。
回复

使用道具 举报

ID:17109 发表于 2021-12-30 10:56 | 显示全部楼层
wulin 发表于 2021-12-29 09:35
楼主显示函数写得有点复杂,自己也会看花眼,先简化再加一句消隐即可。

我新建试过不知道是否出错 编译不到

师傅你好,可以编译打包发上吗?谢谢
回复

使用道具 举报

ID:298123 发表于 2021-12-30 13:48 | 显示全部楼层
定时器中断去扫描显示,这样就不会被别的打断或者延迟。扫描频率足够就行
回复

使用道具 举报

ID:998586 发表于 2021-12-30 14:15 | 显示全部楼层
增加消隐。一般电子原件都有寄生电容,关闭LED要电平翻转一下。
回复

使用道具 举报

ID:17109 发表于 2022-1-4 14:07 来自手机 | 显示全部楼层
wulin 发表于 2021-12-29 09:35
楼主显示函数写得有点复杂,自己也会看花眼,先简化再加一句消隐即可。

师傅你好,可以编译打包发上吗?谢谢
回复

使用道具 举报

ID:161164 发表于 2022-1-4 15:18 | 显示全部楼层
ll13536121668 发表于 2021-12-30 10:56
我新建试过不知道是否出错 编译不到

师傅你好,可以编译打包发上吗?谢谢

不是人人都有那个"ADC.h"头文挡
编译打包不了

学编程就要学懂看错误信息
把编译器的错误信息贴上来看看
回复

使用道具 举报

ID:123289 发表于 2022-1-4 15:45 | 显示全部楼层
记住:改变显示内容时,让LED全黑就可以了。
回复

使用道具 举报

ID:213173 发表于 2022-1-4 16:02 | 显示全部楼层
ll13536121668 发表于 2022-1-4 14:07
师傅你好,可以编译打包发上吗?谢谢

这段代码只是在你贴的代码基础上改写的,你的ADC_convert(void)函数计算很复杂,我没有验证是否正确。仿真也是屏蔽了ADC_convert(void)函数,定时器更改为51/12T 2ms,虚拟一个4位数的ADC返回值temp=1234,目的只是解决你的特殊用法4位数码管的鬼影问题。代码是随手写的,没有保存。如果你对这个仿真有兴趣可以给你重新写一个。
回复

使用道具 举报

ID:17109 发表于 2022-1-4 21:55 来自手机 | 显示全部楼层
这样就感谢老师傅,编泽打包发上
回复

使用道具 举报

ID:213173 发表于 2022-1-5 08:45 | 显示全部楼层
ll13536121668 发表于 2022-1-4 21:55
这样就感谢老师傅,编泽打包发上

两个文件对比一下很容易看明白,可以用ADC测温函数取代DS18b20函数。

改写前的文件 4位数码管时钟温度表仿真.rar (175.41 KB, 下载次数: 6)
回复

使用道具 举报

ID:17109 发表于 2022-1-11 11:55 来自手机 | 显示全部楼层
wulin 发表于 2022-1-5 08:45
两个文件对比一下很容易看明白,可以用ADC测温函数取代DS18b20函数。

改写前的文件

师傅你好,能用你简化后贴出
的代码,用我的AD.C生成可用程序打包上传吗?谢谢
回复

使用道具 举报

ID:526543 发表于 2022-1-11 13:42 | 显示全部楼层

建议你显示和温度数值处理分开做,显示就做显示,放在一定的时间内例如1ms。main函数里面的while(1ms标志位)循环加一个1ms的标志位,1ms时间够程序跑完的,数码管也可以均匀亮度,如果觉得亮度不够,就改成100us,甚至可以10us放在中断里面显示。
回复

使用道具 举报

ID:17109 发表于 2022-1-12 20:15 来自手机 | 显示全部楼层
123456ZXC1 发表于 2022-1-11 13:42
建议你显示和温度数值处理分开做,显示就做显示,放在一定的时间内例如1ms。main函数里面的while(1ms标 ...


师傅你好,能用你简化后贴出
的代码,用我的AD.C生成可用程序打包上传吗
回复

使用道具 举报

ID:213173 发表于 2022-1-12 22:22 | 显示全部楼层
ll13536121668 发表于 2022-1-11 11:55
师傅你好,能用你简化后贴出
的代码,用我的AD.C生成可用程序打包上传吗?谢谢

给你重新写了一个简化的程序,用的是你的ADC代码。你的温度计算公式的出处是在哪里找来的?没有外围硬件图根本无法判断是否可用。现在是注释掉的,显示函数直接显示ADC转换值,不是温度值。从你的代码不能正确判断MCU型号,简化的程序适用于STC12/STC15系列。
测试程序.rar (12.91 KB, 下载次数: 6)
回复

使用道具 举报

ID:17109 发表于 2022-1-14 21:49 来自手机 | 显示全部楼层
wulin 发表于 2022-1-12 22:22
给你重新写了一个简化的程序,用的是你的ADC代码。你的温度计算公式的出处是在哪里找来的?没有外围硬件 ...

师傅测试了你的程序能显示,不能测温,拍电路你看看是否正确
1642167869754.jpg
回复

使用道具 举报

ID:17109 发表于 2022-1-14 21:52 来自手机 | 显示全部楼层
wulin 发表于 2022-1-12 22:22
给你重新写了一个简化的程序,用的是你的ADC代码。你的温度计算公式的出处是在哪里找来的?没有外围硬件 ...

测试的图片
IMG_20220114_211023.jpg
回复

使用道具 举报

ID:17109 发表于 2022-1-14 21:54 来自手机 | 显示全部楼层
wulin 发表于 2022-1-12 22:22
给你重新写了一个简化的程序,用的是你的ADC代码。你的温度计算公式的出处是在哪里找来的?没有外围硬件 ...

电路图
IMG_20220114_215324.jpg
回复

使用道具 举报

ID:213173 发表于 2022-1-14 22:55 | 显示全部楼层

如果显示的数字能随温度传感器变化就算能检测温度,传感器输出的是电压值变化,需要用合适的计算方法转换成温度值。不知道你这计算方法哪来的? temp[0]=(unsigned int) ((1/(log(((float)temp[0]*4700/(1024-(float)temp[0]))/10000)/3950+1/298.15)-273.15)*100);
回复

使用道具 举报

ID:17109 发表于 2022-1-15 00:45 来自手机 | 显示全部楼层
wulin 发表于 2022-1-14 22:55
如果显示的数字能随温度传感器变化就算能检测温度,传感器输出的是电压值变化,需要用合适的计算方法转换 ...

把这段加入
回复

使用道具 举报

ID:17109 发表于 2022-1-15 00:56 来自手机 | 显示全部楼层
wulin 发表于 2022-1-14 22:55
如果显示的数字能随温度传感器变化就算能检测温度,传感器输出的是电压值变化,需要用合适的计算方法转换 ...

师傅,编写一个合理的程序,带测温的可以吗?
回复

使用道具 举报

ID:213173 发表于 2022-1-15 08:08 | 显示全部楼层
ll13536121668 发表于 2022-1-15 00:56
师傅,编写一个合理的程序,带测温的可以吗?

难道这个不合理?难道这个不能测温?NTC热敏电阻规格众多,B值各不相同,温阻曲线呈非线性,分压电阻需要按测温范围取值。几乎不可能仅凭一个通用公式计算就能制作一款能实用的温度计!
回复

使用道具 举报

ID:17109 发表于 2022-1-15 12:30 来自手机 | 显示全部楼层
wulin 发表于 2022-1-15 08:08
难道这个不合理?难道这个不能测温?NTC热敏电阻规格众多,B值各不相同,温阻曲线呈非线性,分压电阻需要 ...

能显示,但是不能测温
回复

使用道具 举报

ID:17109 发表于 2022-1-15 12:33 来自手机 | 显示全部楼层
wulin 发表于 2022-1-15 08:08
难道这个不合理?难道这个不能测温?NTC热敏电阻规格众多,B值各不相同,温阻曲线呈非线性,分压电阻需要 ...

把注释掉的重新开启就编译不到了
IMG_20220115_121552.jpg
回复

使用道具 举报

ID:17109 发表于 2022-1-15 14:37 来自手机 | 显示全部楼层
wulin 发表于 2022-1-15 08:08
难道这个不合理?难道这个不能测温?NTC热敏电阻规格众多,B值各不相同,温阻曲线呈非线性,分压电阻需要 ...

编译不到
IMG_20220115_121549.jpg
回复

使用道具 举报

ID:213173 发表于 2022-1-15 15:15 | 显示全部楼层

编译不了要问你自己根据什么理由写了这条代码,log是什么玩意?
回复

使用道具 举报

ID:17109 发表于 2022-1-15 16:27 来自手机 | 显示全部楼层
wulin 发表于 2022-1-15 08:08
难道这个不合理?难道这个不能测温?NTC热敏电阻规格众多,B值各不相同,温阻曲线呈非线性,分压电阻需要 ...

把注释掉的重新开启就编译不到了
回复

使用道具 举报

ID:17109 发表于 2022-1-15 21:43 来自手机 | 显示全部楼层
wulin 发表于 2022-1-15 15:15
编译不了要问你自己根据什么理由写了这条代码,log是什么玩意?

师傅,看看要什么修改才能编绎成功,可以上传过来吗?谢谢
回复

使用道具 举报

ID:213173 发表于 2022-1-16 10:45 | 显示全部楼层
ll13536121668 发表于 2022-1-15 21:43
师傅,看看要什么修改才能编绎成功,可以上传过来吗?谢谢

你把这个程序看懂了用NTC测温就成了。
-30~150度数码管温度计(对分查表法).rar (27.25 KB, 下载次数: 16)
回复

使用道具 举报

ID:979299 发表于 2022-1-16 13:23 | 显示全部楼层
用单片机做温度计为什么不用18B20之类的采集呢,用NTC之类的不用单片机也可以做成温度计的
回复

使用道具 举报

ID:17109 发表于 2022-1-18 01:31 来自手机 | 显示全部楼层
兴安xa 发表于 2022-1-16 13:23
用单片机做温度计为什么不用18B20之类的采集呢,用NTC之类的不用单片机也可以做成温度计的

不用单片机的NTC温度计,电路图有吗?上传上来看看
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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