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

📄 18b20_gai.c

📁 基于ATMEL AT89S52与DALLS 18B20的应用程序
💻 C
字号:
#include <reg52.h>
#include <intrins.h>
#define jmp_rom 0xcc
#define tmp_start 0x44
#define tmp_ram_read 0xbe
#define nop _nop_()
#define BUSY 0x80 
#define WRITE_DATA 0xff 
#define delay_data 0xff 
#define COMMAND 0x00 
#define LCD_CLEAR 0x01 
#define portdata P0 
#define secondline 0xc0

unsigned char data ds18b20_read_data[9];
unsigned char data table[32] = "temperature 00.0designed by hwb ";
sbit data_pin = P3^7;
sbit RS = P2^7;
sbit RW = P2^6;
sbit E = P2^5;
sbit LED = P2 ^ 3;
bit zheng_fu_hao;

unsigned char lcd_busy(void) 
{ 
  unsigned char temp; 
  portdata = 0xff; 
  RS = 0; 
  RW = 1; 
  E = 1; 
  temp = portdata; 
  E = 0; 
  return (temp); 
} 

void lcd_command_writedata(unsigned char check,unsigned char dispdata) 
{ 
  if (check == COMMAND) 
  { 
   RS = 0; 
   } 
  else 
  { 
   RS = 1; 
  } 
  RW = 0; 
  portdata = dispdata; 
  E = 1; 
  E = 0; 
  while (lcd_busy() & BUSY); 
} 

void lcd_disp(unsigned char disp_data) 
{ 
  static unsigned char flag = 0; 
   
  if (!flag || disp_data == 255) 
  { 
   lcd_command_writedata(COMMAND,LCD_CLEAR); 
   flag = 0; 
   if (disp_data == 255) 
   { 
    return; 
   } 
  } 
   if (flag == 16) 
   { 
    lcd_command_writedata(COMMAND,secondline); 
   } 
   lcd_command_writedata(WRITE_DATA,disp_data); 
   while (lcd_busy() & BUSY); 
   flag++; 
   if (flag >= 32)  flag = 0; 
}

void lcd_init(void) 
{ 
  lcd_command_writedata(COMMAND,LCD_CLEAR); 
  lcd_command_writedata(COMMAND,0x38); 
  lcd_command_writedata(COMMAND,0x0e); 
  lcd_command_writedata(COMMAND,0x06); 
} 


void ds18b20_delay(unsigned char delay_time)  /*计数一次6us,再加上函数调用和返回所花费的14us时间*/
 {
   while (delay_time--);
 }

void delay_ms(unsigned int ms_delay_time) /*计数一次大约1ms*/
 {
  unsigned char i;

   while (ms_delay_time--)
      {
        for (i = 0; i < 120; i ++)
           {
            }
       }
  }

bit ds18b20_rst(void)
 { 
   bit ack = 1;
   unsigned char loop_time = 10;

   while ((loop_time --) && ack)
    {
     ds18b20_delay(10);
     data_pin = 1;
     nop;
     nop;
     data_pin = 0;
     ds18b20_delay(100);
     data_pin = 1;
     ds18b20_delay(10);
	 ack = data_pin;
	 ds18b20_delay(70);
	 }
	return (ack);
  }


bit ds18b20_read_bit(void)
 {
  bit read_bit;

   data_pin = 0;
   nop;
   nop;
   data_pin = 1;
   nop;
   nop;
   nop;
   nop;
   nop;
   nop;
   nop;
   nop;
   read_bit = data_pin;
   ds18b20_delay(7);
   return (read_bit);
  }

unsigned char ds18b20_read_byte(void)
 {
   unsigned char i;
   unsigned char read_temp = 0;

   for (i = 8; i > 0; i --)
     {
	  if(ds18b20_read_bit())
	   {
	    read_temp = read_temp >> 1;
		read_temp = read_temp | 0x80;
	    }
	  else
	    {
		read_temp = read_temp >> 1;
		 }
	   }
	 return (read_temp);
  }


void ds18b20_write_bit(bit write_data)
 {
   if (write_data)
     { 
	   data_pin = 0;
	   nop;
	   nop;
	   data_pin = 1;
	   ds18b20_delay(10);
       }
	else 
	 {
	   data_pin = 0;
	   ds18b20_delay(10);
	 }
   data_pin = 1;
   nop;
   nop;
  }

void ds18b20_write_byte(unsigned char send_data)
 {
   unsigned char i;
    
   for (i = 0; i < 8; i ++)
    {
	 ds18b20_write_bit((bit)((send_data >> i) & 0x01));
	}
  }

unsigned int ds18b20_read_temperature(void)
 {
  unsigned char i;
  unsigned int temperature;

  zheng_fu_hao = 0;
  if (!ds18b20_rst())
   {
     ds18b20_write_byte(jmp_rom);
	 ds18b20_write_byte(tmp_start);
    }
   delay_ms(1);
   if (!ds18b20_rst())
   {
     ds18b20_write_byte(jmp_rom);
	 ds18b20_write_byte(tmp_ram_read);
	  for (i = 0; i < 9; i ++)
	   {
	    ds18b20_read_data[i] = ds18b20_read_byte();
	   }
	}
   temperature = (ds18b20_read_data[1] << 8) + ds18b20_read_data[0];
   if ((ds18b20_read_data[1] & 0xf8) == 0xf8)
     {
	  temperature = ~ temperature + 1;
	  zheng_fu_hao = 1;
	  }
   return (temperature);
  }

void tmp_disp(void)
 {
    unsigned long temperature_temp;
    unsigned int tem_get;
    unsigned char a,b,c,d;
	unsigned char i;

    tem_get = ds18b20_read_temperature();
    temperature_temp =(unsigned long)((double)(tem_get)*(double)(0.0625) * 10); /*温度计算*/
	lcd_command_writedata(COMMAND,LCD_CLEAR);
	/*if (!zheng_fu_hao)     判断温度正负值,判是否要显示负号
	  {
	    table[11] = 0xfe;
	   }
	else 
	  {
	   lcd_disp(0x83,0x2d);
	   }   */
    a = temperature_temp / 1000;  /*温度百位显示,为0时不显示*/
	if (a != 0x00)
	  {
	    table[11] = a + 0x30;
	    }
	else table[11] = 0xfe;
    b = temperature_temp % 1000 / 100; /*温度十位显示,当百位和十位同时为0时不显示*/
	if (b != 0x00)
	  {
	    table[12] = b + 0x30;
	    }
	else table[12] = 0xfe;
	c = temperature_temp % 1000 % 100 /10;/*温度个位显示,无论其值为何值必须显示*/
    table[13] = c + 0x30;
	d = temperature_temp - a * 1000 - b * 100 - c * 10;
	table[15] = d + 0x30;
	for (i = 0 ; i < 32; i ++)
	  { 
  	   lcd_disp(table[i]);
	    }
	delay_ms(100);
	ds18b20_read_data[1] = 0;
	ds18b20_read_data[0] = 0;
	table[12] = 0x30;
	table[13] = 0x30;
	table[15] = 0x30;

 } 

void system_init(void)
 {
  EA = 0;
  TH0 = 0x00;
  TL0 = 0x00;
  TMOD = 0x01;
  TF0 = 0;
  TR0 = 0;
  ET0 = 1;
  EA = 1;
   }

void main(void)
 {
  delay_ms(10);
  lcd_init();
  system_init();
  LED = 0; 
  TR0 = 1; 
  while (1)
   {
    PCON = 0x01;
    }
  }

void timer_interrupt(void) interrupt 1
 {
    TH0 = 0x00;
	TL0 = 0x00;
	tmp_disp();
	TR0 = 0;
	TR0 = 1;
  }

⌨️ 快捷键说明

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