O_嵌入式专题目录

  • 核心为STC89C52RC
  • 屏幕为两行的1602液晶屏
  • 红外接收管为VS838,可用手机红外配置
  • 温湿度传感器为DHT11
  • UART用于调试

SCH/PCB

SCH
PCB

Code

#include <reg52.h>
#include <intrins.h>
#include <string.h>

#define uchar unsigned char
#define uint unsigned int
#define LCD_PORT P1

sbit LCD_RS = P3^3;
sbit LCD_RW = P3^4;
sbit LCD_EN = P3^5;
sbit RR_DATA = P3^2;
sbit DHT11_DATA = P2^0;

uchar Test_Text[]="  HumTem  V1.0";
uchar RR_Value[4]=0;
uchar RR_Time=0;
uchar RR_Check=0;
uchar Get_RR_Value=0;

uchar Humidity[3]=0;
uchar Temperature[3]=0;
uint Length=10;

void Delay_Ms(uchar ms)
{
    int i;
    for(;ms!=0; ms--)
        for (i=0;i<110;i++);
}
void Delay_10Us(uchar us)   //for RR
{
    while(us--);
}
void Delay_Us(uchar us)     //for DHT11
{
    while(--us);
}

void UART_Init(void)
{
    SCON = 0x50;
    TMOD = 0x20;
    PCON = 0x00;
    TH1 = 0xfd;
    TL1 = 0xfd;
    TR1 = 1;
    EA = 1;
}
void UART_Send_Byte(uchar c)
{
    SBUF=c;
    while(TI==0);
    TI=0;
}
void UART_Send_String(uchar *str)
{
    while(*str!='\0')
    {
        UART_Send_Byte(*str++);
    }
}

void LCD_Write(uchar byte, uchar flag)
{
    if(flag)    LCD_RS=1;
    else    LCD_RS=0;

    LCD_RW=0;
    LCD_PORT=byte;
    Delay_Ms(5);
    LCD_EN=1;
    Delay_Ms(5);
    LCD_EN=0;
}
void LCD_Init(void)
{
    LCD_RW=0;
    LCD_RS=0;
    LCD_Write(0x38,0);  //8bit data,double line,5*8point
    LCD_Write(0x0c,0);  //display switch,display on,cursor off,blink off.
    LCD_Write(0x01,0);  //screen clear
    LCD_Write(0x80,0);  //DDRAM AD set to 00h,
}
void LCD_Display_Str(uchar* str, uchar line, uchar addr)    //0:first line,1:second line
{
    uint i;
    if(!line)   LCD_Write(0x80+addr,0);
    else    LCD_Write(0xc0+addr,0);
    for(i=0;str[i]!=0;i++)
    {
        LCD_Write(str[i],1);
    }
}

void RR_Init(void)
{
    IT0=1;
    EX0=1;
    EA=1;
    RR_DATA=1;
}
void RR_Read() interrupt 0
{
    uchar j,k;
    uint err;
    RR_Time=0;
    Delay_10Us(700);
    if(RR_DATA==0)
    {
        err=1000;
        while((RR_DATA==0)&&(err>0))
        {
            Delay_10Us(1);
            err--;
        }
        if(RR_DATA==1)
        {
            err=500;
            while((RR_DATA==1)&&(err>0))
            {
                Delay_10Us(1);
                err--;
            }
            for(k=0;k<4;k++)
            {
                for(j=0;j<8;j++)
                {
                    err=60;
                    while((RR_DATA==0)&&(err>0))
                    {
                        Delay_10Us(1);
                        err--;
                    }
                    err=500;
                    while((RR_DATA==1)&&(err>0))
                    {
                        Delay_10Us(10);
                        RR_Time++;
                        err--;
                        if(RR_Time>30)
                        {
                            return;
                        }
                    }
                    RR_Value[k]>>=1;
                    if(RR_Time>=8)
                    {
                        RR_Value[k]|=0x80;
                    }
                    RR_Time=0;
                }
            }
        }
        if(RR_Value[2]==~RR_Value[3])   //show the uart data at hex
        {
            RR_Check=1;
            UART_Send_String(RR_Value);
            if(RR_Value[2]==0x12)   Get_RR_Value=1;
        }
        else
        {
            RR_Check=0;
            UART_Send_Byte(0x00);
        }
    }
}

void DHT11_Start(void)
{
    DHT11_DATA=1;
    Delay_Us(2);
    DHT11_DATA=0;
    Delay_Ms(20);
    DHT11_DATA=1;
    Delay_Us(30);
}

uchar DHT11_Rec_Byte(void)
{
    uchar i,dat=0;
    for(i=0;i<8;i++)
    {
        while(!DHT11_DATA);
        Delay_Us(8);
        dat<<=1;
        if(DHT11_DATA==1)
            dat+=1;
        while(DHT11_DATA);
    }
    return dat;
}

void DHT11_Receive(void)
{
    uchar R_H,R_L,T_H,T_L,RH,RL,TH,TL,Revise;
    DHT11_Start();
    if(DHT11_DATA==0)
    {
        while(DHT11_DATA==0);
        Delay_Us(40);
        R_H=DHT11_Rec_Byte();
        R_L=DHT11_Rec_Byte();
        T_H=DHT11_Rec_Byte();
        T_L=DHT11_Rec_Byte();
        Revise=DHT11_Rec_Byte();

        Delay_Us(25);

        if((R_H+R_L+T_H+T_L)==Revise)
        {
            RH=R_H;
            RL=R_L;
            TH=T_H;
            TL=T_L;
        }
        Humidity[0]='0'+(RH/10);
        Humidity[1]='0'+(RH%10);
        Humidity[2]='%';
        Temperature[0]='0'+(TH/10);
        Temperature[1]='0'+(TH%10);
        Temperature[2]='C';
    }
}


void main(void)
{
    uint i=0;
    UART_Init();
    LCD_Init();
    RR_Init();

    LCD_Display_Str(Test_Text,0,0);
    UART_Send_String("\r\n");
    UART_Send_String(Test_Text);
    UART_Send_String("\r\n\r\n");

    while(1)
    {
        if(Get_RR_Value)
        {
            Get_RR_Value=0;
            DHT11_Receive();
            LCD_Write(0x01,0);
            LCD_Display_Str("    Hum: ",0,0);
            LCD_Display_Str(Humidity,0,0x09);
            LCD_Display_Str("    Tem: ",1,0);
            LCD_Display_Str(Temperature,1,0x09);


            UART_Send_String("\r\nHum:  ");
            UART_Send_String(Humidity);
            UART_Send_String("\r\nTem:  ");
            UART_Send_String(Temperature);
            UART_Send_String("\r\nGet RR_Value Open or Close\r\n\r\n");
        }
    }
}

评论已关闭

Loading...
Fullscreen Image