找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 8087|回复: 11
收起左侧

ht66f018合泰单片机暖风机的C语言源程序

  [复制链接]
ID:277976 发表于 2018-10-23 11:10 | 显示全部楼层 |阅读模式
0.png

单片机源程序如下:
  1. /***********************************************
  2.   1 建立基本框架
  3.        CONFIG.H/IO.H/TARGET.C.H/ISR.C.H/KEY.C.H/AD.C.H
  4.     2 加入TEMP.C.H,显示采样温度-----获得外部信号 -判断温度显示是否正常
  5.     3 确认按键操作有效
  6.            1 先设置默认华氏显示86;FC转换后,按键+-调整用户温度设置在15-30  (ADde 输入电阻建议4.7K,否则不稳定)
  7.     4 对于一些变量---初始定义的时候最好把初始值也赋值进去了---这样好
  8.     5 未断过电,开关机后--模式,设定温度不变
  9.     6 加入定时开机和定时关机的功能
  10.                    方法:加入定时开机和定时关机标志位,   在定时按键里面判断当前处于何种状态,以及当前对按键的加减是对那方面的操作
  11.                         在定时自减的结束时,根据标志位判断是开机还是关机
  12.     7 加入调温的连续加减程序   在按键的计时下面加入
  13.     8 按键锁: 长按电源键2S进入启动按键锁功能   
  14.     9 加入断电记忆功能:  
  15.     10 双键加锁
  16.     未能解决的问题: 首次上电那几秒屏幕不可控
  17. ***********************************************/
  18. #include "config.h"
  19. __ByteBits g_TimerFlag;
  20. __ByteBits g_TimerFlag1;
  21. __ByteBits g_RunFlag;
  22. __ByteBits g_Run1Flag;
  23. __ByteBits g_Run2Flag;
  24. uint8 BeepCount=0;
  25. uint8 PowOnWaitCnt=50;
  26. uint8 EnvironmentTempF;
  27. uint8 EnvironmentTempC;
  28. uint8 UserTempSetF;
  29. uint8 UserTempSetC;
  30. uint8 TSetTempCnt;
  31. uint8 TkeySetLook;
  32. uint8 UserTimeSetH;
  33. uint8 TSetTimerCnt;
  34. uint8  UserSetMode;
  35. void BeepProc(void);
  36. void InitRam()
  37. {
  38.   g_TimerFlag.tByte=0;
  39.   g_TimerFlag1.tByte=0;
  40.   g_RunFlag.tByte=0;
  41.   g_Run1Flag.tByte=0;
  42.   g_Run2Flag.tByte=0;
  43.   TempErro.tByte=0;   
  44.   UserTempSetF=86;
  45.   gb_FC_Flag=TempUintF;
  46.   gb_FirstWork_Flag=1;   //首次上电,首次开机,蜂鸣器想2声   
  47. }
  48. void main(void)
  49. {
  50.     _emi   = 0;
  51.     Init_IO();
  52.     Init_Foc();
  53.    Init_Timer();
  54.    ISR_Parament_Init();
  55.   while(!_hto);  //等待时钟稳定
  56.    _emi   = 1;
  57.     while(PowOnWaitCnt)
  58.     {
  59.       PowOnWaitCnt--;
  60.       DisCode[2] =0;
  61.       DisCode[1]=0;
  62.       DisCode[0]=0;
  63.     }
  64.     Init_AD();    //AD前期不初始化是为了初始显示不乱码     
  65.    InitRam();  
  66.    bBeepf=1;bBeepSf=1;BeepCount=0;
  67.       
  68.     while(1)
  69.     {
  70.           _clrwdt();
  71.         if(gT_5ms_Flag){gT_5ms_Flag=0;LedDispPro();}
  72.         if(gT_10ms_Flag){ gT_10ms_Flag=0;TempADCollect(); KeyScan();KeyProcess();BeepProc();}
  73. //     if(gT_50ms_Flag){ gT_50ms_Flag=0;}   
  74.        if(gT_100ms_Flag){ gT_100ms_Flag=0; Base100ms();}
  75.        if(gT_250ms_Flag) {gT_250ms_Flag=0;}
  76.         if(gT_500ms_Flag){gT_500ms_Flag=0;gb_500ms_Flag^=1;}
  77.        if(gT_1s_Flag)
  78.         {
  79.           gT_1s_Flag=0;
  80.           SysWorkCtrl();
  81.           Base1s();
  82.           Memory_LastState();
  83.           fun_eeprom_Write(0x00, UserTempSetC);
  84.           fun_eeprom_Write(0x01, UserSetMode);   //写入当前用户状态
  85.         }
  86.     }
  87. }
  88. /******************蜂鸣器的表达***********************************************
  89. 蜂鸣表达:     bBeepf=1;bBeepSf=1;BeepCount=0;
  90. 长鸣3声表达:bBeepf=1;bBeepLf=1;BeepCount=0;
  91. 蜂鸣3声:    bBeepf=1;bBeeAlf=1;BeepCount=0;
  92. ***************************************************************************/
  93. void BeepProc(void)
  94. {
  95.   if(bBeepSf)//蜂鸣
  96.     {     if(++BeepCount >= 10)       {   BeepCount=0;   bBeepSf=0;  bBeepf=0; } }
  97.   elseif(bBeepLf) //3声
  98.   { BeepCount++;
  99.       if(BeepCount==40) { bBeepf=0;     }
  100.        elseif(BeepCount==80)  { bBeepf=1;    }
  101.        elseif(BeepCount==120) { bBeepf=0; }
  102.      else if(BeepCount==160) { bBeepf=1;    }
  103.        elseif(BeepCount>=200) { BeepCount=0;   bBeepf=0;    bBeepLf=0;  }
  104.   }
  105.   else if(bBeepAlf)//3声
  106.   {  BeepCount++;
  107.       if(BeepCount==20)  {bBeepf=0;     }
  108.        elseif(BeepCount==40) { bBeepf=1;   }
  109.        elseif(BeepCount==60) {  bBeepf=0;}
  110.      else if(BeepCount==80) { bBeepf=0; }
  111.        elseif(BeepCount>=120)
  112.        {BeepCount=0; bBeepf=0;   bBeepAlf=0;}
  113.   }
  114.     else {  BeepCount =0;}
  115. }
复制代码
  1. /*********************************************************************
  2.         暖风机的工作控制:
  3.           1:加热有加热标志位和控制标志位的,标志位的开启并不代表实际的输出
  4.       2:根据用户设定模式判断,当前处于哪个状态
  5.       3:当前状态下,判断控制标志位是否开启
  6.       4:无论控制标志位是否开机,均开始计算时间
  7.       5:根据时间的大小来判定实际输出的时间
  8. *********************************************************************/
  9. #include "config.h"

  10. void Base100ms(void);

  11. static volatile unsigned char HEAT1OnTime     __attribute__ ((at(0x1b0)));
  12. static volatile unsigned char FanOnTime       __attribute__ ((at(0x1b1)));
  13. static volatile unsigned int  FanOffTime      __attribute__ ((at(0x1b2))); //当定义INT型时,占用两个地址,所以需要隔开
  14. static volatile unsigned char HEAT1OffTime    __attribute__ ((at(0x1b4)));
  15. static volatile unsigned char HEAT2OffTime    __attribute__ ((at(0x1b5)));
  16. static volatile unsigned char HEAT2OnTime     __attribute__ ((at(0x1b6)));
  17. static volatile unsigned char TimerSec        __attribute__ ((at(0x1b7)));
  18. static volatile unsigned char TimerMin        __attribute__ ((at(0x1b8)));
  19. static volatile unsigned char TimerHour       __attribute__ ((at(0x1b9)));

  20. uint8   SysRunTime;                //机器开机计时秒
  21. uint8   FanOffDelayTime=0;         //关机倒计时
  22. uint8   TimeSelfCheck=50;          //开机那个0.5S可以自检  

  23. void Base100ms(void);
  24. void Base1s(void);
  25. void SysWorkCtrl(void);        //系统工作的控制(从全局把握系统的输出--不包含显示)
  26. void FanCtrl(void);            //风机控制程序(开机及执行,关机,延迟30S关掉)
  27. void HeatCtrl(void);           //加热管输出控制  加热什么时候开关的控制

  28. void HiModeCtrl(void);         //高热模式控制
  29. void LoModeCtrl(void);         //地热模式控制
  30. void EcoModeCtrl(void);        //节能模式控制  是否打开即热的控制--有了相应的控制标志位,在计算时间
  31.   
  32. void SecTimerCnt(void);        //1S计时程序

  33. void RunImpro(void);           //非正常工作程序I
  34. void SwCtrl(void);
  35. void DDRember(void);            //掉电记忆功能

  36. void Base100ms(void)  //100MS计时
  37. {
  38.         if(TSetTimerCnt){TSetTimerCnt-=1;if(!TSetTimerCnt){gb_TimerSet_Flag=0;}}        
  39.         if(TSetTempCnt){TSetTempCnt-=1;if(!TSetTempCnt){gb_TempSet_Flag=0;}}
  40.         if(TkeySetLook){TkeySetLook-=1;}
  41.         if(TimeSelfCheck){TimeSelfCheck-=1;}
  42.         
  43.         if(gb_Fan_Flag)              //风扇的计时
  44.         {
  45.                 FanOffTime=0;
  46.                 if(FanOnTime<=200)  {FanOnTime+=1;} //风扇开启,累计计时20S
  47.         }
  48.         else
  49.         {
  50.                 FanOnTime=0;
  51.                 if(FanOffTime<=60000) {FanOffTime+=1;}  //风扇关机的累计计时
  52.         }
  53.         
  54.         if(gb_HEAT1_Flag)    //加热的计时必须以实际加热开始计时,而不是标志位
  55.         {
  56.                 HEAT1OffTime=0;
  57.                 if(HEAT1OnTime<200)            { HEAT1OnTime+=1;        }
  58.         }
  59.         else
  60.         {
  61.                 HEAT1OnTime=0;
  62.                 if(HEAT1OffTime<200)        { HEAT1OffTime+=1;        }               
  63.         }
  64.         
  65.         if(gb_HEAT2_Flag)   //加热的计时必须以实际加热开始计时,而不是标志位
  66.         {
  67.                 HEAT2OffTime=0;        
  68.                 if(HEAT2OnTime<200)     { HEAT2OnTime+=1;  }
  69.         }
  70.         else
  71.         {
  72.                 HEAT2OnTime=0;
  73.                 if(HEAT2OffTime<200)     { HEAT2OffTime+=1;  }                                
  74.         }
  75.         
  76. }
  77. void Base1s(void)   //1S的计时
  78. {
  79.         if(FanOffDelayTime)        
  80.         {
  81.                 FanOffDelayTime-=1;        
  82.         }
  83.         
  84.         if(UserTimeSetH)        //定时的计数
  85.         {
  86.                 TimerSec+=1;
  87.                 if(TimerSec >= 59)
  88.                 {
  89.                         TimerSec=0;
  90.                         TimerMin+=1;
  91.                         if(TimerMin>=UserTimeSetH)        
  92.                                 {
  93.                                         if(gb_PowerOn_Flag&&gb_TimeOff_Flag)  //此位置1 ,说明处于开机状态
  94.                                         {
  95.                                         gb_TimeOff_Flag=0;
  96.                                         UserTimeSetH=0;         //加这句是为了把时间计数的参数全部清0
  97.                                         gb_Timer_Flag=0;
  98.                                         gb_PowerOn_Flag=0;  //关机
  99.                                         bBeepf=1;bBeepSf=1;BeepCount=0;                                                        
  100.                                         }
  101.                                         else if((!gb_PowerOn_Flag)&&gb_TimeOn_Flag)
  102.                                         {
  103.                                         gb_TimeOn_Flag=0;        
  104.                                         UserTimeSetH=0;        
  105.                                         gb_Timer_Flag=0;
  106.                                         gb_PowerOn_Flag=1;  //开机        
  107.                                         bBeepf=1;bBeepSf=1;BeepCount=0;                                                
  108.                                         }               
  109.                                 }
  110.                 }                                
  111.         }
  112.         else
  113.         {
  114.                 TimerSec=0;        
  115.                 TimerMin=0;
  116.                 TimerHour=0;        
  117.         }
  118. }


  119. void SysWorkCtrl(void)  //分非正常模式和正常模式
  120. {
  121.         if(TempErro.tByte)//非正常模式下的输出
  122.         {
  123.                 if(gb_HEAT1Ctrl_Flag||gb_HEAT2Ctrl_Flag)
  124.                 {
  125.                         FanOffDelayTime=60;   //关机60S的延迟               
  126.                 }
  127.                 gb_HEAT1Ctrl_Flag=0;
  128.                 gb_HEAT2Ctrl_Flag=0;
  129.         }
  130.         else  //正常模式的输出
  131.         {
  132.                 if(gb_PowerOn_Flag)
  133.                 {
  134.                         if(UserSetMode == HIMODE){HiModeCtrl();}
  135.                         else if(UserSetMode == LOMODE){LoModeCtrl();}
  136.                         else if(UserSetMode == ECMODE){EcoModeCtrl();}        
  137.                 }
  138.                 else
  139.                 {
  140.                         if(gb_HEAT1Ctrl_Flag||gb_HEAT2Ctrl_Flag)
  141.                         {
  142.                                 FanOffDelayTime=60;   //关机60S的延迟               
  143.                         }                        
  144.                         gb_HEAT1Ctrl_Flag=0;
  145.                         gb_HEAT2Ctrl_Flag=0;        
  146.                 }        
  147.         }
  148.         FanCtrl();
  149.         HeatCtrl();        
  150. }

  151. void HiModeCtrl(void) //高档--对加热1 加热2 风扇的 控制
  152. {
  153.         if(EnvironmentTempC>UserTempSetC)  //温度中间状态 - 跟随上一个状态
  154.         {
  155.                 if(gb_HEAT1Ctrl_Flag||gb_HEAT2Ctrl_Flag)
  156.                 {
  157.                         FanOffDelayTime=60;   //关机60S的延迟               
  158.                 }               
  159.                         gb_HEAT1Ctrl_Flag=0;
  160.                         gb_HEAT2Ctrl_Flag=0;               
  161.         }
  162.         else if(EnvironmentTempC<UserTempSetC)
  163.         {
  164.                         gb_HEAT1Ctrl_Flag=1;
  165.                         gb_HEAT2Ctrl_Flag=1;               
  166.         }        
  167.         
  168. }
  169. void LoModeCtrl(void)  //低档--对加热1 加热2 风扇的 控制
  170. {
  171.         gb_HEAT2Ctrl_Flag=0;
  172.         if(EnvironmentTempC>UserTempSetC)
  173.         {
  174.                 if(gb_HEAT1Ctrl_Flag)
  175.                 {
  176.                         FanOffDelayTime=60;        
  177.                 }
  178.                         gb_HEAT1Ctrl_Flag=0;               
  179.         }
  180.         else if(EnvironmentTempC<UserTempSetC)
  181.         {
  182.                 gb_HEAT1Ctrl_Flag=1;        
  183.         }        
  184. }
  185. void EcoModeCtrl(void)  //节能模式 低挡开,高档来回开
  186. {
  187.         gb_HEAT1Ctrl_Flag=1;
  188.         if( EnvironmentTempC > UserTempSetC )
  189.         {
  190.                 if(gb_HEAT2Ctrl_Flag)
  191.                 {
  192.                         FanOffDelayTime=60;        
  193.                 }
  194.                 gb_HEAT2Ctrl_Flag=0;                                
  195.         }
  196.         else if(EnvironmentTempC<UserTempSetC)
  197.         {
  198.                 gb_HEAT2Ctrl_Flag=1;        
  199.         }        
  200. }

  201. void FanCtrl(void)  //风扇开启的前提是开机/关机后的延迟时间60S/温度达到设定温度后,加热停止工作,风扇再转60S
  202. {
  203.         if(gb_PowerOn_Flag||FanOffDelayTime||gb_HEAT1Ctrl_Flag||gb_HEAT2Ctrl_Flag)                                
  204.         {
  205.                 gb_Fan_Flag=1;  //次标志位开启,及代表风扇已经再转,同时可以计时了        
  206.                 FANON();        
  207.         }
  208.         else
  209.         {
  210.                 gb_Fan_Flag=0;
  211.                 FANOFF();               
  212.         }         
  213. }

  214. void HeatCtrl(void)
  215. {        
  216.         if(gb_HEAT1Ctrl_Flag)    //低档HEAT1加热功能的开启  开条件(风扇3S和其关闭3S以上)
  217.         {
  218.                 if(gb_HEAT1_Flag)  { HEAT1ON();}
  219.                 else if((FanOnTime>=30)&&(HEAT1OffTime>=30)) //第一次开启加热标志位
  220.                 {
  221.                         gb_HEAT1_Flag=1;
  222.                         HEAT1ON();        
  223.                 }
  224.                 else
  225.                 {
  226.                         gb_HEAT1_Flag=0;
  227.                         HEAT1OFF();               
  228.                 }                                
  229.         }
  230.         else if(((gb_HEAT1_Flag==1)&&(HEAT2OffTime>=30))||(gb_HEAT1_Flag==0) )   //低档加热功能的关闭  关条件 -- 加热1在开启中同时加热2关闭3S以上——加热1已经关闭
  231.         {
  232.                 gb_HEAT1_Flag=0;
  233.                 HEAT1OFF();                                
  234.         }
  235.         
  236.         if(gb_HEAT2Ctrl_Flag)   //高挡HEAT2即热功能的开启和关闭 (加热1开3S以上和加热2关3S以上--加热2已开启)
  237.         {
  238.                 if(gb_HEAT2_Flag)   { HEAT2ON(); }        
  239.                 else if((HEAT1OnTime>=30)&&(HEAT2OffTime>=30))
  240.                 {
  241.                         gb_HEAT2_Flag=1;
  242.                         HEAT2ON();        
  243.                 }
  244.         }
  245.         else
  246.         {
  247.                         gb_HEAT2_Flag=0;
  248.                         HEAT2OFF();                                
  249.         }        
  250. }

  251. void DDRember(void)
  252. {
  253.         if(gb_PowerOn_Flag)
  254.         {
  255.                 fun_eeprom_Write(0x00, UserTempSetC);
  256.                 fun_eeprom_Write(0x01, UserSetMode);
  257.         }
  258.         else
  259.         {
  260.                 UserSetMode=fun_eeprom_Read(0x01);        
  261.                 UserTempSetC=fun_eeprom_Read(0x00);        
  262.         }                        
  263. }

复制代码

所有资料51hei提供下载:
91N-66F018.zip (167.25 KB, 下载次数: 225)

评分

参与人数 2黑币 +65 收起 理由
perfect123 + 15 赞一个!
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:1 发表于 2018-10-23 15:19 | 显示全部楼层
好东东 楼主能分享下原理图吗?
回复

使用道具 举报

ID:427962 发表于 2018-11-16 22:31 | 显示全部楼层
好东西
回复

使用道具 举报

ID:427962 发表于 2018-11-16 22:35 | 显示全部楼层
很不错
回复

使用道具 举报

ID:465596 发表于 2019-1-15 19:50 | 显示全部楼层
刚开始学,谢谢楼主分享
回复

使用道具 举报

ID:492928 发表于 2019-3-18 08:42 | 显示全部楼层
刚用合泰的芯片,过来学习一下。
回复

使用道具 举报

ID:93892 发表于 2019-5-16 16:09 | 显示全部楼层
非常有价值的参考程度。
回复

使用道具 举报

ID:488667 发表于 2019-9-17 09:12 | 显示全部楼层
赞一个
回复

使用道具 举报

ID:47707 发表于 2019-9-25 13:54 | 显示全部楼层
下载了,谢谢
回复

使用道具 举报

ID:67041 发表于 2019-12-6 10:18 | 显示全部楼层
好东西,刚好想学一下合泰
回复

使用道具 举报

ID:93892 发表于 2020-5-20 16:47 | 显示全部楼层
非常感谢,因你,我学合泰大有进步!
回复

使用道具 举报

ID:472035 发表于 2020-6-19 23:23 | 显示全部楼层
过来学习一下合泰的芯片
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表