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

📄 18b20.c

📁 用18b20测的实际温度
💻 C
字号:

//-----------------------函数声明,变量定义--------------------------------------------------------
#include <reg52.h>
#include <intrins.h>
                       

#define uchar unsigned char
#define uint  unsigned int
sbit DQ=P3^2;   
sbit rs = P2^0;
sbit rw = P2^1;
sbit en = P2^2;
sbit psb = P2^3;
sbit ret = P2^5;
uchar  command,data1,data2;
uchar  com0;
uchar  lcd_buf1,lcd_buf2;
uchar yy1,yy2,yy3,yy4,yy5;
uchar code table[]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,//0--9
                    0x3a,0x2e,0x60,0x43,0x21};
					//: //.   //	 //C //!
void lcd_int();	//液晶初始化

void lcd_set();	//液晶复位
void display();	 //显示程序
void write_command(uchar command);	 //写指令
void write_data(uchar data0);		 //写数据
void clear_lcd();	
void dsiplay1();
//延时子程序
void delay(uint k)
{
     while(k--);
    
}
//
//18b20复位
void b20_reset(void)
{
  uchar presence=0;
  DQ=1;
  delay(8);
  DQ = 0;        //拉低总线
  delay(100);    // 保持 480us
  DQ = 1;       // 释放总线
  delay(14);     // 等待回复
  presence = DQ; // 读取信号
  delay(20);    // 等待结束信号
}     

//从 1-wire 总线上读取一个字节
uchar read_byte(void)
{

  uchar i;
  uchar value=0;
  for (i=8;i>0;i--)
  {
    DQ = 0;
	value>>=1; 
    DQ = 1;  
    if(DQ)
	value|=0x80;
    delay(4); 
  }
  return(value);
}

//向 1-WIRE 总线上写一个字节
void write_byte(char val)
{
  uchar i;
  for (i=8; i>0; i--) // 一次写一位
  {
    DQ = 0; // 
    DQ = val&0x01;
    delay(5); // 
    DQ = 1;
    val=val>>1;
  }
  delay(4);
}
//读取和显示温度
void Read_Temperature(void)
  {
	float z,m;
    uint h,tt,j;
	uint c[2];   
   b20_reset();	  //18b20复位
  write_byte(0xCC); // Skip ROM
  write_byte(0x44); // 转换温度
   b20_reset();	   //18b20再次复位
  write_byte(0xCC); //Skip ROM
  write_byte(0xbe); // 读取寄存器
  c[1]=read_byte();//读出温度低8位
  c[0]=read_byte();//读出温度高8位
  j=c[0];
  j<<=8;
  j=j|c[1];
  z=j*0.0625;	//温度之和
  h=z;		  //得高位温度值
  yy1=h/10;//显示温度十位数
  yy2=h%10;//显示温度个位数
  yy3=11;//小数点
  m=z-h;    //得小数部分
  m=m*100;  //乘以100的并没有得到整数
  tt=m;		   //再次取整
  yy4=tt/10;   //显示温度十分位
  yy5=tt%10;	//显示百分位
}
// 液晶复位
void lcd_int(void)
{
 ret=0;
 delay(1200);	 //
 ret=1;
 _nop_();
 psb=1;
 _nop_();
}
//液晶初始化
void lcd_set(void)
{
 command=0x34;			   //扩充指令
 write_command(command);
 command=0x30;			   //基本指令
 write_command(command);
 command=0x01;			  //清屏
 write_command(command);
 command=0x06;			  //DDRM的地址计数器(AC)加一
 write_command(command);
 command=0x0c;			  //光标反白,显示打开
 write_command(command);
}
///	写指令
void write_command(uchar command)
{
 delay(10000);
 rs=0;
 rw=0;
 P0=command;
 en=1;
 _nop_();
 _nop_();
 en=0;
}
//写数据
void write_data(uchar dat)
{
 delay(10000);
 rs=1;
 rw=0;
 P0=dat;
 en=1;
 _nop_();
 _nop_();
 en=0;
}
//显示
void display(void)
{ 
  write_command(0x92);
  write_data(table[yy1]);			 //	  后送高位   显示温度的十位             
  write_data(table[yy2]);			 //  先送低位  显示温度的个位  
  
  write_data(table[yy3]);		  //    显示小数点                
  write_data(table[yy4]);		  //    显示温度的十分位          

  write_data(table[yy5]);		 //    显示温度的百分位          
  write_data(table[12]);		      //   显示 °        
  
  write_data(table[13]);		//  显示C
  write_data(table[14]);		//  显示!
}

void display1()
{
  write_command(0x82);
  write_data(0xBD);  //今
  write_data(0xF1);
  write_data(0xCC); //天
  write_data(0xEC);
  write_data(0xC6); //气 
  write_data(0xF8);
  write_data(0xCE); //温
  write_data(0xC2);
}			
	 
//--------------------------------------------------------------------------------------------------
// 函数名称: main
// 函数功能: 主函数
//--------------------------------------------------------------------------------------------------
void main(void)
{
 lcd_int();
 lcd_set();
 while(1)
 {
  Read_Temperature();
	 display1();
  	 display();	
	 
 }
}


/*******************清屏程序*********************/
/*
void clear_lcd(void)
{
 write_command(0x01);
 write_command(0x34);
 write_command(0x30);
}	*/

⌨️ 快捷键说明

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