久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

標(biāo)題: 基于stm8L051F3單片機(jī)的無(wú)線遙控器程序設(shè)計(jì) [打印本頁(yè)]

作者: gandonjun    時(shí)間: 2019-12-30 13:59
標(biāo)題: 基于stm8L051F3單片機(jī)的無(wú)線遙控器程序設(shè)計(jì)
使用stm8L051F3芯片,RF433頻率的無(wú)線遙控器代碼,支持3種按鍵模式


單片機(jī)源程序如下:
  1. #include "All_Includes.h"

  2. #define ACCEL_OPEN              180
  3. #define ACCEL_SHAKE             60
  4. #define ANGLE_OPEN              900     //55°* 16.4 = 900
  5. #define OPEN_TEST_TIME_GATE     25      //3s
  6. #define SHAKE_TEST_TIME_GATE    (4*60)  //4min
  7. #define SHAKE_TIME_GATE         60      //60s
  8. #define ID_ADDR                 0x4926
  9. #define CODE_MATCH              0X79
  10. #define CODE_DOWN               0X33
  11. #define CODE_UP                 0X11
  12. #define CODE_STOP                 0X55
  13. #define CODE_DRY                 0X75
  14. #define CODE_LED                 0X0F
  15. #define CODE_XD                 0X73
  16. #define CODE_HEAT                 0X76
  17. #define CODE_FLZ                 0X44



  18. uint8_t ShakeFlag       = 0;
  19. uint8_t ShakeFirstFlag  = 0;
  20. uint8_t DryFlag         = 0;//0--未檢測(cè)到任何信號(hào) 1--檢測(cè)到連續(xù)震動(dòng) 2--檢測(cè)到加速度 3--檢測(cè)到開(kāi)門(mén)信號(hào)
  21. uint8_t ShakeTime_1S    = 0;
  22. uint16_t TimeCount       = 0;

  23. uint16_t TestCount       = 0;
  24. uint16_t TestFlag    = 76;
  25. uint8_t TestHALF    = 0;
  26. uint8_t HALF_H_FLAG    = 1;
  27. uint8_t GO_FLAG    = 0;

  28. uint8_t TestGo = 0;

  29. uint8_t ShakeTime       = 0;
  30. uint16_t ShakeTestTime  = 0;
  31. uint8_t OpenTestTime    = 0;
  32. uint8_t Uid[4]          = {0};
  33. uint8_t KeyFlag         = 0;
  34. uint8_t UpFlag         = 1;
  35. uint8_t DnFlag         = 1;
  36. uint8_t TimeFlag = 0;



  37. void Lsi_Clk_Init(void)
  38. {
  39.     CLK_SYSCLKSourceSwitchCmd(ENABLE);            //使能時(shí)鐘切換
  40.     CLK_SYSCLKSourceConfig(CLK_SYSCLKSource_LSI); //選擇內(nèi)部低速時(shí)鐘作為時(shí)鐘源
  41.     CLK_SYSCLKDivConfig(CLK_SYSCLKDiv_1);         //設(shè)置系統(tǒng)時(shí)鐘分頻32K
  42.     while (CLK_GetSYSCLKSource() != CLK_SYSCLKSource_LSI);//等待時(shí)鐘穩(wěn)定
  43.     CLK_HSICmd(DISABLE);
  44. }

  45. void Hsi_Clk_Init(void)
  46. {
  47.     CLK_SYSCLKSourceSwitchCmd(ENABLE);            //使能時(shí)鐘切換
  48.     CLK_SYSCLKSourceConfig(CLK_SYSCLKSource_HSI); //選擇內(nèi)部高速時(shí)鐘作為時(shí)鐘源
  49.     CLK_SYSCLKDivConfig(CLK_SYSCLKDiv_16);         //設(shè)置系統(tǒng)時(shí)鐘分頻1M
  50.     while (CLK_GetSYSCLKSource() != CLK_SYSCLKSource_HSI);//等待時(shí)鐘穩(wěn)定
  51. }


  52. void Rtc_Init(void)
  53. {
  54.     CLK_PeripheralClockConfig(CLK_Peripheral_RTC, ENABLE);//RTC時(shí)鐘門(mén)控使能
  55.     CLK_RTCClockConfig(CLK_RTCCLKSource_LSI, CLK_RTCCLKDiv_1);
  56.     RTC_WakeUpClockConfig(RTC_WakeUpClock_RTCCLK_Div16);
  57.     RTC_SetWakeUpCounter(200);          //80ms
  58.     RTC_WakeUpCmd(ENABLE);
  59.         
  60.     PWR_FastWakeUpCmd(ENABLE);  //快速喚醒使能
  61.     PWR_UltraLowPowerCmd(ENABLE);//超低功耗
  62.     RTC_ITConfig(RTC_IT_WUT, ENABLE);
  63. }
  64.   
  65. void Init_All(void)
  66. {
  67.     Hsi_Clk_Init(); //初始化時(shí)鐘
  68.     Time4_Init();
  69.     Gpio_Init();
  70.     //MPU6050_Init();
  71. }

  72. /*STM8L處于HALT狀態(tài),6050處于1HZ檢測(cè)狀態(tài)*/
  73. void Enter_Halt(void)
  74. {
  75.     //MPU6050_Init_1HZ();
  76.     //Gpio_Init_LowPower();
  77.     Lsi_Clk_Init();
  78.     PWR_UltraLowPowerCmd(ENABLE);//超低功耗
  79.     //MPU6050INT_Port->CR2 |= MPU6050INT_PINS;     //開(kāi)中斷
  80.     enableInterrupts();
  81.     halt();   
  82. }

  83. /*STM8L處于AWU狀態(tài),6050處于40HZ檢測(cè)狀態(tài)*/
  84. void Enter_AWU(void)
  85. {
  86.     MPU6050_Init_40HZ();
  87.     Gpio_Init_LowPower();
  88.     Lsi_Clk_Init();
  89.     Rtc_Init();
  90.     PWR_UltraLowPowerCmd(ENABLE);//超低功耗
  91.     halt();
  92. }

  93. int16_t fabs(int16_t x)
  94. {
  95.     if(x > 0)
  96.     {
  97.         return x;
  98.     }
  99.     else
  100.     {
  101.         return -x;
  102.     }
  103. }

  104. uint16_t fabs_2(int16_t x,int16_t y)
  105. {
  106.     if(x > y)
  107.     {
  108.         return (uint16_t)((int32_t)x-(int32_t)y);
  109.     }
  110.     else
  111.     {
  112.         return (uint16_t)((int32_t)y-(int32_t)x);
  113.     }
  114. }

  115. void GetStm8Id(uint8_t* uid)
  116. {  
  117.     uid[0]  = *(uint8_t*)(ID_ADDR+4);
  118.     uid[1]  = *(uint8_t*)(ID_ADDR+6);
  119.     uid[2]  = *(uint8_t*)(ID_ADDR+8);
  120.     uid[3]  = *(uint8_t*)(ID_ADDR+9);

  121.     //uid[0]  = 0x76;
  122.     //uid[1]  = 0x44;
  123.     //uid[2]  = 0x77;
  124.     //uid[3]  = 0x61;//6,9
  125. }

  126. void KeyDeal(uint8_t code , uint8_t key_pins )
  127. {
  128.     disableInterrupts();
  129.     //KeyFlag = 0;
  130.     TimeCount = 0;

  131.     if(0 == (KEY_PORT_B->IDR & key_pins))//按鍵為0表示有按鍵按下
  132.     {
  133.         Delay100uS(100);
  134.         if(0 == (KEY_PORT_B->IDR & key_pins))//延時(shí)10ms消抖
  135.         {
  136.             SysLED_High;
  137.             Send_RF433_Data_3Time(code);
  138.             Delay100uS(100);
  139.             SysLED_Low;
  140.         }
  141.      }
  142.     enableInterrupts();
  143. }

  144. /*******************************************
  145. 1s調(diào)用一次
  146. 1s內(nèi)有2次以上震動(dòng)就算檢測(cè)到震動(dòng)信號(hào),否則算為靜止時(shí)間,連續(xù)靜止5s以上重新進(jìn)入低功耗模式
  147. 連續(xù)檢測(cè)到5次以上震動(dòng)信號(hào)就算檢測(cè)到甩干信號(hào)
  148. *******************************************/
  149. void ShakeMonitor(void)
  150. {
  151.     if(ShakeTime_1S >= 2)//1s內(nèi)2次
  152.     {
  153.         ShakeTime_1S = 0;
  154.         ShakeTime++;
  155.         if(ShakeTime >= SHAKE_TIME_GATE)
  156.         {
  157.             DryFlag   = 1;
  158.             ShakeTime = 0;
  159.             return;
  160.         }
  161.     }
  162.     ShakeTestTime ++;
  163.     if((ShakeTestTime >= 40 && ShakeTime <= 5)
  164.        || ShakeTestTime >= SHAKE_TEST_TIME_GATE)//(40s內(nèi)5s,4min內(nèi)60s)進(jìn)入低功耗
  165.     {
  166.         ShakeFlag     = 0;
  167.         ShakeTime_1S  = 0;
  168.         ShakeTime     = 0;
  169.         ShakeTestTime = 0;   
  170.     }   
  171. }

  172. /*******************************************
  173. 100ms調(diào)用一次
  174. 未檢測(cè)到甩干信號(hào)時(shí)檢測(cè)甩干信號(hào)
  175. 檢測(cè)到甩干信號(hào)后定時(shí)喚醒檢測(cè)開(kāi)門(mén)狀態(tài)
  176. *******************************************/
  177. void ShakeProcess(void)
  178. {
  179.     int16_t acce_x_aver = 0;
  180.     int16_t acce_y_aver = 0;
  181.     int16_t acce_z_aver = 0;
  182.     uint16_t acce_x_change = 0;
  183.     uint16_t acce_y_change = 0;
  184.     uint16_t acce_z_change = 0;
  185.     static int16_t acce_x_before = 0;
  186.     static int16_t acce_y_before = 0;
  187.     static int16_t acce_z_before = 0;
  188.    
  189.     int16_t gyro_x_aver = 0;
  190.     int16_t gyro_y_aver = 0;
  191.     int16_t gyro_z_aver = 0;
  192.     static int32_t Angle_x = 0;
  193.     static int32_t Angle_y = 0;
  194.     static int32_t Angle_z = 0;
  195.    
  196.     MPU6050INT_Port->CR2 &= ~MPU6050INT_PINS;  //關(guān)閉中斷
  197.     I2C_IOInit();
  198.     MPU6050ReadAcc(&acce_x_aver,&acce_y_aver,&acce_z_aver);
  199.    
  200.     if(1 == ShakeFirstFlag)
  201.     {   
  202.         DryFlag         = 0;
  203.         ShakeTestTime   = 0;
  204.         ShakeTime_1S    = 0;
  205.         ShakeTime       = 0;
  206.         OpenTestTime    = 0;
  207.         ShakeFirstFlag  = 0;
  208.         acce_x_before = acce_x_aver;
  209.         acce_y_before = acce_y_aver;
  210.         acce_z_before = acce_z_aver;
  211.     }
  212.     acce_x_change = fabs_2(acce_x_aver,acce_x_before);
  213.     acce_y_change = fabs_2(acce_y_aver,acce_y_before);
  214.     acce_z_change = fabs_2(acce_z_aver,acce_z_before);
  215.    
  216.     acce_x_before = acce_x_aver;
  217.     acce_y_before = acce_y_aver;
  218.     acce_z_before = acce_z_aver;

  219.     if(0 == DryFlag) //要檢測(cè)連續(xù)震動(dòng)信號(hào)
  220.     {
  221.         if(ACCEL_SHAKE < acce_x_change || ACCEL_SHAKE < acce_y_change || ACCEL_SHAKE < acce_z_change)//震動(dòng)
  222.         {
  223.             ShakeTime_1S++;
  224.         }
  225.         TimeCount++;
  226.         if(TimeCount >= 10)
  227.         {
  228.             TimeCount = 0;
  229.             ShakeMonitor();
  230.         }
  231.     }
  232.     else if(1 == DryFlag)//檢測(cè)到連續(xù)震動(dòng)之后需要檢測(cè)開(kāi)門(mén)信號(hào)
  233.     {
  234.         if(ACCEL_OPEN < acce_x_change || ACCEL_OPEN < acce_y_change || ACCEL_OPEN < acce_z_change)//開(kāi)門(mén)
  235.         {
  236.             DryFlag = 2;
  237.             Angle_x = 0;
  238.             Angle_y = 0;
  239.             Angle_z = 0;
  240.         }
  241.     }
  242.     else if(2 == DryFlag)//檢測(cè)到瞬間加速度值大于開(kāi)門(mén)加速度
  243.     {
  244.         MPU6050_Init_Active();
  245.         
  246.         MPU6050ReadGyro(&gyro_x_aver,&gyro_y_aver,&gyro_z_aver);
  247.         Angle_x = Angle_x + gyro_x_aver/6; //150ms
  248.         Angle_y = Angle_y + gyro_y_aver/6;
  249.         Angle_z = Angle_z + gyro_z_aver/6;

  250.         if(ANGLE_OPEN < fabs(Angle_x) || ANGLE_OPEN < fabs(Angle_y) || ANGLE_OPEN < fabs(Angle_z))
  251.         {
  252.             DryFlag = 0;
  253.             ShakeFirstFlag = 0;
  254.             ShakeFlag = 0;
  255.             disableInterrupts();
  256.             Send_RF433_Data_3Time(CODE_DOWN);
  257.             enableInterrupts();
  258.             return;
  259.         }

  260.         OpenTestTime++;
  261.         if(OpenTestTime >= OPEN_TEST_TIME_GATE)//超過(guò)一定時(shí)間檢測(cè)到角度變化值小則重新檢測(cè)加速度
  262.         {
  263.             OpenTestTime = 0;
  264.             DryFlag = 1;
  265.         }
  266.     }
  267. }

  268. uint8_t itoa(int32_t num,uint8_t *str,int8_t radix)
  269. {
  270.     uint8_t index[]= "0123456789ABCDEF";
  271.     uint32_t unum;
  272.     int8_t i=0,j,k;

  273.     if(num < 0)
  274.     {
  275.         unum=(uint32_t)(-num);
  276.         str[i++] = '-';
  277.     }
  278.     else
  279.     {   
  280.       unum = (uint32_t)num;
  281.     }
  282.    
  283.     do
  284.     {
  285.         str[i++] = index[unum%radix];
  286.         unum /= radix;
  287.     }while(unum);
  288.     str[i]='\0';
  289.    
  290.     /*逆序*/
  291.     if(str[0]=='-')
  292.     {
  293.       k=1;/*十進(jìn)制負(fù)數(shù)*/
  294.     }
  295.     else
  296.     {
  297.       k=0;
  298.     }
  299.    
  300.     int8_t temp;
  301.     for(j=k;j<=(i-1)/2;j++)
  302.     {
  303.         temp = str[j];
  304.         str[j] = str[i-1+k-j];
  305.         str[i-1+k-j] = temp;
  306.     }
  307.     return i;
  308. }

  309. void main(void)
  310. {   
  311.     disableInterrupts();
  312.     Init_All();
  313.     SysLED_High;
  314.     //Delay100uS(10000);
  315.     SysLED_Low;
  316.     GetStm8Id(Uid);
  317.     //Enter_Halt();  
  318.    
  319.     enableInterrupts();
  320.     //Enter_Halt();
  321.     Send_RF433_Data_3Time(CODE_MATCH);
  322.    
  323.     while(1)
  324.     {   
  325.         //Hsi_Clk_Init();
  326.         //RTC_ITConfig(RTC_IT_WUT, DISABLE);
  327.         

  328.         switch(KeyFlag)
  329.         {   
  330.         case 1 : //上升
  331.             Delay100uS( TimeCount );
  332.             if(0 == (KEY_PORT_B->IDR & (KEY_PINS_UP | KEY_PINS_DN )))
  333.             {
  334.                
  335.                 KeyDeal( CODE_MATCH , (KEY_PINS_UP | KEY_PINS_DN) );
  336.                 TimeCount = 0;
  337.             }
  338.             else if ( KeyFlag )
  339.             {
  340.                 KeyDeal( CODE_UP, KEY_PINS_UP );
  341.                 TimeFlag ++;               
  342.             }
  343.             
  344.             if ( KEY_PORT_B->IDR & KEY_PINS_UP )
  345.             {
  346.                 Send_RF433_Data( 0X1E );
  347.                 KeyFlag = 0;
  348.             }
  349.             
  350.             if ( TimeFlag >= 60 )//發(fā)送60次報(bào)文,時(shí)間約10s,
  351.             {
  352.                 KeyFlag = 0;
  353.                 TimeFlag = 0;
  354.             }
  355.             break;
  356.         case 2: //下降
  357.           Delay100uS( TimeCount );
  358.             if(0 == (KEY_PORT_B->IDR & (KEY_PINS_UP | KEY_PINS_DN )))
  359.             {               
  360.                 KeyDeal( CODE_MATCH , (KEY_PINS_UP | KEY_PINS_DN) );
  361.                 TimeCount = 0;
  362.             }
  363.             else if ( KeyFlag )
  364.             {
  365.                 KeyDeal( CODE_DOWN, KEY_PINS_DN );
  366.                 TimeFlag ++;
  367.             }

  368.             
  369.             if ( KEY_PORT_B->IDR & KEY_PINS_DN )
  370.             {
  371.                 Send_RF433_Data( 0X3E );
  372.                 KeyFlag = 0;
  373.             }
  374.             
  375.             if ( TimeFlag >= 60 ) //發(fā)送60次后停止
  376.             {
  377.                 KeyFlag = 0;
  378.                 TimeFlag = 0;               
  379.             }
  380.             break;
  381.          case 3: //風(fēng)干
  382.             KeyDeal( CODE_DRY , KEY_PINS_DRY );
  383.             KeyFlag = 0;
  384.             break;
  385.          case 4: //照明
  386.             KeyDeal( CODE_LED , KEY_PINS_LED );
  387.             //Send_RF433_Data_3Time(0x79);
  388.             KeyFlag = 0;
  389.             break;
  390.          case 5: //消毒
  391.             KeyDeal( CODE_XD , KEY_PINS_XD );
  392.             KeyFlag = 0;
  393.             break;
  394.          case 6: //烘干
  395.             KeyDeal( CODE_HEAT , KEY_PINS_HEAT );
  396.             KeyFlag = 0;
  397.             break;
  398.          case 7: //負(fù)離子
  399.             KeyDeal( CODE_FLZ , KEY_PINS_FLZ );
  400.             KeyFlag = 0;
  401.             break;   
  402.          default:
  403.            //Enter_Halt(); //沒(méi)有按鍵的情況下,進(jìn)入低功耗
  404.            break;
  405.         }
  406.     }
  407. }
復(fù)制代碼

所有資料51hei提供下載:
YK001 V1.0.7z (635.9 KB, 下載次數(shù): 43)







歡迎光臨 (http://www.zg4o1577.cn/bbs/) Powered by Discuz! X3.1
主站蜘蛛池模板: 亚洲三区在线观看 | 欧美伊人影院 | 欧美国产日韩一区 | 亚洲bt 欧美bt 日本bt | 欧美激情va永久在线播放 | 亚洲欧美综合精品另类天天更新 | 欧美在线国产精品 | eeuss国产一区二区三区四区 | 这里精品 | 成年人在线观看 | 最新免费黄色网址 | 一本一道久久a久久精品综合 | 91天堂网 | 亚洲精品一区二区网址 | 国产激情网 | 国产精品a久久久久 | 久草99| 91久久综合亚洲鲁鲁五月天 | 成人1区2区 | 国产亚洲精品久久yy50 | 91就要激情 | 欧产日产国产精品视频 | 久久成人人人人精品欧 | 午夜精品一区二区三区在线视频 | 成人免费大片黄在线播放 | 国产一区二区在线免费播放 | 尤物视频在线免费观看 | 日本欧美国产在线 | 一级毛片视频 | 黄色毛片在线观看 | 日本在线看片 | 国产欧美一区二区三区在线看 | www狠狠干 | 国产午夜亚洲精品不卡 | 久久一区二区三区电影 | 中文字幕国产日韩 | 日韩在线视频精品 | 国产精品高清一区二区三区 | 欧美午夜视频 | 精品视频在线观看 | 99国内精品久久久久久久 |