久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费
標題:
單片機+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.zg4o1577.cn/bbs/)
Powered by Discuz! X3.1
主站蜘蛛池模板:
99久久婷婷国产综合精品电影
|
国产综合欧美
|
日韩精品a在线观看图片
|
亚洲免费在线
|
久久婷婷香蕉热狠狠综合
|
www.99精品
|
日韩成人高清在线
|
91免费在线看
|
国产av毛片
|
日本精品免费在线观看
|
四季久久免费一区二区三区四区
|
日韩精品成人在线
|
久草免费在线视频
|
日韩国产一区二区三区
|
美女131mm久久爽爽免费
|
在线观看成人精品
|
久久久综合网
|
亚洲高清视频一区二区
|
日本超碰
|
精久久久
|
亚洲高清av在线
|
成人一区二区在线
|
亚洲日本乱码在线观看
|
久久久久久免费毛片精品
|
欧产日产国产精品99
|
91高清视频在线观看
|
亚洲精品在线免费观看视频
|
九九九色
|
日韩精品一区二区三区中文在线
|
亚洲一区二区三区四区五区中文
|
日一区二区
|
久草新在线
|
国产激情小视频
|
国产精品中文字幕一区二区三区
|
欧美一级二级三级视频
|
爱综合
|
久久国产精品一区二区
|
精品国产乱码久久久久久1区2区
|
亚洲综合视频
|
www亚洲免费国内精品
|
欧美精品在线免费观看
|