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

📄 dianzi.c

📁 温度自动控制
💻 C
字号:
#include"reg52.h"
#include"intrins.h"
#define Disdata P0
#define discan P2
#define uchar unsigned char
#define uint unsigned int
sbit DIN=P0^7;//LED小数点控制位
sbit DQ=P3^7;//温度输出口
sbit zhuanhuan=P2^7;//转换开关
sbit wenkong=P2^4;//水泥电阻
sbit fengshan=P2^5;//电风扇
uint h;
uchar code ditab[16]={0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x04,0x05,0x06,0x06,0x07,0x08,0x08,0x09,0x09};     //有问题
uchar code scan_con[4]={0xfe,0xfd,0xfb,0xf7};
uchar code dis_7[12]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00,0x40};
uchar data temp_data[2]={0x00,0x00};
uchar data display[5]={0x00,0x08,0x04,0x00,0x00};         
uchar data limit_t1[4]={0x00,0x00,0x04,0x00};//温度下极限
uchar data limit_t2[4]={0x00,0x00,0x06,0x00};//温度上极限
uchar data limit_t[4]={0x00,0x00,0x04,0x00};//温度传递值
uchar data m[4]={0x00,0x00,0x00,0x00};

void delay(uint t){
	for(;t>0;t--);
}

void scan(){
	char k;
	for(k=0;k<4;k++){
		discan|=0x0f;		
		discan&=scan_con[k];
		Disdata=dis_7[display[k]];
		DIN=0;
		if(k==1){DIN=1;}		
		delay(60);//!
		Disdata=0x00;
	}
}

void ow_reset(void){//复位函数
	char presence=1;
	while(presence){
		while(presence){
			DQ=1;_nop_();
			DQ=0;
			delay(30);
			DQ=1;
			delay(3);
			presence=DQ;
		}
		delay(22);
		presence=~DQ;
	}
   DQ=1;
}
void write_byte(uchar val){
	uchar i;
	for(i=8;i>0;i--){
		DQ=1;_nop_();
		DQ=0;_nop_();_nop_();_nop_();
		DQ=val & 0x01;
		delay(3);
		val>>=1;
	}
	DQ=1;
	delay(1);
}
uchar read_byte(void){
	uchar i;
	uchar value=0;
	for(i=8;i>0;i--){
		DQ=1;_nop_();
		value>>=1;
		DQ=0;
		DQ=1;_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
		if(DQ)value |=0x80;
		if(DQ)value |=0x80;
		delay(3);
	}
	DQ=1;
	return value;
}

void read_temp(void){
	ow_reset();
	write_byte(0xcc);
	write_byte(0xbe);
	temp_data[0]=read_byte();
	temp_data[1]=read_byte();
	ow_reset();
	write_byte(0xcc);
	write_byte(0x44);
}

void work_temp(void){
	uchar n=0;
	if(temp_data[1]>127){
		temp_data[1]=(255-temp_data[1]);
		temp_data[0]=(256-temp_data[0]);
		n=1;
	}
	display[4]=temp_data[0] & 0x0f;
	display[0]=ditab[display[4]];
	display[4]=((temp_data[0] & 0xf0)>>4)|((temp_data[1]&0x0f)<<4);
	display[3]=display[4]/100;
	display[1]=display[4]%100;
	display[2]=display[1]/10;
	display[1]=display[1]%10;	
}

void temp_add(void) interrupt 1 using 3{
	char k;
	if(limit_t[0]>=0x09){
		limit_t[0]=0x00;
		if(limit_t[1]>=0x09){
			limit_t[1]=0x00;
			if(limit_t[2]>=0x09)limit_t[2]=0x00;
			else limit_t[2]++;
		}
		else limit_t[1]++;
	}
	else limit_t[0]++;
	for(k=0;k<4;k++)     display[k]=limit_t[k];
}
void temp_sub(void) interrupt 3 using 2{
	char k;
	if(limit_t[0]<=0x00){
		limit_t[0]=0x09;
		if(limit_t[1]<=0x00){
			limit_t[1]=0x09;
			if(limit_t[2]<=0x00)limit_t[2]=0x00;
			else limit_t[2]--;
			}
		else limit_t[1]--;
	}
	else limit_t[0]--;
	for(k=0;k<4;k++)display[k]=limit_t[k];
}
void set(void) interrupt 0 using 1{
    char i;
	for(i=0;i<4;i++)
	{limt_t1[i]=limt_t[i];}//温度传递值->温度下限
	for(i=0;i<4;i++)
	{limt_t[i]=limt_t2[i];}//温度上限->温度传递值
}
void set(void) interrupt 2 using 0{
    char i;
	for(i=0;i<4;i++)
	{limt_t2[i]=limt_t[i];}//温度传递值->温度上限
	EA=0;//关中断
}
void main(){
	uint i;
	EA=1;IT0=1;EX0=1;ET0=1;ET1=1;
	TMOD=0X66;//T1,T0方式2计数
	TH1=0xFF;TL1=0xFF;TH0=0xFF;TL0=0xFF;
	TR0=1;TR1=1;
	for(i=0;i<4;i++)
	{limt_t[i]=limt_t1[i];}//温度下限->温度传递值
	while(EA){
		for(i=0;i<400;i++)scan();	
		delay(4000);
	}	
	ow_reset();
	write_byte(0xcc);
	write_byte(0x44);	
	for(h=0;h<500;h++)scan();
	wenkong=1;fengshan=0;
	while(1)
	{
	while(zhuanhaun){
		read_temp();		
		work_temp();
		for(i=0;i<4;i++)
		{
         m[i]=display[i];
		}
		if((limit_t1[2]>m[2])||(limit_t1[1]>m[1]))
		{
        if((limit_t1[2]>display[2])||(limit_t1[1]>display[1]))
		   {wenkong=1;fengshan=0;}
		   else if(((limit_t1[2]<display[2])||(limit_t1[1]<display[1]))&&((limit_t2[2]>display[2])||(limit_t2[1]>display[1])))
                 {wenkong=1;fengshan=0;}
				 else {wenkong=0;fengshan=1;}
				 }
		if((limit_t2[2]<m[2])||(limit_t2[1]<m[1]))
		{
        if((limit_t2[2]<display[2])||(limit_t2[1]<display[1]))
		   {wenkong=0;fengshan=1;}
		   else if((limit_t1[2]<display[2])||(limit_t1[1]<display[1])&&(limit_t2[2]>display[2])|(limit_t2[1]>display[1]))
                 {wenkong=0;fengshan=1;}
				 else {wenkong=1;fengshan=0;}
		}
		for(h=0;h<6000;h++)scan();
	}
	while(~zhuanhuan)
	{ 
	 //转换显示
	  }
  }
}

⌨️ 快捷键说明

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