找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 841|回复: 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 单片机教程网

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