找回密码
 立即注册
查看: 1489|回复: 1

【求助】烧录以下程序到开发板后,数码管和led灯跳动

[复制链接]
  • 打卡等级:初来乍到
  • 打卡总天数:4
  • 最近打卡:2025-01-31 17:22:42

3

主题

31

回帖

293

积分

中级会员

积分
293
发表于 2023-3-18 19:26:47 | 显示全部楼层 |阅读模式
烧录以下程序到开发板后,数码管和led灯跳动

能不能不让数码管和led灯跳动?
代码来自:深圳市普中科技有限公司(PRECHIN 普中) 稍有改动
main.c文件
  1. /**************************************************************************************
  2. 深圳市普中科技有限公司(PRECHIN 普中)
  3. 技术支持:www.prechin.net
  4. PRECHIN
  5. 普中
  6. 实验名称:DHT11温湿度检测(LCD1602显示)
  7. 接线说明:DHT11温湿度模块-->单片机IO
  8.                   VCC-->5V
  9.                   DATA-->P2.3
  10.                   GND-->GND       
  11. 实验现象:下载程序后,LCD1602上显示DHT11温湿度传感器采集的温度和湿度值
  12. 注意事项:按照LCD1602实验章节插好LCD1602到开发板                                                                                                                                                                  
  13. ***************************************************************************************/
  14. #include "public.h"
  15. #include "lcd1602.h"
  16. #include "dht11.h"
  17. sbit led1 = P2^0;
  18. sbit led2 = P2^1;
  19. sbit led3 = P2^2;
  20. sbit led4 = P2^3;
  21. sbit led5 = P2^4;
  22. sbit led6 = P2^5;
  23. sbit led7 = P2^6;
  24. sbit led8 = P2^7;
  25. /*******************************************************************************
  26. * 函 数 名       : main
  27. * 函数功能                 : 主函数
  28. * 输    入       : 无
  29. * 输    出             : 无
  30. *******************************************************************************/
  31. void main()
  32. {       
  33.         u8 temp=0,humi=0;
  34.         u8 i=0;
  35.         u8 temp_buf[3],humi_buf[3];
  36.         lcd1602_init();
  37.         while(DHT11_Init())        //检测DHT11是否存在
  38.         {
  39.                 lcd1602_show_string(0,0,"DHT11 Was Not Detected!");               
  40.         }
  41.         lcd1602_show_string(0,0,"Wendu:   C");
  42.         lcd1602_show_string(0,1,"Shidu:   %RH ");
  43.        
  44.         while(1)
  45.         {
  46.                 i++;
  47.                 if(i%200==0)
  48.                 {
  49.                         DHT11_Read_Data(&temp,&humi);
  50.                         temp_buf[0]=temp/10+0x30;       
  51.                         temp_buf[1]=temp%10+0x30;
  52.                         temp_buf[2]='\0';
  53.                         lcd1602_show_string(6,0,temp_buf);
  54.                         humi_buf[0]=humi/10+0x30;       
  55.                         humi_buf[1]=humi%10+0x30;
  56.                         humi_buf[2]='\0';
  57.                         lcd1602_show_string(6,1,humi_buf);
  58.                                
  59.                 }
  60.                
  61.                 delay_ms(1);
  62.         }
  63. }
复制代码
public.h文件
  1. #ifndef _public_H
  2. #define _public_H
  3. #include "reg52.h"
  4. typedef unsigned int u16;        //对系统默认数据类型进行重定义
  5. typedef unsigned char u8;
  6. void delay_10us(u16 ten_us);
  7. void delay_ms(u16 ms);
  8. #endif
复制代码
lcd1602.h文件
  1. #ifndef _lcd1602_H
  2. #define _lcd1602_H
  3. #include "public.h"
  4. //LCD1602数据口4位和8位定义,若为1,则为LCD1602四位数据口驱动,反之为8位
  5. #define LCD1602_4OR8_DATA_INTERFACE        0        //默认使用8位数据口LCD1602
  6. //管脚定义
  7. sbit LCD1602_RS=P2^6;//数据命令选择
  8. sbit LCD1602_RW=P2^5;//读写选择
  9. sbit LCD1602_E=P2^7; //使能信号
  10. #define LCD1602_DATAPORT P0        //宏定义LCD1602数据端口
  11. //函数声明
  12. void lcd1602_init(void);
  13. void lcd1602_clear(void);
  14. void lcd1602_show_string(u8 x,u8 y,u8 *str);
  15. #endif
复制代码
lcd1602.c文件
  1. #include "lcd1602.h"
  2. /*******************************************************************************
  3. * 函 数 名       : lcd1602_write_cmd
  4. * 函数功能                 : LCD1602写命令
  5. * 输    入       : cmd:指令
  6. * 输    出             : 无
  7. *******************************************************************************/
  8. #if (LCD1602_4OR8_DATA_INTERFACE==0)//8位LCD
  9. void lcd1602_write_cmd(u8 cmd)
  10. {
  11.         LCD1602_RS=0;//选择命令
  12.         LCD1602_RW=0;//选择写
  13.         LCD1602_E=0;
  14.         LCD1602_DATAPORT=cmd;//准备命令
  15.         delay_ms(1);
  16.         LCD1602_E=1;//使能脚E先上升沿写入
  17.         delay_ms(1);
  18.         LCD1602_E=0;//使能脚E后负跳变完成写入       
  19. }
  20. #else        //4位LCD
  21. void lcd1602_write_cmd(u8 cmd)
  22. {
  23.         LCD1602_RS=0;//选择命令
  24.         LCD1602_RW=0;//选择写
  25.         LCD1602_E=0;
  26.         LCD1602_DATAPORT=cmd;//准备命令
  27.         delay_ms(1);
  28.         LCD1602_E=1;//使能脚E先上升沿写入
  29.         delay_ms(1);
  30.         LCD1602_E=0;//使能脚E后负跳变完成写入
  31.        
  32.         LCD1602_DATAPORT=cmd<<4;//准备命令
  33.         delay_ms(1);
  34.         LCD1602_E=1;//使能脚E先上升沿写入
  35.         delay_ms(1);
  36.         LCD1602_E=0;//使能脚E后负跳变完成写入       
  37. }
  38. #endif
  39. /*******************************************************************************
  40. * 函 数 名       : lcd1602_write_data
  41. * 函数功能                 : LCD1602写数据
  42. * 输    入       : dat:数据
  43. * 输    出             : 无
  44. *******************************************************************************/
  45. #if (LCD1602_4OR8_DATA_INTERFACE==0)//8位LCD
  46. void lcd1602_write_data(u8 dat)
  47. {
  48.         LCD1602_RS=1;//选择数据
  49.         LCD1602_RW=0;//选择写
  50.         LCD1602_E=0;
  51.         LCD1602_DATAPORT=dat;//准备数据
  52.         delay_ms(1);
  53.         LCD1602_E=1;//使能脚E先上升沿写入
  54.         delay_ms(1);
  55.         LCD1602_E=0;//使能脚E后负跳变完成写入               
  56. }
  57. #else
  58. void lcd1602_write_data(u8 dat)
  59. {
  60.         LCD1602_RS=1;//选择数据
  61.         LCD1602_RW=0;//选择写
  62.         LCD1602_E=0;
  63.         LCD1602_DATAPORT=dat;//准备数据
  64.         delay_ms(1);
  65.         LCD1602_E=1;//使能脚E先上升沿写入
  66.         delay_ms(1);
  67.         LCD1602_E=0;//使能脚E后负跳变完成写入
  68.        
  69.         LCD1602_DATAPORT=dat<<4;//准备数据
  70.         delay_ms(1);
  71.         LCD1602_E=1;//使能脚E先上升沿写入
  72.         delay_ms(1);
  73.         LCD1602_E=0;//使能脚E后负跳变完成写入               
  74. }
  75. #endif
  76. /*******************************************************************************
  77. * 函 数 名       : lcd1602_init
  78. * 函数功能                 : LCD1602初始化
  79. * 输    入       : 无
  80. * 输    出             : 无
  81. *******************************************************************************/
  82. #if (LCD1602_4OR8_DATA_INTERFACE==0)//8位LCD
  83. void lcd1602_init(void)
  84. {
  85.         lcd1602_write_cmd(0x38);//数据总线8位,显示2行,5*7点阵/字符
  86.         lcd1602_write_cmd(0x0c);//显示功能开,无光标,光标闪烁
  87.         lcd1602_write_cmd(0x06);//写入新数据后光标右移,显示屏不移动
  88.         lcd1602_write_cmd(0x01);//清屏       
  89. }
  90. #else
  91. void lcd1602_init(void)
  92. {
  93.         lcd1602_write_cmd(0x28);//数据总线4位,显示2行,5*7点阵/字符
  94.         lcd1602_write_cmd(0x0c);//显示功能开,无光标,光标闪烁
  95.         lcd1602_write_cmd(0x06);//写入新数据后光标右移,显示屏不移动
  96.         lcd1602_write_cmd(0x01);//清屏       
  97. }
  98. #endif
  99. /*******************************************************************************
  100. * 函 数 名       : lcd1602_clear
  101. * 函数功能                 : LCD1602清屏
  102. * 输    入       : 无
  103. * 输    出             : 无
  104. *******************************************************************************/
  105. void lcd1602_clear(void)
  106. {
  107.         lcd1602_write_cmd(0x01);       
  108. }
  109. /*******************************************************************************
  110. * 函 数 名       : lcd1602_show_string
  111. * 函数功能                 : LCD1602显示字符
  112. * 输    入       : x,y:显示坐标,x=0~15,y=0~1;
  113.                                    str:显示字符串
  114. * 输    出             : 无
  115. *******************************************************************************/
  116. void lcd1602_show_string(u8 x,u8 y,u8 *str)
  117. {
  118.         u8 i=0;
  119.         if(y>1||x>15)return;//行列参数不对则强制退出
  120.         if(y<1)        //第1行显示
  121.         {       
  122.                 while(*str!='\0')//字符串是以'\0'结尾,只要前面有内容就显示
  123.                 {
  124.                         if(i<16-x)//如果字符长度超过第一行显示范围,则在第二行继续显示
  125.                         {
  126.                                 lcd1602_write_cmd(0x80+i+x);//第一行显示地址设置       
  127.                         }
  128.                         else
  129.                         {
  130.                                 lcd1602_write_cmd(0x40+0x80+i+x-16);//第二行显示地址设置       
  131.                         }
  132.                         lcd1602_write_data(*str);//显示内容
  133.                         str++;//指针递增
  134.                         i++;       
  135.                 }       
  136.         }
  137.         else        //第2行显示
  138.         {
  139.                 while(*str!='\0')
  140.                 {
  141.                         if(i<16-x) //如果字符长度超过第二行显示范围,则在第一行继续显示
  142.                         {
  143.                                 lcd1602_write_cmd(0x80+0x40+i+x);       
  144.                         }
  145.                         else
  146.                         {
  147.                                 lcd1602_write_cmd(0x80+i+x-16);       
  148.                         }
  149.                         lcd1602_write_data(*str);
  150.                         str++;
  151.                         i++;       
  152.                 }       
  153.         }                               
  154. }
复制代码
dht11.c文件
  1. #include "dht11.h"
  2. #include "intrins.h"
  3. //DHT11初始化
  4. //返回0:初始化成功,1:失败
  5. u8 DHT11_Init(void)
  6. {
  7.         DHT11_DQ=1;
  8.         DHT11_Rst();          
  9.         return DHT11_Check();       
  10. }
  11. //复位DHT11
  12. void DHT11_Rst(void)          
  13. {                 
  14.         DHT11_DQ=1;
  15.         delay_10us(1);
  16.         DHT11_DQ=0;         //拉低DQ
  17.     delay_ms(25);   //拉低至少18ms
  18.     DHT11_DQ=1;         //DQ=1
  19.         delay_10us(3);  //主机拉高20~40us
  20. }
  21. //等待DHT11的回应
  22. //返回1:未检测到DHT11的存在
  23. //返回0:存在
  24. u8 DHT11_Check(void)           
  25. {   
  26.         u8 retry=0;
  27.        
  28.         while (!DHT11_DQ&&retry<100)//判断从机发出 80us 的低电平响应信号是否结束
  29.         {
  30.                 retry++;
  31.                 _nop_();
  32.         };
  33.         if(retry>=100)return 1;
  34.         else retry=0;
  35.     while (DHT11_DQ&&retry<100)//判断从机发出 80us 的高电平是否结束如结束则主机进入数据接收状态
  36.         {
  37.                 retry++;
  38.                 _nop_();
  39.         };         
  40.         if(retry>=100)return 1;            
  41.         return 0;
  42. }
  43. //从DHT11读取一个字节
  44. //返回值:读到的数据
  45. u8 DHT11_Read_Byte(void)   
  46. {        
  47.     u8 i,temp;
  48.         u8 data_byte=0;
  49.         u8 retry=0;
  50.           for(i=0;i<8;i++)//接收8bit的数据
  51.           {
  52. //                while(!DHT11_DQ);//等待50us的低电平开始信号结束
  53.                 while (!DHT11_DQ&&retry<50)//等待50us的低电平开始信号结束
  54.                 {
  55.                         retry++;
  56.                         _nop_();
  57.                 };
  58.                 retry=0;
  59.                 delay_10us(3);//等待40us
  60.                 temp=0;//时间为26us-28us表示接收的为数据'0'
  61.                 if(DHT11_DQ==1)
  62.                         temp=1; //如果26us-28us之后还为高电平则表示接收的数据为'1'
  63. //                while(DHT11_DQ);//等待数据信号高电平'0'为26us-28us'1'为70us
  64.                 while (DHT11_DQ&&retry<100)//等待数据信号高电平'0'为26us-28us'1'为70us
  65.                 {
  66.                         retry++;
  67.                         _nop_();
  68.                 };
  69.                 data_byte<<=1;//接收的数据为高位在前右移
  70.                 data_byte|=temp;
  71.           }
  72.           return data_byte;
  73. }
  74. //从DHT11读取一次数据
  75. //temp:温度值(范围:0~50°)
  76. //humi:湿度值(范围:20%~90%)
  77. //返回值:0,正常;1,读取失败
  78. u8 DHT11_Read_Data(u8 *temp,u8 *humi)   
  79. {        
  80.         u8 buf[5];
  81.         u8 i;
  82.         DHT11_Rst();
  83.         if(DHT11_Check()==0)
  84.         {
  85.                 for(i=0;i<5;i++)//读取40位数据
  86.                 {
  87.                         buf[i]=DHT11_Read_Byte();
  88.                 }
  89.                 if((buf[0]+buf[1]+buf[2]+buf[3])==buf[4])
  90.                 {
  91.                         *humi=buf[0];
  92.                         *temp=buf[2];
  93.                 }
  94.                
  95.         }else return 1;
  96.         return 0;            
  97. }
复制代码
dht11.h文件
  1. #ifndef _dht11_H
  2. #define _dht11_H
  3. #include "public.h"
  4. //管脚定义
  5. sbit DHT11_DQ=P2^3;
  6. //函数声明
  7. u8 DHT11_Init(void);
  8. void DHT11_Rst(void);
  9. u8 DHT11_Check(void);
  10. u8 DHT11_Read_Byte(void);
  11. u8 DHT11_Read_Data(u8 *temp,u8 *humi);
  12. #endif
复制代码
public.c文件
  1. #include "public.h"
  2. /*******************************************************************************
  3. * 函 数 名       : delay_10us
  4. * 函数功能                 : 延时函数,ten_us=1时,大约延时10us
  5. * 输    入       : ten_us
  6. * 输    出             : 无
  7. *******************************************************************************/
  8. void delay_10us(u16 ten_us)
  9. {
  10.         while(ten_us--);       
  11. }
  12. /*******************************************************************************
  13. * 函 数 名       : delay_ms
  14. * 函数功能                 : ms延时函数,ms=1时,大约延时1ms
  15. * 输    入       : ms:ms延时时间
  16. * 输    出             : 无
  17. *******************************************************************************/
  18. void delay_ms(u16 ms)
  19. {
  20.         u16 i,j;
  21.         for(i=ms;i>0;i--)
  22.                 for(j=110;j>0;j--);
  23. }
复制代码
reg52.h 与 intrins.h 省略,可见压缩包:)
压缩包解压密码:dht11
小写dht!

DHT11温湿度检测(LCD1602显示).zip

164.1 KB, 下载次数: 87

解压密码:dht11

回复

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:4
  • 最近打卡:2025-01-31 17:22:42

3

主题

31

回帖

293

积分

中级会员

积分
293
发表于 2023-3-18 19:30:34 | 显示全部楼层
视频在这里!

VID_20230318_192815.mp4

3.48 MB, 下载次数: 86

描述

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

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-5-2 20:47 , Processed in 0.191901 second(s), 54 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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