|
單片機(jī)讀取AM2301程序
單片機(jī)源程序如下:
- //****************************************************************//
- //單片機(jī) :AT89S52 或 STC89C52RC
- // 功能 :串口發(fā)送溫濕度數(shù)據(jù) 波特率 9600
- // 晶振 :12M (用戶(hù)系統(tǒng)時(shí)鐘如不是12M 請(qǐng)更改相關(guān)宏定義及注釋的延時(shí)時(shí)間)
- //****************************************************************//
- #include "reg52.h"
- #include <intrins.h>
- //用戶(hù)根據(jù)自己的晶振修改相應(yīng)值
- #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; //校驗(yàn)和
- unsigned char Sensor_AnswerFlag; //收到起始標(biāo)志位
- unsigned char Sensor_ErrorFlag; //讀取傳感器錯(cuò)誤標(biāo)志
- 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"
- /********************************************\
- |* 功能: 延時(shí) 晶振為12M時(shí) *|
- |* t = 1 為 20us 然后成倍增加10us左右 *|
- \********************************************/
- void Delay_N10us(unsigned char t)
- {
- while(t--)
- {
- _nop_();
- }
- }
- /********************************************\
- |* 功能: 延時(shí) 晶振為12M時(shí) *|
- |* 延時(shí)大約 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--); //延時(shí)大約 1ms
- }
- /********************************************\
- |* 功能: 初始化串口 *|
- \********************************************/
- void InitUART(void)
- {
- unsigned int iTmpBaud;
- unsigned long lTmpBaud;
- iTmpBaud = 0;
- //首先選定定時(shí)器2作為波特率發(fā)生器,16位定時(shí)器,自動(dòng)裝載
- 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; //清除接收中斷標(biāo)志
- REN = 1; //允許串行接收
- ES = 1; //允許串行中斷
- TR2 = 1; //啟動(dòng)定時(shí)器1
- EA=1;//開(kāi)總中斷
- }
- /********************************************\
- |* 功能: 串口發(fā)送函數(shù) *|
- \********************************************/
- void UARTSend(char UCHAR)
- {
- SBUF=UCHAR;
- while(TI==0);
- TI=0;
- }
- /********************************************\
- |* 功能: 串口中斷函數(shù) *|
- \********************************************/
- void UARTRead(void) interrupt 4
- {
- char temp;
- if(RI)
- {
- RI=0;
- temp = SBUF;
- }
- }
- /********************************************\
- |* 功能: 串口發(fā)送子函數(shù) *|
- \********************************************/
- 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(' ');
- }
- }
- /********************************************\
- |* 功能: 串口發(fā)送傳感器數(shù)據(jù)函數(shù) *|
- \********************************************/
- void UARTSend_Nbyte(void)
- {
- if(Sensor_AnswerFlag == 1)
- {
- Sensor_Check = Sensor_Data[0]+Sensor_Data[1]+Sensor_Data[2]+Sensor_Data[3];
- //校驗(yàn)成功
- 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 //校驗(yàn)失敗 送上讀到數(shù)據(jù)
- {
- 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;
- }//接收數(shù)據(jù)清零
- }
- /********************************************\
- |* 功能: 讀傳感器發(fā)送的單個(gè)字節(jié) *|
- \********************************************/
- 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) //檢測(cè)上次低電平是否結(jié)束
- {
- if(++cnt >= 300)
- {
- break;
- }
- }
- //延時(shí)Min=26us Max50us 跳過(guò)數(shù)據(jù)"0" 的高電平
- Delay_N10us(2); //延時(shí)30us
-
- //判斷傳感器發(fā)送數(shù)據(jù)位
- tmp =0;
- if(Sensor_SDA)
- {
- tmp = 1;
- }
- cnt =0;
- while(Sensor_SDA) //等待高電平 結(jié)束
- {
- if(++cnt >= 200)
- {
- break;
- }
- }
- buffer <<=1;
- buffer |= tmp;
- }
- return buffer;
- }
- /********************************************\
- |* 功能: 讀傳感器 *|
- \********************************************/
- unsigned char Read_Sensor(void)
- {
- unsigned char i;
- //主機(jī)拉低(Min=800US Max=20Ms)
- Sensor_SDA = 0;
- Delay_N1ms(2); //延時(shí)2Ms
-
- //釋放總線(xiàn) 延時(shí)(Min=30us Max=50us)
- Sensor_SDA = 1;
- Delay_N10us(1);//延時(shí)30us
- //主機(jī)設(shè)為輸入 判斷傳感器響應(yīng)信號(hào)
- Sensor_SDA = 1;
-
- Sensor_AnswerFlag = 0; // 傳感器響應(yīng)標(biāo)志
- //判斷從機(jī)是否有低電平響應(yīng)信號(hào) 如不響應(yīng)則跳出,響應(yīng)則向下運(yùn)行
- if(Sensor_SDA ==0)
- {
- Sensor_AnswerFlag = 1;//收到起始信號(hào)
- Sys_CNT = 0;
- //判斷從機(jī)是否發(fā)出 80us 的低電平響應(yīng)信號(hào)是否結(jié)束
- while((!Sensor_SDA))
- {
- if(++Sys_CNT>300) //防止進(jìn)入死循環(huán)
- {
- Sensor_ErrorFlag = 1;
- return 0;
- }
- }
- Sys_CNT = 0;
- //判斷從機(jī)是否發(fā)出 80us 的高電平,如發(fā)出則進(jìn)入數(shù)據(jù)接收狀態(tài)
- while((Sensor_SDA))
- {
- if(++Sys_CNT>300) //防止進(jìn)入死循環(huán)
- {
- Sensor_ErrorFlag = 1;
- return 0;
- }
- }
- // 數(shù)據(jù)接收 傳感器共發(fā)送40位數(shù)據(jù)
- // 即5個(gè)字節(jié) 高位先送 5個(gè)字節(jié)分別為濕度高位 濕度低位 溫度高位 溫度低位 校驗(yàn)和
- // 校驗(yàn)和為:濕度高位+濕度低位+溫度高位+溫度低位
- for(i=0;i<5;i++)
- {
- Sensor_Data[i] = Read_SensorData();
- }
- }
- else
- {
- Sensor_AnswerFlag = 0; // 未收到傳感器響應(yīng)
- }
- return 1;
- }
- void main(void)
- {
- //Sensor_SCL = 0;
- InitUART(); //初始串口發(fā)送函數(shù)
- while(1)
- {
- Clear_Data(); // 清除收到數(shù)據(jù)
- Read_Sensor(); // 讀取傳感器數(shù)據(jù)
- UARTSend_Nbyte(); // 串口發(fā)送讀到傳感器數(shù)據(jù)
- Delay_N1ms(2000); // 延時(shí) 2S(兩次讀取間隔至少2S)
- }
- }
復(fù)制代碼
所有資料51hei提供下載:
讀AM2301程序.zip
(35.47 KB, 下載次數(shù): 21)
2018-12-3 13:52 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
|
評(píng)分
-
查看全部評(píng)分
|