找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 139|回复: 2
打印 上一主题 下一主题
收起左侧

基于51单片机的湿度计 按下“结束键后无任何显示”

[复制链接]
跳转到指定楼层
楼主
  1. /******************************
  2. 基于51单片机的湿度计

  3. ********************************/
  4. #include <reg52.h>
  5. #include <intrins.h>
  6. #include <absacc.h>
  7. #include <math.h>
  8. #include "DHT11.h"
  9. #include "LCD.h"
  10. #include "delay.h"
  11.         
  12. sbit Key_Begin = P2^0;
  13. sbit Key_Over = P2^1;

  14. unsigned char humiH,humiL;

  15. void main()
  16. {
  17.         while(1)
  18.         {
  19.                 LCD1602_Init();//LCD1602初始化
  20.                 LCD1602_Write_Cmd(0x82);//确定显示位置
  21.                 LCD1602_Write_Data('P');//确定显示"P"
  22.         
  23.                 if(Key_Begin == 0)
  24.                 {
  25.                         while(1)
  26.                         {
  27.                                 LCD1602_Init();//LCD1602初始化
  28.                                 LCD1602_Write_Cmd(0x83);//确定显示位置
  29.                                 LCD1602_Write_Data('H');//确定显示内容,H
  30.                                 LCD1602_Write_Cmd(0x84);//地址
  31.                                 LCD1602_Write_Data('u');//内容,u
  32.                                 LCD1602_Write_Cmd(0x85);//地址
  33.                                 LCD1602_Write_Data('m');//内容,m
  34.                                 LCD1602_Write_Cmd(0x86);//地址
  35.                                 LCD1602_Write_Data(0x3A);//内容,:
  36.                                 LCD1602_Write_Cmd(0x89);//地址
  37.                                 LCD1602_Write_Data(0x25);//内容,%

  38.                                 DHT11_Read_Date(&humiH,&humiL);//DHT11读取数据
  39.                                 Delay1000ms();
  40.                                 
  41.                                 LCD1602_Write_Cmd(0x87);//确定显示地址
  42.                                 LCD1602_Write_Data(humiH);//确定显示内容 humiH
  43.                                 LCD1602_Write_Cmd(0x88);//地址
  44.                                 LCD1602_Write_Data(humiL);//内容 humiL
  45.                                 if(Key_Over == 0)
  46.                                 {
  47.                                         break;
  48.                                 }
  49.                         }
  50.                         LCD1602_Init();//LCD1602初始化
  51.                         LCD1602_Write_Cmd(0x82);//确定显示位置:第一行第一个
  52.                         LCD1602_Write_Data('P');//确定显示"P"
  53.                 }
  54.         }
  55. }

  56. #include "LCD.h"
  57. #define Lcd_DataPort P0
  58. /************************************
  59. //函数名称:LCD1602_Write_Cmd
  60. //输入参数:cmd-指令
  61. //输出参数:无
  62. //函数功能:LCD1602写指令
  63. *********************************/
  64. void LCD1602_Write_Cmd(char cmd)
  65. {
  66.         RS = 0;
  67.         RW = 0;
  68.         EN = 0;
  69.         //配置DB0-DB7的电平
  70.         Lcd_DataPort = cmd;
  71.         _nop_();
  72.         //延时tsp+tsp2的时间
  73.         EN = 1;
  74.         //EN变为高电平,让Lcd1602开始读取DB0-DB7的引脚电平
  75.         _nop_();
  76.         //延时tpm一段时间
  77.         EN = 0;
  78.         _nop_();
  79.         //延时tc-tpw时间
  80. }

  81. /************************************
  82. //函数名称:LCD1602_Write_Data
  83. //输入参数:cmd-数据
  84. //输出参数:无
  85. //函数功能:LCD1602写数据
  86. *********************************/
  87. void LCD1602_Write_Data(char cmd)
  88. {
  89.         RS = 1;
  90.         RW = 0;
  91.         EN = 0;
  92.         //配置DB0-DB7的电平
  93.         Lcd_DataPort = cmd;
  94.         _nop_();
  95.         //延时tsp+tsp2的时间
  96.         EN = 1;
  97.         //EN变为高电平,让Lcd1602开始读取DB0-DB7的引脚电平
  98.         _nop_();
  99.         //延时tpm一段时间
  100.         EN = 0;
  101.         _nop_();
  102.         //延时tc-tpw时间
  103. }

  104. /************************************
  105. //函数名称:LCD1602_Init
  106. //输入参数:无
  107. //输出参数:无
  108. //函数功能:LCD1602初始化
  109. *********************************/
  110. void LCD1602_Init(void)
  111. {
  112.         Delay15ms();
  113.         LCD1602_Write_Cmd(0x38);//写指令38H
  114.         Delay5ms();
  115.         LCD1602_Write_Cmd(0x38);//显示模式设置
  116.         Delay5ms();
  117.         LCD1602_Write_Cmd(0x38);//显示模式设置
  118.         LCD1602_Busy_Check();
  119.         LCD1602_Write_Cmd(0x38);
  120.         LCD1602_Busy_Check();
  121.         LCD1602_Write_Cmd(0x08);//显示关闭
  122.         LCD1602_Busy_Check();
  123.         LCD1602_Write_Cmd(0x01);//显示清屏
  124.         LCD1602_Busy_Check();
  125.         LCD1602_Write_Cmd(0x06);//显示光标移动设置
  126.         LCD1602_Busy_Check();
  127.         LCD1602_Write_Cmd(0x0c);//显示开及光标设置
  128. }

  129. /************************************
  130. //函数名称:LCD1602_Busy_Check
  131. //输入参数:无
  132. //输出参数:无
  133. //函数功能:LCD1602忙信号检测
  134. *********************************/
  135. void LCD1602_Busy_Check(void)
  136. {
  137.         char tmp;//用来保存Lcd_date的电平状态
  138.         Lcd_DataPort = 0xff;//一开始的时候,Lcd_date设置成输入状态
  139.         do{
  140.                 RS = 0;
  141.                 RW = 1;
  142.                 EN = 1;
  143.                 _nop_();
  144.                 //延时CP
  145.                 tmp = Lcd_DataPort;
  146.                 _nop_();
  147.                 //延时PQ
  148.                  EN = 0;
  149.                 }while(tmp&0x80);//判断最高位是否为1
  150. }

  151. #include "DHT11.h"
  152. /************************************
  153. //函数名称:DHT11_Rst
  154. //输入参数:无
  155. //输出参数:无
  156. //函数功能:DHT11复位
  157. *********************************/
  158. void DHT11_Rst(void)
  159. {
  160.         DHT11_IO = 0;//主机拉低总线,至少18ms以上
  161.         Delay20ms();
  162.         DHT11_IO = 1;//主机拉高总线,20-40us
  163.         Delay30us();
  164. }

  165. /************************************
  166. //函数名称:DHT11_Check
  167. //输入参数:无
  168. //输出参数:无
  169. //函数功能:DHT11信号检测
  170. *********************************/
  171. char DHT11_Check(void)
  172. {
  173.         unsigned int t = 0;
  174.         while(DHT11_IO)//等待低电平出现
  175.         {
  176.                 t++;
  177.                 _nop_();
  178.                 if(t > 1000)
  179.                         return -1;
  180.         }
  181.         t = 0;
  182.         while(!DHT11_IO)//判断低电平的合法性,低电平时间80us
  183.         {
  184.                 t++;
  185.                 _nop_();
  186.                 if(t > 100)
  187.                         return -2;
  188.         }
  189.         t = 0;
  190.         while(DHT11_IO)//判断高电平的合法性,高电平时间80us
  191.         {
  192.                 t++;
  193.                 _nop_();
  194.                 if(t > 100)
  195.                         return -3;
  196.         }
  197.         return 0;//如果DHT11 正常,返回0,异常返回小于0
  198. }

  199. /************************************
  200. //函数名称:DHT11_Read_Byte
  201. //输入参数:无
  202. //输出参数:dat
  203. //函数功能:DHT11读取数据
  204. *********************************/
  205. unsigned char DHT11_Read_Byte(void)
  206. {
  207.         unsigned char i;
  208.         unsigned int t = 0;
  209.         unsigned char dat = 0;
  210.         for(i = 0;i<8;i++)//高位先出,地位后出
  211.         {
  212.                 while(!DHT11_IO)//等待50us低电平过去,超时
  213.                 {
  214.                         t++;
  215.                         _nop_();
  216.                         if(t > 100)
  217.                         return 0;
  218.                 }
  219.                 Delay40ms();
  220.                 dat <<= 1;
  221.                 if(DHT11_IO == 1)
  222.                 {
  223.                         dat |= 1;
  224.                         t = 0;
  225.                         while(!DHT11_IO)
  226.                         {
  227.                                 t++;
  228.                                 _nop_();
  229.                                 if(t > 100)
  230.                                 return 0;
  231.                         }
  232.                 }
  233.         }
  234.         return dat;
  235. }

  236. /************************************
  237. //函数名称:DHT11_Read_Date
  238. //输入参数:无
  239. //输出参数:无
  240. //函数功能:DHT11接收并数据检验
  241. *********************************/
  242. char DHT11_Read_Date(unsigned char *humiH,unsigned char *humiL)
  243. {
  244.         unsigned char buf[5];
  245.         DHT11_Rst();
  246.         if(DHT11_Check() == 0)
  247.         {               
  248.                 buf[0] = DHT11_Read_Byte();//接收湿度高8位
  249.                 buf[1] = DHT11_Read_Byte();//接收湿度低8位
  250.                 buf[2] = DHT11_Read_Byte();//接收温度高8位
  251.                 buf[3] = DHT11_Read_Byte();//接收温度低8位
  252.                 buf[4] = DHT11_Read_Byte();//接收校验        
  253.                 Delay40ms();
  254.                 if(buf[0]+buf[1]+buf[2]+buf[3] == buf[4])
  255.                 {
  256.                         *humiH = buf[0];
  257.                         *humiL = buf[1];
  258.                 }
  259.                 else
  260.                         return -1;
  261.                 }
  262.         else
  263.                 return -2;
  264.         return 0;
  265. }
复制代码
要求:上电或案件复位后自动显示"P",进入测量准备阶段;按测量开始键开始测量,当前环境的湿度在显示器上稳定显示;按测量结束键停止测量并返回"P"状态。问题:上电后无法显示“P”;按下“开始建”后只显示部分数据;按下“结束键后无任何显示”。
求各位大佬指点,在此谢过了

51hei图片仿真.png (89.97 KB, 下载次数: 5)

51hei图片仿真.png

湿度计.zip

72.04 KB, 下载次数: 3

程序+仿真

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:232462 发表于 2024-5-15 18:45 | 只看该作者
你的版本太新了,我打不开。我还是用旧版试试吧,稍等
回复

使用道具 举报

板凳
ID:232462 发表于 2024-5-15 19:08 | 只看该作者
我用你的程序,改了一下接口,根本液晶不显示。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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