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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

單片機+as1217無線串口的問題

[復制鏈接]
跳轉到指定樓層
樓主
ID:624511 發表于 2019-11-11 21:07 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
最近老師讓做一個用433無線串口應用的東西,as1217,我用am2302傳感器檢測溫濕度,然后發送到另一個單片機,用lcd1602顯示主函數中的void xianshi(void);函數在void main()中必須要放在其他函數的前面,否則就會編譯有問題,這是為什么。
發射部分寫好了,接收部分一直沒想明白,發射模塊是一直發送信號,接收的時候怎么五個字節五個字節的接收,會不會亂,因為傳感器是連續發送四十位數據。五個字節,四位數據位,一位校驗位,現在無線串口有一個模塊程序,是公司提供的。其中UART.C 有一個接收函數,我想讓SBUF賦值給Sensor_Data,但是函數定義和指針總是出錯。有點想不明白。麻煩各位大神幫忙看一下,謝謝。UART.C
  1. /**
  2.   ******************************************************************************
  3.   * @author  澤耀科技 ASHINING
  4.   * @version V3.0
  5.   * @date    2016-10-08
  6.   * @brief   UART配置C文件
  7.   */


  8. #include "drv_uart.h"
  9. #define uint unsigned int
  10. #define uchar unsigned char


  11. /**
  12.   * @brief :串口初始化
  13.   * @param :無
  14.   * @note  :無
  15.   * @retval:無
  16.   */
  17. void drv_uart_init( )
  18. {
  19.         //引腳配置 部分51單片機不需要
  20.         //TX配置為輸出 RX配置為輸入
  21.         UART_TX_PxM0 |= IO_OUT_PUT_PP_M0 << UART_TX_PIN_BIT;
  22.         UART_TX_PxM1 |= IO_OUT_PUT_PP_M1 << UART_TX_PIN_BIT;
  23.         UART_RX_PxM0 |= IO_IN_PUT_ONLY_M0 << UART_RX_PIN_BIT;
  24.         UART_RX_PxM1 |= IO_IN_PUT_ONLY_M1 << UART_RX_PIN_BIT;
  25.         UART_TX = 1;
  26.         
  27.         //串口配置
  28.         SCON &= (uint8_t)((uint8_t)( ~( UART_MODE | UART_RX )));        //清SM0 SM1 REN
  29.         SCON |= (uint8_t)( UART_8BAUDRATE_VOLATILE | UART_RX );     //按位或運算后賦值
  30.         
  31.         //TIM1配置
  32.         TMOD &= (uint8_t)((uint8_t)( ~TIM1_MODE ));
  33.         TMOD |= TIM1_MODE_2;        //8位自動重裝
  34.         PCON = 0x00;
  35.         TH1 = 0xFD;                                //波特率默認配置為9600
  36.         TL1 = 0xFD;
  37.         
  38.         TI = 1;                                        //清發送標志                                                
  39.         TR1 = 1;                                //使能定時器
  40. }

  41. /**
  42.   * @brief :串口發送數據
  43.   * @param :
  44.   *                        @TxBuffer:發送數據首地址
  45.   *                        @Length:數據長度
  46.   * @note  :無
  47.   * @retval:無
  48.   */
  49. void drv_uart_tx_bytes( uint8_t* TxBuffer, uint16_t Length )
  50. {
  51.         while( Length-- )
  52.         {
  53.                 while( 0 == TI );                //等待上次發送完成
  54.                 TI = 0;                                        //清標志位
  55.                 SBUF = *TxBuffer;                //發送數據
  56.                 TxBuffer++;
  57.         }
  58. }

  59. /**
  60.   * @brief :串口接收數據
  61.   * @param :
  62.   *                        @RxBuffer:發送數據首地址
  63.   * @note  :無
  64.   * @retval:接收到的字節個數
  65.   */
  66. unsigned char drv_uart_rx_bytes( uchar *RxBuffer )
  67. {
  68.         uint8_t l_RxLength = 0;
  69.         uint16_t l_UartRxTimOut = 0x7FFF;
  70.         
  71.         while( l_UartRxTimOut-- )                //在超時范圍內檢測數據
  72.         {
  73.                 if( 0 != RI )                                //檢測是否接收到數據
  74.                 {
  75.                         RI = 0;                                        //清標志位               
  76.                         *RxBuffer = SBUF;                //讀數據
  77.                         RxBuffer++;
  78.                         l_RxLength++;
  79.                         l_UartRxTimOut = 0x7FFF;//重置超時檢測
  80.                 }
  81.         }
  82.         
  83.         return SBUF;                        //等待超時,數據接收完成
  84. }
  85. 主程序
  86. #include<reg52.h>
  87. #include <intrins.h>
  88. #define uint unsigned int
  89. #define uchar unsigned char

  90. //uchar code table[]="    WELCOME ";
  91. uchar code table0[]="T:       'C";
  92. uchar code table1[]="RH:      %";
  93. uchar code table2[]="Sensor Not";
  94. uchar code table3[]="Connected";
  95. uchar code table4[]="Check wrong";
  96. sbit lcdrs=P2^6;
  97. sbit lcdwr=P2^5;
  98. sbit lcden=P2^7;


  99. uchar Sensor_Data[5]={0x00,0x00,0x00,0x00,0x00};
  100. uchar Sensor_AnswerFlag;  //收到起始標志位
  101. uchar Sensor_ErrorFlag=0;   //讀取傳感器錯誤標志
  102. uchar Sensor_Check;                  //校驗和
  103. uint Sys_CNT;
  104. uint Tmp;
  105. uint T;
  106. uint Rh;
  107. uint t0;
  108. uchar num;
  109. uchar flag;

  110. void Init_Timer0(void);//定時器初始化
  111. #include "drv_delay.h"
  112. #include "drv_uart.h"
  113. #include "drv_led.h"
  114. #include "drv_AS1217.h"
  115. #ifdef __AS1217_TX_MODE__
  116.         char *pAshining = "ashining";
  117. #else
  118.         uint8_t g_As1217_rx_buffer[ 56 ] = { 0 };
  119.         uint8_t g_RxLength = 0;
  120. #endif
  121. //unsigned char Read_Sensor(void)
  122. //{
  123. //        drv_uart_init( );
  124. //        drv_led_init( );
  125. //        while( 1 )
  126. //        {         
  127. //               
  128. //                g_RxLength = AS1217_rx_packet( g_As1217_rx_buffer );         
  129. //                Sensor_Data[0]=g_As1217_rx_buffer;
  130. //                  
  131. //                        
  132. //           // void xianshi(void);
  133. //        }
  134. //for(i=0;i<5;i++)
  135. //            {
  136. //              Sensor_Data[i] = Read_SensorData();
  137. //                                                }
  138. //}                                                
  139. //延時函數
  140. void delay(uint z)
  141. {
  142.         uint x,y;
  143.         for(x=z;x>0;x--)
  144.                 for(y=123;y>0;y--);
  145. }

  146. /********************************************\
  147. |* 功能: 延時        晶振為12M時            *|
  148. |*  t = 1 為 20us  然后成倍增加10us左右      *|
  149. \********************************************/
  150. void Delay_N10us(unsigned char t)
  151. {
  152.     while(t--)
  153.    {
  154.             _nop_();
  155.    }
  156. }
  157. /********************************************\
  158. |* 功能: 延時        晶振為12M時            *|
  159. |* 延時大約 1ms                              *|
  160. \********************************************/
  161. void Delay_N1ms(unsigned int t)
  162. {
  163.   unsigned int i;
  164.   unsigned int j;
  165.   for(j=t;j>0;j--)
  166.      for(i=124;i>0;i--);  //延時大約 1ms
  167. }
  168. void write_com(uchar com)                 //寫入命令
  169. {
  170.         lcdrs=0;
  171.         P0=com;
  172.         lcden=1;
  173.         delay(5);
  174.         lcden=0;
  175. }
  176. void write_date(uchar date)                 //寫入數據
  177. {
  178.         lcdrs=1;
  179.         P0=date;
  180.         lcden=1;
  181.         delay(5);
  182.         lcden=0;
  183. }
  184. void diyihang(uint z)                          //第一行
  185. {
  186.         z--;
  187.         write_com(0x80+z);
  188. }           
  189. void dierhang(uint z)                           //第二行
  190. {
  191.         z--;
  192.         write_com(0x80+0x40+z);
  193. }                                                                          
  194. void init_1602()  //1602初始化
  195. {
  196.         lcdwr=0;
  197.         lcden=0;
  198.         write_com(0x38);//模式
  199.         write_com(0x0c);//無光標不閃
  200.         write_com(0x01);//清屏

  201.         diyihang(1);    //顯示位置 第一行
  202.         for(num=0;num<11;num++)
  203.         {
  204.                 write_date(table0[num]); //顯示"    溫度 ";
  205.                 //delay(10);
  206.         }

  207.         dierhang(1);      //換行顯示 第二行
  208.         for(num=0;num<10;num++)
  209.         {
  210.                 write_date(table1[num]);//顯示"RH:      %";
  211.                 //delay(10);
  212.         }
  213. }
  214. void Clear_Data (void)                                         
  215. {
  216.         int i;
  217.         for(i=0;i<5;i++)
  218.         {
  219.            Sensor_Data[i] = 0x00;
  220.         }                       //接收數據清零
  221. }
  222. void display()  //顯示
  223. {
  224.         Tmp = Sensor_Data[2]*256+Sensor_Data[3];     // 溫度高位 溫度低位
  225.         T=Tmp/10;
  226.         diyihang(5);                                                                  //第一行第5個位置開始顯示
  227.         write_date(Tmp/100%10 + '0');                                        //十位
  228.         write_date(Tmp/10%10 + '0');                                        //個位
  229.         write_date('.');                                                                //小數點
  230.         write_date(Tmp%10 + '0');                                                 //小數位

  231.         Tmp = Sensor_Data[0]*256+Sensor_Data[1];   //濕度高位 濕度低位
  232.         Rh=Tmp/10;
  233.         dierhang(5);                          //第二行第5個位置開始顯示
  234.         write_date(Tmp/100%10 + '0');          //十位
  235.         write_date(Tmp/10%10 + '0');           //個位
  236.         write_date('.');                       //小數點
  237.         write_date(Tmp%10 + '0');              //小數位
  238. }
  239. void check_and_display()
  240. {
  241.         if(Sensor_AnswerFlag == 1)
  242.         {
  243.                 Sensor_Check = Sensor_Data[0]+Sensor_Data[1]+Sensor_Data[2]+Sensor_Data[3];

  244.                 if(Sensor_Check ==Sensor_Data[4])        /*校驗成功        */
  245.                 {
  246.                         if(flag == 1)
  247.                         {
  248.                                 flag = 0;
  249.                                 write_com(0x01);//清屏
  250.                                 diyihang(1);//顯示位置
  251.                                 for(num=0;num<11;num++)
  252.                                 {
  253.                                         write_date(table0[num]);         //顯示溫度
  254.                                         //delay(10);
  255.                                 }
  256.                                 dierhang(1);//換行顯示
  257.                                 for(num=0;num<10;num++)
  258.                                 {
  259.                                         write_date(table1[num]); //顯示RH:....%
  260.                                         //delay(10);
  261.                                 }
  262.                         }
  263.                         display();          //顯示溫度  濕度
  264.                 }
  265.                 else                        /*校驗失敗*/
  266.                 {        
  267.                          write_com(0x01);//清屏
  268.                         diyihang(1);//顯示位置
  269.                         for(num=0;num<10;num++)
  270.                         {
  271.                                 write_date(table4[num]);        //顯示 Check wrong
  272.                                 //delay(10);
  273.                         }
  274.                         flag=1;
  275.                 }
  276.         }
  277.         else                        /*沒有連接上 */
  278.         {
  279.                 write_com(0x01);//清屏
  280.                 diyihang(1);//顯示位置
  281.                 for(num=0;num<10;num++)
  282.                 {
  283.                         write_date(table2[num]); //顯示 Sensor Not
  284.                         //delay(10);
  285.                 }
  286.                 dierhang(1);//換行顯示
  287.                 for(num=0;num<8;num++)
  288.                 {
  289.                         write_date(table3[num]);   //顯示  Connected
  290.                         //delay(10);
  291.                 }
  292.                 flag=1;
  293.         }        
  294. }
  295. void xianshi(void)
  296. {        
  297.                 //                Init_Timer0();
  298.         init_1602();
  299.         while(1)
  300.         {               
  301. //         Delay_N1ms(2000);          // 延時 2S(兩次讀取間隔至少2S)
  302.           Clear_Data();         // 清除收到數據
  303. //          Read_Sensor();                  // 讀取傳感器數據   c206錯誤         
  304.           check_and_display();  // 檢測并顯示數據         
  305.         }
  306. }
  307. /*------------------------------------------------
  308.                     定時器初始化子程序
  309. ------------------------------------------------*/
  310. void Init_Timer0(void)
  311. {
  312. TMOD |= 0x01;          //使用模式1,16位定時器,使用"|"符號可以在使用多個定時器時不受影響                     
  313. //TH0=0x00;              //給定初值
  314. //TL0=0x00;
  315. EA=1;            //總中斷打開
  316. ET0=1;           //定時器中斷打開
  317. TR0=1;           //定時器開關打開
  318. }
  319. /*------------------------------------------------
  320.                  定時器中斷子程序
  321. ------------------------------------------------*/
  322. void Timer0_isr(void) interrupt 1
  323. {
  324.                 static unsigned int num;
  325.                 TH0=(65536-2000)/256;                  //重新賦值 2ms
  326.                 TL0=(65536-2000)%256;

  327.                 num++;
  328.                 if(num==300)        
  329.                          {
  330.                                 num=0;
  331.                                                 }
  332. }
  333. void xianshi(void);
  334. int main( void )
  335. {
  336.         //串口初始化  根據模塊波特率變化
  337.         drv_uart_init( );
  338.         drv_led_init( );
  339.         while( 1 )
  340.         {         
  341.                 unsigned int a;
  342. //for(a=0;a<5;a++)
  343. //                {
  344. //                        drv_uart_rx_bytes( Sensor_Data[a] )        ;
  345. //                }        
  346.                 void xianshi(void);
  347. //                g_RxLength = AS1217_rx_packet( g_As1217_rx_buffer );         
  348. //                Sensor_Data[0]=g_As1217_rx_buffer;
  349.                   
  350.                         
  351.            // void xianshi(void);
  352.         }
  353.         
  354.         
  355. }
復制代碼








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

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 久日精品 | 国产免费又黄又爽又刺激蜜月al | 2018中文字幕第一页 | 91九色porny首页最多播放 | 精品一区二区三区四区在线 | 精品视频一区二区 | 中文字幕在线观看一区 | 欧美精品一区三区 | 国产精品1区 | 午夜精品一区二区三区在线观看 | 国产成人精品久久二区二区91 | 成人国产在线视频 | 国产精品海角社区在线观看 | 午夜影院在线免费观看视频 | 狠狠躁天天躁夜夜躁婷婷老牛影视 | 亚洲精品福利视频 | 国产精品视频二区三区 | 亚洲成人精品 | 粉嫩高清一区二区三区 | 国产精品久久久久久久岛一牛影视 | 欧美一二三区 | 欧美日韩精品一区二区三区视频 | 中文字幕亚洲欧美 | 色播久久久 | 国产精品久久国产精品 | 波多野结衣中文视频 | 天堂久久一区 | www.日韩系列 | 久久视频精品 | 亚洲综合99| 精品欧美乱码久久久久久1区2区 | 日本人麻豆 | 亚洲视频一区在线观看 | 91久久精品一区二区二区 | 国产日韩欧美在线播放 | 久久久精品一区 | 91在线观看网址 | 欧美一区二区三区视频 | 国产日韩精品在线 | 亚洲成人动漫在线观看 | 九九精品影院 |