📄 s3f9454.c
字号:
//********************************
//产品名称: NEW_KJ09H
//使用MCU: S3F9454
//FOSC = 3.2MHZ
//********************************
#include "ioS3C9454.h"//
#include "iobit.h" //IO端口位操作定义文件
#include "intrinsics.h"//包含内部函数
//************************************************
//**此处为宏定义替换******
#define uchar unsigned char
#define uint unsigned int
#define nop (__no_operation())
#define di (__disable_interrupt())
#define ei (__enable_interrupt())
//************************************************
//**此处定义程序所用到的全局变量*******
uchar RUNFLAG = 0;
uchar DISPFLAG = 0;
uchar ERRFLAG = 0; //错误代码标志寄存器
uchar TMR_1SL = 0; //定时器1S计数器低位
uchar TMR_1SH = 0; //定时器1S计数器高位
uchar SECOND = 0; //定时器秒计数器
uchar IGBTAD_DT = 0; //IGBT温度检测值
uchar KEY_CODE = 0; //键扫描码
uchar FUNC_LOOP = 0; //功能执行步定义
uchar CURAD_DT = 0; //当前运行电流电压检测值
uchar HSRAD_DT = 0; //炉盘热敏温度检测值
uchar FIRE_SELE = 0; //
uchar IM_LOOP = 0; //间歇加热模式计数器
uchar DELAY_3S = 0; //3S延时计数器
uchar DELAY_2M = 0; //2分钟延时计数器
uchar DELAY_FREE = 0; //间歇延时计数器
uchar DELAY_RUN = 0; //加热延时计数器
uchar DELAY_PV = 0; //电源电压异常时延时计数器
uchar DELAY_2H = 0; //2小时关机定时器
uchar PVAD_DT = 0; //电源电压检测值
uchar TMR_FAST = 0; //
uchar DIGITA = 0; //
uchar DIGITB = 0; //
uchar DIGITC = 0; //
uchar DIGITD = 0; //
uchar SEG_A = 0; //
uchar SEG_B = 0; //
uchar SEG_C = 0; //
uchar SEG_D = 0; //
uchar LED_LOOP = 0; //
uchar TMRFLAG = 0; //
uchar DELAY_HOTA = 0; //
uchar DELAY_HOTB = 0; //
uchar DELAY_HOTC = 0; //
//*************************************************************************
//**位变量操作宏定义
//系统运行操作标志位定义
#define Set_KeyDown (RUNFLAG = RUNFLAG | 0x1)
#define Set_NoFz (RUNFLAG = RUNFLAG | 0x2)
#define Set_ImMode (RUNFLAG = RUNFLAG | 0x4)
#define Set_NoAd (RUNFLAG = RUNFLAG | 0x8)
#define Set_HandStart (RUNFLAG = RUNFLAG | 0x10)
#define Set_OnOff (RUNFLAG = RUNFLAG | 0x20)
#define Set_FastMode (RUNFLAG = RUNFLAG | 0x40)
#define Clr_KeyDown (RUNFLAG = RUNFLAG & ~0x1)
#define Clr_NoFz (RUNFLAG = RUNFLAG & ~0x2)
#define Clr_ImMode (RUNFLAG = RUNFLAG & ~0x4)
#define Clr_NoAd (RUNFLAG = RUNFLAG & ~0x8)
#define Clr_HandStart (RUNFLAG = RUNFLAG & ~0x10)
#define Clr_OnOff (RUNFLAG = RUNFLAG & ~0x20)
#define Clr_FastMode (RUNFLAG = RUNFLAG & ~0x40)
#define Test_KeyDown (RUNFLAG & 0x1)
#define Test_NoFz (RUNFLAG & 0x2)
#define Test_ImMode (RUNFLAG & 0x4)
#define Test_NoAd (RUNFLAG & 0x8)
#define Test_HandStart (RUNFLAG & 0x10)
#define Test_OnOff (RUNFLAG & 0x20)
#define Test_FastMode (RUNFLAG & 0x40)
#define Com_FastMode (RUNFLAG = RUNFLAG ^ 0x40)
//系统显示标志位定义
#define Set_DesMode (DISPFLAG = DISPFLAG | 0x1)
#define Set_TmrWait (DISPFLAG = DISPFLAG | 0x2)
#define Set_FireWait (DISPFLAG = DISPFLAG | 0x4)
#define Set_PvWait (DISPFLAG = DISPFLAG | 0x8)
#define Set_DiFireDisp (DISPFLAG = DISPFLAG | 0x10)
#define Set_DiTmrDisp (DISPFLAG = DISPFLAG | 0x20)
#define Set_DiFireTmr (DISPFLAG = DISPFLAG | 0x40)
#define Set_TmrMode (DISPFLAG = DISPFLAG | 0x80)
#define Clr_DesMode (DISPFLAG = DISPFLAG & ~0x1)
#define Clr_TmrWait (DISPFLAG = DISPFLAG & ~0x2)
#define Clr_FireWait (DISPFLAG = DISPFLAG & ~0x4)
#define Clr_PvWait (DISPFLAG = DISPFLAG & ~0x8)
#define Clr_DiFireDisp (DISPFLAG = DISPFLAG & ~0x10)
#define Clr_DiTmrDisp (DISPFLAG = DISPFLAG & ~0x20)
#define Clr_DiFireTmr (DISPFLAG = DISPFLAG & ~0x40)
#define Clr_TmrMode (DISPFLAG = DISPFLAG & ~0x80)
#define Test_DesMode (DISPFLAG & 0x1)
#define Test_TmrWait (DISPFLAG & 0x2)
#define Test_FireWait (DISPFLAG & 0x4)
#define Test_PvWait (DISPFLAG & 0x8)
#define Test_DiFireDisp (DISPFLAG & 0x10)
#define Test_DiTmrDisp (DISPFLAG & 0x20)
#define Test_DiFireTmr (DISPFLAG & 0x40)
#define Test_TmrMode (DISPFLAG & 0x80)
//系统定时操作标志位定义
#define Set_HalfSedA (TMRFLAG = TMRFLAG | 0x1)
#define Set_HalfSedB (TMRFLAG = TMRFLAG | 0x2)
#define Set_HalfSedC (TMRFLAG = TMRFLAG | 0x4)
#define Set_OneSedA (TMRFLAG = TMRFLAG | 0x8)
#define Set_OneSedB (TMRFLAG = TMRFLAG | 0x10)
#define Set_OneSedC (TMRFLAG = TMRFLAG | 0x20)
#define Set_OneSedD (TMRFLAG = TMRFLAG | 0x40)
#define Clr_HalfSedA (TMRFLAG = TMRFLAG & ~0x1)
#define Clr_HalfSedB (TMRFLAG = TMRFLAG & ~0x2)
#define Clr_HalfSedC (TMRFLAG = TMRFLAG & ~0x4)
#define Clr_OneSedA (TMRFLAG = TMRFLAG & ~0x8)
#define Clr_OneSedB (TMRFLAG = TMRFLAG & ~0x10)
#define Clr_OneSedC (TMRFLAG = TMRFLAG & ~0x20)
#define Clr_OneSedD (TMRFLAG = TMRFLAG & ~0x40)
#define Test_HalfSedA (TMRFLAG & 0x1)
#define Test_HalfSedB TMRFLAG & 0x2)
#define Test_HalfSedC (TMRFLAG & 0x4)
#define Test_OneSedA (TMRFLAG & 0x8)
#define Test_OneSedB (TMRFLAG & 0x10)
#define Test_OneSedC (TMRFLAG & 0x20)
#define Test_OneSedD (TMRFLAG & 0x40)
//P0端口功能定义
#define Set_AutoLed Set_P00
#define Set_HandLed Set_P01
#define Test_AutoLed Test_P00
#define Test_HandLed Test_P01
#define Clr_AutoLed Clr_P00
#define Clr_HandLed Clr_P01
#define Com_AutoLed Com_P00
#define Com_HandLed Com_P01
//P1端口功能定义
#define Set_164sdt Set_P10
#define Set_164sck Set_P11
#define Clr_164sdt Clr_P10
#define Clr_164sck Clr_P11
#define Set_FansPfd Set_P20
#define Set_LedACtrl Set_P21
#define Set_LedBCtrl Set_P22
#define Set_LedCCtrl Set_P23
#define Set_LedDCtrl Set_P24
#define Set_FastLed Set_P25
#define Clr_FansPfd Clr_P20
#define Clr_LedACtrl Clr_P21
#define Clr_LedBCtrl Clr_P22
#define Clr_LedCCtrl Clr_P23
#define Clr_LedDCtrl Clr_P24
#define Clr_FastLed Clr_P25
#define Com_FansPfd Com_P20
#define Com_FastLed Com_P25
#define Test_FansPfd Test_P20
//部分通用宏操作定义
#define Clr_WatchDog (BTCON = BTCON | 0x2)
#define Test_ADOK (ADCON & 0x8)
//*************************************************************************
//***程序所用函数声明*****
//***凡程序中所用到的函数请先在这里声明***
__interrupt void int_9454();
extern void beep();
void chip_init();
void TmrCheck();
void AutoTea();
void PwmCtrl();
void ImCheck();
void ConvertCode();
void DigitConvert();
void ErrCodeConvert();
void KeyScan();
uchar KeyTest();
void FzCheck();
void Current_Check();
void Delay(unsigned int);
void V18Check();
void HsrCheck();
void IgbtCheck();
void PvCheck();
void Beep(uchar);
void LedScan();
void SendTo164(uchar);
//*************************************************************************
//**定义9454的SMART OPTION值****
//**003CH,must be initialized to 0
//**003DH,must be initialized to 0
//**003EH,enable LVR(2.3V)
//**003FH,internal RC(3.2MHZ in Vdd=5V)
//*************************************
__code const volatile uchar SmartOption[4] @0x003c = {0x0,0x0,0xe7,0x03};
//*************************************************************************
//出错代码值定义
#define ERC_PVH 0x1
#define ERC_PVL 0x2
#define ERC_IGBT_OPEN 0x3
#define ERC_IGBT_HOT 0x4
#define ERC_HSR_OPEN 0x5
#define ERC_HSR_HOT 0x6
#define FAST_KEY 0x1
#define AUTO_KEY 0x2
#define HAND_KEY 0x3
#define OFF_KEY 0x4
#define NO_KEY 0xff
#define FUNC_OK 0x80
//*************************************************************************
//数码管显示代码定义(在ROM=0X40)
__code const volatile uchar DigitCode[12] @0x0040 =
{
0x03, //'0'
0x9f, //'1'
0x25, //'2'
0x0d, //'3'
0x99, //'4'
0x49, //'5'
0x41, //'6'
0x1f, //'7'
0x01, //'8'
0x09, //'9'
0xff, //'A'
0x61, //'E'
};
//**************************************************************************
//========================主程序控制===========================
void main(void)
{
//***填充系统SMART OPTION***/
uchar buffer = SmartOption[0];
asm("LD R0,#1");
asm("LD RUNFLAG,R0");
asm("LD P0,R0");
//***初始化过程***//
chip_init();
main_start:
//***主循环开始***//
ei;
Clr_OnOff;
Clr_AutoLed;
Clr_HandLed;
Clr_FastLed;
TMRFLAG = 0;
DISPFLAG = 0;
DELAY_2M = 0;
KEY_CODE = 0;
PWMDATA = 0;
asm("and RUNFLAG,#0x1");
ConvertCode();
if (ERRFLAG)
{
Beep(4);
Delay(50);
Beep(4);
Delay(50);
Beep(4);
Delay(50);
Beep(4);
}
else
{
Beep(0xf);
}
while(!Test_OnOff)
{
asm("push ERRFLAG");
IgbtCheck();
asm("pop ERRFLAG");
if (IGBTAD_DT <= 0x28)
Clr_FansPfd;
else if (IGBTAD_DT > 0x66)
Set_FansPfd;
KeyScan();
}
//启动初始化
DELAY_2H = 0;
DELAY_2M = 0;
FIRE_SELE = 0x2;
//***工作循环开始***//
while(Test_OnOff)
{
//按键检查//
ERRFLAG = 0;
KeyScan();
if (!Test_OnOff)
break;
//电源电压及18V电压检查//
if (Test_PvWait)
goto tmr_check;
V18Check();
if (ERRFLAG)
{
DELAY_PV = 0x3;
goto wait_pv;
}
else
{
PvCheck();
if (!ERRFLAG)
goto chk_hsr;
DELAY_PV = 0;
}
//如果电压出错,则等待2-3S//
wait_pv:
ERRFLAG = 0;
Set_NoFz;
Set_NoAd;
Clr_ImMode;
Set_PvWait;
PWMDATA = 0;
goto tmr_check;
//炉盘热敏检查//
chk_hsr:
HsrCheck();
if (ERRFLAG)
break;
//IGBT热敏检查//
IgbtCheck();
if (ERRFLAG)
break;
//间断加热工作检查//
ImCheck();
//加锅状态检查//
FzCheck();
if (!Test_OnOff)
break;
//功率控制输出检查//
PwmCtrl();
//检查当前工作状态//
if (Test_FastMode)
{
//如果选择了快速加热模式//
FIRE_SELE = 0x1;
if ((KEY_CODE == AUTO_KEY)&&(TMR_FAST > 0x78))
{
Clr_FastMode;
Clr_FastLed;
FIRE_SELE = 0x2;
}
else if ((KEY_CODE == HAND_KEY)&&(TMR_FAST > 0xf0))
{
Clr_FastMode;
Clr_FastLed;
FIRE_SELE = 0x2;
}
}
//检查自动泡茶状态//
if (KEY_CODE == AUTO_KEY)
{
AutoTea();
}
tmr_check:
//显示代码转换及定时运行检查//
ConvertCode();
TmrCheck();
}
goto main_start;
}
//******************************************************************
//****启动时IO初始化子过程******
void chip_init()
{
Clr_KeyDown;
BTCON = 0xa3; //Watch-dog disable
CLKCON = 0x18; //selet non-divided CPU clock
P0PND = 0x0; //P0/INT disable
P0CONH = 0xdf; //P0.7 is as A/D convert port
//P0.6 is PWM output
//P0.5 is as A/D convert port
//P0.4 is as A/D convert port
P0CONL = 0xfa; //P0.3 is as A/D convert port
//P0.2 is as A/D convert port
//P0.0,P0.1 is as push-pull output port
P0 = 0x0;
P1CON = 0xa; //P1.0 is as push-pull output port
//P1.1 is as push-pull output port
P1 = 0x0;
P2CONH = 0x2a; //P2.0-P2.5 is as push-pull output
P2CONL = 0xaa; //P2.6 is as A/D input
P2 = 0x1e;
PWMDATA = 0x0;
PWMCON = 0x5c; //PWM input clock is fosc/8,enable PWM output
//reload from 6 bit coun
T0DATA = 0x32;
T0CON =0x4a; //TMR0 start count,f=fosc/256
//enable TMR0 interrupt/4ms
P2 = 0xff;
SEG_A = 0xff;
SEG_B = 0xff;
SEG_C = 0xff;
SEG_D = 0xff;
Delay(500);
P2 = 0x0;
PvCheck();
if (ERRFLAG)
{
goto init_back;
}
IgbtCheck();
if (!ERRFLAG)
{
goto hsr_chk;
}
Set_FansPfd;
goto init_back;
hsr_chk:
HsrCheck();
//***初始化出口***//
init_back:
return;
}
//**********************************************************************
//功率控制PWM输出子过程
void PwmCtrl()
{
uchar set;
////////////////
if ((Test_NoFz)||(Test_NoAd)) //如果当前未加锅或处于禁止控制状态,则不予处理
goto pwm_back;
di;
switch(FIRE_SELE)
{
case 1:
set = 0xff;
break;
case 2:
set = 0xba;
break;
default:
set = 0x90;
break;
}
if (PWMDATA > set)
{
if (PWMDATA > 0x2)
PWMDATA--;
}
else if (PWMDATA < set)
{
if (PWMDATA < 0xfc)
PWMDATA++;
}
pwm_back:
ei;
return;
}
//**********************************************************************
//定时运行检查子过程
void TmrCheck()
{
if (!Test_OneSedB)
goto tmr_back;
Clr_OneSedB;
di;
if (!Test_PvWait)
{
if (DELAY_2H < 0x78)
goto tmr_back;
Clr_OnOff;
goto tmr_back;
}
DELAY_PV++;
if (DELAY_PV < 0x5)
goto tmr_back;
PvCheck();
if (!ERRFLAG)
V18Check();
Clr_OnOff;
if (!ERRFLAG)
{
Set_OnOff;
Clr_PvWait;
}
tmr_back:
ei;
return;
}
//*************************************************************************
//间断加热模式控制子过程
void ImCheck()
{
Clr_WatchDog;
if ((Test_NoFz)||(!Test_ImMode)||(!Test_OneSedD))
goto im_back;
di;
if (IM_LOOP--)
goto im_back;
if (!Test_NoAd)
{
Clr_NoAd;
Set_NoFz;
DELAY_3S = 0xf0;
IM_LOOP = DELAY_RUN;
goto im_back;
}
else
{
Set_NoAd;
PWMDATA = 0;
IM_LOOP = DELAY_FREE;
}
im_back:
ei;
return;
}
//*************************************************************************
//整机显示转换子过程
void ConvertCode()
{
Clr_WatchDog;
di;
if (!Test_OnOff)
{
if (ERRFLAG)
ErrCodeConvert();
else
{
SEG_A = 0xff;
SEG_B = 0xff;
SEG_C = 0xff;
SEG_D = 0xff;
}
goto cvt_back;
}
DIGITA = 0xa;
DIGITC = 0;
DIGITD = 0;
switch(FIRE_SELE)
{
case 1:
DIGITA = 0x1;
DIGITB = 0x2;
break;
case 2:
DIGITB = 0x9;
break;
case 3:
DIGITB = 0x6;
break;
case 4:
DIGITB = 0x2;
break;
default:
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -