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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2685|回復: 0
打印 上一主題 下一主題
收起左側

基于stm8L051F3單片機的無線遙控器程序設計

[復制鏈接]
跳轉到指定樓層
樓主
使用stm8L051F3芯片,RF433頻率的無線遙控器代碼,支持3種按鍵模式


單片機源程序如下:
  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--未檢測到任何信號 1--檢測到連續震動 2--檢測到加速度 3--檢測到開門信號
  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);            //使能時鐘切換
  40.     CLK_SYSCLKSourceConfig(CLK_SYSCLKSource_LSI); //選擇內部低速時鐘作為時鐘源
  41.     CLK_SYSCLKDivConfig(CLK_SYSCLKDiv_1);         //設置系統時鐘分頻32K
  42.     while (CLK_GetSYSCLKSource() != CLK_SYSCLKSource_LSI);//等待時鐘穩定
  43.     CLK_HSICmd(DISABLE);
  44. }

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


  52. void Rtc_Init(void)
  53. {
  54.     CLK_PeripheralClockConfig(CLK_Peripheral_RTC, ENABLE);//RTC時鐘門控使能
  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(); //初始化時鐘
  68.     Time4_Init();
  69.     Gpio_Init();
  70.     //MPU6050_Init();
  71. }

  72. /*STM8L處于HALT狀態,6050處于1HZ檢測狀態*/
  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;     //開中斷
  80.     enableInterrupts();
  81.     halt();   
  82. }

  83. /*STM8L處于AWU狀態,6050處于40HZ檢測狀態*/
  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))//延時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調用一次
  146. 1s內有2次以上震動就算檢測到震動信號,否則算為靜止時間,連續靜止5s以上重新進入低功耗模式
  147. 連續檢測到5次以上震動信號就算檢測到甩干信號
  148. *******************************************/
  149. void ShakeMonitor(void)
  150. {
  151.     if(ShakeTime_1S >= 2)//1s內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內5s,4min內60s)進入低功耗
  165.     {
  166.         ShakeFlag     = 0;
  167.         ShakeTime_1S  = 0;
  168.         ShakeTime     = 0;
  169.         ShakeTestTime = 0;   
  170.     }   
  171. }

  172. /*******************************************
  173. 100ms調用一次
  174. 未檢測到甩干信號時檢測甩干信號
  175. 檢測到甩干信號后定時喚醒檢測開門狀態
  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;  //關閉中斷
  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) //要檢測連續震動信號
  220.     {
  221.         if(ACCEL_SHAKE < acce_x_change || ACCEL_SHAKE < acce_y_change || ACCEL_SHAKE < acce_z_change)//震動
  222.         {
  223.             ShakeTime_1S++;
  224.         }
  225.         TimeCount++;
  226.         if(TimeCount >= 10)
  227.         {
  228.             TimeCount = 0;
  229.             ShakeMonitor();
  230.         }
  231.     }
  232.     else if(1 == DryFlag)//檢測到連續震動之后需要檢測開門信號
  233.     {
  234.         if(ACCEL_OPEN < acce_x_change || ACCEL_OPEN < acce_y_change || ACCEL_OPEN < acce_z_change)//開門
  235.         {
  236.             DryFlag = 2;
  237.             Angle_x = 0;
  238.             Angle_y = 0;
  239.             Angle_z = 0;
  240.         }
  241.     }
  242.     else if(2 == DryFlag)//檢測到瞬間加速度值大于開門加速度
  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)//超過一定時間檢測到角度變化值小則重新檢測加速度
  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;/*十進制負數*/
  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 )//發送60次報文,時間約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 ) //發送60次后停止
  376.             {
  377.                 KeyFlag = 0;
  378.                 TimeFlag = 0;               
  379.             }
  380.             break;
  381.          case 3: //風干
  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: //負離子
  399.             KeyDeal( CODE_FLZ , KEY_PINS_FLZ );
  400.             KeyFlag = 0;
  401.             break;   
  402.          default:
  403.            //Enter_Halt(); //沒有按鍵的情況下,進入低功耗
  404.            break;
  405.         }
  406.     }
  407. }
復制代碼

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


評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 久久人人爽人人爽 | 成人免费视频 | 亚洲国产精品一区二区三区 | 亚洲国产aⅴ成人精品无吗 国产精品永久在线观看 | 91在线免费观看网站 | 一区二区三区四区免费观看 | 久久精品国产99国产精品 | 日韩三区 | 精品一二区 | 久久国产成人午夜av影院武则天 | 91精品国产91久久久久久密臀 | 久久99久久99精品免视看婷婷 | 久久久蜜桃 | 大吊一区二区 | 国产精品久久久久久久久久久免费看 | 在线欧美亚洲 | 中文字幕在线观看视频网站 | 亚洲精品一区二区 | 国产一区二区三区色淫影院 | 亚洲美女一区二区三区 | 国产精品夜间视频香蕉 | 亚洲一区中文字幕 | 国产成年人小视频 | 欧美一区视频 | 久久久蜜桃一区二区人 | 国产一级久久久久 | 日本一区二区不卡视频 | 综合自拍 | 亚洲人成在线播放 | 一级免费毛片 | 天堂成人国产精品一区 | 久久成人精品视频 | 久久高清| 岛国av一区二区 | 亚洲国产二区 | 国产在线一区二区 | 日本不卡免费新一二三区 | 亚洲精品乱码久久久久久久久久 | 99re在线视频观看 | 欧美freesex黑人又粗又大 | 国产视频欧美 |