找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 766|回复: 0
收起左侧

基于51单片机智能家居仿真程序设计 屏幕无显示 求帮助

[复制链接]
ID:1026694 发表于 2022-5-16 00:03 | 显示全部楼层 |阅读模式
该智能家居基于51单片机控制, 同时外接DS1302和DS18B20以及LCD液晶屏等,对智能家居智进行简易的控制。
该设计运用到的芯片:STC89C58+DS18B20+DHT11+DS1302+LCD12864+红外人体感应器+无线遥控
功能:
1.数字可调万年历
2.显示空气中温度和湿度
3.对环境温度和湿度可以自动控制
4.测量水的温度
5.无线控制
6.防盗报警
7.低功耗模式
8.开机图片
9.EEPROM数据保存

51hei.png

单片机源程序如下:
  1. /****************************************/
  2. /************DHT11驱动程序***************/
  3. /****************************************/
  4. #include<reg52.h>
  5. #include<intrins.h>
  6. #include"DHT11.h"
  7. #include"delay_ms.h"
  8. unsigned int w_s;
  9. unsigned char sd_shi,sd_ge,wd_shi1,wd_ge1,dsq_0,sign_wd,sign_sd; //先要在这进行声明,然后在头文件(DHT11.h)中用extern进行外部变量声明
  10. unsigned char set_up_sd,set_up_wd;                          //湿度报警和温度报警阀值
  11. char shidu,wendu;

  12. void delay_us(unsigned int x)          //DHT11专用延时
  13. {
  14.   while(x--);
  15. }
  16. void init_DHT11()                            //初始化DHT11
  17. {
  18.         unsigned char k=250;
  19.         DHT=0;
  20.         delay_us(2100);                                        //延时18.925ms
  21.         DHT=1;
  22.         delay_us(2);                                                //延时34us,等待DHT11响应,变低电平
  23.         while((DHT==0)&&k--);                        //判断DHT11是否响应,且要防止掉入死循环,先是低电平然后,等待DHT11变高电平
  24.         k=250;
  25.     while((DHT==1)&&k--);                        //判断DHT11是否开始传输数据(再次进入低电平表示开始传输数据)
  26. }

  27. unsigned char Read_OneChar()           //从DHT11读出一个字节数据
  28. {
  29.      unsigned char g;
  30.          unsigned char temp;
  31.      for(g=0;g<8;g++)
  32.          {
  33.             temp=temp<<1;                                //从高字节开始读起,每读一位向左移一位
  34.             while(!DHT);                                //判断是否DHT11信号是否变高电平(这步非常非常关键)
  35.                 delay_us(3);                                        //变高后延时44us左右,这样如果是“1”则还是高电平,“0”就是低电平了
  36.                 if(DHT==1)                                        //进行“1”和“0”的判断
  37.                  {
  38.                         temp=temp|0x01;
  39.                         delay_us(1);
  40.                  }
  41.          }
  42.          return(temp);        
  43. }

  44. unsigned int return_wendu_shidu()      //读取温度湿度
  45. {
  46.     unsigned char sd_h,sd_l,wd_h,wd_l,crc;
  47.         unsigned int sd_wd;
  48.          init_DHT11();                               //初始化DHT11
  49.          sd_h=Read_OneChar();                           //湿度高8位
  50.          sd_l=Read_OneChar();                           //湿度低8位
  51.          wd_h=Read_OneChar();                           //温度高8位
  52.          wd_l=Read_OneChar();                           //温度低8位
  53.          crc=Read_OneChar();                           //CRC校验8位

  54.      sign_sd=sd_h;                                           //报警湿度
  55.          sign_wd=wd_h;                                            //报警温度

  56.          sd_wd=0x00ff&sd_h;
  57.          sd_wd=sd_wd<<8;
  58.          sd_wd=sd_wd|wd_h;                                   //高8位为湿度整数部分,低8位为温度整数部分
  59.          return(sd_wd);                                 
  60. }

  61. void qushu_DHT11(unsigned int qs)           //取数将数据分离
  62. {
  63.     unsigned char sd_H,wd_H;                   //因为进来的数据是int型,高八位为湿度,低八位为温度
  64.         wd_H=0x00ff&qs;                                           //所以要将数据分离开来,再次分成char型,然后再进行取数
  65.         qs=qs>>8;                                                   //取湿度数据
  66.         sd_H=qs;                                                   //直接将int型给char型,会自动保留低八位
  67.         sd_shi=sd_H/10;                                           //关于为什么要这样,因为这样可以不用设置全局变量
  68.         sd_ge=sd_H%10;                                           //没有全局变量就容易将程序模块化!!!
  69.         wd_shi1=wd_H/10;
  70.         wd_ge1=wd_H%10;
  71. }
复制代码

Keil代码与Proteus仿真下载: 01.7z (298.08 KB, 下载次数: 19)
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表