单片机DHT11温湿度+1602液晶显示程序

发布者:机械梦想家最新更新时间:2019-12-19 来源: 51hei关键字:单片机  DHT11  1602液晶显示 手机看文章 扫描二维码
随时随地手机看文章

 

DHT11驱动程序参考
http://www.51hei.com/bbs/dpj-112282-1.html
http://www.51hei.com/bbs/dpj-38067-1.html

1602驱动程序参考
http://www.51hei.com/bbs/dpj-24671-1.html


/*********************************************************************************************

程序名:    DHT11-1602

编写人:    fby

编写时间:  2019年3月21日

硬件支持:  STC89C52RC  DHT11  LCD1602

接口说明:  DHT11:VCC DATA NC GND

*********************************************************************************************

说明:1、单片机是STC89C52RC,晶振频率11.0592MHz,实验成功。

          2、好东西要共享,大家随意折腾~~

*********************************************************************************************/

#include

#include


#define uchar unsigned char        //无符号字符型类型数据

#define uint unsigned int //无符号整型数据

#define IODATA  P0


uchar dat_r[4];          //用于存放从DHT11读取到的数值


sbit DATA=P2^2;   //定义数据线

sbit RS=P1^0; //定义rs端口

sbit RW=P1^1; //定义rw端口

sbit E=P2^5; //定义en端口



/*********************************************************************************************

函数名:延时函数

调  用:Delay30us();/Delay20ms();/Delay1s();

参  数:无

返回值:无 

结  果:延时相应时间

备  注:振荡晶体为11.0592MHz(所有延时函数Copy自STC-ISP(v6.85).exe)

**********************************************************************************************/

void Delay30us()                //@11.0592MHz-40

{

        unsigned char i;


        i = 11;

        while (--i);

}



void Delay20ms()                //@11.0592MHz

{

        unsigned char i, j;


        i = 36;

        j = 217;

        do

        {

                while (--j);

        } while (--i);

}



void Delay1s()                //@11.0592MHz

{

        unsigned char i, j, k;


        _nop_();

        i = 8;

        j = 1;

        k = 243;

        do

        {

                do

                {

                        while (--k);

                } while (--j);

        } while (--i);

}



/*********************************************************************************************

函数名:DHT11启动函数

调  用:无

参  数:无

返回值:无

结  果:DHT11开始工作

备  注:

**********************************************************************************************/

void DHT11_start()                 // 主机控制DHT11开始工作

{

   DATA=1;                                 // 主线空闲状态

   _nop_();

   _nop_();

   DATA=0;                                 // 主机发送开始工作信号

   Delay20ms();   //延时18ms以上

   DATA=1;                                 // 拉高并延时等待DHT11响应

   Delay30us();

}

/*********************************************************************************************

函数名:DHT11读数据函数

调  用:? = DHT11_rec_byte();

参  数:无

返回值:

结  果:读DHT11数据并保存到dat

备  注:

**********************************************************************************************/


uchar DHT11_rec_byte()      //接收一个字节

{

   uchar i,dat=0;

  for(i=0;i<8;i++)    //从高到低依次接收8位数据

   {          

      while(!DATA);   ////等待50us低电平过去

      Delay30us();

          Delay30us();     //延时60us,如果还为高则数据为1,否则为0 

      dat<<=1;           //左移位使正确接收8位数据,数据为0时直接移位

      if(DATA==1)    //数据为1时,使dat加1来接收数据1

         dat+=1;

      while(DATA);  //等待数据线拉低    

    }  

    return dat;

}


/*********************************************************************************************

函数名:接收DHT11的40位的数据并校验

调  用:? = DHT11_receive();

参  数:无

返回值:无

结  果:结果保存到dat_r[i]中

备  注:

**********************************************************************************************/

void DHT11_receive()      //接收40位的数据

{

    uchar R_H,R_L,T_H,T_L,RH,RL,TH,TL,revise; 

    DHT11_start();                 // 主机控制DHT11开始工作

    if(DATA==0)

    {

        while(DATA==0);   //等待拉高     

        Delay30us();

                Delay30us();

                Delay30us();  //拉高后延时80us

        R_H=DHT11_rec_byte();    //接收湿度高八位  

        R_L=DHT11_rec_byte();    //接收湿度低八位  

        T_H=DHT11_rec_byte();    //接收温度高八位  

        T_L=DHT11_rec_byte();    //接收温度低八位

        revise=DHT11_rec_byte(); //接收校正位


        Delay30us();    //结束


        if((R_H+R_L+T_H+T_L)==revise)      //校正

        {

            RH=R_H;

            RL=R_L;

            TH=T_H;

            TL=T_L;

        } 

        /*数据处理,方便显示*/

        dat_r[0]='0'+(RH/10);

        dat_r[1]='0'+(RH%10);

        dat_r[2]='0'+(TH/10);

        dat_r[3]='0'+(TH%10);

    }

}


/********************************************************************

* 名称 : bit Busy(void)

* 功能 : 这个是一个读状态函数,读出函数是否处在忙状态

* 输入 : 输入的命令值

* 输出 : 无

***********************************************************************/

void Busy(void)

{

bit busy_flag = 1;

IODATA  = 0xff;

RS = 0;          //指令关

Delay30us();

RW = 1;          //读状态

Delay30us();

E = 1;        //使能高电平

while(1)

{

busy_flag = (bit)(IODATA  & 0x80); //强制取最高位

if(busy_flag == 0)

{

break;

}

}

E = 0;           //E 1->0,rs=0,rw=1,

           //将数据寄存器内的数据读到DB0~DB7,分别将状态标志BF和地址计数器(AC)内容读到DB7和DB6~DB0。


}


/********************************************************************

* 名称 : lcd1602_write_cmd(uchar del)

* 功能 : 1602命令函数

* 输入 : 输入的命令值

* 输出 : 无

***********************************************************************/

void lcd1602_write_cmd(uchar del)

{

RS = 0;

Delay30us();

RW = 0;

Delay30us();

E = 0;

Delay30us();

IODATA  = del;

Delay30us();

E = 1;

Delay30us();

E = 0;                        //E 1->0,rs=0,rw=0, 将指令代码写入指令寄存器

}


/********************************************************************

* 名称 : lcd1602_write_data(uchar del)

* 功能 : 1602写数据函数

* 输入 : 需要写入1602的数据

* 输出 : 无

***********************************************************************/


void lcd1602_write_data(uchar del)

{

Busy();      

Delay30us();

RS = 1;

Delay30us();

RW = 0;

Delay30us();

E = 0;

Delay30us();

IODATA  = del;

Delay30us();

E = 1;

Delay30us();

E = 0;                          //E 1->0,rs=1,rw=0, 数据写入数据寄存器

}


/********************************************************************

* 名称 : lcd1602_init()

* 功能 : 1602初始化,请参考1602的资料

* 输入 : 无

* 输出 : 无

***********************************************************************/

void lcd1602_init(void)

{

Delay20ms();

lcd1602_write_cmd(0x38);         //8位数据,双列,5*7字形

Delay20ms();

lcd1602_write_cmd(0x38);

Delay20ms();

lcd1602_write_cmd(0x38);

Busy();

lcd1602_write_cmd(0x08);// 只开显示 

Busy();    

lcd1602_write_cmd(0x01);        //清屏

Busy();

lcd1602_write_cmd(0x06);//显示地址递增,即写一个数据后,显示位置右移一位

Busy();

lcd1602_write_cmd(0x0c);        //开启显示屏,关光标,光标不闪烁

}


/********************************************************************

* 名称 : lcd1602_char(uchar hang,uchar lie,char sign)

* 功能 : 改变液晶中某位的值,如果要让第一行,第五个字符显示"b" ,调用该函数如下

L1602_char(1,5,'b')

* 输入 : 行,列,需要输入1602的数据

* 输出 : 无

***********************************************************************/

void lcd1602_char(uchar hang,uchar lie,char sign)

{

uchar a;

if(hang == 1) 

{

a = 0x80;

}

if(hang == 2)

{

a = 0xc0;

}

a = a + lie - 1;

Busy();

lcd1602_write_cmd(a);  //置数据存贮器地址

Busy();

lcd1602_write_data(sign);


/********************************************************************

* 名称 : lcd1602_string(uchar hang,uchar lie,uchar *p)

* 功能 : 改变液晶中某位的值,如果要让第一行,第五个字符开始显示"ab cd ef" ,调用该函数如下

L1602_string(1,5,"ab cd ef;")

* 输入 : 行,列,需要输入1602的数据

* 输出 : 无

***********************************************************************/

void lcd1602_string(uchar hang,uchar lie,uchar *p)

{

uchar a;

if(hang == 1) 

{

a = 0x80;

}

if(hang == 2)

{

a = 0xc0;

}

a = a + lie - 1;

while(1)

{

Busy();

lcd1602_write_cmd(a);

Busy();

lcd1602_write_data(*p);

a++;

p++;    

if((*p == '')||(a==0x90)||(a==0xd0)) //字符结束或每行最后一个字符

{

break;

}

}

}


/*********************************************************************************************

函数名:主函数

调  用:无

参  数:无

返回值:无

结  果:读DHT11数据并送到1602显示

备  注:

[1] [2]
关键字:单片机  DHT11  1602液晶显示 引用地址:单片机DHT11温湿度+1602液晶显示程序

上一篇:基于51单片机的指纹考勤机源程序
下一篇:基于单片机的超声波测距仪设计

推荐阅读最新更新时间:2024-11-23 05:02

单片机中断处理过程:中断响应 中断处理 中断返回详解
中断处理过程可分为中断响应、中断处理和中断返回三个阶段。 中断响应 中断响应是CPU对中断源中断请求的响应,包括保护断点和将程序转向中断服务程序的入口地址(通常称矢量地址)。 中断响应过程 中断响应过程包括保护断点和将程序转向中断服务程序的入口地址。首先,中断系统通过硬件自动生成长调用指令(LACLL),该指令将自动把断点地址压入堆栈保护(不保护累加器A、状态寄存器PSW和其它寄存器的内容),然后,将对应的中断入口地址装入程序计数器PC(由硬件自动执行),使程序转向该中断入口地址,执行中断服务程序。MCS-51系列单片机各中断源的入口地址由硬件事先设定,分配如下: 中断源 入口地址 外部中断
[单片机]
如何处理单片机未使用的引脚
通常我们并不会把所有的单片机的引脚都用完,有时候我们也在同一个产品上分高低配,因此如何对待一些不使用的引脚就成了一个问题。首先我们看一下单片机引脚的结构。 我们可以发现,一般单片机的IO口都是可以配置的。 CMOS器件引脚由N沟道和P沟道场效应管,通常在一个时刻,只有一个管子是开通的,但是,有一个非常短的时间转换期,这两种管子都会部分导通,在一个管子关闭而另一个开启的时候。一个没有端接的输入口可能振荡或在一个中间电平上浮动,导致所有场效应管设备都将在一个微导通的状态,导致了管子的损耗,增加了噪声,并要消耗额外的电源电流。 (Input Only)输入专用管脚 使用上拉或下拉电阻,将每个未使用的引脚拉到VSS或VDD,这是推荐的
[单片机]
如何处理<font color='red'>单片机</font>未使用的引脚
ATMEL推SAM4E系列器件扩展ARM Cortex-M4 快闪微控制器系列
爱特梅尔公司(Atmel® Corporation)宣布扩展ARM® Cortex™-M4快闪微控制器(MCU)阵容,增添具有先进的连通性外设、一个浮点单元(FPU)、先进的模拟功能,以及更高处理能力的SAM4E系列器件。 上述的丰富特性使得SAM4E器件成为用于工业自动化、家居和楼宇控制、机器至机器通信、汽车配件市场和能源管理应用的理想器件。 爱特梅尔SAM4E ARM Cortex-M4 处理器MCU的最高运作频率为120MHz,提供了更大的处理能力,带有一个FPU和一个以全速提供零等待状态快闪访问的集成缓存。SAM4E微控制器具有最大1MB嵌入式快闪存储器、安全性和安全功能,以及广泛的通信链接,比如以太网IEEE1588
[单片机]
ST宣布STM32 F4系列为迄今性能最高ARM® Cortex™-M微控制器
    横跨多重电子应用领域、全球领先的半导体供应商意法半导体(STMicroelectronics,简称ST;纽约证券交易所代码:STM)宣布,采用Green Hills软件公司最新软件工具独立进行的处理器性能评测证实,STM32 F4系列是迄今全球性能最高的ARM® Cortex™-M微控制器。    在行业基准CoreMark™评测 中,Green Hills软件公司的2012版编译器让STM32 F4系列多释放出29%的性能。CoreMark测试成绩用单一数字表示,以便设计人员比较不同品牌的处理器。这个创新高的CoreMark得分让工程师对STM32 F4系列微控制器更有信心,为他们选择业界性能最高的Cortex-M微
[工业控制]
适用于控制永磁无刷直流电机的嵌入式微控制器
一、 概述 无刷直流电机由电动机主体和驱动器组成,是一种典型的机电一体化产品。电动机的定子绕组多做成三相对称星形接法,同三相异步电动机十分相似。电动机的转子上粘有已充磁的永磁体,为了检测电动机转子的极性,在电动机内装有位置传感器。驱动器由功率电子器件和集成电路等构成,其功能是:接受电动机的启动、停止、制动信号,以控制电动机的启动、停止和制动;接受位置传感器信号和正反转信号,用来控制逆变桥各功率管的通断,产生连续转矩;接受速度指令和速度反馈信号,用来控制和调整转速;提供保护和显示等等。 永磁无刷直流电机(Permanent Magnet Brushless DC Motor以下简称PMBLDC)由于其固有的特点,在家用消费类
[工业控制]
适用于控制永磁无刷直流电机的嵌入式<font color='red'>微控制器</font>
PIC单片机编程格式和风格
首先我们来看一段程序: ittle ‘Input.asm’ ;标题 这是一个简单的输入实验 include COUNT EQU 20H ;定义20H寄存器名为COUNT ORG 0 ;程序区将从0000H开始装载 GOTO START ORG 4 ;中断入口 GOTO INTEN ;中断发生时跳转到INTEN ORG 10 ;START将从第10行开始 START …… MAIN …… GOTO MAIN INTSEVER …… RETFIE ;中断返回 END ;程序结束伪指令,不能少! 事实上汇编程序并没有固定的格式,但是它的各部分是有一定的位置安排的,习惯上依次为: ①程序标题:用Tittle伪指令定义,可缺省; ②程序
[单片机]
LINUX下使用简单的中断程序使单片机精确计时
在程序开始时需要对定时器及中断寄存器做初始化设置: 对TMOD——定时器/计数器工作方式寄存器赋值,以确定T0和T1的工作方式。 计算初值,并将初值写入TH0,TL0或TH1,TL1。 对IE——中断允许寄存器的EA和ET0或ET1赋值,打开T0或T1。 使TR0或TR1置位,启动定时器/计数器定时或计数。 详细说明如下 一、TMOD是工作方式寄存器,D0~D3是定时器T0,D4~D7是定时器T1。D0~D3含义如下: D0:M0。 D1:M1——M0和M1的四种组合方式决定了定时器/计数器的4种工作方式。当M1=0,M0=1时是16位定时器/计数器。 D2:C/T——定时器模式和计时器模式选择位,1为计数器模式,
[单片机]
飞思卡尔与Continental联合设计多核32位MCU,优化EBS应用
汽车行业的第一个三核微控制器设计将Power Architecture e200内核与Continental的无故障电子刹车系统(EBS)技术集成起来 德国慕尼黑(飞思卡尔技术论坛)讯--2007年1 0月1 6日 --微电子的不断发展使主流汽车的电子刹车系统(EBS)更可靠、响应更灵敏且更经济。为了支持下一代EBS及底盘控制系统,飞思卡尔半导体和位于法兰克福的大陆汽车系统 (Continental Automotive Systems) EBS事业部联合设计了一款高性能、多核微控制器(MCU),优化了EBS应用。 汽车业界的两位领导者正在就被称为SPACE的定制MCU展开合作,旨在为Continental的下一代EBS产品
[单片机]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved