📄 temprature.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 + -