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

📄 温度main.c

📁 单片机控制温度芯片DS18B20的源代码
💻 C
📖 第 1 页 / 共 2 页
字号:
   	WriteCommandLCM(0x0f,1);   					 //开显示,光标显示,光标闪烁,检测忙信号	
    DisplayOneChar(3,0,hour/10+0x30);             //液晶上显示要设定的小时
	DisplayOneChar(4,0,hour%10+0x30);
}

/**************液晶显示子函数3*****************/

void displayfun3(void)
{
	WriteCommandLCM(0x0c,1);    				//显示屏打开,光标不显示,不闪烁,检测忙信号	
	DisplayListChar(0,0,str0);	
	DisplayListChar(0,1,str1);	
	
	DisplayOneChar(3,0,hour/10+0x30);
	DisplayOneChar(4,0,hour%10+0x30); 

	DisplayOneChar(9,0,seconde/10+0x30);
	DisplayOneChar(10,0,seconde%10+0x30);

	DisplayOneChar(3,1,K/10+0x30);			   
	DisplayOneChar(4,1,K%10+0x30);

   	DisplayOneChar(11,1,temp1/10+0x30);         
	DisplayOneChar(12,1,temp1%10+0x30);
	DisplayOneChar(14,1,temp2/10+0x30);

   
	WriteCommandLCM(0x0f,1);   					 //显示屏打开,光标显示,闪烁,检测忙信号
	DisplayOneChar(6,0,minite/10+0x30);          //液晶上显示要设定的分
	DisplayOneChar(7,0,minite%10+0x30);

}

/**************液晶显示子函数4 *****************/

void displayfun4(void)
{
	WriteCommandLCM(0x0c,1);    				//显示屏打开,光标不显示,不闪烁,检测忙信号	
	DisplayListChar(0,0,str0);	
	DisplayListChar(0,1,str1);	
	
	DisplayOneChar(3,0,hour/10+0x30);
	DisplayOneChar(4,0,hour%10+0x30); 

	DisplayOneChar(6,0,minite/10+0x30);
	DisplayOneChar(7,0,minite%10+0x30);

	DisplayOneChar(9,0,seconde/10+0x30);
	DisplayOneChar(10,0,seconde%10+0x30);

	
   	DisplayOneChar(11,1,temp1/10+0x30);         
	DisplayOneChar(12,1,temp1%10+0x30);
	DisplayOneChar(14,1,temp2/10+0x30);

   
	WriteCommandLCM(0x0f,1);   					 //显示屏打开,光标显示,闪烁,检测忙信号
	DisplayOneChar(3,1,K/10+0x30);			   //液晶上显示要设定的温度
	DisplayOneChar(4,1,K%10+0x30);

}

/**************键盘扫描子函数******************/

void keyscan(void)
{
	uchar xx;                                           //局部变量
	P1=0xff;                           //为读数做准备
	if(P1!=0xff)                       //有键被按下
	  {
	    delay_LCM(50);                 //去抖

		if(P1!=0xff)                   //确认有键被按下
		  {	
			xx=P1;
			switch(xx)				  // 根据按键状态,调用不同的子函数
			{
				case 0xfe:set_adj();       break;   //P1.0则MS按下转set_adj();            
				case 0xfd:inc_key();       break;   //"+"          
				case 0xfb:dec_key();       break;   //"-"            
				case 0xf7:{delay_LCM(150);  ON_OFF=!ON_OFF;  while(!BLUE_ALARM);}  break;
				default:break;
			}
		
		  }
		
	  }
  
}

/**************设定工作模式子函数****************/

void set_adj(void)
{
	delay_LCM(100);
	set++;
    if(set>=4)   set=0;
	while(!RED_ALARM);		//等待"MS"松开
}

/****************按键加法子函数******************/

void inc_key(void)
{
	delay_LCM(150);

	switch(set)
	{
		case 0:if(P1==0xf7){delay_LCM(150);ON_OFF=!ON_OFF;}       break;
		case 1:hour++;   if(hour>=23)          hour=23;           break;
		case 2:minite++; if(minite>=59)        minite=59;         break;
		case 3:K++;      if(K>=99)             K=99;              break; 
		default:break;
	}
	while(!WRITE_ALARM);          ////等待"+"松开
}

/****************按键减法子函数*****************/

void dec_key(void)
{
	delay_LCM(150);
	
	switch(set)
	{
	   	case 0:if(P1==0xf7)  {delay_LCM(150);ON_OFF=!ON_OFF;}     break;
		case 1:hour--;     if(hour<=0)        hour=0;             break;
		case 2:minite--;   if(minite<=0)      minite=0;           break;
		case 3:K--;        if(K<=1)           K=1;				  break; 
		default:break;
	}
	while(!GREEN_ALARM);	//等待"-"松开
}

/////////24C02读写驱动程序////////////////////

void delay1(uchar x)
{  
	uint i;
	for(i=0;i<x;i++);
}

void flash()
{  ;  ; }         //短暂的等待

void x24c02_init()  //24c02初始化子程序,将两条数据线拉高
{
	scl=1; 
	flash(); 
	sda=1; 
	flash();
}
void start()        //启动I2C总线
{
	sda=1; 
	scl=1; 
	flash(); 
	sda=0; 
	flash(); 
	scl=0; 
	flash();
}
void stop()         //停止I2C总线
{
	sda=0; 
	flash(); 
	scl=1; 
	flash(); 
	sda=1; 
	flash();
}
void writex(uchar j)  //写一个字节
{  
	uchar i,temp;
    temp=j;           //全局变量向局部变量传递
    for (i=0;i<8;i++)
		{
			temp=temp<<1; //把最高位移入CY中
			scl=0;      //准备发送到24C02
			flash(); 
			sda=CY;     //送数据,由高位到低位
			flash(); 
			scl=1;      //时钟线挂起
			flash();
		}

	scl=0; 
	flash(); 
	sda=1; 
	flash();
}

uchar readx()   //读一个字节
{
	uchar i,j,k=0;
	scl=0; 
	flash(); 
	sda=1;
    for (i=0;i<8;i++)
		{  
			flash(); 
			scl=1; 
			flash();
			if (sda==1) j=1;
			else j=0;
			k=(k<<1)|j;
			scl=0;
		}
	flash(); 
	return(k);
}

void clock()         //I2C总线时钟
{
	uchar i=0;
	scl=1; 
	flash();
	while ((sda==1)&&(i<255))i++;
	scl=0; 
	flash();
}

////////从24c02的地址address中读取一个字节数据/////

uchar x24c02_read(uchar address)
{
	uchar i;
	start(); 
	writex(0xa0);
	clock(); 
	writex(address);
	clock(); 
	start();
	writex(0xa1); 
	clock();
	i=readx(); 
	stop();
	delay1(10);
	return(i);
}

//////向24c02的address地址中写入一字节数据info/////

void x24c02_write(uchar address,uchar info)
{
	EA=0;
	start(); 
	writex(0xa0);
	clock(); 
	writex(address);
	clock(); 
	writex(info);
	clock(); 
	stop(); 
	EA=1;
	delay1(50);
}

/***************定时器t0初始化*******************/

void init_timer0(void)
{
	 TMOD=0x01;                                  //time0为定时器,方式1(2的16次方计数)
     TH0=0x3c;                                   //预置计数初值,使定时为50ms
     TL0=0xb0;
     EA=1;   								//开总中断
     ET0=1;          						//开TO中断					
     TR0=1;          		//启动
}

/***********定时器t0中断子函数**************/

void timer0(void) interrupt 1 using 0          //定时器0溢出中断,方式1,50ms中断一次
{                                              //使用寄存器组0
     TH0=0x3c;            //出现中断则重置初值 
     TL0=0xb0;            //预置计数初值,使定时为50ms
     mstcnt++;            //中断次数计数器
     if(mstcnt>=20 )  {seconde++; write=1; mstcnt=0; }  //中断20次则50ms*20=1s到,将mscnt置零
	 if(seconde>=60)  {minite++;           seconde=0;}  //计满1分钟则minite加1,同时将second置零
	 if(minite>=60 )  {hour++;             minite=0; }  //计满1小时则hour加1,同时将minite置零
	 if(hour>=24   )  {hour=0;                       }  //计满24小时则hour置零
	 keyscan( );                                        //按键扫描
}

/***********the main funtion*************/
    
void main(void)
{ 

    P1=0xff;                   //初始化p1口,全设为1 
	P3=0x00;
	x24c02_init();             //初始化24C02
    K=x24c02_read(2);          //读出保存的上限温度数据赋于K
	seconde=x24c02_read(4);    //读出保存的秒数据
	minite=x24c02_read(6);     //读出保存的分数据
	hour=x24c02_read(8);       //读出保存的时数据
	delay_LCM(500);	           //延时500ms启动
	initLCM( );                //LCD初始化
	init_timer0( );	           //时钟定时器0初始化	
    Init_DS18B20( ) ;          //DS18B20初始化
	DisplayListChar(0,0,str0); //第一行显示"---  :  :  ---  "
	DisplayListChar(0,1,str1); //第二行显示"SET:  C SA:  . C"
                     	
    while (1)                  //死循环
    {   
       	keyscan();                                            //按键扫描		
	    ReadTemperature();                                    //温度采集
	    switch(set)                                           //LCD根据工作模式显示
		{
			case 0:displayfun1();delay_LCM(1000);break;       //正常工作显示
			case 1:displayfun2();delay_LCM(1000);break;       //调整时显示
			case 2:displayfun3();delay_LCM(1000);break;       //调整分显示
			case 3:displayfun4();delay_LCM(1000);break; 	  //温度设定
			default:break;
		} 	
		keyscan( );  	                    //相当于延时
		if(ON_OFF==1)      					//若温控标志位1, 控制LAMP动作
		{
			if(temp1>=K+1){outflag=1;OUT=1;}//若温度整数部分超过设定值,则将标志置1,以显示超限标志,同时执行继电器动作
			if(temp1<K)                     //若温度没超限
			{ 
				delay_LCM(1000);            //等待液晶稳定
				if(temp1<K){outflag=0;OUT=0;}//若温度没超限,不显超限标志,继电器不动作
			}
		}
		else{outflag=0;OUT=0;}            //若温控标志位0, 关闭控制LAMP动作
		if(write==1)                      //判断计时器是否计时一秒
       {
	      write=0;                        //清零
          x24c02_write(8,hour);           //在24c02的地址2中写入数据hour
		  delay_LCM(11);
		  x24c02_write(6,minite);         //在24c02的地址2中写入数据minite
		  delay_LCM(11);
		  x24c02_write(4,seconde);        //在24c02的地址2中写入数据second
	      delay_LCM(11);
		  x24c02_write(2,K);              //在24c02的地址2中写入数据K
		  	
       }	
    }
	
}

⌨️ 快捷键说明

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