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

📄 fyd.c

📁 基于51系列单片机以DS18B20为温度传感器的数字温度计
💻 C
字号:
#include<reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint   unsigned int

sbit CS  = P2^0;//指令数据控制端
sbit SID = P2^1;//R/W读写控制端
sbit CLK = P2^2;//使能端

//sbit DQ  = P3^7;//DS18B20数据总线
sbit DQ    = P3^0;//DS18B20数据总线
sbit buzzer= P1^5;//报警器接口
sbit set   = P2^3;//时间调整键
sbit ret   = P2^4;//定时按键
sbit add   = P2^5;//加一键
sbit dec   = P2^6;//减一键 
sbit led1  = P1^2;//指示灯

uchar ms50=0,second=0,minite=0,hour=12;//实际时间存放变量 
uchar hh  =0,ff=0,KT=0;//设定时间变量
uint tvalue;//温度值
bit tflag;//温度正负标志
uint n=0;
uchar T[8]={0x3a,0,0,0,0,0x2e,0,0x43};//温度存放缓冲区
uchar sheding[8]={0x3a,0,0,0x3a,0,0,0x20,0x20};//设定时间存放数组
/*************************************************************************************************/

/*****************************初始化子程序******************************/
uchar  code huanyinghuamian[]={"欢迎来到诚信院@"};
uchar  code word[]            ={"时钟温度显示系统"};
uchar  code guanggao[]        ={"嵌入式爱好者协会"};
uchar  code tegong[]          ={"嵌协特工队制作!!"};
//uchar  code huanyinghuamian2[]={"Welcome to here!"};
//uchar  code huanyinghuamian3[]={"We'll be friend!"};
/***********************************************************************/
uchar  code numble[16]={"当前时间       "};
uchar  code name[16]  ={"当前温度       "};
//uchar  code zhifu[]={"女人只能呵护与爱"};
uchar  code zhifu[]   ={"设定时间      "};
/************************温度测试模块***********************/
/***********ds18b20延迟子函数(晶振12MHz )*******/ 

/******************************ds1820程序***************************************/
void delay_18B20(unsigned int i)//延时1微秒
{
   while(i--);
}


void ds1820rst()/*ds1820复位*/
{ unsigned char x=0;
DQ = 1;          //DQ复位
delay_18B20(4); //延时
DQ = 0;          //DQ拉低
delay_18B20(100); //精确延时大于480us
DQ = 1;          //拉高
delay_18B20(40); 
 } 


uchar ds1820rd()/*读数据*/
{ unsigned char i=0;
  unsigned char dat = 0;
  for (i=8;i>0;i--)
  {   DQ = 0; //给脉冲信号
      dat>>=1;
      DQ = 1; //给脉冲信号
      if(DQ)
      dat|=0x80;
      delay_18B20(10);
  }
   return(dat);
}


void ds1820wr(uchar wdata)/*写数据*/
{
  unsigned char i=0;
    for (i=8; i>0; i--)
    { DQ = 0;
      DQ = wdata&0x01;
      delay_18B20(10);
      DQ = 1;
      wdata>>=1;
    }
}



read_temp()/*读取温度值并转换*/
{
   uchar a,b;
   ds1820rst();    
   ds1820wr(0xcc);//*跳过读序列号*/
   ds1820wr(0x44);//*启动温度转换*/
   ds1820rst();    
   ds1820wr(0xcc);//*跳过读序列号*/ 
   ds1820wr(0xbe);//*读取温度*/ 
   a=ds1820rd();
   b=ds1820rd();
   tvalue=b;
   tvalue<<=8;
   tvalue=tvalue|a;
   if(tvalue<0x0fff)
      tflag=0;
   else
     {tvalue=~tvalue+1;
      tflag=1;}

   tvalue=tvalue*(0.625);//温度值扩大10倍,精确到1位小数
   return(tvalue);
}
/*****************************************************************/
/***************************液晶显示模块**************************/
/*****************************延时子程序**************************/
void delay( uint t )
{
  uint i;
  while( t-- )
    for(i=0;i<120;i++);      
}

/*****************************写液晶子程序******************************/
/************************************************************************
说明:word:要写的内容 dat:1为数据 0为指令
*************************************************************************/
void Writelcd(uchar word,uchar dat)
{
    uchar lcddat[3];
    uchar i,j,k;
    lcddat[0] = ( 0xf8+(dat<<1) );//第一个字节
    lcddat[1] = ( word&0xf0 ) ;     //第二个字节 内容的高四位+0000
    lcddat[2] = ( (word<<4)&0xf0 ) ;//第三个字节 内容的第四位+0000
    CS  = 0;
    CS  = 1;
    CLK = 0;
    for(i=0;i<3;i++)
    {
        j = lcddat[i];
        for(k=0;k<8;k++)
        {
            if( (j<<k)&0x80 )
                 SID = 1;        
            else             
                 SID = 0;            
            /**时钟下降沿写入数据**/
            CLK = 1;
            CLK = 0; 
        }
    }    
} 

void Serial_int(void)
{    
    CS  =1;
    SID =0;
    CLK =0; 
    Writelcd( 0x30,0 );//功能设置,一次送8位数据,基本指令集
 //   delay( 50 );
    Writelcd( 0x30,0 );//功能设置,一次送8位数据,基本指令集
 //   delay( 40 );
    Writelcd( 0x0c,0 );//0000,1100  整体显示,游标off,游标位置off
//    delay( 50 );
    Writelcd( 0x01,0 );//0000,0001 清DDRAM
 //   delay( 10000 );
    Writelcd( 0x02,0 );//0000,0010 DDRAM地址归位
//    delay( 50 );

//  delay( 50 );
    Writelcd( 0x80,0 );//1000,0000 设定DDRAM 7位地址000,0000到地址计数器AC//        
//    delay( 150 );
    Writelcd( 0x06,0 );    
}

/***********************按键处理程序模块****************************/
void key_set()
{
  if(set==0)
  {
   delay(10);
    if(set==0)
	n++;
	if(n>=6)
	n=0;
  }
  while(set==0);
  if((n>=1)&&(n<=5))
   KT=1;
  else
   KT=0;
}


void key_ret()
{
  if(ret==0)
  {
  hh=0;
  ff=0;
  //ss=0;
  }
  while(ret==0);
}

void key_add()
{
  if(add==0)
  {
   delay(10);
   switch(n)
   {
    //case 0:break;
    case 1:hour++;if(hour>=24)hour=0;break;
    case 2:minite++;if(minite>=60)minite=0;break;
    case 3:second++;if(second>=60)second=0;break;
	case 4:hh++;if(hh>=24)hh=0;break;
	case 5:ff++;if(ff>=60)ff=0;break;
	//case 6:ss++;if(ss>=60)ss=0;break;
    default:break;
   }
  }
  while(add==0);
}

void key_dec()
{
  if(dec==0)
  {
   delay(10);
   switch(n)
   {
    //case 0:break;
    case 1:hour--;  if(hour<=0)  hour=23;break;
    case 2:minite--;if(minite<=0)minite=59;break;
    case 3:second--;if(second<=0)second=59;break;
	case 4:hh--;  if(hh<=0)  hh=23;break;
    case 5:ff--;if(ff<=0)    ff=59;break;
    //case 6:ss--;if(ss<=0)    ss=59;break;
    default:break;
   }
  }
  while(dec==0);
}

void key_scan()
{
 if(set==0) 
    {
	  delay(10);
	  if(set==0)
      key_set();
	 }
 else if(ret==0)
    {
	  delay(10);
	  if(ret==0)
      key_ret(); 
	}
 else if(add==0)
 	{
	 delay(10);
	 if(add==0)
	 key_add();
	}
 else           
 {
  delay(10);
  if(dec==0) 
  key_dec();
 }
}
/*******************************************************************/

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

/*******************************显示函数*******************************/
 void display(void)
{
  uint i;
 T[2]=tvalue/1000+0x30;   T[3]=tvalue%1000/100+0x30;
 T[4]=tvalue%100/10+0x30; T[6]=tvalue%10+0x30;

 sheding[1]=hh/10+0x30;	  sheding[2]=hh%10+0x30;
 sheding[4]=ff/10+0x30;   sheding[5]=ff%10+0x30;
     
      if(tflag==0)
       T[1]=0x20;//正温度不显示符号
     else
       T[1]=0x2d;//负温度显示负号:-

     if(T[2]==0x30)
      {
        T[2]=0x20;//如果百位为0,不显示
       if(T[3]==0x30)
        {
          T[3]=0x20;//如果百位为0,十位为0也不显示
         }
      }

	  if(KT==0)
	   sheding[7]=0x01;
	  else
	    sheding[7]=0x1d;
   Writelcd( 0x8c,0 );
   for(i=0;i<8;i++)
   {
    Writelcd( T[i],1 );
   }
   
   Writelcd( 0x94,0 );   //时显示
   {
    Writelcd( (hour/10)+0x30,1 );
    Writelcd( (hour%10)+0x30,1 );
   }

      Writelcd( 0x95,0 );// 冒号和分十位
   {
    Writelcd( 0x3a,1 );
    Writelcd( (minite/10)+0x30,1 );
   }

      Writelcd( 0x96,0 ); //分个位和冒号
   {
    Writelcd( (minite%10)+0x30,1 );
    Writelcd( 0x3a,1 );
   }

      Writelcd( 0x97,0 );//秒显示
   {
    Writelcd( (second/10)+0x30,1 );
    Writelcd( (second%10)+0x30,1 );
   }

   Writelcd( 0x9c,0 );
   for(i=0;i<8;i++)
   {
    Writelcd( sheding[i],1 );
   }

}

/***************************************************************/
 void initdisplay(void)               //开机画面
{ unsigned char xxx=2,i;
  for(;xxx>0;xxx--)
  {     
    Writelcd( 0x80,0 );
    for(i=0;i<16;i++)
    Writelcd( huanyinghuamian[i],1 );   //开机画面
   
    Writelcd( 0x90,0 );  //说明:word:要写的内容 dat:1为数据 0为指令
    for(i=0;i<16;i++)
    Writelcd( word[i],1 );


    Writelcd( 0x88,0 );
    for(i=0;i<16;i++)
    Writelcd( guanggao[i],1 );
            		
        	
    Writelcd( 0x98,0 );
    for(i=0;i<16;i++)
    Writelcd( tegong[i],1 );
  }
}

 void initdisplay1(void)               //开机画面
{  
      //uchar i,j;
	  uchar i;
    //Serial_int();// 液晶初始化
     
    //for(j=1;j<10;j++)      //不停的显示,这个参数需要修改
   // {
    
    Writelcd( 0x80,0 );
    for(i=0;i<16;i++)
    Writelcd( tegong[i],1 );

    Writelcd( 0x90,0 );  //说明:word:要写的内容 dat:1为数据 0为指令
    for(i=0;i<16;i++)
    Writelcd( numble[i],1 );


    Writelcd( 0x88,0 );
    for(i=0;i<8;i++)
    Writelcd( name[i],1 );
            		
        	
    Writelcd( 0x98,0 );
    for(i=0;i<8;i++)
    Writelcd( zhifu[i],1 );
  //  }
}

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

void B_J()
{
 if(((hour==hh)&&(minite==ff)&&(second<=30))||(tvalue>=350)||(tvalue<=150))
 {
  led1=0;buzzer=1;
 }
 else
 {led1=1;buzzer=0;}
}

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

/********************主程序***************************/
void main()
{
 set=1;ret=1;add=1;dec=1;buzzer=0;led1=1;
 TMOD=0X01;
 TH0=0X3C;
 TL0=0Xb0;
 EA=1;
 ET0=1;
 TR0=1;
 Serial_int();
 initdisplay();
 delay(5000);
 initdisplay1();
 while(1)
   {
    read_temp();
    display();
	key_scan();	
	B_J();
   }
}

/*********************定时中断服务程序**********************/
void time(void) interrupt 1 using 1
{
 //ET0=0;TR0=1;
 TH0=0X3C;
 TL0=0Xb0;
 //TR0=1;
 ms50++;
 if(ms50==20)
 {
  ms50=0;
  second++;
  if(second==60)
   {
    second=0;minite++;
    if(minite==60)
     { 
      minite=0;
      hour++;
      if(hour==24)
       hour=0;
     }
   }
 }
 //ET0=1;
}

⌨️ 快捷键说明

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