mxdyeah 发表于 2023-3-18 19:26:47

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

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

能不能不让数码管和led灯跳动?
代码来自:深圳市普中科技有限公司(PRECHIN 普中) 稍有改动
main.c文件
/**************************************************************************************
深圳市普中科技有限公司(PRECHIN 普中)
技术支持:www.prechin.net
PRECHIN
普中

实验名称:DHT11温湿度检测(LCD1602显示)
接线说明:DHT11温湿度模块-->单片机IO
                  VCC-->5V
                  DATA-->P2.3
                  GND-->GND       
实验现象:下载程序后,LCD1602上显示DHT11温湿度传感器采集的温度和湿度值
注意事项:按照LCD1602实验章节插好LCD1602到开发板                                                                                                                                                                  
***************************************************************************************/
#include "public.h"
#include "lcd1602.h"
#include "dht11.h"

sbit led1 = P2^0;
sbit led2 = P2^1;
sbit led3 = P2^2;
sbit led4 = P2^3;
sbit led5 = P2^4;
sbit led6 = P2^5;
sbit led7 = P2^6;
sbit led8 = P2^7;

/*******************************************************************************
* 函 数 名       : main
* 函数功能               : 主函数
* 输    入       : 无
* 输    出           : 无
*******************************************************************************/
void main()
{       
        u8 temp=0,humi=0;
        u8 i=0;
        u8 temp_buf,humi_buf;

        lcd1602_init();
        while(DHT11_Init())        //检测DHT11是否存在
        {
                lcd1602_show_string(0,0,"DHT11 Was Not Detected!");               
        }
        lcd1602_show_string(0,0,"Wendu:   C");
        lcd1602_show_string(0,1,"Shidu:   %RH ");
       
        while(1)
        {
                i++;
                if(i%200==0)
                {
                        DHT11_Read_Data(&temp,&humi);
                        temp_buf=temp/10+0x30;       
                        temp_buf=temp%10+0x30;
                        temp_buf='\0';
                        lcd1602_show_string(6,0,temp_buf);

                        humi_buf=humi/10+0x30;       
                        humi_buf=humi%10+0x30;
                        humi_buf='\0';
                        lcd1602_show_string(6,1,humi_buf);
                               
                }
               
                delay_ms(1);

        }
}
public.h文件
#ifndef _public_H
#define _public_H

#include "reg52.h"

typedef unsigned int u16;        //对系统默认数据类型进行重定义
typedef unsigned char u8;


void delay_10us(u16 ten_us);
void delay_ms(u16 ms);

#endif
lcd1602.h文件
#ifndef _lcd1602_H
#define _lcd1602_H

#include "public.h"

//LCD1602数据口4位和8位定义,若为1,则为LCD1602四位数据口驱动,反之为8位
#define LCD1602_4OR8_DATA_INTERFACE        0        //默认使用8位数据口LCD1602

//管脚定义
sbit LCD1602_RS=P2^6;//数据命令选择
sbit LCD1602_RW=P2^5;//读写选择
sbit LCD1602_E=P2^7; //使能信号
#define LCD1602_DATAPORT P0        //宏定义LCD1602数据端口


//函数声明
void lcd1602_init(void);
void lcd1602_clear(void);
void lcd1602_show_string(u8 x,u8 y,u8 *str);

#endiflcd1602.c文件
#include "lcd1602.h"


/*******************************************************************************
* 函 数 名       : lcd1602_write_cmd
* 函数功能               : LCD1602写命令
* 输    入       : cmd:指令
* 输    出           : 无
*******************************************************************************/
#if (LCD1602_4OR8_DATA_INTERFACE==0)//8位LCD
void lcd1602_write_cmd(u8 cmd)
{
        LCD1602_RS=0;//选择命令
        LCD1602_RW=0;//选择写
        LCD1602_E=0;
        LCD1602_DATAPORT=cmd;//准备命令
        delay_ms(1);
        LCD1602_E=1;//使能脚E先上升沿写入
        delay_ms(1);
        LCD1602_E=0;//使能脚E后负跳变完成写入       
}
#else        //4位LCD
void lcd1602_write_cmd(u8 cmd)
{
        LCD1602_RS=0;//选择命令
        LCD1602_RW=0;//选择写
        LCD1602_E=0;
        LCD1602_DATAPORT=cmd;//准备命令
        delay_ms(1);
        LCD1602_E=1;//使能脚E先上升沿写入
        delay_ms(1);
        LCD1602_E=0;//使能脚E后负跳变完成写入
       
        LCD1602_DATAPORT=cmd<<4;//准备命令
        delay_ms(1);
        LCD1602_E=1;//使能脚E先上升沿写入
        delay_ms(1);
        LCD1602_E=0;//使能脚E后负跳变完成写入       
}
#endif

/*******************************************************************************
* 函 数 名       : lcd1602_write_data
* 函数功能               : LCD1602写数据
* 输    入       : dat:数据
* 输    出           : 无
*******************************************************************************/
#if (LCD1602_4OR8_DATA_INTERFACE==0)//8位LCD
void lcd1602_write_data(u8 dat)
{
        LCD1602_RS=1;//选择数据
        LCD1602_RW=0;//选择写
        LCD1602_E=0;
        LCD1602_DATAPORT=dat;//准备数据
        delay_ms(1);
        LCD1602_E=1;//使能脚E先上升沿写入
        delay_ms(1);
        LCD1602_E=0;//使能脚E后负跳变完成写入               
}
#else
void lcd1602_write_data(u8 dat)
{
        LCD1602_RS=1;//选择数据
        LCD1602_RW=0;//选择写
        LCD1602_E=0;
        LCD1602_DATAPORT=dat;//准备数据
        delay_ms(1);
        LCD1602_E=1;//使能脚E先上升沿写入
        delay_ms(1);
        LCD1602_E=0;//使能脚E后负跳变完成写入
       
        LCD1602_DATAPORT=dat<<4;//准备数据
        delay_ms(1);
        LCD1602_E=1;//使能脚E先上升沿写入
        delay_ms(1);
        LCD1602_E=0;//使能脚E后负跳变完成写入               
}
#endif

/*******************************************************************************
* 函 数 名       : lcd1602_init
* 函数功能               : LCD1602初始化
* 输    入       : 无
* 输    出           : 无
*******************************************************************************/
#if (LCD1602_4OR8_DATA_INTERFACE==0)//8位LCD
void lcd1602_init(void)
{
        lcd1602_write_cmd(0x38);//数据总线8位,显示2行,5*7点阵/字符
        lcd1602_write_cmd(0x0c);//显示功能开,无光标,光标闪烁
        lcd1602_write_cmd(0x06);//写入新数据后光标右移,显示屏不移动
        lcd1602_write_cmd(0x01);//清屏       
}
#else
void lcd1602_init(void)
{
        lcd1602_write_cmd(0x28);//数据总线4位,显示2行,5*7点阵/字符
        lcd1602_write_cmd(0x0c);//显示功能开,无光标,光标闪烁
        lcd1602_write_cmd(0x06);//写入新数据后光标右移,显示屏不移动
        lcd1602_write_cmd(0x01);//清屏       
}
#endif

/*******************************************************************************
* 函 数 名       : lcd1602_clear
* 函数功能               : LCD1602清屏
* 输    入       : 无
* 输    出           : 无
*******************************************************************************/
void lcd1602_clear(void)
{
        lcd1602_write_cmd(0x01);       
}

/*******************************************************************************
* 函 数 名       : lcd1602_show_string
* 函数功能               : LCD1602显示字符
* 输    入       : x,y:显示坐标,x=0~15,y=0~1;
                                   str:显示字符串
* 输    出           : 无
*******************************************************************************/
void lcd1602_show_string(u8 x,u8 y,u8 *str)
{
        u8 i=0;

        if(y>1||x>15)return;//行列参数不对则强制退出

        if(y<1)        //第1行显示
        {       
                while(*str!='\0')//字符串是以'\0'结尾,只要前面有内容就显示
                {
                        if(i<16-x)//如果字符长度超过第一行显示范围,则在第二行继续显示
                        {
                                lcd1602_write_cmd(0x80+i+x);//第一行显示地址设置       
                        }
                        else
                        {
                                lcd1602_write_cmd(0x40+0x80+i+x-16);//第二行显示地址设置       
                        }
                        lcd1602_write_data(*str);//显示内容
                        str++;//指针递增
                        i++;       
                }       
        }
        else        //第2行显示
        {
                while(*str!='\0')
                {
                        if(i<16-x) //如果字符长度超过第二行显示范围,则在第一行继续显示
                        {
                                lcd1602_write_cmd(0x80+0x40+i+x);       
                        }
                        else
                        {
                                lcd1602_write_cmd(0x80+i+x-16);       
                        }
                        lcd1602_write_data(*str);
                        str++;
                        i++;       
                }       
        }                               
}
dht11.c文件
#include "dht11.h"
#include "intrins.h"


//DHT11初始化
//返回0:初始化成功,1:失败
u8 DHT11_Init(void)
{
        DHT11_DQ=1;
        DHT11_Rst();          
        return DHT11_Check();       
}

//复位DHT11
void DHT11_Rst(void)          
{               
        DHT11_DQ=1;
        delay_10us(1);
        DHT11_DQ=0;         //拉低DQ
    delay_ms(25);   //拉低至少18ms
    DHT11_DQ=1;         //DQ=1
        delay_10us(3);//主机拉高20~40us
}

//等待DHT11的回应
//返回1:未检测到DHT11的存在
//返回0:存在
u8 DHT11_Check(void)           
{   
        u8 retry=0;
       
        while (!DHT11_DQ&&retry<100)//判断从机发出 80us 的低电平响应信号是否结束
        {
                retry++;
                _nop_();
        };
        if(retry>=100)return 1;
        else retry=0;
    while (DHT11_DQ&&retry<100)//判断从机发出 80us 的高电平是否结束如结束则主机进入数据接收状态
        {
                retry++;
                _nop_();
        };       
        if(retry>=100)return 1;          
        return 0;
}

//从DHT11读取一个字节
//返回值:读到的数据
u8 DHT11_Read_Byte(void)   
{      
    u8 i,temp;
        u8 data_byte=0;
        u8 retry=0;

        for(i=0;i<8;i++)//接收8bit的数据
        {
//                while(!DHT11_DQ);//等待50us的低电平开始信号结束
                while (!DHT11_DQ&&retry<50)//等待50us的低电平开始信号结束
                {
                        retry++;
                        _nop_();
                };
                retry=0;
                delay_10us(3);//等待40us
                temp=0;//时间为26us-28us表示接收的为数据'0'
                if(DHT11_DQ==1)
                        temp=1; //如果26us-28us之后还为高电平则表示接收的数据为'1'
//                while(DHT11_DQ);//等待数据信号高电平'0'为26us-28us'1'为70us
                while (DHT11_DQ&&retry<100)//等待数据信号高电平'0'为26us-28us'1'为70us
                {
                        retry++;
                        _nop_();
                };
                data_byte<<=1;//接收的数据为高位在前右移
                data_byte|=temp;
        }

        return data_byte;
}

//从DHT11读取一次数据
//temp:温度值(范围:0~50°)
//humi:湿度值(范围:20%~90%)
//返回值:0,正常;1,读取失败
u8 DHT11_Read_Data(u8 *temp,u8 *humi)   
{      
        u8 buf;
        u8 i;
        DHT11_Rst();
        if(DHT11_Check()==0)
        {
                for(i=0;i<5;i++)//读取40位数据
                {
                        buf=DHT11_Read_Byte();
                }
                if((buf+buf+buf+buf)==buf)
                {
                        *humi=buf;
                        *temp=buf;
                }
               
        }else return 1;
        return 0;          
}

dht11.h文件
#ifndef _dht11_H
#define _dht11_H

#include "public.h"

//管脚定义
sbit DHT11_DQ=P2^3;

//函数声明
u8 DHT11_Init(void);
void DHT11_Rst(void);
u8 DHT11_Check(void);
u8 DHT11_Read_Byte(void);
u8 DHT11_Read_Data(u8 *temp,u8 *humi);

#endif
public.c文件
#include "public.h"

/*******************************************************************************
* 函 数 名       : delay_10us
* 函数功能               : 延时函数,ten_us=1时,大约延时10us
* 输    入       : ten_us
* 输    出           : 无
*******************************************************************************/
void delay_10us(u16 ten_us)
{
        while(ten_us--);       
}

/*******************************************************************************
* 函 数 名       : delay_ms
* 函数功能               : ms延时函数,ms=1时,大约延时1ms
* 输    入       : ms:ms延时时间
* 输    出           : 无
*******************************************************************************/
void delay_ms(u16 ms)
{
        u16 i,j;
        for(i=ms;i>0;i--)
                for(j=110;j>0;j--);
}reg52.h 与 intrins.h 省略,可见压缩包:)
压缩包解压密码:dht11
小写dht!

mxdyeah 发表于 2023-3-18 19:30:34

视频在这里!
页: [1]
查看完整版本: 【求助】烧录以下程序到开发板后,数码管和led灯跳动