⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ds1820_show.c

📁 18b20四位小数温度显示,18b20四位小数温度显示
💻 C
字号:
/**********************************************************
*采用DS1820+1602精确到4位小数的温度计
*编程:沈阳
*版本:V1.0
*DS1820设置为12位精度
**********************************************************/
#include <reg52.h>
#include "temp.h" 
sbit RW =P1^1;//定义引脚
sbit RS= P1^0;
sbit E= P1^2;
sbit light= P1^3;
//声明外部温度读数数组
extern unsigned char data temperature[2];
//存放分解的7个ASCII码温度数据  
unsigned char temp[7];
unsigned char code string[16]={"TEMP: 28.5\'c"};
unsigned char code DispStr[16]={"SN:12345678"};
unsigned char fCode[8]; //存放序列号,CRC 
/**********************************************************
*主程序
**********************************************************/
void main()
{
 unsigned char i;
 delayms(255);//等待电源稳定,液晶复位完成
 DS1820_Reset();//DS1820复位
 DS1820_WriteData(0x33);//读ROM指令
 for (i=0;i<8;i++)
  {//读取64位系列号
  fCode[i] = DS1820_ReadData();
  }
 DS1820_Reset();//DS1820复位
 delayms(250);
 delayms(250);
 LCDInit();  			//1602液晶初始化
 delayms(10);
 SetLight(1);
 DisplayStr(0,0,string);//显示"温度:"
 delayms(1);
 DisplayStr(0,1,DispStr);//显示"系列号"
 delayms(50);
 DispCode();
 RW=1;
 RS=1;
 light=0;
 //当1602的E和DB18B20共用一个端口时 必须使用以上两条语句隔离
 //当EW,RS,E=1时 1602为读数据 当E=0时 不会改变1602的数据 这样可以使1602的E和DB18B20可以共用
 do{
  read_temp(); //读取温度值
  delayms(50);
  display();  //显示温度值
  delayms(50);
  RW=1;
  RS=1;
 //当1602的E和DB18B20共用一个端口时 必须使用以上两条语句隔离
 //当EW,RS,E=1时 1602为读数据 当E=0时 不会改变1602的数据 这样可以使1602的E和DB18B20可以共用
  delayms(1);
  }while (1); //无限循环
}
/**********************************************************
*系列号显示子程序
*显示顺序(从左到右)8位CRC编码->48位序列号->8位产品系列编码
**********************************************************/
void DispCode()
{
 unsigned char i,temp;
 for (i=8;i>0;i--)
  {
 //显示高4位
 temp = fCode[i-1]>>4;
  if (temp<10) //ASCII码转换
      DisplayChar(3+8-i,1,temp += 0x30);
  else
      DisplayChar(3+8-i,1,temp += 0x37);
 //显示低4位
  temp = fCode[i-1]&0x0f;
  if (temp<10) //ASCII码转换
      DisplayChar(4+8-i,1,temp += 0x30);
  else
      DisplayChar(4+8-i,1,temp += 0x37);
	  i--;
  }
}
/**********************************************************
*转换显示子程序
**********************************************************/
void display()
{
 unsigned char temp_data,temp_data_2;
 unsigned int TempDec; //用来存放4位小数
 temp_data = temperature[1];
 temp_data &= 0xf0;  //取高4位
 if (temp_data==0xf0) //判断是正温度还是负温度读数
  {
 //负温度读数求补,取反加1,判断低8位是否有进位
  if (temperature[0]==0)
   { //有进位,高8位取反加1
     temperature[0]=~temperature[0]+1;
    temperature[1]=~temperature[1]+1;
   }
  else
   { //没进位,高8位不加1
    temperature[0]=~temperature[0]+1;
    temperature[1]=~temperature[1];
   }
  }
 temp_data = temperature[1]<<4;  //取高字节低4位(温度读数高4位)
 temp_data_2 = temperature[0]>>4; //取低字节高4位(温度读数低4位)
 temp_data = temp_data|temp_data_2; //组合成完整数据
 temp[0] = temp_data/100+0x30;   //取百位转换为ASCII码
 temp[1] = (temp_data%100)/10+0x30;  //取十位转换为ASCII码
 temp[2] = (temp_data%100)%10+0x30;  //取个位转换为ASCII码
 temperature[0]&=0x0f;     //取小数位转换为ASCII码
 TempDec = ((temperature[0]&0x0f)*0.0625)*10000;//小数部分,扩大1万倍
 temp[3] = TempDec/1000+0x30;   //取小数个位转换为ASCII码
 temp[4] = (TempDec%1000)/100+0x30;  //取小数十位转换为ASCII码
 temp[5] = ((TempDec%1000)%100)/10+0x30;//取小数百位转换为ASCII码
 temp[6] = ((TempDec%1000)%100)%10+0x30;//取小数千位转换为ASCII码
if(temp[0]==0x30) DisplayChar(5,0,' ');//百位
else DisplayChar(5,0,temp[0]);//百位
DisplayChar(6,0,temp[1]);//十位
DisplayChar(7,0,temp[2]);//个位
DisplayChar(8,0,0x2e);//小数点 .
DisplayChar(9,0,temp[3]);
DisplayChar(10,0,temp[4]);
DisplayChar(11,0,temp[5]);
DisplayChar(12,0,temp[6]);
DisplayChar(13,0,'\'');//显示'
DisplayChar(14,0,'C');
}



 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -