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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2842|回復: 3
收起左側

STM8L單片機SI4463無線芯片IAR例程 廠家資料 好移植

[復制鏈接]
ID:316232 發表于 2019-2-15 14:58 | 顯示全部樓層 |閱讀模式
STM8L-SI4463 IAR例程 廠家資料 好移植

單片機源程序如下:
  1. #include <stdio.h>
  2. #include <stdarg.h>
  3. #include <stdlib.h>
  4. #include <string.h>
  5. #include "gpio.h"
  6. #include "uart.h"
  7. #include "oled.h"
  8. #include "function.h"
  9. #include "sensor.h"
  10. #include "rf.h"

  11. //SI4463 RF @STM8L151
  12. void frameProcess( u8 *buf, u8 size )
  13. {
  14.   u8 cmd = buf[0];
  15.   u8 len = buf[1];
  16.   
  17.   LED_RX=1;
  18.   
  19.   switch ( cmd )
  20.   {
  21.   case CMD_TEMP_HUM:
  22.    
  23.     if ( rfAck )
  24.     { //收到協議數據,立即發送應答
  25.       sendBuf[0]        = CMD_ACK;
  26.       sendBuf[1]        = 0;
  27.       RFSendData( sendBuf, 2 );
  28.       msg( "send reply..." );
  29.     }

  30.     if ( len == sizeof(float) )
  31.     { //拿到溫濕度數據,更新顯示
  32.       memcpy( &temperature, buf + 2, 2 );
  33.       memcpy( &humidity, buf + 4, 2 );
  34.       //發送串口顯示
  35.       rf2uart( temperature, humidity);
  36.       msg( "get sensor dat" );
  37.     }
  38.     break;
  39.    
  40.   case CMD_ACK:
  41.     //發送后收到應答
  42.     msg( "get reply" );
  43.     break;
  44.    
  45.   default:
  46.     //無線接收轉串口透傳
  47.     UartSend( buf, size);
  48.     msg( "get rf data" );
  49.     break;
  50.   }
  51.   
  52.   LED_RX=0;
  53. }

  54. int main( void )
  55. { int len;
  56.   
  57.     asm("sim");   //全局中斷關閉
  58.    
  59.     GPIOInit();   //IO初始化
  60.     Soft_I2C_Int();
  61.     GpioFicker(); //上電兩燈閃
  62.    
  63.     UartInit();   //UART初始化
  64.    
  65.     LED_Init();   //OLED屏初始化
  66.    
  67.     getSensor();  //獲取初始溫濕度值
  68.    
  69.     RFInit();     //射頻模塊初始化
  70.    
  71.     RFRxMode();   //設置RF接收模式
  72.    
  73.     asm("rim");   //全局中斷開啟
  74.   
  75.     msg( "system start" );//顯示開機信息

  76.     /*infinite loop begin*/
  77.     while(1)
  78.     {
  79.         OledDisplay();      //OLED屏幕刷新顯示
  80.    
  81.         keyProcess();       //按鍵監測處理
  82.    
  83.         timerTask();        //定期更新傳感器讀數
  84.    
  85.         uart2rf();          //串口轉無線透傳
  86.    
  87.         len = RFRevData( revBuf );  //接收無線數據
  88.         if ( len > 0 )
  89.         {
  90.             frameProcess( revBuf, len );//對收到的數據進行處理
  91.         }
  92.    
  93.         if ( rfContinueSend() )     //連續發送處理
  94.         {
  95.             delay_ms( 500 );
  96.         }
  97.     }/*infinite loop end*/
  98. }
復制代碼

  1. #include <stdio.h>
  2. #include <stdarg.h>
  3. #include <stdlib.h>
  4. #include <string.h>
  5. #include "function.h"
  6. #include "oled.h"
  7. #include "uart.h"
  8. #include "gpio.h"


  9. #include "rf.h"
  10. #include "sensor.h"


  11. unsigned short continueSendCnt=0; //連續發包數
  12. unsigned short continueSendIndex=0;

  13. void delay_us(u16 t)
  14. {
  15.   u16 i;
  16.   for(i=0;i<t;i++)
  17.   {
  18.    
  19.     asm("NOP");
  20.    
  21.   }
  22. }

  23. void delay_ms(u16 t)
  24. {
  25.   u16 i;
  26.   u16 j;
  27.   for(i=0;i<t;i++)
  28.     for(j=0;j<400;j++);
  29. }
  30. /* ------------------------------------------------------------------------ */
  31. void GpioFicker( void )
  32. {
  33. //上電兩燈閃
  34.        LED_TX=1; //兩燈亮
  35.        LED_RX=1;
  36.        delay_ms(500);
  37.        LED_TX=0;
  38.        LED_RX=0;
  39.        delay_ms(500);
  40.        LED_TX=1; //兩燈亮
  41.        LED_RX=1;
  42.        delay_ms(500);
  43.        LED_TX=0;
  44.        LED_RX=0;
  45. }

  46. void keyProcess( void )
  47. {
  48.   if ( GPIO_ReadInputDataBit( GPIOA, GPIO_Pin_4 ) == 0x00 ) /* S1 C13 */
  49.   {
  50.     delay_ms( 20 );
  51.     if ( GPIO_ReadInputDataBit( GPIOA, GPIO_Pin_4 ) == 0x00 )
  52.     {

  53.       
  54.         msg( "clear ...." );
  55.         iSend        = 0;
  56.         iRev        = 0;
  57.         while ( GPIO_ReadInputDataBit( GPIOA, GPIO_Pin_4 ) == 0x00 )
  58.           ;                                                       /* 等待按鍵釋放 */
  59.         
  60.     }
  61.   }
  62.   
  63.   if ( GPIO_ReadInputDataBit( GPIOA, GPIO_Pin_6 ) == 0x00 )                               /* S2 A0 */
  64.   {
  65.     delay_ms( 10 );
  66.    
  67.     if ( GPIO_ReadInputDataBit( GPIOA, GPIO_Pin_6 ) == 0x00 )
  68.     {
  69.       u8 len = 0;
  70.       while ( GPIO_ReadInputDataBit( GPIOA, GPIO_Pin_6 ) == 0x00 )
  71.         ;                                                               /* 等待按鍵釋放 */
  72.       sendBuf[0]        = CMD_TEMP_HUM;                                 /* cmd: 1發送傳感器數據  2應答成功 */
  73.       sendBuf[1]        = 4;
  74.       getSensor();
  75.       /* 數據長度 */
  76.       memcpy( &sendBuf[2], &temperature, 2 );
  77.       memcpy( &sendBuf[4], &humidity, 2 );
  78.       
  79.       
  80.       LedRed( On );
  81.       len = RFSendData( sendBuf, 6 );
  82.       if ( len > 0 )
  83.         msg( "send ok" );
  84.       else
  85.         msg( "send fail" );
  86.       
  87.       LedRed( Off );
  88.     }
  89.   }
  90.   
  91.   
  92.   if ( GPIO_ReadInputDataBit( GPIOA, GPIO_Pin_5 ) == 0x00 )
  93.   {
  94.     delay_ms( 10 );
  95.     if ( GPIO_ReadInputDataBit( GPIOA, GPIO_Pin_5 ) == 0x00 )
  96.     {
  97.       
  98.       while ( GPIO_ReadInputDataBit( GPIOA, GPIO_Pin_5 ) == 0x00 )
  99.         ;               /* 等待按鍵釋放 */
  100.       
  101.       continueSendCnt+=50;
  102.       
  103.       
  104.     }
  105.   }
  106. }

  107. char rfContinueSend(void)
  108. {
  109.   if(continueSendIndex>=continueSendCnt)return 0;
  110.   continueSendIndex++;
  111.   LedRed( On );
  112.   getSensor();
  113.   sendBuf[0]        = CMD_TEMP_HUM;    /* cmd: 1發送傳感器數據  2應答成功 */
  114.   sendBuf[1]        = 4;    /* 數據長度 */
  115.   memcpy( &sendBuf[2], &temperature, 2 );
  116.   memcpy( &sendBuf[4], &humidity, 2 );
  117.   
  118.   
  119.   RFSendData( sendBuf, 6 );
  120.   sprintf( (char *) sendBuf, "AutoSend:%d/%d", continueSendIndex,continueSendCnt );
  121.   msg( (char *) sendBuf );
  122.   
  123.   LedRed( Off );
  124.   OledDisplay();
  125.   return 1;
  126.   
  127.   
  128. }
  129. /* ------------------------------------------------------------------------ */

  130. void uart2rf(void)
  131. {
  132.   static u8 uart_rx_len_last=0;
  133.   u8 i,tmp=0;
  134.   if(uart_rx_len_last>0)
  135.   {
  136.       LED_TX=1;
  137.       if(uart_rx_len_last==uart_rx_len)
  138.       {
  139.          while(uart_rx_len)
  140.          {
  141.             u8 len=uart_rx_len>32?32:uart_rx_len;
  142.             RFSendData(uart_rx_buf+tmp,len);
  143.             uart_rx_len-=len;
  144.             tmp+=len;
  145.             delay_ms( 10 );
  146.          }
  147.          LED_TX=0;
  148.       }
  149.   }
  150.   
  151.   uart_rx_len_last=uart_rx_len;
  152. }

  153. void rf2uart(s16 tem,s16 hum)
  154. {
  155.    u8 sbuf[64];
  156.    sprintf( sbuf, "Tem%.1f Hum%.1f%%\n", tem / 10.0, hum / 10.0 );
  157.    UartSend( sbuf, 18);
  158. }

  159. void timerTask(void)
  160. {
  161.   static u32        count;
  162.   //static u8        flag = 0;
  163.   static int lastRevByte=-1;
  164.   
  165.   static u8 delay=1;
  166.   
  167.   if ( ++count > 2 )
  168.   {
  169.     count        = 0;
  170.    
  171.    
  172.     //收到數據5秒內顯示收到的數據而不是顯示采集到的本地數據
  173.     if(lastRevByte!=iRev)
  174.     {
  175.       lastRevByte=iRev;
  176.       delay=10;
  177.     }else{
  178.       if(--delay==0)
  179.       {
  180.         if(delay==0)delay=5;
  181.         getSensor();
  182.       }
  183.     }
  184.   }
  185. }

  186. void debug( const char* fmt, ... )
  187. {
  188.   va_list args;
  189.   va_start( args, fmt );
  190.   vprintf( fmt, args );
  191.   va_end( args );
  192. }

  193. /*
  194. * ------------------------------------------------------------------------
  195. * ------------------------------------------------------------------------
  196. * --------------------     私有函數定義            ------------------------------
  197. */
  198. void msg( char *msg )                                   /* 如果要顯示中文,OLED點陣字庫必須有相應數據,英文則不需要 */
  199. {
  200.   static u8 count=0;
  201.   char buf[8];
  202.   LED_PXx16MixStr( 0, 3, "                " );   /* 16個字母 */
  203.   sprintf(buf,"%d:",++count%10);
  204.   LED_PXx16MixStr(0,3,buf);
  205.   LED_PXx16MixStr( 14, 3, msg );
  206.   //debug( msg );
  207.   
  208. }                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            


  209. void OledDisplay( void )
  210. {
  211.   char buf[64] = "";
  212.   static char flag=0;
  213.   
  214.   if(!flag)
  215.   {
  216.     sprintf( buf, "%s + SI7021", rfName );
  217.    
  218.     LED_PXx16MixStr( 0, 0, buf );
  219.    
  220.     flag=1;
  221.   }
  222.   
  223.   sprintf( buf, "Tem%.1f Hum%.1f%%", temperature / 10.0, humidity / 10.0 );
  224.   
  225.   
  226.   LED_PXx16MixStr( 0, 1, buf );
  227.   
  228.   sprintf( buf, "Snd:%d Rev:%d", iSend, iRev );
  229.   
  230.   LED_PXx16MixStr( 0, 2, buf );
  231. }
復制代碼


所有資料51hei提供下載:
STM8L_4463.7z (892.6 KB, 下載次數: 43)

評分

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

查看全部評分

回復

使用道具 舉報

ID:18591 發表于 2019-2-17 12:31 | 顯示全部樓層
感謝~~~~~~~~~~~~
回復

使用道具 舉報

ID:268693 發表于 2019-3-16 11:39 | 顯示全部樓層
感謝喔!
回復

使用道具 舉報

ID:116773 發表于 2019-3-16 18:51 | 顯示全部樓層
以前用51開發時買過這種模塊,但一直沒有用起來,這個資料很好,可以參考,謝謝樓主!
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 福利视频1000 | 国产玖玖| 日韩成人在线电影 | 亚洲免费在线观看 | 中文字幕一区在线观看视频 | 免费在线观看av网址 | 国产毛片久久久久久久久春天 | 日韩一区三区 | 999re5这里只有精品 | 精品国产免费人成在线观看 | 成人黄色在线观看 | www中文字幕 | 密室大逃脱第六季大神版在线观看 | 久久精品久久久久久 | 99re66在线观看精品热 | 久久久久网站 | 国产精品久久久久不卡 | 国产精品日韩在线 | 黄色大片免费播放 | 亚洲一区 | 狠狠操狠狠搞 | 久久久久国色av免费观看性色 | 日本大片在线播放 | 午夜电影合集 | 欧美aⅴ| 91性高湖久久久久久久久_久久99 | 欧美日韩亚洲国产综合 | 久久国产日韩 | 国产高清不卡 | 免费a网站 | 成人国产精品久久 | 午夜丰满少妇一级毛片 | 日韩精品中文字幕一区二区三区 | .国产精品成人自产拍在线观看6 | 国产日韩一区二区 | 99精品一级欧美片免费播放 | 成人一区精品 | 国产成人精品一区二区三区在线 | 欧美一级欧美一级在线播放 | 夜夜操天天艹 | 韩日视频在线观看 |