标题:
ht66f018合泰单片机暖风机的C语言源程序
[打印本页]
作者:
736898032
时间:
2018-10-23 11:10
标题:
ht66f018合泰单片机暖风机的C语言源程序
0.png
(47.06 KB, 下载次数: 108)
下载附件
2018-10-23 15:14 上传
单片机源程序如下:
/***********************************************
1 建立基本框架
CONFIG.H/IO.H/TARGET.C.H/ISR.C.H/KEY.C.H/AD.C.H
2 加入TEMP.C.H,显示采样温度-----获得外部信号 -判断温度显示是否正常
3 确认按键操作有效
1 先设置默认华氏显示86;FC转换后,按键+-调整用户温度设置在15-30 (ADde 输入电阻建议4.7K,否则不稳定)
4 对于一些变量---初始定义的时候最好把初始值也赋值进去了---这样好
5 未断过电,开关机后--模式,设定温度不变
6 加入定时开机和定时关机的功能
方法:加入定时开机和定时关机标志位, 在定时按键里面判断当前处于何种状态,以及当前对按键的加减是对那方面的操作
在定时自减的结束时,根据标志位判断是开机还是关机
7 加入调温的连续加减程序 在按键的计时下面加入
8 按键锁: 长按电源键2S进入启动按键锁功能
9 加入断电记忆功能:
10 双键加锁
未能解决的问题: 首次上电那几秒屏幕不可控
***********************************************/
#include "config.h"
__ByteBits g_TimerFlag;
__ByteBits g_TimerFlag1;
__ByteBits g_RunFlag;
__ByteBits g_Run1Flag;
__ByteBits g_Run2Flag;
uint8 BeepCount=0;
uint8 PowOnWaitCnt=50;
uint8 EnvironmentTempF;
uint8 EnvironmentTempC;
uint8 UserTempSetF;
uint8 UserTempSetC;
uint8 TSetTempCnt;
uint8 TkeySetLook;
uint8 UserTimeSetH;
uint8 TSetTimerCnt;
uint8 UserSetMode;
void BeepProc(void);
void InitRam()
{
g_TimerFlag.tByte=0;
g_TimerFlag1.tByte=0;
g_RunFlag.tByte=0;
g_Run1Flag.tByte=0;
g_Run2Flag.tByte=0;
TempErro.tByte=0;
UserTempSetF=86;
gb_FC_Flag=TempUintF;
gb_FirstWork_Flag=1; //首次上电,首次开机,蜂鸣器想2声
}
void main(void)
{
_emi = 0;
Init_IO();
Init_Foc();
Init_Timer();
ISR_Parament_Init();
while(!_hto); //等待时钟稳定
_emi = 1;
while(PowOnWaitCnt)
{
PowOnWaitCnt--;
DisCode[2] =0;
DisCode[1]=0;
DisCode[0]=0;
}
Init_AD(); //AD前期不初始化是为了初始显示不乱码
InitRam();
bBeepf=1;bBeepSf=1;BeepCount=0;
while(1)
{
_clrwdt();
if(gT_5ms_Flag){gT_5ms_Flag=0;LedDispPro();}
if(gT_10ms_Flag){ gT_10ms_Flag=0;TempADCollect(); KeyScan();KeyProcess();BeepProc();}
// if(gT_50ms_Flag){ gT_50ms_Flag=0;}
if(gT_100ms_Flag){ gT_100ms_Flag=0; Base100ms();}
if(gT_250ms_Flag) {gT_250ms_Flag=0;}
if(gT_500ms_Flag){gT_500ms_Flag=0;gb_500ms_Flag^=1;}
if(gT_1s_Flag)
{
gT_1s_Flag=0;
SysWorkCtrl();
Base1s();
Memory_LastState();
fun_eeprom_Write(0x00, UserTempSetC);
fun_eeprom_Write(0x01, UserSetMode); //写入当前用户状态
}
}
}
/******************蜂鸣器的表达***********************************************
蜂鸣表达: bBeepf=1;bBeepSf=1;BeepCount=0;
长鸣3声表达:bBeepf=1;bBeepLf=1;BeepCount=0;
蜂鸣3声: bBeepf=1;bBeeAlf=1;BeepCount=0;
***************************************************************************/
void BeepProc(void)
{
if(bBeepSf)//蜂鸣
{ if(++BeepCount >= 10) { BeepCount=0; bBeepSf=0; bBeepf=0; } }
elseif(bBeepLf) //3声
{ BeepCount++;
if(BeepCount==40) { bBeepf=0; }
elseif(BeepCount==80) { bBeepf=1; }
elseif(BeepCount==120) { bBeepf=0; }
else if(BeepCount==160) { bBeepf=1; }
elseif(BeepCount>=200) { BeepCount=0; bBeepf=0; bBeepLf=0; }
}
else if(bBeepAlf)//3声
{ BeepCount++;
if(BeepCount==20) {bBeepf=0; }
elseif(BeepCount==40) { bBeepf=1; }
elseif(BeepCount==60) { bBeepf=0;}
else if(BeepCount==80) { bBeepf=0; }
elseif(BeepCount>=120)
{BeepCount=0; bBeepf=0; bBeepAlf=0;}
}
else { BeepCount =0;}
}
复制代码
/*********************************************************************
暖风机的工作控制:
1:加热有加热标志位和控制标志位的,标志位的开启并不代表实际的输出
2:根据用户设定模式判断,当前处于哪个状态
3:当前状态下,判断控制标志位是否开启
4:无论控制标志位是否开机,均开始计算时间
5:根据时间的大小来判定实际输出的时间
*********************************************************************/
#include "config.h"
void Base100ms(void);
static volatile unsigned char HEAT1OnTime __attribute__ ((at(0x1b0)));
static volatile unsigned char FanOnTime __attribute__ ((at(0x1b1)));
static volatile unsigned int FanOffTime __attribute__ ((at(0x1b2))); //当定义INT型时,占用两个地址,所以需要隔开
static volatile unsigned char HEAT1OffTime __attribute__ ((at(0x1b4)));
static volatile unsigned char HEAT2OffTime __attribute__ ((at(0x1b5)));
static volatile unsigned char HEAT2OnTime __attribute__ ((at(0x1b6)));
static volatile unsigned char TimerSec __attribute__ ((at(0x1b7)));
static volatile unsigned char TimerMin __attribute__ ((at(0x1b8)));
static volatile unsigned char TimerHour __attribute__ ((at(0x1b9)));
uint8 SysRunTime; //机器开机计时秒
uint8 FanOffDelayTime=0; //关机倒计时
uint8 TimeSelfCheck=50; //开机那个0.5S可以自检
void Base100ms(void);
void Base1s(void);
void SysWorkCtrl(void); //系统工作的控制(从全局把握系统的输出--不包含显示)
void FanCtrl(void); //风机控制程序(开机及执行,关机,延迟30S关掉)
void HeatCtrl(void); //加热管输出控制 加热什么时候开关的控制
void HiModeCtrl(void); //高热模式控制
void LoModeCtrl(void); //地热模式控制
void EcoModeCtrl(void); //节能模式控制 是否打开即热的控制--有了相应的控制标志位,在计算时间
void SecTimerCnt(void); //1S计时程序
void RunImpro(void); //非正常工作程序I
void SwCtrl(void);
void DDRember(void); //掉电记忆功能
void Base100ms(void) //100MS计时
{
if(TSetTimerCnt){TSetTimerCnt-=1;if(!TSetTimerCnt){gb_TimerSet_Flag=0;}}
if(TSetTempCnt){TSetTempCnt-=1;if(!TSetTempCnt){gb_TempSet_Flag=0;}}
if(TkeySetLook){TkeySetLook-=1;}
if(TimeSelfCheck){TimeSelfCheck-=1;}
if(gb_Fan_Flag) //风扇的计时
{
FanOffTime=0;
if(FanOnTime<=200) {FanOnTime+=1;} //风扇开启,累计计时20S
}
else
{
FanOnTime=0;
if(FanOffTime<=60000) {FanOffTime+=1;} //风扇关机的累计计时
}
if(gb_HEAT1_Flag) //加热的计时必须以实际加热开始计时,而不是标志位
{
HEAT1OffTime=0;
if(HEAT1OnTime<200) { HEAT1OnTime+=1; }
}
else
{
HEAT1OnTime=0;
if(HEAT1OffTime<200) { HEAT1OffTime+=1; }
}
if(gb_HEAT2_Flag) //加热的计时必须以实际加热开始计时,而不是标志位
{
HEAT2OffTime=0;
if(HEAT2OnTime<200) { HEAT2OnTime+=1; }
}
else
{
HEAT2OnTime=0;
if(HEAT2OffTime<200) { HEAT2OffTime+=1; }
}
}
void Base1s(void) //1S的计时
{
if(FanOffDelayTime)
{
FanOffDelayTime-=1;
}
if(UserTimeSetH) //定时的计数
{
TimerSec+=1;
if(TimerSec >= 59)
{
TimerSec=0;
TimerMin+=1;
if(TimerMin>=UserTimeSetH)
{
if(gb_PowerOn_Flag&&gb_TimeOff_Flag) //此位置1 ,说明处于开机状态
{
gb_TimeOff_Flag=0;
UserTimeSetH=0; //加这句是为了把时间计数的参数全部清0
gb_Timer_Flag=0;
gb_PowerOn_Flag=0; //关机
bBeepf=1;bBeepSf=1;BeepCount=0;
}
else if((!gb_PowerOn_Flag)&&gb_TimeOn_Flag)
{
gb_TimeOn_Flag=0;
UserTimeSetH=0;
gb_Timer_Flag=0;
gb_PowerOn_Flag=1; //开机
bBeepf=1;bBeepSf=1;BeepCount=0;
}
}
}
}
else
{
TimerSec=0;
TimerMin=0;
TimerHour=0;
}
}
void SysWorkCtrl(void) //分非正常模式和正常模式
{
if(TempErro.tByte)//非正常模式下的输出
{
if(gb_HEAT1Ctrl_Flag||gb_HEAT2Ctrl_Flag)
{
FanOffDelayTime=60; //关机60S的延迟
}
gb_HEAT1Ctrl_Flag=0;
gb_HEAT2Ctrl_Flag=0;
}
else //正常模式的输出
{
if(gb_PowerOn_Flag)
{
if(UserSetMode == HIMODE){HiModeCtrl();}
else if(UserSetMode == LOMODE){LoModeCtrl();}
else if(UserSetMode == ECMODE){EcoModeCtrl();}
}
else
{
if(gb_HEAT1Ctrl_Flag||gb_HEAT2Ctrl_Flag)
{
FanOffDelayTime=60; //关机60S的延迟
}
gb_HEAT1Ctrl_Flag=0;
gb_HEAT2Ctrl_Flag=0;
}
}
FanCtrl();
HeatCtrl();
}
void HiModeCtrl(void) //高档--对加热1 加热2 风扇的 控制
{
if(EnvironmentTempC>UserTempSetC) //温度中间状态 - 跟随上一个状态
{
if(gb_HEAT1Ctrl_Flag||gb_HEAT2Ctrl_Flag)
{
FanOffDelayTime=60; //关机60S的延迟
}
gb_HEAT1Ctrl_Flag=0;
gb_HEAT2Ctrl_Flag=0;
}
else if(EnvironmentTempC<UserTempSetC)
{
gb_HEAT1Ctrl_Flag=1;
gb_HEAT2Ctrl_Flag=1;
}
}
void LoModeCtrl(void) //低档--对加热1 加热2 风扇的 控制
{
gb_HEAT2Ctrl_Flag=0;
if(EnvironmentTempC>UserTempSetC)
{
if(gb_HEAT1Ctrl_Flag)
{
FanOffDelayTime=60;
}
gb_HEAT1Ctrl_Flag=0;
}
else if(EnvironmentTempC<UserTempSetC)
{
gb_HEAT1Ctrl_Flag=1;
}
}
void EcoModeCtrl(void) //节能模式 低挡开,高档来回开
{
gb_HEAT1Ctrl_Flag=1;
if( EnvironmentTempC > UserTempSetC )
{
if(gb_HEAT2Ctrl_Flag)
{
FanOffDelayTime=60;
}
gb_HEAT2Ctrl_Flag=0;
}
else if(EnvironmentTempC<UserTempSetC)
{
gb_HEAT2Ctrl_Flag=1;
}
}
void FanCtrl(void) //风扇开启的前提是开机/关机后的延迟时间60S/温度达到设定温度后,加热停止工作,风扇再转60S
{
if(gb_PowerOn_Flag||FanOffDelayTime||gb_HEAT1Ctrl_Flag||gb_HEAT2Ctrl_Flag)
{
gb_Fan_Flag=1; //次标志位开启,及代表风扇已经再转,同时可以计时了
FANON();
}
else
{
gb_Fan_Flag=0;
FANOFF();
}
}
void HeatCtrl(void)
{
if(gb_HEAT1Ctrl_Flag) //低档HEAT1加热功能的开启 开条件(风扇3S和其关闭3S以上)
{
if(gb_HEAT1_Flag) { HEAT1ON();}
else if((FanOnTime>=30)&&(HEAT1OffTime>=30)) //第一次开启加热标志位
{
gb_HEAT1_Flag=1;
HEAT1ON();
}
else
{
gb_HEAT1_Flag=0;
HEAT1OFF();
}
}
else if(((gb_HEAT1_Flag==1)&&(HEAT2OffTime>=30))||(gb_HEAT1_Flag==0) ) //低档加热功能的关闭 关条件 -- 加热1在开启中同时加热2关闭3S以上——加热1已经关闭
{
gb_HEAT1_Flag=0;
HEAT1OFF();
}
if(gb_HEAT2Ctrl_Flag) //高挡HEAT2即热功能的开启和关闭 (加热1开3S以上和加热2关3S以上--加热2已开启)
{
if(gb_HEAT2_Flag) { HEAT2ON(); }
else if((HEAT1OnTime>=30)&&(HEAT2OffTime>=30))
{
gb_HEAT2_Flag=1;
HEAT2ON();
}
}
else
{
gb_HEAT2_Flag=0;
HEAT2OFF();
}
}
void DDRember(void)
{
if(gb_PowerOn_Flag)
{
fun_eeprom_Write(0x00, UserTempSetC);
fun_eeprom_Write(0x01, UserSetMode);
}
else
{
UserSetMode=fun_eeprom_Read(0x01);
UserTempSetC=fun_eeprom_Read(0x00);
}
}
复制代码
所有资料51hei提供下载:
91N-66F018.zip
(167.25 KB, 下载次数: 229)
2018-10-23 11:09 上传
点击文件名下载附件
暖风机原理图&源代码
下载积分: 黑币 -5
作者:
admin
时间:
2018-10-23 15:19
好东东 楼主能分享下原理图吗?
作者:
Wangshenghuai
时间:
2018-11-16 22:31
好东西
作者:
Wangshenghuai
时间:
2018-11-16 22:35
很不错
作者:
at366
时间:
2019-1-15 19:50
刚开始学,谢谢楼主分享
作者:
新攻城狮
时间:
2019-3-18 08:42
刚用合泰的芯片,过来学习一下。
作者:
liupam
时间:
2019-5-16 16:09
非常有价值的参考程度。
作者:
小小米
时间:
2019-9-17 09:12
赞一个
作者:
lux169
时间:
2019-9-25 13:54
下载了,谢谢
作者:
双城
时间:
2019-12-6 10:18
好东西,刚好想学一下合泰
作者:
liupam
时间:
2020-5-20 16:47
非常感谢,因你,我学合泰大有进步!
作者:
meady
时间:
2020-6-19 23:23
过来学习一下合泰的芯片
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1