久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费
標題:
單片機讀取單總線AM2301溫濕度源程序
[打印本頁]
作者:
小徐
時間:
2018-12-3 13:52
標題:
單片機讀取單總線AM2301溫濕度源程序
單片機讀取AM2301程序
單片機源程序如下:
//****************************************************************//
//單片機 :AT89S52 或 STC89C52RC
// 功能 :串口發送溫濕度數據 波特率 9600
// 晶振 :12M (用戶系統時鐘如不是12M 請更改相關宏定義及注釋的延時時間)
//****************************************************************//
#include "reg52.h"
#include <intrins.h>
//用戶根據自己的晶振修改相應值
#define FOSC 12000000
#define BAUD 9600
//讀傳感器 端口位定義,可修改
sbit Sensor_SDA = P1^0;
//sbit Sensor_SCL = P1^1;
// 變量定義
unsigned char Sensor_Data[5]={0x00,0x00,0x00,0x00,0x00};
unsigned char Sensor_Check; //校驗和
unsigned char Sensor_AnswerFlag; //收到起始標志位
unsigned char Sensor_ErrorFlag; //讀取傳感器錯誤標志
unsigned int Sys_CNT;
unsigned int Tmp;
unsigned char *String;
//字符串定義
#define S_Temp "Temp:"
#define S_RH "RH:"
#define S_CRCT "Check: True"
#define S_CRCF "Check: Wrong"
#define S_Data "Data: "
#define S_NotS "Sensor Not Connected"
/********************************************\
|* 功能: 延時 晶振為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 InitUART(void)
{
unsigned int iTmpBaud;
unsigned long lTmpBaud;
iTmpBaud = 0;
//首先選定定時器2作為波特率發生器,16位定時器,自動裝載
SCON = 0x50; //SM0 SM1 SM2 REN TB8 RB8 TI RI //0 1 0 1 0 0 0 0
PCON = 0x00; //PCON的地址是87H,這里SMOD =0
T2CON = 0x30; //TF2 EXF2 RCLK TCLK EXEN2 TR2 C(/T2) CP(/RL2) //0 0 1 1 0 0 0 0
T2MOD = 0x00; // / / / / / / T2OE DCEN //0 0 0 0 0 0 0 0
lTmpBaud = FOSC/BAUD;
lTmpBaud /= 32; //12T-mode
iTmpBaud = lTmpBaud & 0xFFFF;
iTmpBaud = 65536 - iTmpBaud;
RCAP2H = (iTmpBaud>>8) & 0x0FF;
RCAP2L = iTmpBaud & 0x0FF;
RI = 0; //清除接收中斷標志
REN = 1; //允許串行接收
ES = 1; //允許串行中斷
TR2 = 1; //啟動定時器1
EA=1;//開總中斷
}
/********************************************\
|* 功能: 串口發送函數 *|
\********************************************/
void UARTSend(char UCHAR)
{
SBUF=UCHAR;
while(TI==0);
TI=0;
}
/********************************************\
|* 功能: 串口中斷函數 *|
\********************************************/
void UARTRead(void) interrupt 4
{
char temp;
if(RI)
{
RI=0;
temp = SBUF;
}
}
/********************************************\
|* 功能: 串口發送子函數 *|
\********************************************/
void UART_PutString(unsigned char *buf)
{
while(*buf)
UARTSend(*buf++);
}
void UART_PutStringAndNum(unsigned char *buf ,unsigned int num)
{
unsigned char a[3],i;
a[3] = '0'+num%10;
a[2] = '.';
a[1] = '0'+num/10%10;
a[0] = '0'+num/100%10;
while(*buf)
UARTSend(*buf++);
UARTSend(' ');
for(i=0;i<4;i++)
{
UARTSend(a[i]);
}
}
void UART_PutStringAnd_Data(unsigned char *buf ,unsigned char *bufdata)
{
unsigned char a[2],i,j;
while(*buf)
UARTSend(*buf++);
UARTSend(' ');
for(i=0;i<5;i++)
{
a[0] = bufdata[i]/16;
a[1] = bufdata[i]%16;
for(j=0;j<2;j++)
{
if(a[j]>9)
{
a[j] = (a[j]-10)+'A';
}
else
{
a[j] = a[j]+'0';
}
UARTSend(a[j]);
}
UARTSend(' ');
}
}
/********************************************\
|* 功能: 串口發送傳感器數據函數 *|
\********************************************/
void UARTSend_Nbyte(void)
{
if(Sensor_AnswerFlag == 1)
{
Sensor_Check = Sensor_Data[0]+Sensor_Data[1]+Sensor_Data[2]+Sensor_Data[3];
//校驗成功
if(Sensor_Check ==Sensor_Data[4])
{
String = S_RH;//"RH:";
Tmp = Sensor_Data[0]*256+Sensor_Data[1];
UART_PutStringAndNum(String,Tmp);
UARTSend(' ');
UARTSend(' ');
String = S_Temp;// "Temp:";
Tmp = Sensor_Data[2]*256+Sensor_Data[3];
UART_PutStringAndNum(String,Tmp);
UARTSend(' ');
UARTSend(' ');
String = S_CRCT;//"Check: True";
UART_PutString(String);
}else //校驗失敗 送上讀到數據
{
String = S_Data;//"Data: ";
UART_PutStringAnd_Data(String,Sensor_Data);
UARTSend(' ');
UARTSend(' ');
String = S_CRCF;//"Check: Wrong";
UART_PutString(String);
}
}// 傳感器未連接
else
{
String = S_NotS; //"Sensor Not Connected";
UART_PutString(String);
}
UARTSend(0x0A);
}
void Clear_Data (void)
{
int i;
for(i=0;i<5;i++)
{
Sensor_Data[i] = 0x00;
}//接收數據清零
}
/********************************************\
|* 功能: 讀傳感器發送的單個字節 *|
\********************************************/
unsigned char Read_SensorData(void)
{
unsigned char i,cnt;
unsigned char buffer,tmp;
buffer = 0;
for(i=0;i<8;i++)
{
cnt=0;
while(!Sensor_SDA) //檢測上次低電平是否結束
{
if(++cnt >= 300)
{
break;
}
}
//延時Min=26us Max50us 跳過數據"0" 的高電平
Delay_N10us(2); //延時30us
//判斷傳感器發送數據位
tmp =0;
if(Sensor_SDA)
{
tmp = 1;
}
cnt =0;
while(Sensor_SDA) //等待高電平 結束
{
if(++cnt >= 200)
{
break;
}
}
buffer <<=1;
buffer |= tmp;
}
return buffer;
}
/********************************************\
|* 功能: 讀傳感器 *|
\********************************************/
unsigned char Read_Sensor(void)
{
unsigned char i;
//主機拉低(Min=800US Max=20Ms)
Sensor_SDA = 0;
Delay_N1ms(2); //延時2Ms
//釋放總線 延時(Min=30us Max=50us)
Sensor_SDA = 1;
Delay_N10us(1);//延時30us
//主機設為輸入 判斷傳感器響應信號
Sensor_SDA = 1;
Sensor_AnswerFlag = 0; // 傳感器響應標志
//判斷從機是否有低電平響應信號 如不響應則跳出,響應則向下運行
if(Sensor_SDA ==0)
{
Sensor_AnswerFlag = 1;//收到起始信號
Sys_CNT = 0;
//判斷從機是否發出 80us 的低電平響應信號是否結束
while((!Sensor_SDA))
{
if(++Sys_CNT>300) //防止進入死循環
{
Sensor_ErrorFlag = 1;
return 0;
}
}
Sys_CNT = 0;
//判斷從機是否發出 80us 的高電平,如發出則進入數據接收狀態
while((Sensor_SDA))
{
if(++Sys_CNT>300) //防止進入死循環
{
Sensor_ErrorFlag = 1;
return 0;
}
}
// 數據接收 傳感器共發送40位數據
// 即5個字節 高位先送 5個字節分別為濕度高位 濕度低位 溫度高位 溫度低位 校驗和
// 校驗和為:濕度高位+濕度低位+溫度高位+溫度低位
for(i=0;i<5;i++)
{
Sensor_Data[i] = Read_SensorData();
}
}
else
{
Sensor_AnswerFlag = 0; // 未收到傳感器響應
}
return 1;
}
void main(void)
{
//Sensor_SCL = 0;
InitUART(); //初始串口發送函數
while(1)
{
Clear_Data(); // 清除收到數據
Read_Sensor(); // 讀取傳感器數據
UARTSend_Nbyte(); // 串口發送讀到傳感器數據
Delay_N1ms(2000); // 延時 2S(兩次讀取間隔至少2S)
}
}
復制代碼
所有資料51hei提供下載:
讀AM2301程序.zip
(35.47 KB, 下載次數: 21)
2018-12-3 13:52 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
作者:
1231yyy
時間:
2019-1-10 21:38
濕度傳感器怎么連接單片機啊?
歡迎光臨 (http://www.zg4o1577.cn/bbs/)
Powered by Discuz! X3.1
主站蜘蛛池模板:
亚洲午夜精品一区二区三区他趣
|
国产农村妇女毛片精品久久麻豆
|
日韩精品一区二区三区四区视频
|
亚洲成人av
|
国产精品久久久久久一区二区三区
|
国产精品久久久久久久久久
|
天天亚洲
|
亚洲精品二区
|
成人一区二区在线
|
天堂va在线观看
|
日本久久网
|
可以免费观看的av
|
欧美日韩国产欧美
|
麻豆久久久9性大片
|
天天操网
|
国产成人小视频
|
狠狠操av
|
亚洲一区二区精品视频
|
国产亚洲一区二区精品
|
秋霞在线一区二区
|
在线亚洲一区
|
九九久久国产精品
|
亚洲a在线观看
|
91欧美精品成人综合在线观看
|
久久久91精品国产一区二区三区
|
精品视频一区二区三区四区
|
中文字幕日韩一区
|
av黄色在线
|
久久久久久免费毛片精品
|
9191成人精品久久
|
欧美日韩中文在线
|
777777777亚洲妇女
|
www国产成人免费观看视频
|
操射视频
|
在线中文字幕视频
|
欧美黄色片在线观看
|
成年精品
|
日本精品在线观看
|
自拍视频在线观看
|
波多野结衣一二三区
|
亚洲h视频
|