📄 sangna.c
字号:
//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 + -