找回密码
 立即注册

QQ登录

只需一步,快速开始

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

STM8L的智能手持血糖监测设备的数据存储实现源码

[复制链接]
跳转到指定楼层
楼主
ID:478372 发表于 2019-2-20 10:16 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
为了克服红外无创血糖检测中 存在的难题, 使微弱的光谱信号变化能正确的体现人体血糖浓度, 作者根据朗伯—比尔定律原理, 分析 了人体葡萄糖的吸收谱, 设计了多波长红外血糖检测传感器阵列, 采用MOE 和MADALINE 整合神经网 络方法建立了传感器阵列信号处理模型, 使红外无创血糖检测的精度和稳定性得到了改善

单片机源程序如下:
  1. #include "stm8l15x.h"
  2. #include "./Protocol/Protocol.h"
  3. #include "./LCD/Lcd_Driver.h"
  4. #include "./RTC_CLK/RTC_CLK.h"
  5. #include "./InPut/InPut_Driver.h"
  6. #include "./IIC/I2C_Driver.h"
  7. #include "./Flash/Flash_Driver.h"
  8. #include "./UsrData/UsrData.h"
  9. #include "stdio.h"
  10. #include "main.h"

  11. /*
  12. *****************************************************************/
  13. System_sContrl SystemCtr;
  14. Main_sMenu MainMenu;
  15. PassWdBrand_sContrl PassWordBrand;
  16. /*
  17. *****************************************************************/
  18. /*   测试程序    */
  19. void System_Delay(uint8_t nCount);

  20. void Read_RTCTimes();
  21. uint8_t System_AutoCheck();
  22. uint8_t Time_Setting(void);

  23. void ReadPasswdBrand();
  24. uint8_t ReadPassWDMode();


  25. uint8_t Recode_Header(uint32_t paddr,uint8_t *uData);
  26. uint8_t Read_RecodeData(uint32_t paddr,uint8_t *uData);
  27. uint8_t Verity_PassWord();

  28. static void TIM4_Config(void);
  29. static void USART_Config(void);
  30. static void LCD_RTCConfig(void);
  31. static void System_MainMenu();

  32.   void System_EventProcess();

  33. void SystemDeviceInit();
  34. void Halt_OffDevice();
  35. void TestBoolMode();

  36. void main(void)
  37. {     
  38.       CLK_SYSCLKDivConfig(CLK_SYSCLKDiv_1);
  39.       while(1)
  40.       {
  41.         /*          判断是否有输入                  */
  42.         if(InputDevice.uType == NO_INPUT_DEV )
  43.         {
  44.           /*        判断系统是否激活状态            */
  45.           if( SystemCtr.uStatus != SYSTEM_ACTIVE )
  46.           {
  47.             /*进入halt模式关闭,外设
  48.             ******************************************/
  49.             Halt_OffDevice();
  50.            /*****************************************/
  51.             halt();   //进入休眠模式         
  52.            /*初始化系统外设init()
  53.             ****************************************/
  54.            SystemDeviceInit();
  55.            /****************************************/
  56.           }
  57.         }
  58.             
  59.           InPut_Process();
  60.          /* 系统处理过程
  61.          ****************************************/  
  62.           if(SystemCtr.uStatus == SYSTEM_ACTIVE)
  63.           {
  64.             System_MainMenu();
  65.         

  66.             System_EventProcess();
  67.       
  68.             Protocol_Process();

  69.           }
  70.          /****************************************/     
  71.       }
  72.       
  73.                                        
  74. }
  75. /***************************************************************
  76. * 函数名:System_MainMenu()
  77. * 输入  :void
  78. * 输出  :void
  79. * 功能  :系统处理菜单
  80. ****************************************************************/
  81. static void System_MainMenu()
  82. {
  83.   
  84.    if(SystemCtr.uStatus != SYSTEM_SLEEP)
  85.    {
  86.      if( ButtonClick.SystemVoiceKey == SET)
  87.      {
  88.        Display_Speeker(ENABLE);
  89.      }
  90.      else
  91.      {
  92.        Display_Speeker(DISABLE);
  93.      }
  94.       
  95.            
  96.       switch(MainMenu.uMenu)
  97.         {
  98.           case TESTING_BOOL_MENU:
  99.             {
  100.                  Write_RecodeTest();
  101.                  TestBoolMode();
  102.             }break;
  103.           case PASSWORD_BRAND_MENU:
  104.             {
  105.               if(ReadPassWDMode())
  106.                  DisplayOutSlaverEro();
  107.             }break;
  108.           case SETTING_TIME_MENU:
  109.             {
  110.               Set_Calendar();
  111.             }break;
  112.           case RECODE_BLEMPTY_MENU:
  113.             {
  114.               DisplayNoneEmptyBool();
  115.               //Read_Recode();
  116.             }break;
  117.           case RECODE_BLNOEMPTY_MENU:
  118.             {
  119.               DisplayNoneUnEmptyBool();
  120.              }break;
  121.           case RECODE_BLINDENTY_MENU:
  122.             {
  123.               DisplayNoneIndentBool();
  124.             }break;
  125.           case ALARM_CLOCK_MENU:
  126.             {
  127.               Display_Alarm(ENABLE);
  128.               
  129.              RTC_ITConfig(RTC_IT_ALRA, ENABLE);
  130.              RTC_AlarmCmd(ENABLE);
  131.             }break;
  132.           default :
  133.             {
  134.               SystemCtr.uStatus = SYSTEM_SLEEP;
  135.             }break;      
  136.          }
  137.      
  138.    }

  139. }
  140. /***************************************************************
  141. * 函数名:Halt_OffDevice
  142. * 输入  :void
  143. * 输出  :void
  144. * 功能  :进入halt模式前关闭外设
  145. ****************************************************************/
  146. void Halt_OffDevice()
  147. {
  148.   /* 关闭设备前,设置系统主时钟,和中断 */
  149.    CLK_SYSCLKDivConfig(CLK_SYSCLKDiv_1);   
  150.    InPut_Init();
  151.    enableInterrupts();
  152.    
  153.    
  154.    LCD_ClearScreen();
  155.    CalendarSetting_Quit();
  156.    LCD_Cmd(DISABLE); //关闭LCD
  157. }
  158. /***************************************************************
  159. * 函数名:SystemDeviceInit
  160. * 输入  :void
  161. * 输出  :void
  162. * 功能  :初始化外设
  163. ****************************************************************/
  164. void SystemDeviceInit()
  165. {   
  166.       CLK_SYSCLKSourceSwitchCmd(ENABLE);
  167.       /* System Clock is HSI/1 */
  168.       CLK_SYSCLKDivConfig(CLK_SYSCLKDiv_1);
  169.      /*初始化I2C端口*/
  170.   
  171.       I2C_Init();
  172.       
  173.       TIM4_Config();
  174.       
  175.       USART_Config();
  176.       
  177.       LCD_RTCConfig();
  178.       
  179.       LCD_Init();
  180.       
  181.       Protocol_Init();

  182.         
  183. }
  184. /*******************************************************************
  185. * 函数名:ReadPasswdBrand
  186. * 输  入:void8
  187. * 输  出:void
  188. * 功  能:读密码牌操作
  189. ********************************************************************/
  190. void ReadPasswdBrand()
  191. {   
  192.      while(Verity_PassWord())//如果校验码与插入读出的校验码不同回写
  193.      {                    
  194.            FLASH_SetProgrammingTime( FLASH_ProgramTime_Standard); //设置Flash操作
  195.       
  196.            FLASH_unLock(MCU_EEPROM_DATA);                           //解锁数据存储区
  197.    
  198.            while (!(FLASH->IAPSR & (uint8_t)0x08));                   //等待解锁操作
  199.       
  200.            /*      读取密码牌内容,数据搬移临界区           */
  201.            System_Delay(200);
  202.         
  203.            IIC_SlaveRead_LongBuffer(PassWordBrand.DataBuffer,sizeof(PassWordBrand.DataBuffer));//读出密码牌数据
  204.         
  205.            System_Delay(10);     
  206.         
  207.            FLASH_WriteLongBuffer(MCU_EEPROM_DATA,PassWordBrand.DataBuffer,sizeof(PassWordBrand.DataBuffer));
  208.         
  209.            System_Delay(200);
  210.            /* ********************************************* */   
  211.           while (FLASH_GetFlagStatus( FLASH_FLAG_EOP) == SET);
  212.          
  213.           /* 读取内容测试
  214.           FLASH_ReadLongBuffer(MCU_EEPROM_DATA,ReadBuffer,sizeof(ReadBuffer));
  215.           while (FLASH_GetFlagStatus( FLASH_FLAG_EOP) == SET);*/
  216.                         
  217.         
  218.        }
  219.                                     
  220. }
  221. /*******************************************************************
  222. * 函数名:ReadPassWDMode
  223. * 输  入:void
  224. * 输  出:void
  225. * 功  能:读密码牌操作
  226. ********************************************************************/
  227. uint8_t Verity_PassWord()
  228. {  

  229.   uint8_t uPassWord = 0;
  230.   uint8_t uFlash = 0;
  231.   
  232.   if(PassWordBrand.uStatus != VERIFY_SUCESS)
  233.   {
  234.      LCD_Cmd(DISABLE); //关闭LCD  
  235.      
  236.      FLASH_SetProgrammingTime( FLASH_ProgramTime_Standard); //设置Flash操作
  237.       
  238.      FLASH_unLock(MCU_EEPROM_DATA);                           //解锁数据存储区
  239.    
  240.      while (!(FLASH->IAPSR & (uint8_t)0x08));                   //等待解锁操作
  241.      
  242.      System_Delay(200);
  243.      
  244.      uPassWord =(uint8_t)I2C_ReadByte(SLAVE_BLOCK_START_ADDRESS,SLAVE_START_ADDRESS);
  245.    
  246.       System_Delay(10);
  247.      
  248.      uFlash = (uint8_t)FLASH_ReadByte(MCU_EEPROM_START);
  249.      
  250.       System_Delay(200);
  251.      while (FLASH_GetFlagStatus( FLASH_FLAG_EOP) == SET);
  252.   }
  253.   
  254.    if((uFlash^uPassWord) == 0)
  255.     {
  256.         LCD_Cmd(ENABLE);
  257.         PassWordBrand.uStatus = VERIFY_SUCESS;
  258.         return 0;
  259.     }

  260.   return 1;
  261. }
  262. /*******************************************************************
  263. * 函数名:ReadPassWDMode
  264. * 输  入:void
  265. * 输  出:void
  266. * 功  能:读密码牌操作
  267. ********************************************************************/
  268. uint8_t ReadPassWDMode()
  269. {
  270.    if(BUTTON_DOWN(GPIOC,PASSWORD_BRAND))
  271.      {
  272.         ReadPasswdBrand();
  273.         if(PassWordBrand.uStatus != VERIFY_FAILD)
  274.         {
  275.           PassWordBrand.Start_Flick = SET;
  276.          if(System_AutoCheck())
  277.          {
  278.            MainMenu.uMenu = NO_OPERATION_MENU;
  279.            PassWordBrand.uStatus = VERIFY_FAILD;
  280.            PassWordBrand.Start_Flick = RESET;
  281.            InputDevice.uProcType = NONE_PROCESS;   //
  282.          }
  283.        }
  284.      }
  285.     else
  286.     {
  287.            /* 密码牌插入不稳  */

  288.        Frame.uEvent = SYSTEM_TESTING_ERROR;     //提示密码牌出错
  289.        Frame.uValuer.uError = ERROR_E4;

  290.        LCD_ClearScreen();
  291.        InputDevice.uProcType = NONE_PROCESS;   //
  292.        return 1;
  293.     }

  294. return 0;
  295. }
  296. /*******************************************************************
  297. * 函数名:TestBoolMode
  298. * 输  入:void
  299. * 输  出:void
  300. * 功  能:读密码牌操作
  301. ********************************************************************/
  302. void TestBoolMode()
  303. {
  304.   if(BUTTON_DOWN(GPIOG,TESTING_BOTTLET))
  305.     {
  306.       my_test();
  307.       if(BottlerOpt.BottlerPriority == SET)
  308.         {
  309.           BottlerOpt.BottlerPriority = RESET;
  310.           LCD_ClearScreen();
  311.         }
  312.                
  313.     }
  314.   else
  315.     {

  316.       Frame.uEvent = SYSTEM_BLOTTER_OUT;

  317.       InputDevice.uPriority = NO_PRIORITY;
  318.       MainMenu.uMenu = NO_OPERATION_MENU;
  319.     }      
  320. }
  321. /*******************************************************************
  322. * 函数名:void System_AutoCheck()
  323. * 输  入:void
  324. * 输  出:void
  325. * 功  能:所有血糖值记录为空
  326. ********************************************************************/
  327. uint8_t System_AutoCheck()
  328. {
  329.   static  uint8_t Calc = 0;
  330.      Display_DataValuer(DISPLAY_BIT_NUM_1,(uint8_t)Calc);
  331.      Display_DataValuer(DISPLAY_BIT_NUM_2,(uint8_t)Calc);
  332.      Display_DataValuer(DISPLAY_BIT_NUM_3,(uint8_t)Calc);
  333.      Display_DataValuer(DISPLAY_BIT_NUM_4,(uint8_t)Calc);
  334.      Display_DataValuer(DISPLAY_BIT_NUM_5,(uint8_t)Calc);
  335.      Display_DataValuer(DISPLAY_BIT_NUM_6,(uint8_t)Calc);
  336.      Display_DataValuer(DISPLAY_BIT_NUM_7,(uint8_t)Calc);
  337.      Display_DataValuer(DISPLAY_BIT_NUM_8,(uint8_t)Calc);
  338.      Display_DataValuer(DISPLAY_BIT_NUM_9,(uint8_t)Calc);
  339.      Display_DataValuer(DISPLAY_BIT_NUM_10,(uint8_t)Calc);
  340.      Display_DataValuer(DISPLAY_BIT_NUM_11,(uint8_t)Calc);
  341.      Display_DataValuer(DISPLAY_BIT_NUM_12,(uint8_t)Calc);
  342.      Display_DataValuer(DISPLAY_BIT_NUM_13,(uint8_t)Calc);
  343.      Display_DataValuer(DISPLAY_BIT_NUM_14,(uint8_t)Calc);
  344.      Display_DataValuer(DISPLAY_BIT_NUM_15,(uint8_t)Calc);
  345.      Display_DataValuer(DISPLAY_BIT_NUM_16,(uint8_t)Calc);  
  346.    
  347.   if(PassWordBrand.Flick_Calc == SET)
  348.   {
  349.      PassWordBrand.Flick_Calc = RESET;     
  350.      Calc++;  
  351.      
  352.    if(Calc == 0x0A)
  353.    {
  354.      Calc = 0x00;
  355.      PassWordBrand.DspCalc =0;
  356.      PassWordBrand.Start_Flick = RESET;
  357.      
  358.      return 1;
  359.    }
  360.       
  361.    
  362.    Screen_ClearPostion(DISPLAY_BIT_NUM_1);
  363.    Screen_ClearPostion(DISPLAY_BIT_NUM_2);
  364.    Screen_ClearPostion(DISPLAY_BIT_NUM_3);
  365.    Screen_ClearPostion(DISPLAY_BIT_NUM_4);
  366.    Screen_ClearPostion(DISPLAY_BIT_NUM_5);
  367.    Screen_ClearPostion(DISPLAY_BIT_NUM_6);
  368.    Screen_ClearPostion(DISPLAY_BIT_NUM_7);
  369.    Screen_ClearPostion(DISPLAY_BIT_NUM_8);
  370.    Screen_ClearPostion(DISPLAY_BIT_NUM_9);
  371.    Screen_ClearPostion(DISPLAY_BIT_NUM_10);
  372.    Screen_ClearPostion(DISPLAY_BIT_NUM_11);
  373.    Screen_ClearPostion(DISPLAY_BIT_NUM_12);
  374.    Screen_ClearPostion(DISPLAY_BIT_NUM_13);
  375.    Screen_ClearPostion(DISPLAY_BIT_NUM_14);
  376.    Screen_ClearPostion(DISPLAY_BIT_NUM_15);
  377.    Screen_ClearPostion(DISPLAY_BIT_NUM_16);
  378.   
  379.   }     
  380.      return 0;
  381. }
  382. /***************************************************************
  383. * 函数名:USART_Config()
  384. * 输入  :void
  385. * 输出  :void
  386. * 功能  :初始化串口
  387. ****************************************************************/
  388. static void USART_Config(void)
  389. {
  390.   /*             配置USART3外围时钟源                   */
  391.   CLK_PeripheralClockConfig(CLK_Peripheral_USART3, ENABLE);
  392.   /*             配置RX,TX引脚为上拉                    */
  393.   GPIO_ExternalPullUpConfig(GPIOG, GPIO_Pin_0|GPIO_Pin_1, ENABLE);
  394.   /*             初始化USART2,波特率,控制和校验       */
  395.   USART_Init(USART3,(uint32_t)9600, USART_WordLength_8b, USART_StopBits_1,
  396.                    USART_Parity_No, (USART_Mode_TypeDef)(USART_Mode_Tx | USART_Mode_Rx));

  397.   /*            采用中断方式接收        */
  398. // enableInterrupts();
  399.   USART_ITConfig(USART3, USART_IT_RXNE, ENABLE);
  400.   
  401.   /*             启动USART3                            */
  402.   USART_Cmd(USART3, ENABLE);
  403. }
  404. /***************************************************************
  405. * 函数名:TIM4_Config
  406. * 输入  :void
  407. * 输出  :void
  408. * 功能  :初始化定时器
  409. ****************************************************************/
  410. static void TIM4_Config(void)
  411. {
  412.   CLK_PeripheralClockConfig(CLK_Peripheral_TIM4, ENABLE);
  413.   
  414.    TIM4_TimeBaseInit(TIM4_Prescaler_16384, 1);  //定时1S

  415.      /* Enable TIM4_IT clock */
  416.    TIM4_ITConfig(TIM4_IT_Update,ENABLE);
  417.      
  418.    TIM4_Cmd(ENABLE);
  419. }
  420. /***************************************************************
  421. * 函数名:LCD_Config
  422. * 输入  :void
  423. * 输出  :void
  424. * 功能  :初始化LCD显示器
  425. ****************************************************************/
  426. static void LCD_RTCConfig(void)
  427. {
  428.   /* Enable LSE */
  429.   CLK_LSEConfig(CLK_LSE_ON);
  430.   /* Enable LCD clock */
  431.   CLK_PeripheralClockConfig(CLK_Peripheral_LCD, ENABLE);
  432.   CLK_RTCClockConfig(CLK_RTCCLKSource_LSE, CLK_RTCCLKDiv_1);
  433.    /* Enable RTC clock */
  434.   CLK_PeripheralClockConfig(CLK_Peripheral_RTC, ENABLE);
  435.   
  436. }
  437. /**************************************************************************************
  438. * 函数原型:void Read_RTCTimes()
  439. * 输  入:void
  440. * 输  出:void                    
  441. * 功  能:读取时钟
  442. * 描  述:
  443. ***************************************************************************************/
  444. void Read_RTCTimes()
  445. {
  446.   do{
  447.         while (RTC_WaitForSynchro() != SUCCESS);
  448.       
  449.         RTC_GetTime(RTC_Format_BIN, &RTC_TimeStr);
  450.         RTC_GetDate(RTC_Format_BIN, &RTC_DateStr);
  451.       
  452.         Frame.uValuer.uTimes.uFrame_Year = RTC_DateStr.RTC_Year;
  453.         Frame.uValuer.uTimes.uFrame_Month = (((uint8_t)RTC_DateStr.RTC_Month & 0xF0)>>4)*10+((uint8_t)RTC_DateStr.RTC_Month &0x0F);
  454.         Frame.uValuer.uTimes.uFrame_Date = RTC_DateStr.RTC_Date;
  455.           Frame.uValuer.uTimes.uFrame_Hours= RTC_TimeStr.RTC_Hours;
  456.         Frame.uValuer.uTimes.uFrame_Minutes = RTC_TimeStr.RTC_Minutes;

  457.      }
  458.     while(0);
  459.    
  460. }

  461. /****************************************************
  462. * 函数名:Time_Setting
  463. * 输  入:void
  464. * 输  出:uint8_t
  465. * 功  能:时间校验检查
  466. * 描  述:
  467. *****************************************************/
  468. uint8_t Time_Setting(void)
  469. {

  470.   RTC_DateStr.RTC_Year          = Frame.uValuer.uTimes.uFrame_Year;
  471.   RTC_DateStr.RTC_Month   = (RTC_Month_TypeDef)Frame.uValuer.uTimes.uFrame_Month;
  472.   RTC_DateStr.RTC_Date          =  Frame.uValuer.uTimes.uFrame_Date;
  473.   RTC_TimeStr.RTC_Hours    = Frame.uValuer.uTimes.uFrame_Hours;
  474.   RTC_TimeStr.RTC_Minutes  = Frame.uValuer.uTimes.uFrame_Minutes;
  475.   RTC_TimeStr.RTC_Seconds  = (uint8_t)DATA_EMPTY;

  476.   
  477.   RTC_SetTime(RTC_Format_BIN, &RTC_TimeStr);
  478.   RTC_SetDate(RTC_Format_BIN, &RTC_DateStr);
  479.   
  480.    while (RTC_WaitForSynchro() != SUCCESS);
  481.       
  482.    RTC_GetTime(RTC_Format_BIN, &RTC_TimeStr);
  483.    RTC_GetDate(RTC_Format_BIN, &RTC_DateStr);
  484.    
  485.     if(RTC_DateStr.RTC_Year > 100)
  486.            return 0;
  487.           
  488.         if((((uint8_t)RTC_DateStr.RTC_Month>>4)&0x0F)*10 + ((uint8_t)RTC_DateStr.RTC_Month & 0x0F) > 12)
  489.             return 0;  

  490.         if(RTC_DateStr.RTC_Date > 31)
  491.            return 0;

  492.         if(RTC_TimeStr.RTC_Hours > 24)
  493.            return 0;

  494.         if( RTC_TimeStr.RTC_Minutes > 60)
  495.            return 0;
  496.           
  497. return 1;  
  498. }

  499. /******************************************************************************************
  500. * 函数原型:uint8_t Read_RecodeData(uint32_t paddr,uint8_t *uData)
  501. * 输  入:uint8_t paddr               - 数据记录首地址
  502.           uint8_t *uData              - 读出数据缓存
  503. * 输  出:uint8_t                     - 读出数据情况,如果成功返回读出数据记录长度、
  504.                                         否则为0
  505. * 功  能:  实现一次数据记录的读取操作
  506. * 描  述:
  507. ******************************************************************************************/

  508. uint8_t Read_RecodeData(uint32_t paddr,uint8_t *uData)
  509. {
  510.   static uint8_t  upackge_index = 0x00;
  511.   static uint32_t pStart_addr;
  512.   uint8_t Empty_Calc = 0x00;
  513.   uint8_t uindex = 0x00;
  514.   uint8_t Package_Mum = PACKAGE_SEND_MAX;
  515.   
  516.   
  517.    if(upackge_index == DATA_EMPTY)
  518.      pStart_addr = paddr;
  519.    
  520.    if((uData[DATA_START]-upackge_index) == 0x01)                             //最后一次数据读取判断
  521.    {
  522.      if(Frame.uContrl.uFrame_LastLen !=DATA_EMPTY)                                                  //如果是不完整的发送包个数
  523.       Package_Mum = Frame.uContrl.uFrame_LastLen;
  524.      
  525.       Frame.uContrl.uFrame_Next = RESET;                                                           //清除后续包标志
  526.    }
  527.       
  528.   for(;uindex < Package_Mum*RECODE_SIGEN_LEN;uindex++)
  529.   {
  530.       if(DATA_EMPTY == *((PointerAttr uint8_t*)(uint16_t)pStart_addr+uindex))        //判断数据记录是否为空
  531.          Empty_Calc++;
  532.          
  533.        if(RECODE_SIGEN_LEN <= Empty_Calc )                                           //如果有一条记录为空
  534.          return 0;
  535.       
  536.        if((uindex != 0) &&(uindex % RECODE_SIGEN_LEN ==0))
  537.          Empty_Calc = 0x00;        
  538.       
  539.       uData[FRAME_START+uindex] = *((PointerAttr uint8_t *)(uint16_t)pStart_addr+ uindex); // 读取数据到缓冲buffer  
  540.   }  
  541.    upackge_index++;  
  542.   
  543.   uData[DATA_START+0x01] = upackge_index;                         //当前读取次数
  544.   
  545.   uData[FRAME_START-0x01] = uindex / RECODE_SIGEN_LEN ;      //当前读取包个数
  546.   
  547.   pStart_addr += (uint32_t)READ_BUFF_MAX;                    //保存读取地址
  548.   
  549.   
  550.   if(Frame.uContrl.uFrame_Next == RESET)
  551.       upackge_index = 0x00;
  552.   
  553.   Frame.uContrl.uFrame_DataLen = uindex;
  554.   
  555.   return 1;
  556. }

  557. /********************************************************************************************
  558. * 函数原型:uint8_t Recode_Header(uint32_t paddr,uint8_t *uData)
  559. * 输  入:uint8_t paddr                       - 记录头首地址  (数据包个数地址)
  560.           uint8_t *uData                      - 读出数据缓存
  561. * 输  出:uint8_t                             - 读取情况,如果为空返回1 ,如果为0表示记录不为空
  562. * 功  能:读取数据记录头信息
  563. * 描  述:
  564. ********************************************************************************************/

  565. uint8_t Recode_Header(uint32_t paddr,uint8_t *uData)
  566. {
  567.   uint8_t Send_index = (uint8_t)(*((PointerAttr uint8_t*)((uint16_t)paddr))/PACKAGE_SEND_MAX);
  568.   
  569.   if(*((PointerAttr uint8_t *)((uint16_t)paddr)) == 0x00)
  570.       return 0;
  571.   
  572.   if((*((PointerAttr uint8_t*)((uint16_t)paddr))%PACKAGE_SEND_MAX))
  573.   {
  574.      Send_index++;
  575.      Frame.uContrl.uFrame_LastLen = (uint8_t)*((PointerAttr uint8_t*)((uint16_t)paddr))%PACKAGE_SEND_MAX;
  576.   }
  577.    
  578.    uData[DATA_START] = Send_index;
  579.    
  580.    if(uData[DATA_START] > 0x01)
  581.       Frame.uContrl.uFrame_Next = SET;
  582.       
  583.   return 1;
  584. }

  585. /********************************************************************************************
  586. * 函数原型:uint8_t Recode_Header(uint32_t paddr,uint8_t *uData)
  587. * 输  入:uint8_t paddr                       - 记录头首地址  (数据包个数地址)
  588.           uint8_t *uData                      - 读出数据缓存
  589. * 输  出:uint8_t                             - 读取情况,如果为空返回1 ,如果为0表示记录不为空
  590. * 功  能:读取数据记录头信息
  591. * 描  述:
  592. ********************************************************************************************/

  593. void System_EventProcess()
  594. {
  595.         
  596.      /*    被动发送测试
  597.       *****************************************************************
  598.       */  
  599.          /* 测试连接与读取ID信息 !*/
  600.          if(Frame.uAction.uEvent == READ_STATE)
  601.          {
  602.            Frame.uAction.uEvent = INVALID_ACTION;
  603.            /* 读取时间 */
  604.            Read_RTCTimes();
  605.            Frame.uAction.uResult = ACTION_SUCCESS;
  606.            Frame.uEvent = READSYS_STATE_FINSHED;
  607.          }
  608.          /* 测试清除数据 ! */
  609.          if(Frame.uAction.uEvent == ERASE_RECODE)
  610.          {
  611.            Frame.uAction.uEvent = INVALID_ACTION;
  612.            
  613.            /* .........进行清除操作........... */
  614.            
  615.            Frame.uAction.uResult = ACTION_SUCCESS;
  616.            Frame.uEvent = ERASE_RECODE_FINSHED;
  617.          }
  618.          /* 测试设置时间 ! */
  619.          if(Frame.uAction.uEvent == SETING_TIME)
  620.          {
  621.            Frame.uAction.uEvent = INVALID_ACTION;
  622.            
  623.            if(Time_Setting())   
  624.            Frame.uAction.uResult = ACTION_SUCCESS;
  625.            
  626.            Frame.uEvent = SETING_TIME_FINSHED;
  627.          }     
  628.           /* 读取血糖测试结果 !*/
  629.          if(Frame.uAction.uEvent == READ_SESULT)
  630.          {
  631.            Frame.uAction.uEvent = INVALID_ACTION;
  632.            
  633.            /* 测试模式读取血糖测试结果 */
  634.            Frame.uValuer.uTestMode =TESTING_MODE;
  635. ……………………

  636. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

所有资料51hei提供下载:
于STM8L低功耗系列芯片,开发一款智能手持血糖监测设备的源码.7z (158.68 KB, 下载次数: 23)


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

使用道具 举报

沙发
ID:1 发表于 2019-2-20 16:38 | 只看该作者
本帖需要重新编辑补全电路原理图,源码,详细说明与图片即可获得100+黑币(帖子下方有编辑按钮)
回复

使用道具 举报

板凳
ID:470175 发表于 2019-2-20 17:10 | 只看该作者
点错了,,。。没想下载。。。。尴尬
回复

使用道具 举报

地板
ID:470175 发表于 2019-2-20 17:11 | 只看该作者
admin 发表于 2019-2-20 16:38
本帖需要重新编辑补全电路原理图,源码,详细说明与图片即可获得100+黑币(帖子下方有编辑按钮)

是我发的无效了么,我说我点错了,并不想下载尴尬啊,我的黑币
回复

使用道具 举报

5#
ID:1 发表于 2019-2-20 19:35 | 只看该作者
缺原理图
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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