标题:
单片机+as1217无线串口的问题
[打印本页]
作者:
5112311
时间:
2019-11-11 21:07
标题:
单片机+as1217无线串口的问题
最近老师让做一个用433无线串口应用的东西,as1217,我用am2302传感器检测温湿度,然后发送到另一个单片机,用lcd1602显示主函数中的void xianshi(void);函数在void main()中必须要放在其他函数的前面,否则就会编译有问题,这是为什么。
发射部分写好了,接收部分一直没想明白,发射模块是一直发送信号,接收的时候怎么五个字节五个字节的接收,会不会乱,因为传感器是连续发送四十位数据。五个字节,四位数据位,一位校验位,现在无线串口有一个模块程序,是公司提供的。其中UART.C 有一个接收函数,我想让SBUF赋值给Sensor_Data,但是函数定义和指针总是出错。有点想不明白。麻烦各位大神帮忙看一下,谢谢。UART.C
/**
******************************************************************************
* @author 泽耀科技 ASHINING
* @version V3.0
* @date 2016-10-08
* @brief UART配置C文件
*/
#include "drv_uart.h"
#define uint unsigned int
#define uchar unsigned char
/**
* @brief :串口初始化
* @param :无
* @note :无
* @retval:无
*/
void drv_uart_init( )
{
//引脚配置 部分51单片机不需要
//TX配置为输出 RX配置为输入
UART_TX_PxM0 |= IO_OUT_PUT_PP_M0 << UART_TX_PIN_BIT;
UART_TX_PxM1 |= IO_OUT_PUT_PP_M1 << UART_TX_PIN_BIT;
UART_RX_PxM0 |= IO_IN_PUT_ONLY_M0 << UART_RX_PIN_BIT;
UART_RX_PxM1 |= IO_IN_PUT_ONLY_M1 << UART_RX_PIN_BIT;
UART_TX = 1;
//串口配置
SCON &= (uint8_t)((uint8_t)( ~( UART_MODE | UART_RX ))); //清SM0 SM1 REN
SCON |= (uint8_t)( UART_8BAUDRATE_VOLATILE | UART_RX ); //按位或运算后赋值
//TIM1配置
TMOD &= (uint8_t)((uint8_t)( ~TIM1_MODE ));
TMOD |= TIM1_MODE_2; //8位自动重装
PCON = 0x00;
TH1 = 0xFD; //波特率默认配置为9600
TL1 = 0xFD;
TI = 1; //清发送标志
TR1 = 1; //使能定时器
}
/**
* @brief :串口发送数据
* @param :
* @TxBuffer:发送数据首地址
* @Length:数据长度
* @note :无
* @retval:无
*/
void drv_uart_tx_bytes( uint8_t* TxBuffer, uint16_t Length )
{
while( Length-- )
{
while( 0 == TI ); //等待上次发送完成
TI = 0; //清标志位
SBUF = *TxBuffer; //发送数据
TxBuffer++;
}
}
/**
* @brief :串口接收数据
* @param :
* @RxBuffer:发送数据首地址
* @note :无
* @retval:接收到的字节个数
*/
unsigned char drv_uart_rx_bytes( uchar *RxBuffer )
{
uint8_t l_RxLength = 0;
uint16_t l_UartRxTimOut = 0x7FFF;
while( l_UartRxTimOut-- ) //在超时范围内检测数据
{
if( 0 != RI ) //检测是否接收到数据
{
RI = 0; //清标志位
*RxBuffer = SBUF; //读数据
RxBuffer++;
l_RxLength++;
l_UartRxTimOut = 0x7FFF;//重置超时检测
}
}
return SBUF; //等待超时,数据接收完成
}
主程序
#include<reg52.h>
#include <intrins.h>
#define uint unsigned int
#define uchar unsigned char
//uchar code table[]=" WELCOME ";
uchar code table0[]="T: 'C";
uchar code table1[]="RH: %";
uchar code table2[]="Sensor Not";
uchar code table3[]="Connected";
uchar code table4[]="Check wrong";
sbit lcdrs=P2^6;
sbit lcdwr=P2^5;
sbit lcden=P2^7;
uchar Sensor_Data[5]={0x00,0x00,0x00,0x00,0x00};
uchar Sensor_AnswerFlag; //收到起始标志位
uchar Sensor_ErrorFlag=0; //读取传感器错误标志
uchar Sensor_Check; //校验和
uint Sys_CNT;
uint Tmp;
uint T;
uint Rh;
uint t0;
uchar num;
uchar flag;
void Init_Timer0(void);//定时器初始化
#include "drv_delay.h"
#include "drv_uart.h"
#include "drv_led.h"
#include "drv_AS1217.h"
#ifdef __AS1217_TX_MODE__
char *pAshining = "ashining";
#else
uint8_t g_As1217_rx_buffer[ 56 ] = { 0 };
uint8_t g_RxLength = 0;
#endif
//unsigned char Read_Sensor(void)
//{
// drv_uart_init( );
// drv_led_init( );
// while( 1 )
// {
//
// g_RxLength = AS1217_rx_packet( g_As1217_rx_buffer );
// Sensor_Data[0]=g_As1217_rx_buffer;
//
//
// // void xianshi(void);
// }
//for(i=0;i<5;i++)
// {
// Sensor_Data[i] = Read_SensorData();
// }
//}
//延时函数
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=123;y>0;y--);
}
/********************************************\
|* 功能: 延时 晶振为12M时 *|
|* t = 1 为 20us 然后成倍增加10us左右 *|
\********************************************/
void Delay_N10us(unsigned char t)
{
while(t--)
{
_nop_();
}
}
/********************************************\
|* 功能: 延时 晶振为12M时 *|
|* 延时大约 1ms *|
\********************************************/
void Delay_N1ms(unsigned int t)
{
unsigned int i;
unsigned int j;
for(j=t;j>0;j--)
for(i=124;i>0;i--); //延时大约 1ms
}
void write_com(uchar com) //写入命令
{
lcdrs=0;
P0=com;
lcden=1;
delay(5);
lcden=0;
}
void write_date(uchar date) //写入数据
{
lcdrs=1;
P0=date;
lcden=1;
delay(5);
lcden=0;
}
void diyihang(uint z) //第一行
{
z--;
write_com(0x80+z);
}
void dierhang(uint z) //第二行
{
z--;
write_com(0x80+0x40+z);
}
void init_1602() //1602初始化
{
lcdwr=0;
lcden=0;
write_com(0x38);//模式
write_com(0x0c);//无光标不闪
write_com(0x01);//清屏
diyihang(1); //显示位置 第一行
for(num=0;num<11;num++)
{
write_date(table0[num]); //显示" 温度 ";
//delay(10);
}
dierhang(1); //换行显示 第二行
for(num=0;num<10;num++)
{
write_date(table1[num]);//显示"RH: %";
//delay(10);
}
}
void Clear_Data (void)
{
int i;
for(i=0;i<5;i++)
{
Sensor_Data[i] = 0x00;
} //接收数据清零
}
void display() //显示
{
Tmp = Sensor_Data[2]*256+Sensor_Data[3]; // 温度高位 温度低位
T=Tmp/10;
diyihang(5); //第一行第5个位置开始显示
write_date(Tmp/100%10 + '0'); //十位
write_date(Tmp/10%10 + '0'); //个位
write_date('.'); //小数点
write_date(Tmp%10 + '0'); //小数位
Tmp = Sensor_Data[0]*256+Sensor_Data[1]; //湿度高位 湿度低位
Rh=Tmp/10;
dierhang(5); //第二行第5个位置开始显示
write_date(Tmp/100%10 + '0'); //十位
write_date(Tmp/10%10 + '0'); //个位
write_date('.'); //小数点
write_date(Tmp%10 + '0'); //小数位
}
void check_and_display()
{
if(Sensor_AnswerFlag == 1)
{
Sensor_Check = Sensor_Data[0]+Sensor_Data[1]+Sensor_Data[2]+Sensor_Data[3];
if(Sensor_Check ==Sensor_Data[4]) /*校验成功 */
{
if(flag == 1)
{
flag = 0;
write_com(0x01);//清屏
diyihang(1);//显示位置
for(num=0;num<11;num++)
{
write_date(table0[num]); //显示温度
//delay(10);
}
dierhang(1);//换行显示
for(num=0;num<10;num++)
{
write_date(table1[num]); //显示RH:....%
//delay(10);
}
}
display(); //显示温度 湿度
}
else /*校验失败*/
{
write_com(0x01);//清屏
diyihang(1);//显示位置
for(num=0;num<10;num++)
{
write_date(table4[num]); //显示 Check wrong
//delay(10);
}
flag=1;
}
}
else /*没有连接上 */
{
write_com(0x01);//清屏
diyihang(1);//显示位置
for(num=0;num<10;num++)
{
write_date(table2[num]); //显示 Sensor Not
//delay(10);
}
dierhang(1);//换行显示
for(num=0;num<8;num++)
{
write_date(table3[num]); //显示 Connected
//delay(10);
}
flag=1;
}
}
void xianshi(void)
{
// Init_Timer0();
init_1602();
while(1)
{
// Delay_N1ms(2000); // 延时 2S(两次读取间隔至少2S)
Clear_Data(); // 清除收到数据
// Read_Sensor(); // 读取传感器数据 c206错误
check_and_display(); // 检测并显示数据
}
}
/*------------------------------------------------
定时器初始化子程序
------------------------------------------------*/
void Init_Timer0(void)
{
TMOD |= 0x01; //使用模式1,16位定时器,使用"|"符号可以在使用多个定时器时不受影响
//TH0=0x00; //给定初值
//TL0=0x00;
EA=1; //总中断打开
ET0=1; //定时器中断打开
TR0=1; //定时器开关打开
}
/*------------------------------------------------
定时器中断子程序
------------------------------------------------*/
void Timer0_isr(void) interrupt 1
{
static unsigned int num;
TH0=(65536-2000)/256; //重新赋值 2ms
TL0=(65536-2000)%256;
num++;
if(num==300)
{
num=0;
}
}
void xianshi(void);
int main( void )
{
//串口初始化 根据模块波特率变化
drv_uart_init( );
drv_led_init( );
while( 1 )
{
unsigned int a;
//for(a=0;a<5;a++)
// {
// drv_uart_rx_bytes( Sensor_Data[a] ) ;
// }
void xianshi(void);
// g_RxLength = AS1217_rx_packet( g_As1217_rx_buffer );
// Sensor_Data[0]=g_As1217_rx_buffer;
// void xianshi(void);
}
}
复制代码
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1