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

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

[复制链接]
  • TA的每日心情
    奋斗
    2024-2-1 21:56
  • 签到天数: 2 天

    [LV.1]初来乍到

    3

    主题

    32

    回帖

    284

    积分

    中级会员

    积分
    284
    发表于 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, 下载次数: 33

    解压密码:dht11

    回复 送花

    使用道具 举报

  • TA的每日心情
    奋斗
    2024-2-1 21:56
  • 签到天数: 2 天

    [LV.1]初来乍到

    3

    主题

    32

    回帖

    284

    积分

    中级会员

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

    VID_20230318_192815.mp4

    3.48 MB, 下载次数: 37

    描述

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

    本版积分规则

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

    GMT+8, 2024-4-25 12:23 , Processed in 0.062501 second(s), 35 queries .

    Powered by Discuz! X3.5

    © 2001-2024 Discuz! Team.

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