找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索

求大神修改单片机数字温度计程序

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

正文摘要:

小白制作个数字温度计,4位共阳数码管,位选p0.1 2 3 4,段选p2,ds18b20测温,接p3.7,用下面程序运行后第二三四位数码管显示正确,就是第一位数码管显示不对,求大神修改#include"reg51.h" #define uchar uns ...

回复

ID:7485 发表于 2016-6-19 09:35
按下面试一试(省略号的内容自己加上):
P2=table[temp/100];  //显示百位                 
         delay1(5);
         wx1=1;
         wx2=0;
P2=table[temp%100/10];  //显示十位                 
        ......
        ......
P2=table[temp%10];  //显示个位  
       ......
       ......
P2=table[temp/10]+0x80;      /加上0x80就显示小数点了。
ID:71099 发表于 2016-6-18 17:15
461534727 发表于 2016-6-18 15:10
我的电路没用锁存,就用了pnp驱动三极管而已

我的只有接电阻,芯片为STC12C5204,设置为推挽输出
ID:125878 发表于 2016-6-18 15:10
geminiguy_07 发表于 2016-6-18 14:06
那可能是我俩的硬件电路不一样
我的是单片机直接接数码管,不用连锁存器

我的电路没用锁存,就用了pnp驱动三极管而已
ID:71099 发表于 2016-6-18 14:06
461534727 发表于 2016-6-18 13:24
void wenduxianshi(unsigned int temp)
{
         unsigned char buf[4];

那可能是我俩的硬件电路不一样
我的是单片机直接接数码管,不用连锁存器
ID:125878 发表于 2016-6-18 13:24
geminiguy_07 发表于 2016-6-18 10:47
显示程序试一试换成这样
void wenduxianshi(unsigned int data)
{

void wenduxianshi(unsigned int temp)
{
         unsigned char buf[4];
         unsigned char i;
         for(i=0;i<4;i++)                //i=0        个位
        {
                 buf = temp % 10;
                 temp /= 10;
         }
         if(buf[3] == 0)
       {
                 if(buf[2] == 0)
                   {
                         if(buf[1] == 0)
                           {
                                 wx1=0;
                                 P2=table[buf[0]];
                                 delay1(8);  
                    }
                         else
                           {
                                 wx2=0;
                                 P2=table[buf[1]];
                                 delay1(4);

                                 wx1=0;
                                 P2=table[buf[0]];
                                 delay1(4);   
                           }
                         }
                 else
                   {
                         wx3=0;
                         P2=table[buf[2]];
                         delay1(2);

                         wx2=0;
                         P2=table[buf[1]];
                         delay1(4);

                         wx1=0;
                         P2=table[buf[0]];
                         delay1(4);   
               }
        }
         else
         {
                 wx4=0;
                 P2=table[buf[3]];
                 delay1(2);

                 wx3=0;
                 P2=table[buf[2]];
                 delay1(2);

                 wx2=0;
                 P2=table[buf[1]];
                 delay1(4);

                 wx1=0;
                 P2=table[buf[0]];
                 delay1(4);  
         }
}

改成这样后,显示全都不正确了
ID:125878 发表于 2016-6-18 12:46
ahshmj 发表于 2016-6-18 11:40
楼主给出的程序一共就三位,十位个位和小数。就没有百位。

另外,你的小数的显示为什么要取余?“P2=tab ...

那显示函数应该怎么更改呀
ID:7485 发表于 2016-6-18 11:40
楼主给出的程序一共就三位,十位个位和小数。就没有百位。

另外,你的小数的显示为什么要取余?“P2=table[xs%10];      //显示个位而不是除以10?(这样,其实显示的是小数的百分位,不是十分位,更不是个位

其他的没有仔细看。估计也有些小问题。
ID:71099 发表于 2016-6-18 10:47
显示程序试一试换成这样
void wenduxianshi(unsigned int data)
{
        unsigned char buf[4];
        unsigned char i;
        for(i=0;i<4;i++)                //i=0        个位
        {
                buf[i] = data % 10;
                data /= 10;
        }
        if(buf[3] == 0)
      {
                if(buf[2] == 0)
                  {
                        if(buf[1] == 0)
                          {
                                wx1=1;
                                P2=table[buf[0]];
                                delay1ms(8);  
                   }
                        else
                          {
                                wx2=1;
                                P2=table[buf[1]];
                                delay1ms(4);

                                wx1=1;
                                P2=table[buf[0]];
                                delay1ms(4);   
                          }
                        }
                else
                  {
                        wx3=1;
                        P2=table[buf[2]];
                        delay1ms(2);

                        wx2=1;
                        P2=table[buf[1]];
                        delay1ms(4);

                        wx1=1;
                        P2=table[buf[0]];
                        delay1ms(4);   
              }
       }
        else
        {
                wx4=1
                P2=table[buf[3]];
                delay1ms(2);

                wx3=1;
                P2=table[buf[2]];
                delay1ms(2);

                wx2=1;
                P2=table[buf[1]];
                delay1ms(4);

                wx1=1;
                P2=table[buf[0]];
                delay1ms(4);  
        }
}
注:根据需要适当修改一下
ID:111634 发表于 2016-6-18 07:53
该案例程序包括2部分:测温和显示。显示电路不一定采用上述电路。读别人的程序用于参考,吸收自己有用的部分,然后改写。这样才会有帮助和提高。
ID:125878 发表于 2016-6-17 23:15

可是我的原理图没用锁存芯片,就用pnp驱动数码管而已
ID:111634 发表于 2016-6-17 19:41
本帖最后由 zl2168 于 2016-6-17 19:42 编辑

DS18B20 测温


Proteus仿真一下,确认有效。
实例97 DS18B20测温.rar (51.78 KB, 下载次数: 11)



以上摘自张志良编著《单片机实验实训100例》 ISBN 978-7-5124-1603-1,北航社出版

书中电路和程序设计有详细说明,程序语句条条有注解。


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

Powered by 单片机教程网

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