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

📄 ds130218b20.c

📁 时钟温度
💻 C
📖 第 1 页 / 共 2 页
字号:
#include <reg52.h>              //268384947071 
#include <intrins.h>
#define uchar unsigned char
#define uint  unsigned int


//gloable valuaue

uchar a=0;

//**1602端口
#define databus P0    //lcd数据口
sbit    dc=P2^0;     //寄存器选择,dc=1选数据;dc=0,选指令
sbit    rw=P2^1;    //读写选择,rw=1读;rw=0写
sbit    cs=P2^2;   //使能信号
//**1602端口

/************************************************************/

//**18B20端口
sbit DQ=P2^6; /*18b20操作命令代码   跳过ROM 0xCC  发送温度转换 0xBE  写EEPROM  0x4E*/
uchar  decimalH[]={00,06,12,18,25,31,37,43,50,56,62,68,75,81,87,93};
uchar  decimalL[]={00,25,50,75,00,25,50,75,00,25,50,75,00,25,50,75};
uchar  ResultTemperatureH ,ResultTemperatureLH,ResultTemperatureLL;//整数,小数高位,小数低位
uchar  ResultSignal;//符号位
bit dis_flag;
//**18B20端口

/************************************************************/

//**74165引脚连接
sbit sh_ld=P2^5;
sbit clk_165=P2^4;
sbit in=P2^3;
uchar dd[2];             //按键防止多加
//**74165引脚连接

/************************************************************/

//DS1302引脚连接

sbit T_clk=P1^0;
sbit T_io=P1^1;
sbit T_rst=P1^2;
uchar year_1302,month_1302,day_1302,week_1302,hour_1302,min_1302,sec_1302;
uchar set_year,set_month,set_day,set_week,set_hour,set_min,set_sec;
uchar disp[14];
uchar disp_set[14];
uchar set_flag=0;
uchar set_no=0;
uchar alarm=0;
sbit  p27=P2^7;
                

//DS1302引脚连接

/************************************************************/

/**********lcd1602程序***********/

void lcd_delay5ms()                              //短延时函数
{
 uint i=5552;
 while(i--);
}



void wait_for_en()                          //lcd忙检测函数
{
    databus=0xff;	   
	cs=1;
    dc=0;   			
    rw=1;   			
    _nop_();
    _nop_();
	_nop_();
    while(databus&0x80)
	{  cs=0;
	   _nop_();
	   _nop_();
	   cs=1;
	   _nop_();
	   _nop_();
	}
   	cs=0;
	
}


 void lcd_wrcmd(uchar lcdcmd,uchar attribc)    //lcd写控制字
 {
   if(attribc) wait_for_en();
   dc=0; rw=0; _nop_();
   databus=lcdcmd;  _nop_();
   cs=1;  _nop_(); _nop_();
   cs=0;
 }
  
 void lcd_wrdata(uchar lcddata)               //lcd写一个字节
  {
    wait_for_en();
	dc=1; rw=0;      _nop_();
	databus=lcddata;  _nop_();
	cs=1; _nop_(); _nop_();
	cs=0;
   }

   
 void lcdreset()                              //lcd复位
  {
   lcd_wrcmd(0x38,0);                         //
   lcd_delay5ms();
   lcd_wrcmd(0x38,0);
   lcd_delay5ms();
   lcd_wrcmd(0x38,0);
   lcd_delay5ms();

   lcd_wrcmd(0x38,1);
   lcd_wrcmd(0x08,1);
   lcd_wrcmd(0x01,1);                          //清零
   lcd_wrcmd(0x06,1);
   lcd_wrcmd(0x0c,1);
  }

  void locateXY(uchar posx,uchar posy)          //lcd定位
  {
    posy&=1;
    posx&=15;
    if(posy) posx|=0x40;                     //若y为1(显示第二行),地址码+0X40
    posx|=0x80;                             //指令码为地址码+0X80
    lcd_wrcmd(posx,0);
  }

 void lcd_disonechar(uchar x,uchar y,uchar lcd_data)   //在指定位置显示一个字符
 {
  locateXY(x,y);
  lcd_wrdata(lcd_data);
  }

 
 void lcd_dis_string(uchar x,uchar y,uchar *ptr)      //从指定开始显示字符串
  {
    uchar i,length=0;
	while(ptr[length]!=0) {length++;}
	for(i=0;i<length;i++)
	{
	  lcd_disonechar(x++,y,ptr[i]);
	  if(x==16) 
	   {
	   x=0;y=1;
	   }
     }
   }


/**********lcd1620程序***********/






/**************************18b20程序****************************/

void Delay15(uchar n)
 {  do{ _nop_(); _nop_(); _nop_(); _nop_(); _nop_();
        _nop_(); _nop_(); _nop_(); _nop_(); _nop_();
        _nop_(); _nop_(); _nop_();
        n--;
      }while(n);
  } 


void Delay10ms(uchar delay_num)
{
 uchar i;
 while(delay_num--)
 { 
  for(i=0;i<125;i++)
   {;}
 }
}


unsigned char Read18B20(void)
 { uchar ch;
   uchar q ;
   for(q=0;q<8;q++)
    {
	 ch=ch>>1;
     DQ=0;
     _nop_();
     DQ=1;
     _nop_();_nop_();_nop_();_nop_();
     if(DQ==1)  ch=ch|0x80;
     else     ch=ch&0x7f;
     Delay15(3);
     DQ=1;
    }  
 return (ch);
}
void Write18B20(uchar ch)
 { uchar i;
   for(i=0;i<8;i++)
   { 
    DQ=0;
   Delay15(1);
   DQ=ch&0x01;
   Delay15(3);
   DQ=1;
   ch=ch>>1;
   _nop_();
   }
 }

void Init18B20(void)
 { DQ=0;
   Delay15(33);//至少延时480us
   DQ=1;
   Delay15(10);//至少延时100us
   /*if(DQ==1)  return 0;   //初始化失败
    else  return 1;
   DQ=1; Delay15(18);  */ 
   }

void covert_18b20()
{
  uchar TemH,TemL;//k=0;
  Init18B20();
  Write18B20(0xCC);//跳过ROM
   _nop_();
   //Write18B20(0x4E);//写EEPROM
  // Write18B20(0x00);//Th
   //Write18B20(0x00);//Tl
   Write18B20(0x7f);//12 bits温度分辨率
   Init18B20();

   Write18B20(0xCC);//跳过ROM
   _nop_();


   Write18B20(0x44);//发送温度转换指令
   Delay10ms(25);
   Delay10ms(25);
   Delay10ms(25);
   Delay10ms(25);//等待1s转换

   Init18B20();
   Write18B20(0xCC);//跳过ROM
   Write18B20(0xBE);//发送温度转换指令
   TemL=Read18B20();  //读低位温度值
   TemH=Read18B20();  //读高位温度值                                                         

   Delay10ms(2);
   
  TemH=(TemH<<4)|(TemL>>4);
  TemL=TemL&0x0f;   //取低4位
   if(TemH&0x80)
    {  TemH=~TemH+1;
	   TemH&=0x7f;
	   if(TemL!=0) TemH-=1;
       TemL=~TemL+1;
	   TemL&=0x0f;
       ResultSignal=1;     //负
    }
   else  ResultSignal=0;   //正 

   ResultTemperatureLH=decimalH[TemL];
   ResultTemperatureLL=decimalL[TemL];
   ResultTemperatureH=TemH;

}


void  Display_18b20(void)
{  
    uchar i,j,q;
   
   	
     q=ResultTemperatureH/100;
     i=ResultTemperatureH/10%10;
     j=ResultTemperatureH%10;
  // lcd_dis_string(8,1,"T:");
  
     lcd_dis_string(8,1," ");

 if(ResultSignal)    lcd_disonechar(9,1,'-'); 
 else                lcd_disonechar(9,1,'+');
    
   if(q!=0)  {
               lcd_disonechar(10,1,q|0x30);lcd_disonechar(11,1,i|0x30);
               lcd_disonechar(12,1,j|0x30); lcd_disonechar(13,1,'.');
			   lcd_disonechar(14,1,(ResultTemperatureLH/10)|0x30);
               lcd_disonechar(15,1,(ResultTemperatureLH%10)|0x30);
			   
			 }
   else if(q==0&&i!=0)  { 
                         lcd_disonechar(10,1,i|0x30);lcd_disonechar(11,1,j|0x30);
                         lcd_disonechar(12,1,'.');
					   	lcd_disonechar(13,1,(ResultTemperatureLH/10)|0x30);
                         lcd_disonechar(14,1,(ResultTemperatureLH%10)|0x30);
                         lcd_disonechar(15,1,(ResultTemperatureLL/10)|0x30);
                         }

   else if(q==0&&i==0)  {
                         lcd_disonechar(10,1,j|0x30);
						 lcd_disonechar(11,1,'.');
                         lcd_disonechar(12,1,(ResultTemperatureLH/10)|0x30);                        
                         lcd_disonechar(13,1,(ResultTemperatureLH%10)|0x30);
                         lcd_disonechar(14,1,(ResultTemperatureLL/10)|0x30);
                         lcd_disonechar(15,1,(ResultTemperatureLL%10)|0x30);
						}
   }


/**************************18b20程序****************************/


/******************************************************/


/**************************1302程序****************************/

//-----延时
void delay(uchar n)
{
 uchar i,j;
 for(i=0;i<n;i++)
   for(j=0;j<n;j++);
}

void v_RTinputByte(uchar indata)
{
  uchar i;
  for(i=8;i>0;i--)
   {
    if((indata&0x01)!=0) T_io=1; else T_io=0;
	T_clk=1;T_clk=0;delay(4);
	indata>>=1;
	}
}


uchar v_RToutputByte()
{
 uchar i,da=0;
 for(i=8;i>0;i--)
 {
  if(T_io!=0)  da=da|0x80;
  else         da=da|0x00;
  if(i>1) da>>=1;
  T_clk=1;T_clk=0;delay(4);
 }
  return (da);
}

//-----读1302某个地址的数据---------

⌨️ 快捷键说明

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