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

📄 sangna.c

📁 用HOLTEK单片机做的一个实际项目
💻 C
📖 第 1 页 / 共 2 页
字号:
//sangna.c
//
//Body: HT46r22
//Mask option
//All the mask options use the default value.
//*********************************************************************************************************
//**硬件平台:		HT46R22                                           
//**晶	振:		4Mhz                                   
//**
//**                                
//**                                
//**
//**--------------文件信息--------------------------------------------------------------------------------
//**文   件   名: sangna.C
//**创   建   人: 龚树强
//**最后修改日期: 2004年9月29日
//**描        述: 桑拿温度控制
//**
//**--------------历史版本信息----------------------------------------------------------------------------
//** 创建人: 龚树强
//** 版  本: V1.0
//** 日 期: 2004年9月29日
//** 描 述: 原始版本,应用于桑拿温度控制板
//**
//**------------------------------------------------------------------------------------------------------
//** 修改人:
//** 版  本:
//** 日 期:
//** 描 述:
//**
//**--------------当前版本修订------------------------------------------------------------------------------
//** 修改人: 
//** 日 期: 
//** 描 述: 
//**
//**------------------------------------------------------------------------------------------------------
//********************************************************************************************************
#include <ht46r22.h>															//HT46R22 , 4Mhz OSC ,5v

#pragma vector _ExternISR 	@ 0x4
#pragma vector _Timer0ISR 	@ 0x8
#pragma vector _ADISR 		@ 0xc

			
#define TEST_BIT			1

#define	AT24ADDR			0xA0									

#define	IDLE				0
#define	RUN					3													//系统状态 RUN		
#define	SET_TIME			1													//系统状态 SET_TIME
#define	SET_TEMPERATURE		2													//系统状态 SET_TEMPERATURE

#define	SAFE_TEMPERATURE	67													//安全温度

#define	AD_TIMER			100													//AD采样间隔
#define	DISINFACT_TIMER		1800												//消毒时间	
#define	DRAIN_TIMER			61													//排水时间		

#define	NEXT_SCAN_INTERVAL  2													//下次扫描间隔
#define	DELAY_INTERVAL		60													//延迟间隔

#define	SER_DATA0			_pd0												//串行输出数据端0
#define	SER_CLK0			_pa2												//串行输出时钟端0

#define	SER_DATA1			_pc0												//串行输出数据端1
#define	SER_CLK1			_pb1												//串行输出时钟端1

#define	SDA					_pb3
#define	SCL					_pb2

#define	SDA_DIR				0x08		

#define	SDA_IN()			(_pbc|=SDA_DIR)
#define	SDA_OUT()			(_pbc&=(~SDA_DIR))

#define	DISP_SEL0			_pa4												//LED显示选择0
#define	DISP_SEL1			_pa6												//LED显示选择1
#define	DISP_SEL2			_pb6												//LED显示选择2
#define	DISP_SEL3			_pb7												//LED显示选择3
		
#define	BEEP				_pc1												//蜂鸣器

#define	KEY_UP		 		0													//上键
#define	KEY_SET		 		1													//设定键
#define	KEY_DOWN	 		2													//下键
#define	KEY_DISINFACT 		3													//消毒键
#define	KEY_FAN 			4													//风扇键
#define	KEY_LIGHT	 		5													//灯键
#define	KEY_POWER			6													//电源键

#define	KEY_COM				_pa5												//键公共端

#define	OUTPUT_DISINFACT 	_pa0												//消毒输出
#define	OUTPUT_LIGHT	 	_pa3												//灯输出
#define	OUTPUT_FAN 			_pa1												//风扇输出
#define	OUTPUT_POWER 		_pb5												//电源输出
#define	OUTPUT_HEAT 		_pb4												//加热输出
#define	OUTPUT_DRAIN		_pa7												//排水输出

#define	ANOLOG_INPUT		_pb0												//模拟输入端


void _ExternISR(); 																// external ISR
void _Timer0ISR(); 																// timer/event 0 ISR
void _ADISR(); 																	// AD ISR

unsigned char _SysState;														//系统状态

unsigned int _SecondTimer;														//系统节拍计数器

unsigned int _ButtonScanTimer;													//按键扫描计时器
unsigned int _ADTimer;															//AD计时器

unsigned long _DisinfactTimer;													//消毒计时器	
unsigned int _DrainTimer;														//排水计时器

unsigned long _Timer;															//当前时间

unsigned long _PreSettedTemperature;											//预设温度
unsigned long _CurrentTemperature;												//当前温度	

unsigned char _StateReg;														//状态寄存器

unsigned char _InputReg;														//输入寄存器
unsigned char _PreInputReg;

unsigned char _LedSequence;														//LED显示序列

unsigned long _Rtemperature;													//热敏电阻阻值																															


bit _Flag_KeyPressed;

bit _Flag_Power;																

				
	
const unsigned int _DispTbl[16] ={
									0xC0,0xF9,0xA4,0xB0,0x99,
									0x92,0x82,0xF8,0x80,0x90,
									0x88,0x83,0xC6,0xA1,0x86,0x8E
								};
const unsigned long _TempTbl[70] ={
									 	16491,15663,14881,14144,13447,
										12789,12167,11579,11023,10497,
										9999,9528,9081,8659,8259,
										7879,7519,7178,6854,6547,
										6254,5977,5714,5463,5226,
										5000,4785,4580,4386,4200,
										4024,3856,3696,3543,3398,
										3259,3127,3000,2880,2765,
										2655,2551,2450,2355,2264,
										2176,2093,2013,1937,1864,
										1794,1727,1663,1602,1543,
										1487,1433,1381,1331,1284,
										1238,1194,1162,1122,1073,
										1036,1000,966,933,902
									};




//timer0 interrupt function
void _Timer0ISR(void)
{
	unsigned char i;
	
	unsigned long temp;
	
	_SecondTimer--;
	if(!_SecondTimer)
	{
		if(_SysState==RUN)
		{
			if(_Timer>0)
			{
				if(_Timer<5940)
				{
#if		TEST_BIT
					_Timer-=60;
#else	
					_Timer--;
#endif
				}
			}
			else
			{
				_Flag_KeyPressed=1;
				_InputReg=0xFF;
				_PreInputReg=0xBF;
			}
		}
		if(_DisinfactTimer)
		{
#if		TEST_BIT
			_DisinfactTimer-=360;
#else
			_DisinfactTimer--;
#endif
		}
		if(_DrainTimer)
		{
#if		TEST_BIT
			if(_DrainTimer>1)
			{
				_DrainTimer-=10;
			}
			else
			{
				_DrainTimer--;
			}
#else
			_DrainTimer--;
#endif
		}
		
		
		_SecondTimer=250;
	}
	if(_SysState==RUN)
	{
		if(_CurrentTemperature<(_PreSettedTemperature-1))
		{
			OUTPUT_HEAT=1;
		}
		else if(_CurrentTemperature>=_PreSettedTemperature)
		{
			OUTPUT_HEAT=0;
		}
	}
	else
	{
		OUTPUT_HEAT=0;
	}
	if(_ADTimer)
	{
		_ADTimer--;
	}
	if(_ButtonScanTimer)
	{
		_ButtonScanTimer--;
	}
	
	
	
//****************************************************************************************************************
//****************************************   Display  Flash  Section           ***********************************
//****************************************************************************************************************
		
	DISP_SEL0=1;
	DISP_SEL1=1;
	DISP_SEL2=1;
	DISP_SEL3=1;

	switch(_LedSequence)
	{
		case	0		:	temp=(_Timer+59)/600;
							break;
		case	1		:	temp=(_Timer+59)/60;
							temp%=10;
							break;
		case	2		:	if((_SysState==RUN)||(_SysState==IDLE))
							{	
								if((_CurrentTemperature==0xFF)||(_CurrentTemperature==0xF0))
								{
									temp=_CurrentTemperature>>4;
									OUTPUT_HEAT=0;
								}
								else
								{
									temp=_CurrentTemperature/10;
								}
							}
							else
							{
								temp=_PreSettedTemperature/10;
							}
							
							break;
		case	3		:	if((_SysState==RUN)||(_SysState==IDLE))
							{	
								if((_CurrentTemperature==0xFF)||(_CurrentTemperature==0xF0))
								{
									temp=_CurrentTemperature&0x0F;
									OUTPUT_HEAT=0;
								}
								else
								{
									temp=_CurrentTemperature%10;
								}
							}
							else
							{
								temp=_PreSettedTemperature%10;
							}
							break;
		default			:	break;
	}
	
	
	i=_DispTbl[temp];
	temp=i;
	if(_SecondTimer>125)
	{
		if((_SysState==SET_TIME)&&(!((~_InputReg)&0x05)))
		{
			switch(_LedSequence)
			{
				case	0		:	
				case	1		:	temp=0xFF;
									break;
					
				default			:	break;
			}
		}
		else if((_SysState==SET_TEMPERATURE)&&(!((~_InputReg)&0x05)))
		{
			switch(_LedSequence)
			{
				case	2		:	
				case	3		:	temp=0xFF;
									break;
				
				default			:	break;
			}
		}
		else
		{
			if(_LedSequence==1)
			{
				if(_SysState==RUN)
				{
					temp&=0x7F;
				}
			}
		}
		
	}
	
	for(i=8;i--;)
	{
		SER_CLK0=0;
		
		if(temp&0x80)
		{
			SER_DATA0=1;	
		}
		else 
		{
			SER_DATA0=0;
		}

		SER_CLK0=1;

		temp<<=1;

		
	}
	SER_CLK0=0;

	if(_Flag_Power)
	{
		switch(_LedSequence)
		{
			case	0		:	DISP_SEL0=0;
								break;
			case	1		:	DISP_SEL1=0;
								break;
			case	2		:	DISP_SEL2=0; 
								break;
			case	3		:	DISP_SEL3=0;
								break;
			default			:	break;
		}
	}

	_LedSequence++;
	if(_LedSequence>3)
	{
		_LedSequence=0;
	}

}


//AD interrupt function
void _ADISR(void)
{
	unsigned char i,j;
	
	unsigned long temp;

	temp=_adrh;
	temp<<=1;
	if(_adrl&0x80)
	{
		temp++;
	}

	_Rtemperature=100*temp;
	temp=512-temp;
	_Rtemperature/=temp;
	_Rtemperature*=30;

	if(_Rtemperature>20000)
	{
		_CurrentTemperature=0xFF;
	}
	else if(_Rtemperature<20)
	{
		_CurrentTemperature=0xF0;
	}
	else
	{
		i=69;
		j=0;
	
		for(;;)
		{
			temp=_TempTbl[(i+j)/2];

			if(_Rtemperature<temp)
			{
				if(j<(i-1))
				{
					j=(i+j)/2;
					continue;	
				}	
				else
				{
					break;
				}
				
			}	
			else
			{
				if(j<(i-1))
				{
					i=(i+j)/2;
					continue;	
				}	
				else
				{
					break;
				}
			}
		}
		_CurrentTemperature=(i+j)/2;		
	}	
	
			
	return;
}

//extern interrupt function
void _ExternISR()
{
	return;
}


//initialize registers for safeguard
void safeguard_init()
{
	_intc0 = 0x0D;

	_tmrc = 0x86;																	// fint=fsys(4M)/64
	_tmr = 4;																		// Tint=(1/fint)*250=4ms

	_adcr=0x08;																		//AN0开启

	_pac = 0x20; 																	//pa7:0 | pa6:0 | pa5:1 | pa4:0 | pa3:0 | pa2:0 | pa1:0 | pa0:0 
	_pa = 0;

	_pbc = 0x01; 																	//pb7:0 | pb6:0 | pb5:0 | pb4:0 | pb3:0 | pb2:0 | pb1:0 | pb0:1 
	_pb = 0; 
	
	_pcc = 0x00; 																	//pc7:0 | pc6:0 | pc5:0 | pc4:0 | pc3:0 | pc2:0 | pc1:0 | pc0:0 
	_pc = 0; 
	
	_pdc = 0x00; 																	//pd7:0 | pd6:0 | pd5:0 | pd4:0 | pd3:0 | pd2:0 | pd1:0 | pd0:0 
	_pd = 0; 
																	
}

void Start_I2C(void)       //启动I2C总线
{
   SDA=1;
   _nop();
   _nop();
   _nop();
   SCL=1;
   _nop();
   _nop();
   _nop();
   _nop();
   _nop();
   _nop();
   _nop();

⌨️ 快捷键说明

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