마이크로컨트롤러와 PC 간의 통신 문제
DHT11 프로그램이 있는데 직접 참고해주세요.
////////////////////////////////////DHT11 습윤 온도 표시 예 작성자: digital tube 프로그램///////////////////////////////20101031 Shen 선생님의 정보 참조//////// ////// ////////////////////////
//#include "stc12c5406ad.h" p>
#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바이트로 결합됩니다.
}
} p>
}
////////////////////////////////////// //// ///////////////////////////////////////////////// ///////////////
// 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를 기다립니다. p>
// 지연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);
// }
}
}