51单片机 串口通信 LCD1602、温湿度模块DH11

一 LCD1602输出一个字符 参考手册配置 注意类型

1在什么位置输出(lcd手册最高位置1)0x80+0x05;

2 输出什么内容'c'

3手册 lcd初始化配置

4 函数调用传位置和字符,写操作分为RS 为寄存器选择,高电平时选择数据(data----字符)寄存器、低电平时选择指令(cmd---位置 地址)寄存器。

5要先检测是否在忙(读操作 初始化都是在忙 定义一个tmp 循环扫描P0并赋值给tmp判断是否在忙)

二 LCD1602显示字符串

1 底层逻辑不变 在主函数中调用一个函数传过去 (行 列 “字符串”)

2 在函数lcd1602_show中 依据传过来的 行swiitch case 1/2  列:位置函数(即cmd指令)字符串通过不断扫描和偏移(weite_DATA(*string)指令)、

三 温湿度模块、

1根据手册DHT数据线的电平判断模块是否正常(正常会把电平拉低 通过LED的亮灭来判断)

2根据手册配置模块,数据发送前配置 和发送时的配置,在发送前都要配置DHT (通过卡电平的方式),用一个char datas【5】来存放  for i    for j来遍历 一个标志位来表示是高电平还是低电平(用高电平(持续实践)来表示高低电平)用char tmp来存放读取的数据 tmp=tmp《《1,tmp |=标志位 datas【i】 = tmp 

3通过串口的方式将温湿度的数据传送到电脑端(串口初始化--pcon--scon--TMOD--SMOD--TH1--TL1配置串口 定时器 波特率 计时器开始)(发送字符串---遍历 偏移---调用字符存放在SBUF中 需要软件给TI发送标志复位)

将data【i】的值放入wen_du数组中 lcd1602调用、string调用、data【2】大于23给继电器低电平、蜂鸣器低电平、也可以通过串口(配置)中断来发送open/clase来开关灯和控制风扇51单片机 串口通信 LCD1602、温湿度模块DH11_第1张图片

 void LCD1602_Show(char hang,char lie,char *string){//行 列 显示
    switch(hang){
        case 1:Write_CMD(0x80+lie);//显示位置
               while(*string){        //显示字符串 字符串偏移 lcd会给位置
                    Write_DATA(*string);//显示数据
                    string++;
                }
            break;
            
        case 2:Write_CMD(0x80+0x40+lie);
               while(*string){
                    Write_DATA(*string);
                    string++;
                }
            break;
    }
}

void UART_Handle() interrupt 4{
    static char i = 0;                                //静态变量只会执行一次

    if(RI == 1){                                    //打开接收中断
            RI = 0;                                    //手册 软件复位
            light[i] = SBUF;                        // 读移位寄存器里面的值
            i++;
            if(i == size){
                i = 0;
            }
            
            if(strstr(light,"en")){                    //在ligth数组中查找是否有en 有执行
                D5 = 0;        //输入的字符为O 点亮D5
                ji_dian_qi = 0;//有en风扇响
                memset(light,'\0',size);             //初始化light数组 里面放空,放的大小为sizeof(light) 
                i = 0;                                //i回到0 从新开始增加灵敏度
            }

            if(strstr(light,"se")){    
                D5 = 1;                                //输入的字符为C 熄灭D5
                ji_dian_qi = 1;
                memset(light,'\0',size);
                i = 0;
            }
    }
    
    
}

void sendByte(char data_msg){

        SBUF = data_msg;
        while(!TI);
        TI = 0;
}

void sendString(char * str){
    while(*str != '\0'){
        sendByte(*str);
        str++;
    }
}


void fa_song_shi_DHT(){
    char i;
    char j;
    char biao_zhi_wei;
    char tmp;//tmp里面可以存放0000 0000
    
    fa_song_qian_DHT();//每次都要配置发送前  不然会进入休眠
    
    for(i=0;i<5;i++){
        for(j=0;j<8;j++){
            while(!DHT);//DHT=1 动作后DHT=0需要取反保持1(一直为低电平)   进入工作模式并延时50us
            Delay40us();//在延时50us后再延时40毫秒看是
            
            if(DHT == 1){//延迟44us后是1 则说明是高电平 并while(DHT)让dht走完
                biao_zhi_wei = 1;
                while(DHT);
            }
            
            else{        //否则是低电平
                biao_zhi_wei = 0;
            }
            
            tmp = tmp<<1;//可以存放0000 0000
            tmp |= biao_zhi_wei;//随机的tmp0000 0000 |= 标志位的0000 0001/0000
        }
        
        datas[i] = tmp;
    }
    
    
}


void wen_shi_du_String(){ //把datas【i】中的数据放在字符串数组wen_du、shi_du中
    shi_du[0] = 'S';
    shi_du[1] = 'D';
    shi_du[2] = ':';
    shi_du[3] = datas[0]/10+0x30;
    shi_du[4] = datas[0]%10+0x30;
    shi_du[5] = '.';
    shi_du[6] = datas[1]/10+0x30;
    shi_du[7] = datas[1]%10+0x30;
    shi_du[8] = '\0';
    shi_du[8] = '%';
    
    wen_du[0] = 'W'; 
    wen_du[1] = 'D';
    wen_du[2] = ':';
    wen_du[3] = datas[2]/10+0x30;
    wen_du[4] = datas[2]%10+0x30;
    wen_du[5] = '.';
    wen_du[6] = datas[3]/10+0x30;
    wen_du[7] = datas[3]%10+0x30;
    wen_du[8] = '\0';
    wen_du[8] = 'C';    
}

你可能感兴趣的:(51单片机,c语言,51单片机,嵌入式硬件,单片机)