51单片机at89c52,温湿度传感器测温,并在OLED中显示,保留小数点后三位,请给我代码

时间: 2023-12-08 21:04:08 浏览: 53
好的,根据您的需求,我为您提供以下代码。请注意,本代码基于Keil C51开发平台和STC89C52单片机,且需要外接温湿度传感器和OLED屏幕。 ```c #include <reg52.h> sbit DHT11=P2^0; // 温湿度传感器数据信号接口 sbit SCL=P2^1; // OLED SCL时钟线接口 sbit SDA=P2^2; // OLED SDA数据线接口 void Delay10us() // 延时函数,用于IIC通讯 { unsigned char i; for (i=0;i<11;i++); } void IICStart() // IIC起始信号 { SDA=1; Delay10us(); SCL=1; Delay10us(); SDA=0; Delay10us(); SCL=0; Delay10us(); } void IICStop() // IIC停止信号 { SDA=0; Delay10us(); SCL=1; Delay10us(); SDA=1; Delay10us(); } void IICSendByte(unsigned char dat) // IIC发送字节 { unsigned char i; for (i=0;i<8;i++) { SDA=dat&0x80; Delay10us(); SCL=1; Delay10us(); SCL=0; Delay10us(); dat<<=1; } } unsigned char IICRecvByte() // IIC接收字节 { unsigned char dat=0,i; SDA=1; Delay10us(); for (i=0;i<8;i++) { SCL=1; Delay10us(); dat<<=1; dat|=SDA; SCL=0; Delay10us(); } return dat; } bit DHT11Check() // DHT11数据读取前的校验 { unsigned char i; for (i=0;i<100;i++); DHT11=0; Delay10us(); DHT11=1; Delay10us(); if (DHT11==1) // DHT11响应 { while (DHT11==1); // DHT11主机延时 return 1; } else return 0; } unsigned char DHT11RecvByte() // DHT11接收字节 { unsigned char i,dat=0; for (i=0;i<8;i++) { while (DHT11==0); // DHT11开始一个位的数据传输 Delay10us(); Delay10us(); Delay10us(); dat<<=1; if (DHT11==1) dat|=1; while (DHT11==1); // DHT11等待下一个位的数据传输 } return dat; } void OLEDInit() // OLED屏幕初始化函数 { IICStart(); IICSendByte(0x78); IICSendByte(0x00); IICSendByte(0xAE); // 关闭OLED显示 IICSendByte(0xD5); IICSendByte(0x80); IICSendByte(0xA8); IICSendByte(0x3F); IICSendByte(0xD3); IICSendByte(0x00); IICSendByte(0x40); IICSendByte(0x8D); IICSendByte(0x14); IICSendByte(0x20); IICSendByte(0x00); IICSendByte(0xA1); IICSendByte(0xC0); IICSendByte(0xDA); IICSendByte(0x12); IICSendByte(0x81); IICSendByte(0xCF); IICSendByte(0xD9); IICSendByte(0xF1); IICSendByte(0xDB); IICSendByte(0x30); IICSendByte(0xA4); IICSendByte(0xA6); IICSendByte(0xAF); // 打开OLED显示 IICStop(); } void DispChar(unsigned char x,unsigned char y,unsigned char num) // 显示一个字符 { IICStart(); IICSendByte(0x78); IICSendByte(0x00); IICSendByte(0x21); IICSendByte(x); IICSendByte(x+7); IICSendByte(0x22); IICSendByte(y); IICSendByte(y+15); IICSendByte(0xb0+num-32); IICStop(); } void DispString(unsigned char x,unsigned char y,unsigned char *s) // 显示一个字符串 { while (*s!=0) { DispChar(x,y,*s); x+=8; s++; } } void main() // 主函数 { unsigned char temp1=0,temp2=0,hum1=0,hum2=0; float temp=0,hum=0; OLEDInit(); // OLED屏幕初始化 while (1) { if (!DHT11Check()) continue; // DHT11读取前的校验失败,重新读取 hum1=DHT11RecvByte(); hum2=DHT11RecvByte(); temp1=DHT11RecvByte(); temp2=DHT11RecvByte(); if ((hum1+hum2+temp1+temp2)!=DHT11RecvByte()) continue; // DHT11数据校验失败,重新读取 hum=hum1+hum2/10.0; temp=temp1+temp2/10.0; DispString(0,0,"Temperature:"); DispString(0,2,"Humidity :"); DispString(96,0,"C"); DispString(96,2,"%"); DispString(72,0," "); // 清除之前的数据 DispString(72,2," "); DispString(72,0,"%f",temp); // 在OLED屏幕上显示温度 DispString(72,2,"%f",hum); // 在OLED屏幕上显示湿度 } } ``` 在以上代码中,DHT11Check函数、DHT11RecvByte函数和IICStart函数、IICStop函数、IICSendByte函数和IICRecvByte函数分别表示了DHT11温湿度传感器数据读取前的校验和IIC通讯协议的相关函数。OLEDInit函数、DispChar函数和DispString函数则表示了OLED屏幕的初始化、在指定位置显示一个字符和在指定位置显示一个字符串的函数。在main函数中,我们首先读取DHT11传感器的数据,计算得到温度和湿度的值,然后在OLED屏幕上显示出来。其中,DispString函数使用了类似printf函数的方式来格式化输出字符串和浮点数。

相关推荐

最新推荐

recommend-type

51单片机(AT89C52)一键多功能(短按、长按)

短按(按下持续时间小于3s)一次数码管显示加1,同时流水灯计数加1。长按(按下持续时间大于3s)时,数码管显示每500ms加1,同时流水灯每500ms计数加1。
recommend-type

基于AT89C52单片机的SD卡读写设计

单片机使用12MHz的晶体振荡器时,读写速度和功耗都基本...本文详细阐述了用AT89C52单片机对SD卡进行操作的过程,提出了一种不带SD卡控制器,MCU读写SD卡的方法,实现了SD卡在电能监测及无功补偿数据采集系统中的用途。
recommend-type

基于AT89C52单片机的语音录放系统实现

文中给出以单片机AT89C52为核心构成的语音录放系统原理图及软件流程。通过实验验证该语音录放系统录音和放音效果良好,单片机控制相当准确。在应用方面,将该系统作为一个模块可与其他功能电路集成,实现各种功能...
recommend-type

基于AT89C52单片机最小系统接口电路设计

AT89C52是美国Atmel公司生产的低电压、高性能CMOS 8位单片机,片内含8KB的可反复擦写的程序存储器和256B的随机存取数据存储器(RAM),器件采用Atmel公司的高密度、非易失性存储技术生产,兼容标准MCS-51指令系统,...
recommend-type

基于AT89C51单片机的LED汉字显示屏设计方案

研究了基于AT89C51单片机16×16 LED汉字滚动显示屏的设计与运用Proteus软件的仿真实现。主要介绍了LED汉字显示屏的硬件电路、汇编程序设计与调试、Proteus软件仿真等方面的内容,本显示屏的设计具有体积小、硬件少、...
recommend-type

RTL8188FU-Linux-v5.7.4.2-36687.20200602.tar(20765).gz

REALTEK 8188FTV 8188eus 8188etv linux驱动程序稳定版本, 支持AP,STA 以及AP+STA 共存模式。 稳定支持linux4.0以上内核。
recommend-type

管理建模和仿真的文件

管理Boualem Benatallah引用此版本:布阿利姆·贝纳塔拉。管理建模和仿真。约瑟夫-傅立叶大学-格勒诺布尔第一大学,1996年。法语。NNT:电话:00345357HAL ID:电话:00345357https://theses.hal.science/tel-003453572008年12月9日提交HAL是一个多学科的开放存取档案馆,用于存放和传播科学研究论文,无论它们是否被公开。论文可以来自法国或国外的教学和研究机构,也可以来自公共或私人研究中心。L’archive ouverte pluridisciplinaire
recommend-type

:YOLOv1目标检测算法:实时目标检测的先驱,开启计算机视觉新篇章

![:YOLOv1目标检测算法:实时目标检测的先驱,开启计算机视觉新篇章](https://img-blog.csdnimg.cn/img_convert/69b98e1a619b1bb3c59cf98f4e397cd2.png) # 1. 目标检测算法概述 目标检测算法是一种计算机视觉技术,用于识别和定位图像或视频中的对象。它在各种应用中至关重要,例如自动驾驶、视频监控和医疗诊断。 目标检测算法通常分为两类:两阶段算法和单阶段算法。两阶段算法,如 R-CNN 和 Fast R-CNN,首先生成候选区域,然后对每个区域进行分类和边界框回归。单阶段算法,如 YOLO 和 SSD,一次性执行检
recommend-type

info-center source defatult

这是一个 Cisco IOS 命令,用于配置 Info Center 默认源。Info Center 是 Cisco 设备的日志记录和报告工具,可以用于收集和查看设备的事件、警报和错误信息。该命令用于配置 Info Center 默认源,即设备的默认日志记录和报告服务器。在命令行界面中输入该命令后,可以使用其他命令来配置默认源的 IP 地址、端口号和协议等参数。
recommend-type

c++校园超市商品信息管理系统课程设计说明书(含源代码) (2).pdf

校园超市商品信息管理系统课程设计旨在帮助学生深入理解程序设计的基础知识,同时锻炼他们的实际操作能力。通过设计和实现一个校园超市商品信息管理系统,学生掌握了如何利用计算机科学与技术知识解决实际问题的能力。在课程设计过程中,学生需要对超市商品和销售员的关系进行有效管理,使系统功能更全面、实用,从而提高用户体验和便利性。 学生在课程设计过程中展现了积极的学习态度和纪律,没有缺勤情况,演示过程流畅且作品具有很强的使用价值。设计报告完整详细,展现了对问题的深入思考和解决能力。在答辩环节中,学生能够自信地回答问题,展示出扎实的专业知识和逻辑思维能力。教师对学生的表现予以肯定,认为学生在课程设计中表现出色,值得称赞。 整个课程设计过程包括平时成绩、报告成绩和演示与答辩成绩三个部分,其中平时表现占比20%,报告成绩占比40%,演示与答辩成绩占比40%。通过这三个部分的综合评定,最终为学生总成绩提供参考。总评分以百分制计算,全面评估学生在课程设计中的各项表现,最终为学生提供综合评价和反馈意见。 通过校园超市商品信息管理系统课程设计,学生不仅提升了对程序设计基础知识的理解与应用能力,同时也增强了团队协作和沟通能力。这一过程旨在培养学生综合运用技术解决问题的能力,为其未来的专业发展打下坚实基础。学生在进行校园超市商品信息管理系统课程设计过程中,不仅获得了理论知识的提升,同时也锻炼了实践能力和创新思维,为其未来的职业发展奠定了坚实基础。 校园超市商品信息管理系统课程设计的目的在于促进学生对程序设计基础知识的深入理解与掌握,同时培养学生解决实际问题的能力。通过对系统功能和用户需求的全面考量,学生设计了一个实用、高效的校园超市商品信息管理系统,为用户提供了更便捷、更高效的管理和使用体验。 综上所述,校园超市商品信息管理系统课程设计是一项旨在提升学生综合能力和实践技能的重要教学活动。通过此次设计,学生不仅深化了对程序设计基础知识的理解,还培养了解决实际问题的能力和团队合作精神。这一过程将为学生未来的专业发展提供坚实基础,使其在实际工作中能够胜任更多挑战。