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

📄 temprature.c

📁 本人写的利用c8051f330单片机开发的系统的程序,包括驱动ds18b20功能和hd7279的驱动,保证能用!
💻 C
字号:
#include "C8051F330.h"

#define 	TRUE 1
#define 	FALSE 0
#define 	ADC0START ADC0CN|=0x10;

#define Set_Bit(BIT) (BIT = 1) /*定义置1函数*/
#define Clear_Bit(BIT) (BIT = 0) /*定义清0函数*/



sbit	ChouYang=P0^1;				//臭氧控制位
sbit 	JiaRe_Disp=P0^4;			//加热灯显示位
sbit 	FengShan_Disp=P0^5;			//排风灯显示位
sbit 	JiaRe=P0^7;					//加热控制位
sbit	ChouYang_Disp=P1^1;			//臭氧显示位
sbit 	FengShan=P1^0;				//风扇控制位
sbit	Kong=P1^2;

sbit	DQ=P0^6;

sbit 	Hd7279_Key=P0^0;				//7279按键识别信号	
sbit	Hd7279_CS=P1^4;					//7279片选
sbit	Hd7279_Clk=P1^5;				//7279时钟				
sbit	Hd7279_Data=P1^7;				//7279信号

unsigned char n,a=0;
  char TemperatureSet,TemperatureNow;	//温度
 char TimeSet,TimeNow=0x00;						//时间
//static unsigned char TemperatureTemp,TimeTemp;
unsigned char KeyValue;					//按键值
static unsigned int Time_Inc=0,Time_Inc_30S=0,Time_Inc_5S=0;
static unsigned char Display_Select;			//Display_Select=0(显示当前温度);Display_Select=1(显示设定温度);
static unsigned char Time_Change;				//Time_Change=0(30s定时);Time_Change=1(5s定时)
static unsigned char ChouYang_Flag,JiaRe_Flag,FengShan_Flag;		//标志位
/*ChouYang_Flag(01:开启臭氧排放;02:臭氧指示灯亮;04:臭氧指示灯闪烁)*/
/*JiaRe_Flag(01:加热开启;02:加热指示灯亮;04:加热指示灯闪烁)*/
/*FengShan_Flag(01:排风开启;02:排风指示灯亮;04:排风指示灯闪烁)*/
bit isnewdata;
unsigned int kk=0;
float temp=0.0;
float count=0.0;
char Control_Auto;
char Control_Flag;
char FengShan_Time,JiaRe_Time;

char Int_Flag=0;
char CInt_Flag=0;
char Temperature_Flag=0;


void initial(void);
void timer_init(void);
void adc0_Rx(void);//对滑动变阻器采样
void delayus(unsigned int x);

void Temperature_Display(unsigned char tempr);//显示当前温度
void Time_Display(unsigned char );		//显示当前时间
void init_18B20(void);//初始化18B20
void write_18B20(unsigned char x);//向18B20写数据
unsigned char read_18B20(void);//读取18B20数据

void Write_Hd7279(unsigned char,unsigned char); /*定义HD7279写函数*/
unsigned char Read_Hd7279(unsigned char); /*定义HD7279读函数*/
void Send_Byte(unsigned char); /*定义HD7279发送字节函数*/
unsigned char Receive_Byte(void); /*定义HD7279接收字节函数*/
void Short_Delay(void); /*定义短延时函数*/
void Long_Delay(void); /*定义长延时函数*/
void System_Initial(void);		//设定初始设定

void Control_Key_Check(void);				//检查控制按键
void Up_Down_Check(void );			//检查是否在增加减少温度/时间值
void ChouYang_Check(void);
void LED_Flash(void);
void delayms(int);

void main(void)
{
	float sumTemp=0.0;
	unsigned char index=0;
	int sign=1,i;
	int a=0;
	delayus(50);
	System_Initial();
	initial();

	timer_init();
	delayus(100);
	EA=1;				//开中断
	for(i=0;i<0x200;i++)
		Send_Byte(0xa4); /*HD7279复位*/
	Write_Hd7279(0x98,0x0f); /*HD7279启动消隐功能,能提高灯的亮度*/
	Send_Byte(0x88);
	Send_Byte(0xff);			//LED停止闪烁
	delayms(1000);
	TimeNow=TimeSet;
	Temperature_Display(TemperatureNow);

	while(1)
	{
		
		Time_Display(TimeSet);						//显示当前时间
		if(Display_Select==0)						//显示当前温度
			Temperature_Display(TemperatureNow);		
		if(Display_Select==1)					//显示设定温度
			Temperature_Display(TemperatureSet);
							
		Up_Down_Check();							//检查是否在增加减少温度/时间值
		ChouYang_Check();
				
		if(Control_Flag==1)
		{
			Control_Flag=0;
			Control_Auto=1;
		
		}

		if(Control_Auto==0)
		{
			if(Temperature_Flag==1)
			{		
				if((TemperatureNow>TemperatureSet+5))
				{
					JiaRe=0;								//停止加热
				
				
					delayms(100);
					FengShan=1;								//排风
				
				}
				LED_Flash();

				if((TemperatureNow<TemperatureSet-5))
				{
					FengShan=0;
					delayms(100);
					JiaRe=1;								//开始加热
			
				
				}
				Temperature_Flag=0;
			}	 
		 }
		 if(Control_Auto==1)
		{
			 
		 Control_Key_Check();
		}





	}		
}

void delayus(unsigned int x)
{ 
	while(x)
	{
		x--;
	}
}

void delayms(int x)
{
	int i;
	for(i=0;i<1000;i++)
	delayus(x);
}
void System_Initial(void)			//设定初始设定
{
	ChouYang=0;					//臭氧不开
	ChouYang_Disp=0;			//臭氧指示关闭
	JiaRe=0;					//加热关闭
	JiaRe_Disp=0;				//加热指示关闭
	FengShan=0;					//风扇关闭
	FengShan_Disp=0;			//风扇指示关闭
	ChouYang_Flag=0;			//臭氧标志位清零
	JiaRe_Flag=0;				//加热标志位清零
	FengShan_Flag=0;			//排风标志位清零
	KeyValue=0xff;

	TimeSet=45;				
	TemperatureSet=30;				//30
	TemperatureNow=0;
	Display_Select=0;

	Int_Flag=0;
	
	Control_Auto=0;
	FengShan_Time=0;
	JiaRe_Time=0;
	Control_Flag=0;


}

void initial(void)
{
	PCA0MD=0x00;//禁用看门狗

	P0MDIN=0xF3;						//P0.2,P0.3配置为模拟输入(晶振)
	P0MDOUT=0xBE;						
	P0SKIP=0x0C;						//P0.2,P0.3配置为模拟输入

	P1MDIN=0xFF;						//所有P1口配置为数字I/O口
	P1MDOUT=0xFF;
	P1SKIP=0x00;						//推挽输出

	XBR0=0x00;
	XBR1=0x40;
	
	//*/使用内部高频时钟
	OSCICL=0xFF;
	OSCICN=0x80;//系统时钟15/8M
	CLKSEL=0x00;
	//*/
	//*/切换到外部振荡器
	OSCXCN=0x67;
	for(n=0;n<255;n++);
	while(0==(OSCXCN&0x80))
	{
	}
	CLKSEL=0x01;//外部振荡器
	OSCICN=0x00;		//禁止内部振荡器
	//*/
	//初始化ADC0
	
	//
	IT01CF=0x00;		//使P0.0(HD7279_Key)为中断(INT0),低电平有效

	IT0=1;			//边缘触发
//	TCON&=0xFE;

	EX0=1;




}

	

	
void timer_init(void)
{
	TR0=0;
	TR1=0;
	TL0=0x00;
	TH0=0x00;
	TL1=0xFF;
	TH1=0x4B;					//定时50ms
	TMOD=0x11;//T0,T1,16位定时器
	CKCON=0x00;//定时器时钟=系统时钟/12
	


	Time_Inc=0;
	Time_Inc_30S=0;
	Time_Inc_5S=0;
	Display_Select=0;			//默认起始显示当前温度
	Time_Change=0;				//默认30计时开始
	
	TR0=1;//启动T0,T1
	TR1=1;
	
	ET0=1;
	ET1=1;						//允许定时器中断
}


void Temperature_Display(unsigned char tempr)		//显示当前温度
{
	unsigned char tempHigh,tempLow;
	tempHigh=(unsigned char)tempr/10;
	tempLow=tempr%10;
	
	Write_Hd7279(0x81,tempLow);			//显示温度个位81
	Write_Hd7279(0x80,tempHigh);		//显示温度十位80
}

void Time_Display(unsigned char time)			//显示当前时间
{
	unsigned char TimeHigh,TimeLow;
	TimeHigh=time/10;
	TimeLow=time%10;

	Write_Hd7279(0x83,TimeLow);			//显示时间低位83
	Write_Hd7279(0x82,TimeHigh);		//显示时间高位82
}

void init_18B20(void)
{
	DQ=TRUE;
	DQ=FALSE;
	delayus(700);//>480us
	DQ=TRUE;
	delayus(17);
	while(FALSE!=DQ);
	delayus(200);//60~240us
}


void write_18B20(unsigned char x)
{
	unsigned char m;
	for(m=0;m<8;m++)
	{
		DQ=TRUE;
		DQ=FALSE;
		delayus(1);
		if(x&(1<<m))//写数据,从低位开始
			DQ=TRUE;
		else
			DQ=FALSE;
		delayus(100);//60us
	}
	DQ=TRUE;
	delayus(1);
}

unsigned char read_18B20(void)
{
	unsigned char temp,l;
	temp=0;
	for(l=0;l<8;l++)
	{
		temp>>=1;
		DQ=FALSE;
		delayus(1);
		DQ=TRUE;
		delayus(1);
		if(DQ)
			temp|=0x80;
		delayus(100); //60~120us
		DQ=TRUE;
	}
	delayus(1);
	return (temp);
}

void t0_ISR() interrupt 1
{
	unsigned char temh,teml;
	ET1=0;									//关定时器1
	EX0=0;									//关外部中断
//	TCON&=~0x01;

	if(0==a)
	{
		temh=0;
		teml=0;
		init_18B20();//复位18b20
		write_18B20(0xCC);//发出转换命令
		write_18B20(0x44);
		delayus(1000);
		init_18B20();
		write_18B20(0xCC);//发出读命令
		write_18B20(0xBE);
		teml=read_18B20();//读数据
		temh=read_18B20();
		count=(temh*256.0+teml*1.0)*0.0625;//计算具体温度
		TemperatureNow=(unsigned char)(count);
	}
	a++;
	if(a>10)
		a=0;
//	TCON=0x00;
	ET1=1;									//开定时器1
	EX0=1;									//开外部中断
	Temperature_Flag=1;
	
}

void T1_ISR()  interrupt 3					//50ms定时		
{
//	ET0=0;									//关定时器0
//	EX0=0;									//关外部中断
	EA=0;
	delayus(200);
	Time_Inc++;

	if(Time_Change==0)						//30s定时统计
		Time_Inc_30S++;
	if(Time_Change==1)						//5s定时统计
		Time_Inc_5S++;
	if(Time_Inc==1200)		//1min定时到
	{
	
		TimeSet--;
		if(TimeSet==-1)
			TimeSet=60;
		Time_Inc=0;
		
	}
	else if(Time_Inc_30S==600)				//30s定时时间到
	{
		Time_Inc_30S=0;
		Display_Select=1;					//开始显示设定温度
		Time_Change=1;
	}
	else if(Time_Inc_5S==100)				//5s定时时间到
	{
		Time_Inc_5S=0;
		Display_Select=0;					//显示测量温度
		Time_Change=0;						
	}
	


	TL1=0xFF;
	TH1=0x4B;			//重载(50ms定时)


	EA=1;

}
	




void Short_Delay(void) /*短延时函数*/
{ 
unsigned char i;
for(i=0;i<0x08;i++);
}
/****************************************************************************** 
******/
void Long_Delay(void) /*长延时函数*/
{
unsigned char i;
for(i=0;i<0x30;i++);
}

void Write_Hd7279(unsigned char Command,unsigned char Data) /*HD7279写函数*/
{ 
Send_Byte(Command);
Send_Byte(Data);
}
/****************************************************************************** 
******/
unsigned char Read_Hd7279(unsigned char Command) /*HD7279读函数*/
{ 
Send_Byte(Command);
return(Receive_Byte());
 }


/****************************************************************************** 
******/ 
void Send_Byte(unsigned char Data_Out) /*HD7279发送字节函数*/
{ 
unsigned char i;
Clear_Bit(Hd7279_CS);
Long_Delay();
for(i=0;i<8;i++)
{ 
if(Data_Out&0x80) Set_Bit(Hd7279_Data);
else Clear_Bit(Hd7279_Data);
Set_Bit(Hd7279_Clk);
Short_Delay();
Clear_Bit(Hd7279_Clk);
Short_Delay();
Data_Out=Data_Out<<1;
}
Clear_Bit(Hd7279_Data);
 }
/****************************************************************************** 
******/ 
unsigned char Receive_Byte(void) /*HD7279接收字节函数*/
{ 
unsigned char i,Data_In;
Set_Bit(Hd7279_Data);
Long_Delay();
for(i=0;i<8;i++)
{
Set_Bit(Hd7279_Clk);
Short_Delay();
Data_In=Data_In<<1;
if(Hd7279_Data) Data_In=Data_In|0x01;
Clear_Bit(Hd7279_Clk);
Short_Delay();
}
Clear_Bit(Hd7279_Data);
return(Data_In);
}


void HD_Key_ISR() interrupt 0	//外部中断0函数(按键中断)
{
	EA=0;

	Send_Byte(0x15);			//读键盘
	KeyValue=Receive_Byte();	//取得键值
	while(!Hd7279_Key);			//等待按键结束
	if(KeyValue==4||KeyValue==5||KeyValue==6||KeyValue==8)
		Int_Flag=1;
	if(KeyValue==0||KeyValue==2)
		Control_Flag=1;
	EA=1;
	
}


	
/*HD7279值,加热(0),臭氧(1),排风(2),确定(3),时间加(4),时间减(5),温度加(6),温度减(8)*/


void Up_Down_Check(void )			//检查是否在增加减少温度/时间值
{
	 char TemperatureTemp,TimeTemp;
	long counter=0;
	ET0=0;
	ET1=0;


	if((KeyValue==4||KeyValue==5||KeyValue==6||KeyValue==8)&&Int_Flag==1)
	{
			TimeTemp=TimeSet;
			TemperatureTemp=TemperatureSet;
			
				do{
			
					Send_Byte(0x88);
					Send_Byte(0x00);			//LED闪烁
					delayms(200);
				if(Int_Flag==1)
				{

					
					
					if(KeyValue==4)				//时间加
					{
						TimeTemp++;
						if(TimeTemp>=60)
							TimeTemp=60;
				
						
					}
					if(KeyValue==5)		//时间减
					{	
					
						
							TimeTemp--;
							if(TimeTemp<=0)
							TimeTemp=0;
							
					
				
					}

					if(KeyValue==6)		//温度加
					{
						TemperatureTemp++;
						if(TemperatureTemp>=99)
							TemperatureTemp=99;
					
					}
			
					if(KeyValue==8)		//温度减
					{
						TemperatureTemp--;
						if(TemperatureTemp<=1)
							TemperatureTemp=1;
					
					}
					counter=0;
					delayms(700);
					Temperature_Display(TemperatureTemp);
					Time_Display(TimeTemp);
					Int_Flag=0;
				}
				
				counter++;
			}
			while(KeyValue!=3&&counter<0x30000);
			
			TemperatureSet=TemperatureTemp;
			TimeSet=TimeTemp;
	}
				Send_Byte(0x88);
				Send_Byte(0xff);			//LED停止闪烁
		

		ET0=1;
		ET1=1;
	
}
void LED_Flash(void)
{
	JiaRe_Disp=1;
	FengShan_Disp=0;
	delayms(1000);
	JiaRe_Disp=0;
	FengShan_Disp=1;
	delayms(1000);
}
void Control_Key_Check(void)				//检查控制按键
{
	
//	EA=0;							//关外部中断
//	ET0=0;
//	ET1=0;

		if(KeyValue==0)				//加热被按下
		{
			JiaRe_Time++;
			KeyValue=0xff;
			FengShan_Time=0;
		}
		if(KeyValue==2)				//排风按钮被按下
		{
			FengShan_Time++;
			KeyValue=0xff;
			JiaRe_Time=0;
		}	
			
//		if(JiaRe_Time==1)
//			FengShan_Time=0;
//		if(FengShan_Time==1)
//			JiaRe_Time=0;

		if((FengShan_Time==1))//
			{
				
		
					FengShan=1;			//启动排风
					JiaRe=0;			//关闭加热
					JiaRe_Disp=0;
					if(TemperatureNow<=TemperatureSet-10)
					{
						FengShan_Disp=1;
						delayms(500);
						FengShan_Disp=0;
						delayms(500);
					}	
					else
					{
				
						FengShan_Disp=1;	//排风灯亮

					}
				
				
			}
			if(FengShan_Time==2)	//第二次被按下
			{
				FengShan_Time=0;
				Control_Auto=0;		//切换至自动状态
				
				
			}


			if((JiaRe_Time==1))		//第一次被按下//
			{
			
				
					JiaRe=1;			//启动加热
					FengShan=0;			//关闭排风
					FengShan_Disp=0;
				
					if(TemperatureNow>=TemperatureSet+10)
					{
						JiaRe_Disp=1;
						delayms(500);
						JiaRe_Disp=0;
						delayms(500);
					}
					else
					{
				
						JiaRe_Disp=1;		//加热灯亮
					}
				
			}
				
			if(JiaRe_Time==2)		//第二次被按下
			{
				JiaRe_Time=0;
				Control_Auto=0;		//切换至自动状态
				
				
			}	
			
			
		
		
 // 	EA=1;							//开外部中断
 //	ET0=1;
//		ET1=1;
	
}

void ChouYang_Check(void)
{
	if(KeyValue==0x01)
	{
		KeyValue=0xff;
		ChouYang_Flag++;
		if(ChouYang_Flag==1)
		{
			ChouYang=1;
			ChouYang_Disp=1;
		}
		if(ChouYang_Flag==2)
		{
			ChouYang=0;
			ChouYang_Disp=0;
			ChouYang_Flag=0;
		}
	}
}

⌨️ 快捷键说明

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