컴퓨터 지식 네트워크 - 컴퓨터 하드웨어 - 마이크로컨트롤러와 PC 간의 통신 문제

마이크로컨트롤러와 PC 간의 통신 문제

DHT11 프로그램이 있는데 직접 참고해주세요.

////////////////////////////////////DHT11 습윤 온도 표시 예 작성자: digital tube 프로그램///////////////////////////////20101031 Shen 선생님의 정보 참조//////// ////// ////////////////////////

//#include "stc12c5406ad.h"

#include "reg51.h"

#include "intrins.h"

#define uint unsigned int

#define uchar unsigned char

//디지털 튜브는 LG5641BH입니다. 왼쪽에 온도 2개, 오른쪽에 습도 2개

uchar duan[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};

sbit LED1=P1^0; //위에서 네 번째 디지털 튜브인 첫 번째 LED를 제어합니다.

sbit LED2=P1^1; //위에서 세 번째 디지털 튜브인 두 번째 LED를 제어합니다. 하단

sbit LED3=P1^2; //세 번째 LED와 첫 번째 디지털 튜브 제어

sbit LED4=P1^3; //네 번째 LED와 두 번째 LED 제어 디지털 튜브

sbit pw=P1^0; // DHT11 데이터 라인 포트

uchar rh_h,rh_l,temp_h,temp_l,check_data,dat=0;

uchar r_rh_h,r_rh_l,r_temp_h,r_temp_l,r_check_data;

uchar 확인;

//

uchar c[6],d[1]; /p>

////////////////////////// /100u초 지연 기능/////////// / //////////////////////////

무효 지연(단위 xs)

{

uint i,j;

for(i=xs;i>0;i--)

for(j=110;j>0;j-- );

}

/////////////////////////지연 10us의 i는 11/입니다. / //////////////////////////// //////////

void Delay10us (uchar i)

{

while(i--)

}

///////// /// /////////////////// //니지튜브 표시 기능 ///////////////////// ////// ////////////////////////

void 표시(uchar shidu,uchar wendu)

{

uchar i=280; //이 지연 시간은 이보다 작을 수 없습니다. 100초, 300초는 DHT11의 작동을 중단시킵니다. 즉, 무한 루프에 들어갑니다.

while(i--) //DHT11과 관련이 있습니다. 수집은 변환 주기와 관련이 있으며, 하나의 샘플이 완료되도록 일정한 지연이 있어야 합니다.

{ //주기적으로, 다음 샘플링과 출력이 원활하게 수행될 수 있습니다.

//bai=shu/100;

//shi=shu%100/10;

//ge=shu%10;

LED3=0; //가장 왼쪽에 불을 켠다

LED4=1;

LED2=1;

LED1=1;< / p>

P1=duan[wendu/10];

지연(50);

LED3=1

LED4=0; 두 번째 것을 켜세요

LED2=1;

LED3=1;

LED1=1;

P1=duan[ wendu %10];

지연(50);

LED4=1;

LED2=0; //세 번째 램프 켜기

LED4=1;

LED3=1;

LED1=1;

P1=duan[shidu/10];

지연(50);

LED2=1;

LED1=0; //네 번째 램프 켜기

LED4=1;

LED3=1;

LED2=1;

P1=duan[shidu%10];

지연(50);

LED1=1;

}

}

/////////////////// /////DHT11 핵심 프로그램///////////////////////////////////////// p>

void dht11_com(void) //이 함수는 판독의 정확성을 결정하는 결정적인 요소입니다

//여기서 지연 시간을 조정하는 것이 주요 문제입니다

{

uchar j;

bit wei;

// TH0=0x00; // 타이머 지우기

// TL0=0x00 ;

for(j=0;j<8;j++)

{

// flag=2; > //그리고 기다리세요

// while((!pw)&&flag++) //낮은 레벨로 끝납니다

// while(pw);

지연10us(11);

지연10us(11);

// 지연10us(11)

// 지연10us(11); p>// 지연10us(11);

// 지연10us(11)

// 지연10us(11);

// 지연10us(11) ;

while(!pw);

if(pw)

{

Delay10us(11);

지연10us(11); // 26us-28us는 0입니다.

지연10us(11)

지연10us(11) ;

// 지연10us(2);

// 지연10us(2);

wei=0; //

/ / 지연은 약 50us입니다. 여전히 높으면 1로 간주되고, 그렇지 않으면 0입니다.

if(pw) wei=1; //

// 높은 수준 기간

// 70us는 1입니다.

// flag=2;

// while(pw&&flag++);

dat<< =1;

dat|=wei; //DHT11 데이터는 상위 비트입니다. 여기서는 8비트가 1바이트로 결합됩니다.

}

}

}

////////////////////////////////////// //// ///////////////////////////////////////////////// ///////////////

// if(pw) //하이레벨이면 타이머 0을 켠다

// {

// TR0=1; //양성 펄스의 폭을 계산합니다.

// }

// while(pw);

// TR0=0;

// a=TL0;

///////////////////// /// ////////////////////////////////////////////// /////// ////////////////////////////////

// if (a>28)

// wei=1;

// else

// wei=0;

// ///////// //////////////////////////////////////// ///////////// //////////////////////////////////// ////////

/*

uint getbyte1(void)

{

uint i,j,dat ;

dat=0;

for(i=0;i<8;i++)

{

//// ///// j=getbit();//// ////////////////////////////////// ////////////////// /////////////////

dat=(dat<< 1)|j;

}

return dat;

}

*/

/// /////////////////// ////////////////////////////// ///////////////////////////////////////////////// ////////

/*

void init(void) //타이머 및 센서 초기화

{

단위 i;

///////////// /////////////////////////// ///////////////////////////////////////////////// //////////////////////////// p>

uchar 플래그;

// TMOD=0x09;

// EX0=0;

*/

////////////////////// ///////////////////////데이터 수집 기능//// /////////////////// ////////////////////////////////// ///

void shujushenchen(void)

{

pw=0; //호스트 풀업 저항은 로우로 풀링됩니다.

지연(20) //시작 신호는 다음과 같이 지연됩니다. 20 MS

pw=1; //호스트가 높이 올라갑니다.

// for(i=0;i<30;i++) 30US를 기다립니다.

// 지연10us(11);

지연10us(11); 입력 모드로

while(pw); //낮은 수준의 응답을 기다립니다.

if(!pw) //슬레이브 DHT11이 응답 신호를 보냅니다.

{

// flag=2;

// while((!pw)&&flag++) //슬레이브 응답 신호 지연 대기 시간은 약 80US입니다.

지연10us(11);

지연10us(11);

지연10us(11)

지연10us(11); Delay10us(11);

// Delay10us(11);

while(!pw);

if (pw) //슬레이브 응답이 종료되는 경우

{

// flag=2;

// while(pw&&flag++) //슬레이브 종료 상위 레벨 상태를 기다립니다.

지연10us(11);

지연10us(11);

지연10us(11);

지연10us(11);

// 지연10us(11);

// 지연10us(11); //이 과정에는 약 80us가 소요됩니다.

while(pw);

//시작 이후 데이터 수신

dht11_com(); //습도의 8자리 정수인 첫 번째 바이트를 수락합니다.

// rh_h=dat

c[0]=dat;

dht11_com(); // 다음도 같은 방식으로 적용됩니다

// rh_l=dat;

c[ 1]=dat;

dht11_com();

// temp_h=dat;

c[2]=dat; p> dht11_com();

// temp_l=dat;

c[3]=dat;

dht11_com(); > // check_data=dat;

c[4]=dat;

pw=1; // 마지막 바이트를 수신한 후 호스트에서 데이터를 수집합니다. time

//데이터 확인

// check=(rh_h+rh_l+temp_h+temp_l);

c[5]=(c [0] +c[1]+c[2]+c[3]);

//처음 4바이트의 합이 마지막 바이트와 같은지 여부, 그렇다면 데이터가 전송된다는 의미 올바르게

if(/*(check==check_data)*/d[0]==c[4]) //데이터가 올바르게 전송된 경우

{

r_rh_h=1;

r_rh_l=rh_l;

r_temp_h=temp_h;

r_temp_l=temp_l;

} /p>

}

}

}

//////////////////// /// ////////////////주요 기능///////////////////////////// ///// /////////////////////////////

void main(void)

{

// uchar i;

Delay(2000); //불안정 상태를 통과할 때까지 1초 대기

while(1 )

{

shujushenchen(); //데이터 수집 c

// 데이터 생성

//디지털 튜브 디스플레이로 보내기

// for(i=0;i<6;i++)

// {

디스플레이(c[0],c[2]) ; //습도

// display(c[2]); //온도

지연(50);

// }

}

}

上篇: 길림성 중이월 강지광 마케팅 센터의 전화번호는 몇 번입니까? 下篇: 웹 디자인 개발 도구인 Dreamweaver, flashmx, fireworksmx 의 기능과 기능에 대해 설명합니다
관련 내용