打印

怎么把程序中每0.5变化的小数点改成0.1

[复制链接]
1324|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
xin946|  楼主 | 2017-11-1 09:29 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#include<reg51.h>
#define uint unsigned int
#define uchar unsigned char

uchar code lednum[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40};//数码管字0~9
uint  temp;
uchar g,s,b,q;          //个十百千位
//uchar data disdata[5];
uint  Tvalue;     //温度值
uchar Tflag;      //温度正负标志



sbit P34=P3^4;
sbit P35=P3^5;
sbit P36=P3^6;
sbit  DQ=P3^7;//ds18b20与单片机连接口
sbit P17=P1^7;
sbit P24=P2^4;

/*****************延时函数********************/
void delay(uint x)
{  uchar k;
   while(x--)
   for(k=0;k<200;k++) ;
}
/*****************数码管扫描********************/                                          
void ledscan(void)
{   uchar k;
    for(k=0;k<150;k++)
        {                 //显示DS18B20  小数点一位,含负温度显示
                  P1=lednum[g];P2=0x0e;delay(1);P1=0x00;
        P1=lednum[s];P17=1;P2=0x0d;delay(1);P1=0x00;
            P1=lednum[b];P2=0x0b;delay(1);P1=0x00;
            P1=lednum[q];P2=0x07;delay(1);P1=0x00;
         }
}

/******************************DS18B20程序(定义开始)***************************************/
void delay_18B20(unsigned int i)//延时2微秒
{
        while(i--);
}
/*****************ds1820复位****************/
void DS18B20_RST()         
{  unsigned char x=0;
         DQ = 1;           //DQ复位
         delay_18B20(8);   //延时
         DQ = 0;           //DQ拉低
         delay_18B20(80); //精确延时大于480us
         DQ = 1;           //拉高
         delay_18B20(14);
         x=DQ;
         delay_18B20(20);         
   }  
/*****************读数据*******************/  
uchar DS18B20_RD()        
  {  unsigned char i=0;
         unsigned char R_data= 0;
         for (i=8;i>0;i--)
         {    DQ = 0;      //给脉冲信号
                  R_data>>=1;  //
                  DQ = 1;      //给脉冲信号
                  if(DQ)
                  R_data|=0x80;
                  delay_18B20(4);
         }
        return(R_data);
  }
/*******************写数据*******************/
  void DS18B20_WR(uchar W_data)
  {  
     unsigned char i=0;
     for (i=8; i>0; i--)
    {  DQ = 0;
       DQ = W_data&0x01;
       delay_18B20(5);
       DQ = 1;
       W_data>>=1;                //
    }
         delay_18B20(4);
}
/****************读取温度值并转换***************/
read_temp()
{  uchar a,b;
    DS18B20_RST();   
    DS18B20_WR(0xcc);  //*跳过读序列号*/
    DS18B20_WR(0x44);  //*启动温度转换*/
    DS18B20_RST();   
    DS18B20_WR(0xcc);  //*跳过读序列号*/
    DS18B20_WR(0xbe);  //*读取温度*/
    a=DS18B20_RD();
    b=DS18B20_RD();
    Tvalue=b;
    Tvalue<<=8;                  //
    Tvalue=Tvalue|a;
    if(Tvalue<0x0fff)
    Tflag=0;
    else
   {
      Tvalue=~Tvalue+1;
      Tflag=1;
    }
      Tvalue=Tvalue*(0.625);//温度值扩大10倍,精确到1位小数
        return(Tvalue);
  }
  /****************温度值显示***************/
void DS1820disp()
{
          b=Tvalue/100%10;//十位数
          s=Tvalue/10%10;  //个位数
          g=Tvalue%10;      //小数位
   
     if(Tflag==0)
             q=Tvalue/1000;    //正温度不显示符号,显示百位数
     else
         q=10;//负温度显示负号:-



   }
/******************************DS18B20程序(定义结束)***************************************/

/*****************主函数********************/
void main()
{   
                           
        while(1)
         {
                  read_temp();
                  DS1820disp();
          ledscan();
        
          }
}

相关帖子

沙发
混子黄| | 2017-11-2 14:14 | 只看该作者
Tvalue=Tvalue*(0.625);//温度值扩大10倍,精确到1位小数
在这之后Tvalue=Tvalue*10+0.5;
应该可以

使用特权

评论回复
板凳
airwill| | 2017-11-7 22:09 | 只看该作者
楼上的办法很好啊, 其实未必一定用用浮点数去处理带小数的数字.
你可以改变单位, 比如让整数的单位是 0.1℃.

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

1

帖子

0

粉丝