找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4451|回复: 0
打印 上一主题 下一主题
收起左侧

STM8S与HT1621b的24小时时钟带温度功能

[复制链接]
跳转到指定楼层
楼主
ID:117761 发表于 2016-6-18 01:32 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
  1. #include "stm8s.h"
  2. #include "ht1621.h"
  3. unsigned char const smg_1[]={0x0a,0x00,0x06,0x04,0x0c,0x0c,0x0e,0x08,0x0e,0x0c};//0123456789--fge
  4. unsigned char const smg_2[]={0xf0,0x60,0xd0,0xf0,0x60,0xb0,0xb0,0xe0,0xf0,0xf0};//abcd
  5. //unsigned char const smg_2[]={0x50,0x00,0x60,0x20,0x30,0x30,0x70,0x00,0x70,0x30};//0123456789
  6. //unsigned char const smg_1[]={0x0f,0x06,0x0b,0x0f,0x06,0x0d,0x0d,0x0e,0x0f,0x0f};
  7. unsigned char smgys[]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
  8. unsigned char QX[]={0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff};
  9. unsigned char QL[]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
  10. unsigned char adc1_value[];
  11. unsigned char const Tab_Temp[]=
  12. //1 2 3 4 5 6 7 8 9 0 1 2 3 4 5//比实际温度高30度
  13. { 0, 0, 5, 5, 10, 10, 15, 15, 20, 20, 25, 25, 25, 30, 30, 31,  /* ADC: 0~15 */
  14. 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47,  /* ADC: 16~31 */
  15. 48, 49, 49, 50, 50, 51, 51, 52, 53, 54, 55, 56, 56, 57, 57, 58,  /* ADC: 32~47 */
  16. 58, 59, 60, 60, 61, 61, 62, 63, 63, 64, 64, 65, 65, 65, 66, 66,  /* ADC: 48~63 */
  17. 67, 67, 68, 68, 69, 69, 70, 70, 71, 71, 72, 72, 73, 73, 74, 74,  /* ADC: 64~79 */
  18. 75, 75, 76, 76, 77, 77, 78, 78, 78, 79, 79, 80, 80, 81, 81, 82,  /* ADC: 80~95 */
  19. 82, 83, 83, 84, 84, 85, 85, 85, 86, 86, 87, 87, 88, 88, 89, 89,  /* ADC: 96~111 */
  20. 89, 90, 90, 90, 91, 91, 92, 92, 93, 93, 93, 94, 94, 95, 95, 95,  /* ADC: 112~127 */
  21. 96, 96, 97, 97, 98, 98, 99, 99, 100, 100, 100, 101, 101, 102, 102, 103,  /* ADC: 128~143 */
  22. 103, 104, 104, 105, 105, 106, 106, 107, 107, 108, 108, 109, 109, 110, 110, 110,  /* ADC: 144~159 */
  23. 111, 112, 113, 113, 113, 114, 114, 115, 115, 116, 116, 117, 118, 118, 119, 119,  /* ADC: 160~175 */
  24. 120, 120, 121, 122, 122,123,124, 124, 125, 126, 127, 128, 128, 129, 129, 130,  /* ADC: 176~191 */
  25. 130, 130, 79, 80, 81, 82, 83, 83, 84, 85, 86, 86, 87, 88, 89, 89,  /* ADC: 192~207 */
  26. 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100,0,  0,  0,  0,   /* ADC: 208~223 */
  27. 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,   /* ADC: 224~239 */
  28. 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  /* ADC: 240~255 */
  29. };

  30. unsigned char Hour,Min,Sec,Hour_H,Hour_L,Min_H,Min_L,Sec_H,Sec_L,Temp_HBit,Temp_LBit;
  31. unsigned char HalfSec_fig,Half_SecFlag=1;
  32. unsigned char Key_fig;
  33. unsigned int Temp_value;
  34. extern unsigned int u16_adc1_value,Temp_adc;
  35. FlagStatus fs;
  36. unsigned char Flash_Fig;
  37. extern unsigned char Half_SecFlag,Key_mode,Key_Long_fig;
  38. void DelayMS(u16 iMs)
  39. {
  40. u16 i,j;
  41.    for(i=0;i<iMs;i++)
  42.         {
  43.                 IWDG_ReloadCounter();
  44.     for(j=0;j<65;j++)
  45.       {
  46.                                 Delay(1);
  47.                                 IWDG_ReloadCounter();
  48.       }
  49.         }
  50. }
  51. void Time_Data_process(void)
  52. {
  53.   Hour_H=Hour/10;
  54.   Hour_L=Hour%10;
  55.   Min_H=Min/10;
  56.   Min_L=Min%10;
  57.   Sec_H=Sec/10;
  58.   Sec_L=Sec%10;
  59. }

  60. void Display(void)
  61. {
  62.   if(Flash_Fig)
  63.   {
  64.     if(Key_mode==1)
  65.     {
  66.       smgys[4]=smg_1[Min_L]|smg_2[Min_H];smgys[5]=smg_2[Min_L];
  67.       smgys[3]=smg_1[Min_H]|smg_2[Hour_L]|0x01;
  68.     }
  69.     if(Key_mode==2)
  70.     {
  71.      smgys[2]=smg_1[Hour_L]|smg_2[Hour_H];smgys[3]=smg_1[Min_H]|smg_2[Hour_L]|0x01;
  72.      smgys[1]=smg_1[Hour_H];
  73.     }
  74.     if(Key_mode==0)
  75.     {
  76.       smgys[4]=smg_1[Min_L]|smg_2[Min_H];smgys[5]=smg_2[Min_L];
  77.       smgys[3]=smg_2[Hour_L]|smg_1[Min_H]|0x01;
  78.       if(Hour_H==0)
  79.       {smgys[1]=0;smgys[2]=smg_1[Hour_L];}
  80.       else
  81.       {
  82.         smgys[2]=smg_1[Hour_L]|smg_2[Hour_H];
  83.         smgys[1]=smg_1[Hour_H];
  84.       }
  85.     }
  86.   }
  87.   else
  88.   {     if((Key_mode==1)&(Key_Long_fig==0))
  89.         {
  90.           smgys[4]=0;smgys[5]=0;
  91.           smgys[3]=smg_2[Hour_L]&0xfe;
  92.           smgys[2]=smg_1[Hour_L]|smg_2[Hour_H];
  93.           smgys[1]=smg_1[Hour_H];
  94.         }
  95.         if((Key_mode==2)&(Key_Long_fig==0))
  96.         {
  97.           smgys[2]=0;smgys[3]=smg_1[Min_H];
  98.           smgys[1]=0;smgys[4]=smg_1[Min_L]|smg_2[Min_H];smgys[5]=smg_2[Min_L];
  99.         }
  100.         if(Key_mode==0)  
  101.         {
  102.           smgys[4]=smg_1[Min_L]|smg_2[Min_H];smgys[5]=smg_2[Min_L];
  103.           //smgys[3]=(smg_1[Hour_H]|smg_2[Hour_L]|smg_1[Min_H])&0xfe;
  104.           smgys[3]=smg_2[Hour_L]|smg_1[Min_H]&0xfe;
  105.           if(Hour_H==0)
  106.           {
  107.             smgys[2]=smg_1[Hour_L];
  108.             smgys[1]=0;
  109.           }
  110.           else
  111.           {
  112.             smgys[2]=smg_1[Hour_L]|smg_2[Hour_H];
  113.             smgys[1]=smg_1[Hour_H];
  114.           }
  115.         }
  116.   }
  117.   /*
  118.   if(Halt_flag)
  119.   {
  120.     Ht1621WrAllData(8,QL,20);
  121.     Halt_flag=0;GPIO_WriteHigh(GPIOB, GPIO_PIN_0);
  122.     halt();
  123.   } */
  124. }

  125. void GPIO_int(void)
  126. {
  127.   GPIO_Init(GPIOA, GPIO_PIN_HNIB, GPIO_MODE_OUT_PP_HIGH_FAST);
  128.   GPIO_Init(GPIOC, GPIO_PIN_1, GPIO_MODE_IN_PU_IT);
  129.   
  130.   
  131.   EXTI_SetExtIntSensitivity(EXTI_PORT_GPIOC, EXTI_SENSITIVITY_FALL_ONLY);
  132.   GPIO_Init(GPIOC, GPIO_PIN_2, GPIO_MODE_OUT_PP_LOW_FAST);
  133.   GPIO_Init(GPIOB, GPIO_PIN_0, GPIO_MODE_IN_FL_NO_IT);
  134.   GPIO_Init(GPIOE, GPIO_PIN_6, GPIO_MODE_OUT_PP_HIGH_FAST);

  135. }
  136. void TIM4_int(void)
  137. {
  138.   TIM4_TimeBaseInit(TIM4_PRESCALER_32,249);//1ms_8MHz   8/32=250KHz=0.004ms*250=1ms
  139.   //TIM4_ClearFlag(TIM4_FLAG_UPDATE);
  140.   TIM4_SetCounter(249);
  141.   TIM4_ITConfig(TIM4_IT_UPDATE, ENABLE);
  142.   TIM4_Cmd(ENABLE);
  143. }
  144. void TIM2_int(void)
  145. {
  146.   TIM2_TimeBaseInit(TIM2_PRESCALER_8, 1000);
  147.   TIM2_OC2Init(TIM2_OCMODE_PWM1, TIM2_OUTPUTSTATE_ENABLE, 0x0000, TIM2_OCPOLARITY_HIGH);
  148.   TIM2_OC2PreloadConfig(ENABLE);
  149.   TIM2_ARRPreloadConfig(ENABLE);
  150.   TIM2_Cmd(ENABLE);
  151. }


  152. void TIM1_int(void)
  153. {
  154.   TIM1_TimeBaseInit(79, TIM1_COUNTERMODE_UP,50000,0);//500ms_8MHz
  155.   TIM1_ITConfig(TIM1_IT_UPDATE, ENABLE);
  156.   TIM1_GenerateEvent(TIM1_EVENTSOURCE_UPDATE);
  157.   //TIM1_OC2Init(TIM1_OCMODE_PWM1, TIM1_OUTPUTSTATE_ENABLE, TIM1_OUTPUTNSTATE_ENABLE, 0, TIM1_OCPOLARITY_HIGH, TIM1_OCNPOLARITY_HIGH, TIM1_OCIDLESTATE_SET, TIM1_OCNIDLESTATE_RESET);
  158.   //TIM1_OC2Init(TIM1_OCMODE_PWM1, TIM1_OUTPUTSTATE_ENABLE, TIM1_OUTPUTNSTATE_DISABLE, 0x0000, TIM1_OCPOLARITY_HIGH, TIM1_OCNPOLARITY_HIGH, TIM1_OCIDLESTATE_RESET, TIM1_OCNIDLESTATE_SET);
  159.   //TIM1_CtrlPWMOutputs(ENABLE);
  160.   //TIM1_OC2PreloadConfig(ENABLE);
  161.   //TIM1_ARRPreloadConfig(ENABLE);
  162.   TIM1_Cmd(ENABLE);
  163. }
  164. void Beep_int(void)
  165. {
  166.   BEEP_DeInit();
  167.   BEEP_LSICalibrationConfig(128000);
  168.   BEEP_Init(BEEP_FREQUENCY_2KHZ);
  169. }
  170. void ClkInit(void)
  171. {
  172.   ErrorStatus clk_return_status;
  173.   clk_return_status = CLK_ClockSwitchConfig(CLK_SWITCHMODE_AUTO, CLK_SOURCE_HSE, DISABLE, CLK_CURRENTCLOCKSTATE_DISABLE);
  174.   if (clk_return_status == SUCCESS)  //SUCCESS or ERROR
  175.   {};


  176. }
  177. void Adc_init(void)
  178. {
  179.   ADC1_DeInit();
  180.   ADC1_Init(ADC1_CONVERSIONMODE_CONTINUOUS, ADC1_CHANNEL_0, ADC1_PRESSEL_FCPU_D2, ADC1_EXTTRIG_TIM, DISABLE, ADC1_ALIGN_RIGHT, ADC1_SCHMITTTRIG_CHANNEL0, DISABLE);
  181.   ADC1_ITConfig(ADC1_IT_EOCIE, DISABLE);
  182.   ADC1_Cmd(ENABLE);
  183.   ADC1_StartConversion();
  184. }
  185. void WWdog_init(void)
  186. {
  187.   fs = RST_GetFlagStatus(RST_FLAG_WWDGF);
  188.   if(fs != RESET)
  189. {
  190.   RST_ClearFlag(RST_FLAG_WWDGF);
  191.   GPIO_WriteHigh(GPIOC, GPIO_PIN_2);
  192. }  
  193.   WWDG_Init(0x7f, 0x7f);
  194. }
  195. void IWdog_init(void)
  196. {
  197.   
  198. IWDG_Enable();
  199. IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable);
  200. IWDG_SetPrescaler(IWDG_Prescaler_16);
  201. IWDG_SetReload(0xff);
  202. }
  203. void Refresh_WWdog(void)
  204. {
  205.   u8 u8_value;
  206.   u8_value = (u8)(WWDG_GetCounter()&0x7f);
  207.   if(u8_value<0x7f)
  208.   {
  209.     WWDG_SetCounter(0x7f);
  210.   }
  211. }
  212. void Adc_process(void)
  213. {
  214.     ADC1->CR1|=0x02;
  215.     ADC1_StartConversion();
  216.     unsigned char count=0;
  217.     while(count<10)
  218.     {
  219.       while (ADC1_GetFlagStatus(ADC1_FLAG_EOC)== RESET) // SET or RESET
  220.       ADC1_ClearFlag(ADC1_FLAG_EOC);
  221.       adc1_value[count] = ADC1_GetConversionValue();
  222.       count++;
  223.     }
  224.     ADC1->CR1&=~0x02;
  225.     unsigned char i,j;
  226.     unsigned int temp;
  227.     for(i=10;i>=1;i--)
  228.     {
  229.       for(j=0;j<(i-1);j++)
  230.       {
  231.         if(adc1_value[j]>adc1_value[j+1])
  232.         {
  233.           temp=adc1_value[j];
  234.           adc1_value[j]=adc1_value[j+1];
  235.           adc1_value[j+1]=temp;
  236.         }
  237.       }
  238.     }
  239.     Temp_adc=0;
  240.     for(i=2;i<=7;i++)
  241.     Temp_adc+=adc1_value[i];
  242.     Temp_adc/=6;
  243.     Temp_value=Tab_Temp[Temp_adc/4];
  244.     Temp_value=Temp_value-30;
  245. }
  246. void Temp_Data_process(void)
  247. {
  248.   Temp_HBit=Temp_value/10;
  249.   Temp_LBit=Temp_value%10;
  250. }

  251. void main(void)
  252. {
  253.   /* Infinite loop */
  254.   //u8 i;
  255.   ClkInit();
  256.   GPIO_int();
  257.   Ht1621_Init();
  258.   Ht1621WrAllData(8,QL,7);
  259.   Beep_int();
  260.   //Half_SecFlag=1;
  261.   TIM4_int();
  262.   //TIM2_int();
  263.   TIM1_int();
  264.   Adc_init();
  265.   //WWdog_init();
  266.   IWdog_init();
  267.   rim();
  268.   Ht1621WrAllData(8,QX,7);
  269.   while (1)
  270.   {  
  271.     Time_Data_process();
  272.     //Adc_process();
  273.     Temp_Data_process();
  274.     if(Sec/10==0)
  275.     {
  276.       smgys[1]=smg_1[Temp_HBit];smgys[2]=smg_2[Temp_HBit]|smg_1[Temp_LBit];
  277.       //smgys[3]=smg_2[Temp_LBit]|0x0a;smgys[4]=0x9c;smgys[5]=0xc0;
  278.       smgys[3]=smg_2[Temp_LBit]|0x0c;smgys[4]=0xca;smgys[5]=0x90;
  279.     }
  280.     else
  281.     { Display();}
  282.     Ht1621WrAllData(8,smgys,7);
  283.     IWDG_ReloadCounter();
  284.   }
  285. }

  286. #ifdef USE_FULL_ASSERT

  287. /**
  288.   * @brief  Reports the name of the source file and the source line number
  289.   *   where the assert_param error has occurred.
  290.   * @param file: pointer to the source file name
  291.   * @param line: assert_param error line source number
  292.   * @retval : None
  293.   */
  294. void assert_failed(u8* file, u32 line)
  295. {
  296.   /* User can add his own implementation to report the file name and line number,
  297.      ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */

  298.   /* Infinite loop */
  299.   while (1)
  300.   {
  301.   }
  302. }
  303. #endif


  304. /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
复制代码


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏2 分享淘帖 顶 踩1
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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