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

📄 gq-1.c

📁 这是一款温度控制器的控制程序
💻 C
📖 第 1 页 / 共 2 页
字号:
		#include<ht46r47.h>
//		TY-Temp
//		2007-10-27 9:26
//-----------------------------------------------
//		表格
//-----------------------------------------------
const unsigned char frg[16] = {
0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8,
0x80, 0x90, 0x88, 0x83, 0xc6, 0xa1, 0x86, 0x8e};
//-----------------------------------------------

#define 	data		_pa4
#define 	clk		_pa5

#define		sda		_pa6            	//模拟I2C数据传送位
#define		sdar    	_13_6
#define 	scl		_pa7            	//模拟I2C时钟控制位

#define 	w_address 	0xa0			//定义器件在IIC总线中的地址
#define 	r_address 	0xa1
#define		port_com	_pa0			//按键检测脚定义
#define		port_buzzer	_pb2			//蜂鸣器引脚定义
#define		port_temp	_pd0			//温度控制

#define		ad_eoc		_22_6
#define		ad_start	_22_7

unsigned char 	num1;					//十六进制转十进制个位
unsigned char 	num2;					//十六进制转十进制十位
unsigned char 	num3;					//十六制进转十进制百位
unsigned char	time_temp_keep;				//进入保温状态的时间
unsigned char	time_keep;
unsigned char	time_temp_close;			//进入关机状态的时间
unsigned char	time_close;
unsigned char	data_keep;				//保温数据交换处
unsigned char	time_15s;				//15s无操作
unsigned char	time_ms;
unsigned char	time_sec;				//秒
unsigned char	time_second;
unsigned char	time_delay;				//延时设定
unsigned char	time_delay1;				//自动到烤杯计数器的延时时间
unsigned char	time_delay_check;			//延时操作寄存器
unsigned char	temp_set;				//设定温度
unsigned char	time_set;				//设定时间
unsigned char	temp_low;				//保温温度
unsigned char	temp_high;				//高温报警
unsigned char	data_disp;				//显示内容交换处
unsigned char	data_key;				//认为长闭合的时间
unsigned char	temperature;				//实际温度
unsigned char	temp_check;				//用于恒温比较(实际温度)
unsigned char	data_buzzer;				//按键音的长度
unsigned char	windows;				//界面
unsigned char	win_delay;				//P标志显示延时
unsigned char	product_count;				//产品计数器
unsigned char	time_pid;				//间歇加热90秒计时寄存器
unsigned char	data_pid;				//导通的宽度
unsigned char	data_pid_change;			//导通宽度变化的比较值

unsigned char	time_alarm;				//音乐报警频率
unsigned char	time_alarm1;				//音乐报警频率1
unsigned char	alarm_count;				//音乐报警短音次数
unsigned char	time_high;
unsigned char	data_at24;
unsigned long	ad_zong;
unsigned char	ad_count;
bit		temp_tall_e;
bit		flag_alarm;				//音乐报警短音后的标志
bit		flag_temp2;				//实际温度与设定温度只差2度的标志
bit		flag_temp15;				//实际温度与设定温度只差15度的标志
bit		flag_pid_90;				//加热90秒没到温度的标志

bit 		ack;	         			//应答标志位		
bit		flag_disp;				//显示P的标志
bit		flag_win;				//开始计时清P的标志
bit		flag_buzzer;				//响蜂鸣器的标志
bit		flag_inc;				//增加键状态
bit		flag_inc_check;				
bit		flag_dec;				//减少键状态
bit		flag_dec_check;
bit		flag_soon;				//按键长闭合的标志
bit		flag_close;				//加或减闭合的标志
bit		flag_ok;				//OK键状态
bit		flag_enter;				//回车键状态
bit		flag_temp_on;				//加热的标志
bit		flag_temp_music;
bit		flag_temp_reach;			//实际温度达到设定温度的标志
bit		flag_time_auto;				//自动倒计时的标志
bit		flag_set;				//设定状态标志
bit		flag_temp_close;
bit		flag_temp_keep;

#pragma vector isr_8 @ 0x8
//-----------------------------------------------
//		4ms中断
//-----------------------------------------------
void	isr_8()
{

	_clrwdt();
//-----------------------------------------------
//		清蜂鸣器
//-----------------------------------------------	
if(flag_alarm==0)
{
	if(flag_buzzer==0)
	{
		if(data_buzzer==25)
		{
			flag_buzzer=1;
			data_buzzer=0;
			port_buzzer=0;
		}
		else
		{
			data_buzzer++;		
		}	
	}
}
//-----------------------------------------------
//		清蜂鸣器
//-----------------------------------------------	
if(flag_alarm==1)
{
	if(flag_buzzer==0)
	{
		if(data_buzzer==50)
		{
			flag_buzzer=1;
			data_buzzer=0;
			port_buzzer=0;
		}
		else
		{
			data_buzzer++;		
		}	
	}
}
//-----------------------------------------------
//		快速加减
//-----------------------------------------------
	if(flag_soon==0)
	{
		if(flag_close==1)
		{
			data_key++;
			if(data_key==250)
			{
				flag_soon=1;	
			}	
		}
	}
	else
	{
		flag_inc=0;
		flag_dec=0;
	}
//-----------------------------------------------
//		音乐报警
//-----------------------------------------------
if(flag_alarm==0&&flag_temp_music==1&&windows!=0&&windows!=1&&windows!=2&&windows!=3&&windows!=4&&windows!=5)
{
	time_alarm++;
	if(time_alarm==60)	
	{
		time_alarm=0;
		flag_buzzer=0;
		port_buzzer=1;	
		alarm_count++;
		if(alarm_count==4)
		{
		alarm_count=0;
		flag_alarm=1;	
		}
	}	
}
//-----------------------------------------------
	if(temp_tall_e==1)
	{
		time_high++;
		if (time_high==240)
		{
		port_buzzer=1;
		flag_buzzer=0;
		time_high=0;	
	
		}
	}
//-----------------------------------------------	
//-----------------------------------------------
//		以下是1s	
//-----------------------------------------------
	time_ms++;
	if (time_ms==250)
	{
		time_ms=0;
		//-------------------------------
		//以下为1秒
		//-------------------------------
		if(windows==10&&flag_time_auto==1)
		{
			if(time_sec!=0)
			{
			time_sec--;
			}
			else
			{
				flag_time_auto=0;
				time_delay_check=time_delay;
				flag_temp_music=1;
				product_count++;
				data_at24=5;
				if(product_count==250)
				{
				product_count=0;	
				}
			}
		}	
		//-------------------------------
		time_alarm1++;
		if(time_alarm1==3)
		{
			time_alarm1=0;
			flag_alarm=0;
		}
		//-------------------------------
		//"P"标志清除
		//-------------------------------
		if (flag_win==1)
		{	
			if (flag_disp==1)
			{
				win_delay++;
		
				if(win_delay==2)
		
				{
					flag_disp=0;
					flag_win=0;
				}
			}
		}
		//-------------------------------
		//间歇加热
		//-------------------------------
	if(flag_pid_90==0)
	//间歇加热时间小于90秒
	{
		if(flag_temp15==1 && flag_temp2==0)
		//实际温度在设定温度15度附近,但小设定温度2度
		{
			time_pid++;		//90秒间歇加热计时
			if(time_pid==90)
			{
				flag_pid_90=1;		//90秒间歇加热还没有达到设定温度置标志
			}
		}
	}
//-----------------------------------------------
	if(flag_pid_90==0)
	{
		data_pid_change=2;			//90秒以内是加热1秒停1秒
	}
	else
	{
		data_pid_change=4;			//90秒以内是加热3秒停1秒
	}

//-----------------------------------------------
//			间歇加热
//-----------------------------------------------
	if(flag_temp15==1 &&flag_temp2==0 && windows==0)
	{
		data_pid++;
		if(data_pid==data_pid_change)
		{
			port_temp=1;
			data_pid=0;
			flag_temp_on=0;	//清加热指示的标志		
		}
		else
		{
			port_temp=0;
			flag_temp_on=1;	//置加热指示的标志	
		}
	}	
//------------------------------------------------
//		自动倒计时
//------------------------------------------------
	if(flag_temp_reach==1&&windows==0)
	{
		if(time_delay_check>0)	
		{
		time_delay_check--;	
		}
		else
		{
		flag_time_auto=1;
		windows=10;
		time_sec=time_set;
		//flag_alarm=0;
		//alarm_count=0;	
		}
	}
//------------------------------------------------
//		自动到烤杯计数器
//------------------------------------------------
	if(windows==10&&time_sec==0)
	{
		time_delay1++;
		if(time_delay1==5)
		{
		windows=8;
		time_delay1=0;	
		time_sec=time_set;
		}	
	}
//------------------------------------------------
//		自动回到实际温度显示
//------------------------------------------------
if(windows!=0&&windows!=10&&flag_set==1)
	if (time_15s>=15)
	{
		
		flag_disp=0;
				data_keep=temp_set;
		flag_set=0;
		windows=0;
		data_at24=10;
	}
	else
	{
		time_15s++;
	}
//-----------------------------------------------
//		自动到保温状态
//-----------------------------------------------
if(flag_set==0&&windows==8&&flag_temp_keep==0)
{
	if(time_keep==time_temp_keep)
	{
	data_keep=temp_low;
	flag_temp_music=0;	
	flag_temp_keep=1;		//进入保温状态的标志置1
	}
	else
	{
	time_keep++;	
	}
}
//-----------------------------------------------
//		自动到关机状态
//-----------------------------------------------
if(flag_temp_keep==1)
{
	if(time_close==time_temp_close)	
	{
		flag_temp_close=1;
		num3=0xc0;
		num2=0x8e;
		num1=0x8e;	
	}
	else
	{
		time_second++;
		if(time_second==60)
		{
		time_second=0;
		time_close++;	
		}
		
	}
}
//-----------------------------------------------			
	}
}

//-----------------------------------------------
//		初始化
//-----------------------------------------------
void 	safeguard_int() {
	_intc = 0;
	_tmrc = 0;
	_tmr  = 0;
	_pac  = 0xff;
	_pbc  = 0xff;
	_pdc  = 0xff;
	_mp   = 0x40;
}	
//-----------------------------------------------
void	clr_ram()
{
	unsigned char i;
	for (i=0;i<64;i++)
	{
	_iar=0;
	_mp++;	
	}
}
//------------------------------------------------	
void 	start() 
{
	_intc   = 0x25;
	_tmrc   = 0x96;		//64分频
	_tmr    = 0x6;		//计时初值为6(满250中断一次)
	_pac    = 0x1;
	_pbc    = 0x8;
	_pdc    = 0;
	_pa     = 0x0;
	_pb   	= 0x4;
	_pd0	= 1;
}
//-----------------------------------------------
void	check_at24()
{
	
	data_at24  = read24c02(0x127);	
	if(data_at24!=100)
	{
		write24c02(180,0x0);
		write24c02(30,0x1);
		write24c02(150,0x2);
		write24c02(190,0x3);
		write24c02(10,0x4);
		write24c02(20,0x5);
		write24c02(5,0x6);
		write24c02(0,0x7);
		write24c02(100,0x127);
				
	}
}
//-----------------------------------------------
void	auto_wt()
{
	if(data_at24==10)
	{
		data_at24=0;
		write24c02(temp_set,0x0);
		write24c02(time_set,0x1);
		write24c02(temp_low,0x2);
		write24c02(temp_high,0x3);
		write24c02(time_delay,0x4);
		write24c02(time_temp_keep,0x5);
		write24c02(time_temp_close,0x6);
		write24c02(product_count,0x7);
	}
	if(data_at24==5)
	{
		
		write24c02(product_count,0x7);
		data_at24=0;
			
	}
}
//-----------------------------------------------
//		延时
//-----------------------------------------------
void 	delay(unsigned char x)			//48ms
{
 unsigned char i;
 	while(x--)
	{
	for (i = 0; i<150; i++)
	{
	}
	}
}
//===============================================
//		iic总路线
//===============================================
//定时函数
void delayms(unsigned int number)
{
	unsigned char temp;
	for(;number!=0;number--)
	{
		for(temp=112;temp!=0;temp--);
	}
}
//开始总线
void iic_start()
{
	sdar=0;
	
	sda=1;
	scl=1;
	sda=0;
	scl=0;
}
//结束总线
void stop()
{
	sdar=0;
	
	scl=0;
	sda=0;
	scl=1;
	sda=1;
}
//发acko
void noack()
{
	sdar=0;
	
	sda=1;
	scl=1;
	scl=0;
}

//测试ack
bit testack()
{
	bit errorbit;
	sda=1;
	scl=1;
	errorbit=sda;
	scl=0;
	return(errorbit);
}
//写入8个bit到24c02
write8bit(unsigned char input)
{
	unsigned char temp;
	for(temp=8;temp!=0;temp--)
	{
		sda=(bit)(input&0x80);	 	// 一位一位的传,&80是为了有零输出零,有1输出1并屏蔽了低七位
		scl=1;
		scl=0;
		input=input<<1;
	}
}
//写入一个字节到24c02中
void write24c02(unsigned char ch,unsigned char address)
{
	iic_start();
	write8bit(w_address);
	testack();
	write8bit(address);
	testack();
	write8bit(ch);
	testack();
	stop();
	delayms(10);
}
//从24c02中读出8个bit

unsigned char read8bit()
{
	unsigned char temp,rbyte=0;
	for(temp=8;temp!=0;temp--)
	{
		sdar=1;
		
		scl=1;
		rbyte=rbyte<<1;
		rbyte=rbyte|((unsigned char)(sda));
		scl=0;
	}
	return(rbyte);
}
//从24c02中读出1个字节
unsigned char read24c02(unsigned char address)
{
	unsigned char ch;
	iic_start();
	write8bit(w_address);
	testack();
	write8bit(address);
	testack();
	iic_start();
	write8bit(r_address);
	testack();
	ch=read8bit();
	noack();
	stop();
	return(ch);
}

//-----------------------------------------------
//		移位
//-----------------------------------------------
void	qdz8(unsigned char x)
	{
		unsigned char i, txbuf;
	txbuf = x;
	for(i=0;i<8;i++)
	 {
	  data = txbuf & 0x01;
	  
	  clk=0;
	  clk=1;
	  txbuf=txbuf>>1;
	 }
}
//-----------------------------------------------
//		16-10
//-----------------------------------------------
void 	d_aa(unsigned char x)
{
	unsigned char daa_low;
	if(flag_disp==0&&flag_temp_close==0)
	{
		daa_low = x;
		num3 = daa_low/100;
		num3 = frg[num3];
		daa_low = daa_low%100;
		num2 = daa_low/10;
		num2 = frg[num2];
		num1 = daa_low%10;
		num1 = frg[num1];
	}
}

//-----------------------------------------------
//		显示
//-----------------------------------------------
void	display()
{
	if(num3==0xc0&&num2==0xc0)
	{
	num2=num2|0x7f;	
	}
	if(num3==0xc0&&flag_temp_close==0)
	{
	num3=num3|0x7f;	
	}
//-----------------------------------------------
	if(temp_tall_e==1)
	{
		num3=num3-0x80;	
	}
	qdz8(num3);
	_pa1=0;
	_pa2=1;
	_pa3=1;
	delay(3);
	_pa1=1;
	delay(1);
	
	if(flag_temp_on==1)
	{
		num2=num2-0x80;	
	}
	qdz8(num2);
	_pa1=1;
	_pa2=0;
	_pa3=1;
	delay(3);
	_pa2=1;
	delay(1);
	
	
	qdz8(num1);

⌨️ 快捷键说明

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