使用 DHT11 温湿度传感器完成测量,并打印结果到串口;使用 SDCC 工具链编译


1. 下载并安装 SDCC,在 EIDE 上设置好安装路径

下载链接:SDCC


2. 使用 EIDE 新建一个 C51 项目


3. 编写代码

main.c

#include "dht11.h"
#include "stdio.h"
#include "soft_uart.h"/*** * 使用 DHT11 温湿度传感器完成测量,并打印结果到串口;使用 SDCC 工具链编译* * 时钟频率 16 Mhz,要修改时钟频率,更改宏 CLOCK 的值即可;* 注意:CLOCK 的值为:晶振频率/一条指令所需周期数,如 12M 晶振的 89c52 单片机:CLOCK=1* * -------------------- 引脚配置 ---------------------* * DHT11 DATA 引脚:P11* * 串口输出引脚 TX:P10* * ---------------------- 串口配置 ------------------------* * 波特率:9600,位宽度:8,停止位:1* *
*/void main()
{DHT11_Data dhtData;DHT11_Init();while (1){switch (DHT11_Measure(&dhtData)){case DHT11_CONNECT_ERR:printf("connect DHT11 failed !\n");break;case DHT11_VERIFY_ERR:printf("data verify error !\n");break;default:printf("temp: %d, humidity: %d%%\n", (uint8_t)dhtData.temperature, dhtData.humidity);break;}Delay(2000);}
}int putchar(int c)
{TxSend((uint8_t)c);return c;
}

dht11.h

#ifndef _H_DHT11
#define _H_DHT11#include "stdint.h"/*** Interface define
*/#include "mcs51/8051.h"
#include "delay.h"#define DATA_WRITE(val) P1_1 = (val)
#define DATA_READ() P1_1#define _Delay(ms) Delay(ms)void _Delay10us() //@16MHz
{unsigned char i;_nop_();_nop_();i = 37;while (--i);
}//---------------------// 返回值含义
#define DHT11_DONE 0
#define DHT11_CONNECT_ERR 1
#define DHT11_VERIFY_ERR 2typedef struct
{uint8_t humidity;float temperature;
} DHT11_Data;#define DHT11_Init() DATA_WRITE(1)uint8_t DHT11_Measure(DHT11_Data *dat)
{int8_t buf[5];uint8_t i, j, errCode = DHT11_DONE;DATA_WRITE(0);_Delay(20); // 开始信号 20 msDATA_WRITE(1);// 60 us_Delay10us();_Delay10us();_Delay10us();_Delay10us();_Delay10us();_Delay10us();if (DATA_READ() == 0){while (DATA_READ() == 0) //等待 DHT11 拉高;while (DATA_READ() == 1);i = 0;while (i < 5){j = 0;while (j < 8){while (DATA_READ() == 0);_Delay10us();_Delay10us();_Delay10us();buf[i] <<= 1;buf[i] |= DATA_READ();while (DATA_READ() == 1);j++;}i++;}_Delay10us();_Delay10us();_Delay10us();_Delay10us();_Delay10us();_Delay10us();if (buf[4] == buf[0] + buf[1] + buf[2] + buf[3]){dat->temperature = buf[2];dat->humidity = buf[0];}else{errCode = DHT11_VERIFY_ERR;}}else{errCode = DHT11_CONNECT_ERR;}DATA_WRITE(1);_Delay(1);return errCode;
}#endif

delay.h

#ifndef _H_DELAY_
#define _H_DELAY_#include "stdint.h"#define _nop_() __asm nop __endasmvoid DelayUs(uint16_t us);void Delay(uint16_t ms);#endif

delay.c

#include "delay.h"void DelayUs(uint16_t us)
{uint16_t i, n = (us * CLOCK) >> 5;for (i = 0; i < n; i++);
}void Delay(uint16_t ms)
{uint16_t i, n = 62 * CLOCK;while (ms--){for (i = 0; i < n; i++);}
}

soft_uart.h

#ifndef _H_SOFT_UART
#define _H_SOFT_UART/*** 波特率:9600,位宽度:8,停止位:1
*/#include "stdint.h"
#include "mcs51/8051.h"#define P_TXD P1_0 //定义模拟串口发送端,可以是任意IOvoid TxSend(uint8_t dat);#endif

soft_uart.c

#include "soft_uart.h"void BitTime(void)
{uint16_t i;i = (CLOCK * 104) / 12 - 1; //根据主时钟来计算位时间while (--i);
}void TxSend(uint8_t dat)
{uint8_t i;EA = 0;P_TXD = 0;BitTime();for (i = 0; i < 8; i++){if (dat & 1)P_TXD = 1;elseP_TXD = 0;dat >>= 1;BitTime();}P_TXD = 1;EA = 1;BitTime();BitTime();
}

4. 添加宏 CLOCK,本例中为 CLOCK=16,代表时钟为 16Mhz

CLOCK 怎样取值见 main.c 里的注释说明,这里不再阐述


5. 切换工具链为 SDCC,设置好编译参数,F6 开始编译

{"beforeBuildTasks":[],"afterBuildTasks": [{"name": "清理输出目录","command": "del \"${OutDir}\\*.map\" \"${OutDir}\\*.lst\" \"${OutDir}\\*.rst\" \"${OutDir}\\*.sym\""}],"global": {"device": "mcs51","optimize-type": "speed","specific-options": ["--model-large"]},"c/cpp-compiler": {"language-c": "c99"},"asm-compiler": {},"linker": {"$mainFileName": "main"}
}


6. 设置烧录参数,F7 下载到芯片

烧录参数

{"device": "auto"
}



7. 设置串口监视器波特率 9600,然后打开

如果一切连接正常,则会在串口完成温度、湿度信息的打印


工程已经打包为 EIDE 模板,已上传,可直接在 EIDE 上安装此项目

vscode 上使用 SDCC 工具链开发 8051(DHT11温湿度传感器示例)相关推荐

  1. 嵌入式设计与开发项目-DHT11温湿度传感器程序设计

    嵌入式设计与开发项目-DHT11温湿度传感器程序设计 一.实现的功能 二.根据功能实现代码 1.主文件main.c 2.DHT11温湿度的头文件"dht11.h" 3.DHT11温 ...

  2. linux mipi驱动分析_寒武纪社招内推数字IC设计、DSI驱动、软件架构、产品经理、芯片架构、工具链开发、深度学习、FAE工程师...

    点击上方蓝字关注我吧! 为什么内推更靠谱?内推是基于人脉关系链的推荐,其背后有一定的信用背书,靠谱的人推荐的人相对也会比较靠谱,所以企业一般职位都是从内部开始分享的,相较于自己海投简历,内推的效率和成 ...

  3. 【STM32 Net MF开发板学习-19】DHT11温湿度传感器通信(上)

    前段时间开发远程医疗系统(Dr.Cloud)就曾用到过温湿度传感器,不过当时考虑到集成难度,选了一个RS485接口的传感器,该传感器实现了Modbus Rtu Slave的功能,只要客户程序实现Mod ...

  4. 【STM32 .Net MF开发板学习-19】DHT11温湿度传感器通信(上)

    前段时间开发远程医疗系统(Dr.Cloud)就曾用到过温湿度传感器,不过当时考虑到集成难度,选了一个RS485接口的传感器,该传感器实现了Modbus Rtu Slave的功能,只要客户程序实现Mod ...

  5. ESP32 开发笔记(三)源码示例 8_DHT11_RMT 使用RMT实现读取DHT11温湿度传感器

    开发板购买链接 https://item.taobao.com/item.htm?spm=a2oq0.12575281.0.0.50111deb2Ij1As&ft=t&id=62636 ...

  6. Arduino开发板使用DHT11温湿度传感器的方法

    在本篇文章中,我们将DHT11温湿度传感器与Arduino开发板和LCD显示屏连接,设计一种能够测量室温和环境湿度的设备.简单地说,我们将使用Arduino和DHT11传感器设计数字湿度和温度计,并将 ...

  7. ⑦ ESP8266 开发学习笔记_By_GYC 【ESP8266 驱动 DHT11 温湿度传感器】

    目录 一.准备材料 二.硬件连接 三.软件编程 1.修改工程名 2.添加组件 3.编程 4.反馈结果 5.核心代码 四.总结 ⑦ ESP8266 开发学习笔记_By_GYC [ESP8266 驱动 D ...

  8. DHT11温湿度传感器开发

    DHT11温湿度传感器开发 单总线说明 单总线传送数据位定义 数据格式 数据时序图 外设读取步骤 单总线说明   DHT11 器件采用简化的单总线通信.单总线即只有一根数据线,系统中的数据交换.控制均 ...

  9. python温湿度传感器源代码_在树莓派上读取DHT11温湿度传感器-python代码实现及常见问题(全面简单易懂)...

    最近由于自己的课题需要,想要用在树莓派上使用DHT11温湿度传感器来读取空气中温湿度,遇到了几个问题,解决之后也对之前的知识进行了回顾,总结,特整理如下,希望能给也在学习树莓派的小伙伴们带来一些帮助. ...

  10. 可编程 USB 转串口适配器开发板 SHT3x-DIS 温湿度传感器芯片

    可编程 USB 转串口适配器开发板  SHT3x-DIS 温湿度传感器芯片 可编程USB转 UART/I2C /SMBusS/SPI/CAN/1 -Wire适配器USB2S  的温湿传感器 1.2   ...

最新文章

  1. MPB:中南大学刘学端、马丽媛组-基于16S测序和RT-qPCR的硫化矿物表面微生物群落组成分析...
  2. HDU4825 Xor Sum —— Trie树
  3. 中文课程!台大李宏毅机器学习公开课2019版上线
  4. matlab安装配置vc出错,64位系统安装matlab出现mexopts.bat及出现缺少或无法安装c++ compilers 故障的解决办法.pdf...
  5. 地震中房子变废墟了,贷款还需要还吗?
  6. mysql多实例安装启动_MySQL多实例安装启动
  7. MySql中json类型的使用___mybatis存取mysql中的json
  8. 7-5 表达式转换 (18 分)
  9. Git学习总结(5)——搭建Git简易高效服务器
  10. perl index和rindex的用法
  11. 递归求最大公约数和最小公倍数
  12. java中的displaytag类_java-如何在displaytag中以xlsx扩展名导出Excel文...
  13. 利用 netDxf与DocumentUltimate 生成CAD钻孔柱状图
  14. Typora官网下载慢,用这个镜像
  15. 生存分析(Survival Analysis)、Cox风险比例回归模型(Cox proportional hazards model)及
  16. vue 自定义指令 directive
  17. 为什么转置512x512矩阵,会比513x513矩阵慢很多?
  18. 使用ONVIF Device Test Tool获取网络摄像头的音/视频
  19. 教你如果恢复硬盘直接删除的视频资料
  20. 苹果退款_苹果ios退款流程最新苹果内购退款政策条例

热门文章

  1. 无线桥连后不能访问服务器,路由器设置无线桥接后不能登录副路由器怎么办?...
  2. Opencv4.2 DNN模块 终于支持Nividia GPU了!
  3. layui合并单元格(此方式适用于没有列冻结的单元格合并)
  4. CCIE-重认证-300-410-补充题库-必须的哟
  5. 〖Python零基础入门篇㊿〗- Python中的 sys 模块
  6. Go语言之父谈Go:大道至简
  7. CPU卡指令文件读取算法
  8. CPU卡程序设计实例(四)CPU卡处理流程
  9. Orange Business Services 携手 Riverbed 将 SD-WAN 引入混合网络
  10. python stacktrace_pystack--python stack trace--让python打印线程栈信息