O_嵌入式专题目录
- 核心为STC89C52RC
- 屏幕为两行的1602液晶屏
- 红外接收管为VS838,可用手机红外配置
- 温湿度传感器为DHT11
- UART用于调试
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");
}
}
}
评论已关闭