51单片机+DHT11温控程序-可设置温度值

发布者:SparklingStar22最新更新时间:2015-05-13 来源: 51hei关键字:51单片机  DHT11  温控程序 手机看文章 扫描二维码
随时随地手机看文章
基于51单片机的温湿度测量控制程序,使用DHT11数字传感器,用1602液晶屏显示,按键定义如下:

sbit key_1=P0^1;  //确定按键
sbit key_2=P0^2;  //按键加
sbit key_3=P0^3;  // 按键减
本程序中用到的头文件 12c5a.h下载: http://www.51hei.com/f/12c5a.rar
#include "12c5a.H"
#include "intrins.h"

unsigned char code num[]={"0123456789"};//显示字符存储
unsigned char code start_char[]={"Loading...."};
unsigned char code t_char[]={"NOW TEMP IS"};
unsigned char *pnum=num;
unsigned int bbb,ccc,temp,temp_high,temp_low;

 
#define  ADC_POWER          0x80                                //ADC power control bit 
#define  ADC_FLAG           0x10                                //ADC complete flag 
#define  ADC_START          0x08                                //ADC start control bit 
#define  ADC_SPEEDLL        0x00                                //540 clocks 
#define  ADC_SPEEDL         0x20                                //360 clocks 
#define  ADC_SPEEDH         0x40                                //180 clocks 
#define  ADC_SPEEDHH        0x60                                //90 clocks

 

sbit RS=P3^4;  //数据命令选择端
sbit RW=P3^5;  //读写控制端
sbit E=P3^6;   //使能信号控制端
//sbit key_0=P0^0;  //设置按键
sbit key_1=P0^1;  //确定按键
sbit key_2=P0^2;  //按键加
sbit key_3=P0^3;  // 按键减
sbit P04=P0^4;
sbit P05=P0^5;
sbit P06=P0^6;

void key_temphigh();
void key_templow();
void key_scan();
void delay_1602(unsigned int a);
void init_1602(void);
void WR_data_1602(unsigned char adata,unsigned char i);
void  process(unsigned int shuju);


 void Delay(unsigned char n)                           
{                                                         
     int x;
  while (n--)                                  
     {
   x = 500;
   while (x--);
   }
}

void init_ADC(void)
{
 P1ASF=0xFF;
 ADC_RES = 0;
 ADC_RESL = 0;                                       
 ADC_CONTR = 0x88;
 Delay(2);  
}


unsigned int GetResult(void) 

 unsigned char m,n;
 unsigned int aaa;
    init_ADC();
    while (!(ADC_CONTR & ADC_FLAG));                //Wait complete flag 
    ADC_CONTR =0x80;                         //Close ADC 
 m=ADC_RES;
 n=ADC_RESL;                    
    aaa=m*4+n;
 return aaa;
}     
void start_init(void)
{
 unsigned char i;
  WR_data_1602(0x80,0);   //显示在第一行
 for(i=0;i<11;i++)  
  WR_data_1602(start_char[i],1);
 delay_1602(20);
 init_ADC();
 temp=GetResult()*5.0;
 WR_data_1602(0x80,0);   //显示在第一行
 for(i=0;i<11;i++)  
  WR_data_1602(t_char[i],1);  
}


void delay_1602(unsigned int a)  //延时
{
 unsigned int i,j,k;
 for(i=0;i   for(j=0;j<106;j++)
   for(k=0;k<100;k++);
}

[page]
void key_temphigh()    // 温度上限判断
 { if(key_2==0)  //进行加判断
    { Delay(3);
        if(key_2==0)
       { while(!key_2);
      temp_high+=5;
      if(temp_high==995)
      {temp_high=5;}
       }
    }
   if(key_3==0)  //进行减判断
      { Delay(3);
        if(key_3==0)
       { while(!key_3);  //等待松手
          temp_high-=5;  //上限报警温度每次减0。5
       if(temp_high==0)
        {temp_high=990;}
       }
      }
    }

void key_templow()    // 温度下限判断
 { if(key_2==0)  //进行加判断
    { Delay(3);
        if(key_2==0)
       { while(!key_2);
      temp_low+=5;
      if(temp_low==995)
      {temp_low=5;}
       }
    }
   if(key_3==0)  //进行减判断
      { Delay(3);
        if(key_3==0)
       { while(!key_3);  //等待松手
          temp_low-=5;  // 上限温度每次减0。5
       if(temp_low== 0)
        {temp_low=990;}
       }
      }
    }

void key_scan()
  { unsigned char nm=0,k;
     if(key_1==0)   //检测设置按键,判断是否进行设置
      { if(key_1==0)
    { Delay(100) ;
     while(!key_1);
       k=1;nm++;
     }
    } 
   while(k)      //进入调整界面,
   {  if(key_1==0)
       { Delay(3);
       if(key_1==0)
     { while(!key_1);
        nm++;  //调整哪个的参数
     if(nm==4){nm=1;}
      }
     }
    switch(nm)   //选择调整的对象
      { case 1:WR_data_1602(0xc0,0);WR_data_1602('H',1);process(temp_high);key_temphigh();break;
     case 2:WR_data_1602(0xc0,0);WR_data_1602('L',1);process(temp_low);key_templow();break;
     case 3:WR_data_1602(0xc0,0);WR_data_1602(' ',1);process(temp);nm=0;k=0;break;
     default :break;
     }
  
 /*  if(key_1==0)       //确定并退出
     {Delay(3);
       if(key_1==0)
      {while(!key_1);
        nm=0;k=0;WR_data_1602(0xc1,0);process(temp);
       }
    } */
       if(k==0)
   {continue;}//结束循环 
    }
  }

 void baojing()
   {
   if(temp>temp_high-5) {P04=1;P05=0;P06=1;}     // 上限25
      else if(temp          else  {P04=1;P05=1;P06=0;}
      } 

void init_1602(void)  //初始化
{
 WR_data_1602(0x38,0);
 WR_data_1602(0x01,0);
 WR_data_1602(0x06,0);
 WR_data_1602(0x0c,0);
}


void WR_data_1602(unsigned char adata,unsigned char i) //写数据i=1,写指令i=0
{
 P2=adata;
 RS=i;
 RW=0;
 E=1;
 delay_1602(1);
 E=0;
 RW=1;
 RS=0;  
}


void  process(unsigned int shuju) //显示数据处理
{
 unsigned int a,b,c,d;
 a=shuju/1000;
 b=(shuju%1000)/100;
 c=(shuju%100)/10;
 d=shuju%10;
 if(a==0&&b!=0){WR_data_1602(0xc2,0);
 WR_data_1602(*(pnum+b),1);
 WR_data_1602(*(pnum+c),1);
 WR_data_1602('.',1); 
 WR_data_1602(*(pnum+d),1);
 WR_data_1602('C',1);}
 if(a==0&&b==0){WR_data_1602(0xc2,0); 
 WR_data_1602(*(pnum+c),1);
 WR_data_1602('.',1); 
 WR_data_1602(*(pnum+d),1);
 WR_data_1602('C',1);
 WR_data_1602(' ',1);}
 //WR_data_1602(0xc1,0);    //显示在第二行
 //WR_data_1602(' ',1);
 //WR_data_1602(*(pnum+a),1);
// WR_data_1602(*(pnum+b),1);
 //WR_data_1602(*(pnum+c),1);
// WR_data_1602('.',1); 
// WR_data_1602(*(pnum+d),1);
// WR_data_1602('C',1);
 
 delay_1602(1);  
}

 

void main()   //主函数
{
 unsigned int mm;
 init_1602();  //初始化
 start_init();
 mm=GetResult();
 temp_high=250;
 temp_low=90;
 while(1)
 { 
  key_scan();
     baojing();
  ccc=GetResult();
  temp=ccc*5.0;
  process(temp);
  delay_1602(10); 
 }
}

关键字:51单片机  DHT11  温控程序 引用地址:51单片机+DHT11温控程序-可设置温度值

上一篇:STC89C51RC 40C-PDIP名称各部分含义
下一篇:51单片机频率计Proteus仿真设计(带程序电路)

推荐阅读最新更新时间:2024-03-16 14:02

51单片机C语言程序100例分析(4)外设
和我预想的一致,接下来该涉及外设了! /******************************************************** *********数码管显示*****数码管显示******************** 数码管显示****************数码管显示 ***************************************************/ //实例60:用LED数码显示数字5 #include reg51.h //包含51单片机寄存器定义的头文件 void main(void) { P2=0xfe;//P2.0引脚输出低电平,数码显示
[单片机]
51单片机和52单片机有什么区别
  本文主要是关于51单片机和52单片机的相关介绍,并着重对51单片机和52单片机进行了相近的对比分析。   51单片机   51单片机是对所有兼容Intel 8031指令系统的单片机的统称。该系列单片机的始祖是Intel的8004单片机,后来随着Flash rom技术的发展,8004单片机取得了长足的进展,成为应用最广泛的8位单片机之一,其代表型号是ATMEL公司的AT89系列,它广泛应用于工业测控系统之中。很多公司都有51系列的兼容机型推出,今后很长的一段时间内将占有大量市场。51单片机是基础入门的一个单片机,还是应用最广泛的一种。需要注意的是51系列的单片机一般不具备自编程能力。      功能   ·8位CPU·4kb
[单片机]
51单片机DIY做PLC编程
简介:有朋友想定制一个净水机控制器,有一些独特的功能要增加,但是商品控制板没有这样的功能,问我能否做一个,我觉得单片机完全能满足这种简单的控制需要,上手开始编程序时候突然感到,用PLC逻辑编这种功能是非常简单轻松的,而如果用汇编或C编却感觉有点棘手,编程效率不高,所以想为何不在单片机上实现PLC的逻辑呢? 上网搜索尝试看能否找到合适的程序下载来稍微改改就能用的呢?方案几年前就有了,实际上是利用三菱的低档plc编程软件编辑好梯形图,存盘后用专用的格式转换工具转换成HEX单片机烧写文件烧进去,尝试下载三菱plc工具软件,但是在我的WIN7-64位系统上不能正常工作,好容易换了系统装好开发工具,但是初次上手这款开发工具,界面挺复杂的
[单片机]
<font color='red'>51单片机</font>DIY做PLC编程
51单片机构成的轴类零件温度测量系统
  一、前言   零件在加工过程中由于受各种热的影响而产生变形, 从而导致原有的加工精度遭到破坏或直接引起加工误差。对于精密加工而言,热变形的影响尤为显著,由此而引起的加工误差约占总加工误差的40%以上。本文给出一种对 轴类零件 的温度进行较准确测量的系统组成,系统由 单片机 80C552为控制核心,简单可靠,精度高。同时能计算出在不同温度下轴的热变形量。   二、 传感器 组成及接口电路   1.传感器组成   传感器采用Pt 温度传感器 ,如图1所示。   图1 Pt温度传感器   这种传感器是由一个直径为30 微米的铂丝绕成的线圈被夹在两层聚酰亚胺箔片之间,通过两条镍带与外界连接,其厚度只有0.
[单片机]
由<font color='red'>51单片机</font>构成的轴类零件温度测量系统
30-基于51单片机出租车计价器(霍尔测速)
具体实现功能 系统由AT89C52单片机+霍尔传感器模块+LCD1602液晶屏+DS1302时钟模块+AT24C02掉电存储模块+直流电机+按键模块+电源构成。 具体功能: 1、无乘客模式:显示当前时间; 2、切换到乘客模式:可以显示起步价(三公里内)、单价(三公里后)、总价(元)、里程和乘车时间,可以按照里程或计时两种模式收费; 3、里程模式收费:在高速情况下,按照起步价和里程单价收费 4、计时收费模式:在低速情况下,按照计时时间和时间单价收费 5、按清零键,计价器可清除计价。 6、可以设置白天和夜晚的起步价、单价,可以设置计时模式的单价; 7、根据当前时间,白天和夜晚的收费不同。 液晶显示的
[单片机]
30-基于<font color='red'>51单片机</font>出租车计价器(霍尔测速)
51单片机入门 - I/O口直接输入输出实例
51单片机P0/P1/P2/P3口的区别: P0口要作为低8位地址总线和8位数据总线用,这种情况下P0口不能用作I/O,要先作为地址总线对外传送低8位的地址,然后作为数据总线对外交换数据; P1口只能作为I/O口(P1.0、P1.1以外); P2口除了作为普通I/O口之外,在扩展外围设备时,要用作高8位地址线; P3口除了作为普通I/O口之外,其每个引脚都有第二功能。 I/O端口具有以下特性: ① 端口自动识别:无论是P0 P2口的总线复用还是P3口的功能复用,内部资源会自动选择,不需要通过指令的状态选择。 ② 准双向口功能:准双向口作为输入口时,应先使锁存器置 1 ,然后再读引脚。 ③ P0作为普通I/O口使用:不使用并行扩展总
[单片机]
<font color='red'>51单片机</font>入门 - I/O口直接输入输出实例
51单片机分频、机器周期、时钟周期、状态周期
​​​​(1)振荡周期=时钟周期:是指为单片机提供时钟脉冲信号的振荡源的周期。即晶振 (2)状态周期:每个状态周期为时钟周期的2倍,是振荡周期经二分频后得到的。 ​​详解:在8051单片机中把一个时钟周期定义为一个节拍(用P表示),二个节拍定义为一个状态周期(用S表示) (3)机器周期:一个机器周期包含6个状态周期S1~S6,也就是12个时钟周期。在一个机器周期内,CPU可以完成一个独立的操作 机器周期 在计算机中,为了便于管理,常把一条指令的执行过程划分为若干个阶段,每一阶段完成一项工作。例如,取指令、存储器读、存储器写等,这每一项工作称为一个基本操作。完成一个基本操作所需要的时间称为机器周期。一般情况下,一个机器周期由若干
[单片机]
51单片机的IO口操作基础知识介绍
以我们常用的STC单片机为例:STC单片机所有IO口均可由软件配置成4种工作类型。4种类型分别为:准双向口/弱上拉(标准8051输出模式)、强推挽输出/强上拉、仅为输入(高阻)或开漏输出功能。每个口有2个寄存器中的相应位控制每个引脚的工作类型。上电复位后的工作模式为准双向/弱上拉模式。2V以上为高电平,0.8V以下为低电平,每个I/O口驱动能力可以达到20mA。 那么我们通过配置哪两个寄存器来设定I/O口的工作模式呢:这两个寄存器就是PxM1和PxM0,P0口对应的就是P0M1和P0M0,P1口对应的就是P0M1和P0M0,P2口对应的就是P0M1和P0M0,P3口对应的就是P0M1和P0M0。以P0口的设置为例: 如果有
[单片机]
<font color='red'>51单片机</font>的IO口操作基础知识介绍
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
热门活动
换一批
更多
设计资源 培训 开发板 精华推荐

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

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

更多精选电路图
换一换 更多 相关热搜器件
更多每日新闻
随便看看
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved