/*
  * 123.c 

  * 

  *  Created on: 2013-6-3 

  *      Author: Administrator 

  */ 

 #include<reg52.h> 

 #include <intrins.h> 

 #define uchar unsigned char 

 #define uint unsigned int 

 typedef bit BOOL; 



 sbit DQ = P3 ^ 7; 



 uchar Temp_Value[] = { 0x00, 0x00 }; 

 uchar Display_Digit[] = { 0, 0, 0, 0 }; 



 sbit LCD_RW = P2 ^ 5; //写数据? 

 sbit LCD_RS = P2 ^ 6; 

 sbit LCD_EP = P2 ^ 7; //使能? 

 uchar num; 

 int temper = 0; 

 int CurrentT = 0; 

 bit flag; 



 void delay(uchar t) { 

     while (t--) 

         ; 

 } 

 /* 

  void delay2(uint z) 

  { 

  uint x,y; 

  for(x=z;x>0;x--) 

  for(y=110;y>0;y--){;} 

  } 

  */ 

 void init_ds18b20() { 

     //    uchar n; 

 DQ = 1; 

     _nop_(); 

     DQ = 0; 

     delay(80); 

     _nop_(); 

     DQ = 1; 

     delay(14); 

     _nop_(); 

     _nop_(); 

     _nop_(); 



     if (DQ == 0) 

         flag = 1; //detect 1820 success! 

     else 

         flag = 0; //detect 1820 fail! 

     delay(20); //20 

     _nop_(); 

     _nop_(); 

     DQ = 1; 

 } 



 void write_byte(uchar dat) { 

     uchar i; 

     for (i = 0; i < 8; i++) { 

         DQ = 0; 

         _nop_(); 

         DQ = dat & 0x01; //从最低位开始写 

         delay(3); 

         _nop_(); 

         _nop_(); 

         DQ = 1; 

         dat >>= 1; 

     } 

     //    delay(4); 

 } 



 uchar read_byte() { 

     uchar i, value = 0; 

     for (i = 0; i < 8; i++) { 

         DQ = 0; 

         value >>= 1; 

         DQ = 1; 

         if (DQ) 

             value |= 0x80; 

         delay(2); 

         _nop_(); 

     } 

     return value; 

 } 



 int readtemperature() { 

     uchar templ, temph; 

     //    int temp; 

     init_ds18b20(); 

     write_byte(0xcc); //跳过ROM 

     write_byte(0x44); //启动温度测量 

     delay(300); 



     init_ds18b20(); 

     write_byte(0xcc); 

     write_byte(0xbe); 

     //    Temp_Value[0] = ReadOneByte(); 

     //    Temp_Value[1] = ReadOneByte(); 

     templ = read_byte(); 

     temph = read_byte(); 

     //CurrentT = ((templ&0xf0)>>4) | ((temph&0x07)<<4); 

     CurrentT = temph*256 +templ; 

     CurrentT = CurrentT * 62.5; 

     return CurrentT; 

 } 



 /****************侧忙函数************************/ 

 BOOL lcd_bz() { 

     BOOL result; 

     LCD_RS = 0; 

     LCD_RW = 1; 

     LCD_EP = 1; 

     _nop_(); 

     _nop_(); 

     _nop_(); 

     _nop_(); 

     result = (BOOL) (P0 & 0x80); //检测P0最高位是否为1 

     LCD_EP = 0; 

     return result; 

 } 

 /****************写命令函数************************/ 

 void write_com(uchar cmd) { 

     while (lcd_bz()) 

         ; 

     LCD_RS = 0; 

     LCD_RW = 0; 

     //    LCD_EP = 0; 

     _nop_(); 

     _nop_(); 

     P0 = cmd; 

     _nop_(); 

     _nop_(); 

     _nop_(); 

     _nop_(); 

     LCD_EP = 1; 

     _nop_(); 

     _nop_(); 

     _nop_(); 

     _nop_(); 

     LCD_EP = 0; 

 } 



 void lcd_pos(uchar pos) { 

     write_com(pos | 0x80); 

 } 



 /****************写数据函数************************/ 

 void write_data(uchar dat) { //写入字符显示数据到LCD 

     while (lcd_bz()) 

         ; 

     LCD_RS = 1; 

     LCD_RW = 0; 

     //    LCD_EP = 0; 

     _nop_(); 

     _nop_(); 

     P0 = dat; 

     _nop_(); 

     _nop_(); 

     _nop_(); 

     _nop_(); 

     LCD_EP = 1; 

     _nop_(); 

     _nop_(); 

     _nop_(); 

     _nop_(); 

     LCD_EP = 0; 

 } 



 void init() { 

     //    dula=0; 

     //    wela=0; 

     LCD_EP = 0; 

     write_com(0x38); //16*2显示 

     write_com(0x0e); //开显示;显示光标,光标不闪烁 

     write_com(0x06); //光标自动增加111 

     write_com(0x01); //显示清屏 

     //    write_com(0x80+0x10); 

 } 



 void main() { 

     init(); 

     while (1) { 

         temper = readtemperature(); 

         lcd_pos(0); 

         if (temper < 0) { 

             write_data('-'); 

             temper = 0 - temper; 

         } else 

             write_data('+'); 



         lcd_pos(1); 

         write_data((temper) / 10000 + 0x30); 



         lcd_pos(2); 

         write_data(((temper) % 10000 )/ 1000 + 0x30); 



         lcd_pos(3); 

         write_data('.'); 



         lcd_pos(4); 

         write_data(((temper) % 10000 % 1000 )/ 100 + 0x30); 



         lcd_pos(5); 

         write_data(((temper) %10000 %1000 % 100 )/10 + 0x30); 

         lcd_pos(6); 

         write_data((temper) %10000 %1000 % 100 % 10 + 0x30); 

         lcd_pos(7); 

         write_data(0xdf); 

         lcd_pos(8); 

         write_data('C'); 



     } 



 }