記錄一下 用到的軟件
1 Keil uVision5 (把源代碼編譯成HEX文件)
2 stc-isp-15xx-v6.85.exe?(把HEX文件寫入單片機(jī))
下面是源代碼
//****************************************************************//
//? ?STC89C52RC??DHT11 溫度濕度
// 功能? :單片機(jī)通過 DHT11 獲取溫濕度? 顯示到8位數(shù)碼管?
//硬件連接:DHT11有3根線 DATA連接P2.0? VCC連接VCC GND連接GND
// 測試通過: wx:? yaolifang1987
//****************************************************************//
#include <reg52.h>
#include <intrins.h>
//
typedef unsigned char? U8;? ? ? /* defined for unsigned 8-bits integer variable? ? ? ? ? 無符號(hào)8位整型變量? */
typedef signed? char? S8;? ? ? /* defined for signed 8-bits integer variable? ? ? ? ? ? ? ? ? 有符號(hào)8位整型變量? */
typedef unsigned int? U16;? ? ? /* defined for unsigned 16-bits integer variable? ? ? ? ? 無符號(hào)16位整型變量 */
typedef signed? int? S16;? ? ? /* defined for signed 16-bits integer variable? ? ? ? ? 有符號(hào)16位整型變量 */
typedef unsigned long? U32;? ? ? /* defined for unsigned 32-bits integer variable? ? ? ? ? 無符號(hào)32位整型變量 */
typedef signed? long? S32;? ? ? /* defined for signed 32-bits integer variable? ? ? ? ? 有符號(hào)32位整型變量 */
typedef float? ? ? ? ? F32;? ? ? /* single precision floating point variable (32bits) 單精度浮點(diǎn)數(shù)(32位長度) */
typedef double? ? ? ? F64;? ? ? /* double precision floating point variable (64bits) 雙精度浮點(diǎn)數(shù)(64位長度) */
//
#define uchar unsigned char
#define uint unsigned int
#define? Data_0_time? ? 4
//----------------------------------------------//
//----------------IO口定義區(qū)--------------------//
//----------------------------------------------//
sbit FM=P2^3; // 蜂鳴器的接口
sbit? P2_0 = P2^0;
sbit? dula=P2^6;
sbit? wela=P2^7;
//----------------------------------------------//
//----------------定義區(qū)--------------------//
//----------------------------------------------//
U8? U8FLAG,k;
U8? U8count,U8temp;
U8? U8T_data_H,U8T_data_L,U8RH_data_H,U8RH_data_L,U8checkdata;
U8? U8T_data_H_temp,U8T_data_L_temp,U8RH_data_H_temp,U8RH_data_L_temp,U8checkdata_temp;
U8? U8comdata;
U8? outdata[5];? //定義發(fā)送的字節(jié)數(shù)? ? ? ? ?
U8? indata[5];
U8? count, count_r=0;
U8? str[5];
U16 U16temp1,U16temp2;
U8? table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
? ? ? ? void delayms(U16 xms)
? {
? U16 i,j;
? for(i=xms;i>0;i--)
? {
? for(j=110;j>0;j--);
? }
? }
? ? void Delay(U16 j)
? ? {? ? ? U8 i;
? ? ? ? ? ? for(;j>0;j--)
? ? ? ? ? {? ? ? ?
? ? ? ? ? ? ? ? for(i=0;i<27;i++);
? ? ? ? ? }
? ? }
? ? void? Delay_10us(void)
? ? ? {
? ? ? ? U8 i;
? ? ? ? i--;
? ? ? ? i--;
? ? ? ? i--;
? ? ? ? i--;
? ? ? ? i--;
? ? ? ? i--;
? ? ? }
? ? void? COM(void)
? ? ? {
? ? ? ? ? ? ? ? U8 i;
? ? ? for(i=0;i<8;i++)? ? ? ? ?
? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? ? U8FLAG=2;? ? ? ?
? ? ? ? ? ? ? ? ? while((!P2_0)&&U8FLAG++);
? ? ? ? ? ? ? ? ? ? ? ? Delay_10us();
? ? ? ? ? ? ? ? ? ? Delay_10us();
? ? ? ? ? ? ? ? ? ? ? ? Delay_10us();
? ? ? ? ? ? ? ? ? ? ? ? ? U8temp=0;
? ? ? ? ? ? if(P2_0)U8temp=1;
? ? ? ? ? ? ? ? ? ? U8FLAG=2;
? ? ? ? ? ? ? ? while((P2_0)&&U8FLAG++);
? ? ? ? ? ? ? ? ? //超時(shí)則跳出for循環(huán)? ? ? ? ? ? ? ? ?
? ? ? ? ? ? ? ? ? ? if(U8FLAG==1)break;
? ? ? ? ? ? ? ? ? //判斷數(shù)據(jù)位是0還是1? ? ? ?
? ? ? ? ? ? ? ? // 如果高電平高過預(yù)定0高電平值則數(shù)據(jù)位為 1
? ? ? ? ? ? ? ? ? U8comdata<<=1;
? ? ? ? ? ? ? ? ? ? ? U8comdata|=U8temp;? ? ? ? //0
? ? ? ? ? ? }//rof
? ? ? ? }
? ? ? ? //--------------------------------
? ? ? ? //-----濕度讀取子程序 ------------
? ? ? ? //--------------------------------
? ? ? ? //----以下變量均為全局變量--------
? ? ? ? //----溫度高8位== U8T_data_H------
? ? ? ? //----溫度低8位== U8T_data_L------
? ? ? ? //----濕度高8位== U8RH_data_H-----
? ? ? ? //----濕度低8位== U8RH_data_L-----
? ? ? ? //----校驗(yàn) 8位 == U8checkdata-----
? ? ? ? //----調(diào)用相關(guān)子程序如下----------
? ? ? ? //---- Delay();, Delay_10us();,COM();
? ? ? ? //--------------------------------
? ? ? ? void RH(void)
? ? ? ? {
? ? ? ? ? //主機(jī)拉低18ms
? ? ? P2_0=0;
? ? ? ? ? Delay(180);
? ? ? ? ? P2_0=1;
? ? ? ? //總線由上拉電阻拉高 主機(jī)延時(shí)20us
? ? ? ? ? Delay_10us();
? ? ? ? ? Delay_10us();
? ? ? ? ? Delay_10us();
? ? ? ? ? Delay_10us();
? ? ? ? //主機(jī)設(shè)為輸入 判斷從機(jī)響應(yīng)信號(hào)
? ? ? ? ? P2_0=1;
? ? ? ? //判斷從機(jī)是否有低電平響應(yīng)信號(hào) 如不響應(yīng)則跳出袭异,響應(yīng)則向下運(yùn)行? ? ? ? ?
? ? ? ? ? if(!P2_0)? ? ? ? ? ? ? ? //T !? ? ? ? ?
? ? ? ? ? {
? ? ? ? ? U8FLAG=2;
? ? ? ? //判斷從機(jī)是否發(fā)出 80us 的低電平響應(yīng)信號(hào)是否結(jié)束? ? ? ?
? ? ? ? ? while((!P2_0)&&U8FLAG++);
? ? ? ? ? U8FLAG=2;
? ? ? ? //判斷從機(jī)是否發(fā)出 80us 的高電平鸵荠,如發(fā)出則進(jìn)入數(shù)據(jù)接收狀態(tài)
? ? ? ? ? while((P2_0)&&U8FLAG++);
? ? ? ? //數(shù)據(jù)接收狀態(tài)? ? ? ? ? ? ? ?
? ? ? ? ? COM();
? ? ? ? ? U8RH_data_H_temp=U8comdata;
? ? ? ? ? COM();
? ? ? ? ? U8RH_data_L_temp=U8comdata;
? ? ? ? ? COM();
? ? ? ? ? U8T_data_H_temp=U8comdata;
? ? ? ? ? COM();
? ? ? ? ? U8T_data_L_temp=U8comdata;
? ? ? ? ? COM();
? ? ? ? ? U8checkdata_temp=U8comdata;
? ? ? ? ? P2_0=1;
? ? ? ? //數(shù)據(jù)校驗(yàn)
? ? ? ? ? U8temp=(U8T_data_H_temp+U8T_data_L_temp+U8RH_data_H_temp+U8RH_data_L_temp);
? ? ? ? ? if(U8temp==U8checkdata_temp)
? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? U8RH_data_H=U8RH_data_H_temp;
? ? ? ? ? ? ? ? ? ? U8RH_data_L=U8RH_data_L_temp;
? ? ? ? ? ? ? ? ? U8T_data_H=U8T_data_H_temp;
? ? ? ? ? ? ? ? ? ? U8T_data_L=U8T_data_L_temp;
? ? ? ? ? ? ? ? ? ? U8checkdata=U8checkdata_temp;
? ? ? ? ? }//fi
? ? ? ? ? }//fi
? ? ? ? }
//----------------------------------------------
//main()功能描述:? AT89C51? 11.0592MHz? ? ? ?
void main()
{
? ? ? ? U8? i,j;
? ? ? ? unsigned int ikk;
? ? ? ? //uchar str[6]={"RS232"};
? ? ? ? /* 系統(tǒng)初始化 */
? ? ? ? Delay(1);? ? ? ? //延時(shí)100US(12M晶振)
FM=0;Delay(2000); ? ? ? ? ? //蜂鳴器報(bào)警
FM=1;Delay(2000);? ? //延遲
FM=0;Delay(2000); ? ? ? ? ? //蜂鳴器報(bào)警
FM=1;Delay(2000);? ? //延遲
FM=0;Delay(2000); ? ? ? ? ? //蜂鳴器報(bào)警
FM=1;
FM=0;Delay(1000); ? ? ? ? ? //蜂鳴器報(bào)警
FM=1;Delay(1000);? ? //延遲
FM=0;Delay(1000); ? ? ? ? ? //蜂鳴器報(bào)警
FM=1;Delay(1000);? ? //延遲
FM=0;Delay(1000); ? ? ? ? ? //蜂鳴器報(bào)警
FM=1;Delay(1000);
FM=0;Delay(1000); ? ? ? ? ? //蜂鳴器報(bào)警
FM=1;Delay(1000);
FM=0;Delay(1000); ? ? ? ? ? //蜂鳴器報(bào)警
FM=1;
? Delay(1000);
? ? ? ? while(1)
? ? ? ? {?
? ? ? ? ? //------------------------
? ? ? ? ? //調(diào)用溫濕度讀取子程序
? ? ? ? ? RH();
? ? ? ? ? //串口顯示程序
? ? ? ? ? //--------------------------
? ? ? ? ? str[0]=U8RH_data_H; //? 把濕度整數(shù)給予SRT0.(直接使用即可)
? ? ? ? ? str[1]=U8RH_data_L; //? 把濕度小數(shù)給予SRT1.==0(為零诫龙,不用)
? ? ? ? ? str[2]=U8T_data_H;? //? 把溫度整數(shù)給予SRT2.(直接使用即可)
? ? ? ? ? str[3]=U8T_data_L;? //? 把溫度小數(shù)給予SRT3.==0(為零,不用)
? ? ? ? ? str[4]=U8checkdata; //? 校驗(yàn)位(不用)
// unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};?
// unsigned char code wei[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; ?
? // dula=1;
? ? ? ? ? // P0=table[str[2]/10];
? ? ? ? ? // dula=0;
? ? ? ? ? // P0=0xff;
? ? ? ? ? // wela=1;
? ? ? ? ? // P0=0xfe;
? ? ? ? ? // wela=0;
? ? ? ? ? // delayms(300);
? ? // FM=0;Delay(2000); ? ? ? ? ? //蜂鳴器報(bào)警
// FM=1;Delay(2000);? ? //延遲
// FM=0;Delay(2000); ? ? ? ? ? //蜂鳴器報(bào)警
// FM=1;Delay(2000);? ? //延遲
// FM=0;Delay(2000); ? ? ? ? ? //蜂鳴器報(bào)警
// FM=1;
// FM=0;Delay(1000); ? ? ? ? ? //蜂鳴器報(bào)警
// FM=1;Delay(1000);? ? //延遲
// FM=0;Delay(1000); ? ? ? ? ? //蜂鳴器報(bào)警
// FM=1;Delay(1000);? ? //延遲
// FM=0;Delay(1000); ? ? ? ? ? //蜂鳴器報(bào)警
// FM=1;Delay(1000);
// FM=0;Delay(1000); ? ? ? ? ? //蜂鳴器報(bào)警
// FM=1;Delay(1000);
// FM=0;Delay(1000); ? ? ? ? ? //蜂鳴器報(bào)警
// FM=1;
? // Delay(1000);
? ikk=0;
? // for(ikk=0;ikk<500;ikk++)
? for(ikk=0;ikk<500;ikk++)
? {
? // 溫度 第一位
? ? ? ? ? dula=1;
? ? ? ? ? P0=table[str[2]/10];
? ? ? ? ? dula=0;
? ? ? ? ? P0=0xff;
? ? ? ? ? wela=1;
? ? ? ? ? P0=0xfe;
? ? ? ? ? wela=0;
? ? ? ? ? delayms(1);
// 溫度 第二位
? ? ? ? ? dula=1;
? ? ? ? ? P0=table[str[2]%10];
? ? ? ? ? dula=0;
? ? ? ? ? P0=0xff;
? ? ? ? ? wela=1;
? ? ? ? ? P0=0xfd;
? ? ? ? ? wela=0;
? ? ? ? ? delayms(1);
? // 溫度 C
? ? ? ? ? dula=1;
? ? ? ? ? P0=table[12];
? ? ? ? ? dula=0;
? ? ? ? ? P0=0xff;
? ? ? ? ? wela=1;
? ? ? ? ? P0=0xfb;
? ? ? ? ? wela=0;
? ? ? ? ? delayms(1);
// unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};?
// unsigned char code wei[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
// unsigned char code wei[]={0xfe,0xfd,0xfb,0xf7,? 0xef,0xdf,0xbf,0x7f};
? // 濕度 第一位 str[0]
? dula=1;
? ? ? ? ? P0=table[str[0]/10];
? ? ? ? ? dula=0;
? ? ? ? ? P0=0xff;
? ? ? ? ? wela=1;
? ? ? ? ? P0=0xef;
? ? ? ? ? wela=0;
? ? ? ? ? delayms(1);
? // 濕度 第二位 str[0]
? dula=1;
? ? ? ? ? P0=table[str[0]%10];
? ? ? ? ? dula=0;
? ? ? ? ? P0=0xff;
? ? ? ? ? wela=1;
? ? ? ? ? P0=0xdf;
? ? ? ? ? wela=0;
? ? ? ? ? delayms(1);
? // 濕度 符號(hào)
? dula=1;
? ? ? ? ? // P0=table[13];
? ? ? ? ? P0=0x76;
? ? ? ? ? dula=0;
? ? ? ? ? P0=0xff;
? ? ? ? ? wela=1;
? ? ? ? ? P0=0xbf;
? ? ? ? ? wela=0;
? ? ? ? ? delayms(1);
? }
// FM=0; ? ? ? ? ? //蜂鳴器報(bào)警
// Delay(3000);? ? //延遲
// FM=1;
// Delay(3000);?
// FM=0; ? ? ? ? ? //蜂鳴器報(bào)警
// Delay(3000);? ? //延遲
// FM=1;
// Delay(1000);
// Delay(10000);
? // FM=0;Delay(2000); ? ? ? ? ? //蜂鳴器報(bào)警
// FM=1;Delay(2000);? ? //延遲
// FM=0;Delay(2000); ? ? ? ? ? //蜂鳴器報(bào)警
// FM=1;Delay(2000);? ? //延遲
// FM=0;Delay(2000); ? ? ? ? ? //蜂鳴器報(bào)警
// FM=1;
// FM=0;Delay(1000); ? ? ? ? ? //蜂鳴器報(bào)警
// FM=1;Delay(1000);? ? //延遲
// FM=0;Delay(1000); ? ? ? ? ? //蜂鳴器報(bào)警
// FM=1;Delay(1000);? ? //延遲
// FM=0;Delay(1000); ? ? ? ? ? //蜂鳴器報(bào)警
// FM=1;Delay(1000);
// FM=0;Delay(1000); ? ? ? ? ? //蜂鳴器報(bào)警
// FM=1;Delay(1000);
// FM=0;Delay(1000); ? ? ? ? ? //蜂鳴器報(bào)警
// FM=1;
? // Delay(1000);
? ? ? //延遲
Delay(18000);
FM=0;Delay(1000); ? ? ? ? ? //蜂鳴器報(bào)警
FM=1;Delay(1000);
? ? ? ? ? //讀取模塊數(shù)據(jù)周期不易小于 2S
? ? ? ? ? // Delay(10000);
? ? ? ? }//elihw
}// main