找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1478|回复: 3
收起左侧

在单片机开发板上运行程序,显示的为以下图片,测不出温度,怎么解决呀

[复制链接]
ID:1087557 发表于 2023-7-6 20:36 | 显示全部楼层 |阅读模式

51hei图片_20230706203541.jpg
main.c


#include <smg.h>
#include <ds18b20.h>

void main()
{        
        u8 i=0;
  int temp_value;
        u8 temp_buf[6];

        ds18b20_init();

        while(1)
        {                                
                i++;
                if(i%50==0)
                        temp_value=ds18b20_read_temperture()*10;
                if(temp_value<0)
                {
                        temp_value=-temp_value;
                        temp_buf[0]=0x40;
                }
                else

                temp_buf[2]=gsmg_code[temp_value%1000%100/10];
                temp_buf[3]=gsmg_code[temp_value%1000%100%10];
                smg_display(temp_buf,3);
        }               
}

/***********************************************************************************

ds18b20.c

#include <ds18b20.h>
#include <intrins.h>

void ds18b20_reset(void)
{
        DS18B20_PORT=0;        
        delay_10us(75);        
        DS18B20_PORT=1;        
        delay_10us(2);
}


u8 ds18b20_check(void)
{
        u8 time_temp=0;

        while(DS18B20_PORT&&time_temp<20)        
        {
                time_temp++;
                delay_10us(1);        
        }
        if(time_temp>=20)return 1;
        else time_temp=0;
        while((!DS18B20_PORT)&&time_temp<20)
        {
                time_temp++;
                delay_10us(1);
        }
        if(time_temp>=20)return 1;        
        return 0;
}


u8 ds18b20_read_bit(void)
{
        u8 dat=0;
        
        DS18B20_PORT=0;
        _nop_();_nop_();
        DS18B20_PORT=1;        
        _nop_();_nop_();
        if(DS18B20_PORT)dat=1;
        else dat=0;
        delay_10us(5);
        return dat;
}


u8 ds18b20_read_byte(void)
{
        u8 i=0;
        u8 dat=0;
        u8 temp=0;

        for(i=0;i<8;i++)
        {
                temp=ds18b20_read_bit();
                dat=(temp<<7)|(dat>>1);
        }
        return dat;        
}


void ds18b20_write_byte(u8 dat)
{
        u8 i=0;
        u8 temp=0;

        for(i=0;i<8;i++)
        {
                temp=dat&0x01;
                dat>>=1;
                if(temp)
                {
                        DS18B20_PORT=0;
                        _nop_();_nop_();
                        DS18B20_PORT=1;        
                        delay_10us(6);
                }
                else
                {
                        DS18B20_PORT=0;
                        delay_10us(6);
                        DS18B20_PORT=1;
                        _nop_();_nop_();        
                }        
        }        
}

void ds18b20_start(void)
{
        ds18b20_reset();
        ds18b20_check();
        ds18b20_write_byte(0xcc);
    ds18b20_write_byte(0x44);
}


u8 ds18b20_init(void)
{
        ds18b20_reset();
        return ds18b20_check();        
}


float ds18b20_read_temperture(void)
{
        float temp;
        u8 dath=0;
        u8 datl=0;
        u16 value=0;

        ds18b20_start();
        ds18b20_reset();
        ds18b20_check();
        ds18b20_write_byte(0xcc);
  ds18b20_write_byte(0xbe);

        datl=ds18b20_read_byte();
        dath=ds18b20_read_byte();
        value=(dath<<8)+datl;

        if((value&0xf800)==0xf800)
        {
                value=(value)+1;
                temp=value*(-0.0625);
        }
        else
        {
                temp=value*0.0625;        
        }
        return temp;
}
/***********************************************************************************

smg.c


#include <smg.h>

u8 gsmg_code[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
                                0x7f,0x6f};


void delay_10us(u16 ten_us)
{
        while(ten_us--);        
}
void smg_display(u8 dat[],u8 pos)
{
        u8 i=0;
        u8 pos_temp=pos-1;

        for(i=pos_temp;i<8;i++)
        {
                   switch(i)
                {
                        case 0: LSC=1;LSB=1;LSA=1;break;
                        case 1: LSC=1;LSB=1;LSA=0;break;
                        case 2: LSC=1;LSB=0;LSA=1;break;
                        case 3: LSC=1;LSB=0;LSA=0;break;
                        case 4: LSC=0;LSB=1;LSA=1;break;
                        case 5: LSC=0;LSB=1;LSA=0;break;
                        case 6: LSC=0;LSB=0;LSA=1;break;
                        case 7: LSC=0;LSB=0;LSA=0;break;
                }
                SMG_A_DP_PORT=dat[i-pos_temp];
                delay_10us(100);
                SMG_A_DP_PORT=0x00;
        }
}
回复

使用道具 举报

ID:712097 发表于 2023-7-7 08:09 | 显示全部楼层
你温度传感器接哪里的呀?有没有电路图?
回复

使用道具 举报

ID:1080935 发表于 2023-7-7 08:19 | 显示全部楼层
首先取个位  x%10,取十位 x/10%10,取百位 x/100%10,然后注意if,else的范围,不清楚就全用大括号括起来,另外注意正负号处理。
回复

使用道具 举报

ID:213173 发表于 2023-7-7 11:16 | 显示全部楼层
你自己根据硬件电路核对IO口。 无标题.jpg

  1. #include <reg51.h>
  2. #include <intrins.h>
  3. typedef unsigned char u8;
  4. typedef unsigned int u16;
  5. #define SMG_A_DP_PORT P0

  6. sbit LSC=P2^4;
  7. sbit LSB=P2^3;
  8. sbit LSA=P2^2;
  9. sbit DS18B20_PORT=P3^7;

  10. u8  gsmg_code[17]={0x3f,0x06,0x5b,0x4f,0x66,
  11.                   0x6d,0x7d,0x07,0x7f,0x6f};
  12. u8  temp_buf[8];

  13. u16 temp;
  14. u8  tempH=0;
  15. u8  tempL=0;

  16. void delay_10us(u16 ten_us)//T=ten_us*9+16us
  17. {
  18.         while(ten_us--);        
  19. }

  20. void ds18b20_reset(void)//重置
  21. {
  22.         DS18B20_PORT=1;
  23.         delay_10us(8);
  24.         DS18B20_PORT=0;        
  25.         delay_10us(80);        
  26.         DS18B20_PORT=1;
  27.         delay_10us(30);
  28. }

  29. u8 ds18b20_read_byte(void)//读
  30. {
  31.         u8 i=0;
  32.         u8 dat=0;
  33.        
  34.         for(i=0;i<8;i++)
  35.         {
  36.                 DS18B20_PORT=0;
  37.                 dat>>=1;
  38.                 DS18B20_PORT=1;
  39.                 if(DS18B20_PORT)
  40.                         dat|=0x80;
  41.                 delay_10us(4);
  42.         }
  43.         return dat;        
  44. }


  45. void ds18b20_write_byte(u8 dat)//写
  46. {
  47.         u8 i=0;
  48.         for(i=0;i<8;i++)
  49.         {
  50.                 DS18B20_PORT=0;
  51.                 DS18B20_PORT=dat&0x01;
  52.                 delay_10us(5);
  53.                 DS18B20_PORT=1;
  54.                 dat>>=1;
  55.         }
  56.         delay_10us(4);
  57. }

  58. void ds18b20_start(void)
  59. {
  60.         ds18b20_reset();
  61.         ds18b20_write_byte(0xcc);
  62.         ds18b20_write_byte(0x44);
  63. }


  64. void ds18b20_read(void)
  65. {
  66.         ds18b20_reset();
  67.         ds18b20_write_byte(0xcc);
  68.         ds18b20_write_byte(0xbe);   
  69. }


  70. void ds18b20_read_temperture(void)
  71. {
  72.         static u8 value;
  73.         u8 dath=0;
  74.         u8 datl=0;
  75.         switch(value)
  76.         {
  77.                 case 0: ds18b20_start(); break;

  78.                 //1~4为等待转换完成时间

  79.                 case 5: ds18b20_read();  break;

  80.                 case 6: datl=ds18b20_read_byte();
  81.                                 dath=ds18b20_read_byte();
  82.                                 temp=dath<<8|datl;
  83.                                 tempH=temp>>4;
  84.                                 tempL=(temp&0x0f)*0.625;
  85.                 case 7:
  86.                                 temp_buf[0]=gsmg_code[tempH/100%10];
  87.                                 temp_buf[1]=gsmg_code[tempH/10%10];
  88.                                 temp_buf[2]=gsmg_code[tempH%10]|0x80;
  89.                                 temp_buf[3]=gsmg_code[tempL];
  90.                                 break;
  91.         }               
  92.         value=++value%8;
  93. }

  94. void smg_display()
  95. {
  96.         static i=0;
  97.         SMG_A_DP_PORT=0x00;//消隐       
  98.         switch(i)
  99.         {
  100.                 case 0: LSC=1;LSB=1;LSA=1;break;
  101.                 case 1: LSC=1;LSB=1;LSA=0;break;
  102.                 case 2: LSC=1;LSB=0;LSA=1;break;
  103.                 case 3: LSC=1;LSB=0;LSA=0;break;
  104. /*                case 4: LSC=0;LSB=1;LSA=1;break;
  105.                 case 5: LSC=0;LSB=1;LSA=0;break;
  106.                 case 6: LSC=0;LSB=0;LSA=1;break;
  107.                 case 7: LSC=0;LSB=0;LSA=0;break;*/
  108.         }
  109.         SMG_A_DP_PORT=temp_buf[i];
  110.         i=++i%4;

  111. }

  112. void main()
  113. {
  114.        
  115.         while(1)
  116.         {                                
  117.                 smg_display();
  118.                 ds18b20_read_temperture();
  119.                 delay_10us(100);
  120.         }               
  121. }
复制代码



回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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