|
經(jīng)過(guò)幾天的努力,終于搞出了89C51單片機(jī)控制AM2302濕度溫度傳感器+lcd1602+藍(lán)牙上顯示!
被店家坑死嘍,還好我會(huì)改電路,把傳感器模塊的電路改為單總線模式,接法如圖:(一定記得接地哦)
實(shí)物圖:
實(shí)物圖
手繪電路原理圖:
接線方法
電路板封裝圖
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
電路原理圖
這是部分程序:
- /*
- humidity RH就是相對(duì)濕度 日常生活中所指的濕度為相對(duì)濕度,%rh表示
- 溫度(temperature)
- */
- #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 Sensor_SDA = P3^4;
- sbit lcdrs=P1^3;
- sbit lcdwr=P1^4;
- sbit lcden=P1^5;
- /*
- sbit lcdrs=P2^6;
- sbit lcdwr=P2^5;
- sbit lcden=P2^7;
- */
- uchar Sensor_Data[5]={0x00,0x00,0x00,0x00,0x00};
- uchar Sensor_AnswerFlag; //收到起始標(biāo)志位
- uchar Sensor_ErrorFlag; //讀取傳感器錯(cuò)誤標(biāo)志
- uchar Sensor_Check; //校驗(yàn)和
- uint Sys_CNT;
- uint Tmp;
- uint T;
- uint Rh;
- uint t0;
- uchar num;
- uchar flag;
- void sendDataToProcessing(char symbol, int dat); //串發(fā)送數(shù)據(jù)
- void Init_Timer0(void);//定時(shí)器初始化
- //串口發(fā)送函數(shù)
- void sendDataToProcessing(char symbol, int dat )
- {
- putchar(symbol);
- printf("%d\r\n",dat);
- }
- void UART_Init(void)
- {
- SCON=0X50; //設(shè)置為工作方式1
- TMOD=0X20; //設(shè)置計(jì)數(shù)器工作方式2
- PCON=0X80; //波特率加倍
- TH1=0XF3; //計(jì)數(shù)器初始值設(shè)置,注意波特率是4800的
- TL1=0XF3;
- // ES=1; //打開(kāi)接收中斷
- // EA=1; //打開(kāi)總中斷
- TR1=1; //打開(kāi)計(jì)數(shù)器
- }
- char putchar(unsigned char dat)
- {
- TI=0;
- SBUF=dat;
- while(!TI);
- TI=0;
- return SBUF;
- }
- //延時(shí)函數(shù)
- void delay(uint z)
- {
- uint x,y;
- for(x=z;x>0;x--)
- for(y=123;y>0;y--);
- }
- /********************************************\
- |* 功能: 延時(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 write_com(uchar com) //寫(xiě)入命令
- {
- lcdrs=0;
- P0=com;
- lcden=1;
- delay(5);
- lcden=0;
- }
- void write_date(uchar date) //寫(xiě)入數(shù)據(jù)
- {
- 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);//無(wú)光標(biāo)不閃
- 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;
- } //接收數(shù)據(jù)清零
- }
- /********************************************\
- |* 功能: 讀傳感器發(fā)送的單個(gè)字節(jié) *|
- \********************************************/
- unsigned char Read_SensorData(void) //讀取傳感器信號(hào)
- {
- 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
-
- //釋放總線 延時(shí)(Min=30us Max=50us)
- Sensor_SDA = 1;
- Delay_N10us(2);//延時(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 display() //顯示
- {
- Tmp = Sensor_Data[2]*256+Sensor_Data[3]; // 溫度高位 溫度低位
- T=Tmp/10;
- diyihang(5); //第一行第5個(gè)位置開(kāi)始顯示
- write_date(Tmp/100%10 + '0'); //十位
- write_date(Tmp/10%10 + '0'); //個(gè)位
- write_date('.'); //小數(shù)點(diǎn)
- write_date(Tmp%10 + '0'); //小數(shù)位
- Tmp = Sensor_Data[0]*256+Sensor_Data[1]; //濕度高位 濕度低位
- Rh=Tmp/10;
- dierhang(5); //第二行第5個(gè)位置開(kāi)始顯示
- write_date(Tmp/100%10 + '0'); //十位
- write_date(Tmp/10%10 + '0'); //個(gè)位
- write_date('.'); //小數(shù)點(diǎn)
- write_date(Tmp%10 + '0'); //小數(shù)位
- }
- 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]) /*校驗(yàn)成功 */
- {
- 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 /*校驗(yàn)失敗*/
- {
- write_com(0x01);//清屏
- diyihang(1);//顯示位置
- for(num=0;num<10;num++)
- {
- write_date(table4[num]); //顯示 Check wrong
- //delay(10);
- }
- flag=1;
- }
- }
- else /*沒(méi)有連接上 */
- {
- 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 init_t0()
- {
- TMOD=0x01;
- TH0=(65536-50000)/256;
- TL0=(65536-50000)%256;
- EA=1;
- ET0=1;
- TR0=1;
- }*/
- void main()
- { Init_Timer0();
- UART_Init(); //串口初始化
- init_1602();
- while(1)
- {
-
- Delay_N1ms(2000); // 延時(shí) 2S(兩次讀取間隔至少2S)
- Clear_Data(); // 清除收到數(shù)據(jù)
- Read_Sensor(); // 讀取傳感器數(shù)據(jù)
- check_and_display(); // 檢測(cè)并顯示數(shù)據(jù)
- sendDataToProcessing('T',T); //發(fā)送脈率值
- sendDataToProcessing('H',Rh); //發(fā)送脈率值
- }
- }
- /*------------------------------------------------
- 定時(shí)器初始化子程序
- ------------------------------------------------*/
- void Init_Timer0(void)
- {
- TMOD |= 0x01; //使用模式1,16位定時(shí)器,使用"|"符號(hào)可以在使用多個(gè)定時(shí)器時(shí)不受影響
- //TH0=0x00; //給定初值
- //TL0=0x00;
- EA=1; //總中斷打開(kāi)
- ET0=1; //定時(shí)器中斷打開(kāi)
- TR0=1; //定時(shí)器開(kāi)關(guān)打開(kāi)
- }
- /*------------------------------------------------
- 定時(shí)器中斷子程序
- ------------------------------------------------*/
- 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;
- }
- }
復(fù)制代碼
全部資料51hei下載地址:
|
-
-
濕度 溫度 藍(lán)牙 lcd1602.zip
2018-1-1 19:36 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
44.64 KB, 下載次數(shù): 77, 下載積分: 黑幣 -5
程序
-
-
電路.zip
2018-1-1 19:43 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
160.99 KB, 下載次數(shù): 40, 下載積分: 黑幣 -5
原理圖,封裝圖
-
-
AM2302模塊資料.zip
2018-1-1 19:43 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
2.77 MB, 下載次數(shù): 35, 下載積分: 黑幣 -5
單總線方式
評(píng)分
-
查看全部評(píng)分
|