51单片机 esp-01发送DS18B20数据、AS5600数据、HX711数据的C语言程序

时间: 2023-07-14 17:13:39 浏览: 52
以下是一个可以发送DS18B20、AS5600和HX711数据的51单片机程序,使用esp-01作为WiFi模块进行数据传输。 ``` #include <reg51.h> #include <math.h> #include <intrins.h> #include <stdio.h> #include <string.h> #define FOSC 11059200L //定义晶振频率 #define BAUD 9600 //定义波特率 #define ERROR 0 //定义常量0 #define OK 1 //定义常量1 #define DS18B20_PIN P2_3 //定义DS18B20引脚 #define AS5600_PIN P2_4 //定义AS5600引脚 #define HX711_PIN P2_5 //定义HX711引脚 unsigned char idata Send_Buffer[60]; //定义发送缓存区 unsigned char idata Receive_Buffer[60]; //定义接收缓存区 unsigned int count; //定义计数器 bit flag; //用于指示是否有数据需要发送 void Init_UART(void) //初始化UART { TMOD |= 0x20; //设定定时器1为8位自动重载模式 TH1 = TL1 = -(FOSC / 12 / 32 / BAUD); //设定波特率 TR1 = 1; //启动定时器1 SM0 = 0; //设定串口工作模式 SM1 = 1; REN = 1; //允许串口接收数据 EA = 1; //开启总中断 ES = 1; //开启串口中断 } void Init_DS18B20(void) //初始化DS18B20 { DS18B20_PIN = 1; //DS18B20初始化 _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); } bit Start_DS18B20(void) //启动DS18B20 { bit ack; DS18B20_PIN = 1; //总线复位 _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); DS18B20_PIN = 0; //开始信号 _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); DS18B20_PIN = 1; //释放总线,等待DS18B20响应 _nop_(); _nop_(); _nop_(); _nop_(); ack = DS18B20_PIN; //读取DS18B20响应信号 _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); return ack; } void Write_DS18B20(unsigned char dat) //写入数据 { unsigned char i; for (i = 0; i < 8; i++) { DS18B20_PIN = 0; //写入数据开始 _nop_(); _nop_(); DS18B20_PIN = dat & 0x01; //写入数据 _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); DS18B20_PIN = 1; //释放总线 dat >>= 1; //准备写入下一位数据 } } unsigned char Read_DS18B20(void) //读取数据 { unsigned char i, dat = 0; for (i = 0; i < 8; i++) { dat >>= 1; //准备读取下一位数据 DS18B20_PIN = 0; //读取数据开始 _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); DS18B20_PIN = 1; //释放总线,等待DS18B20响应 _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); if (DS18B20_PIN) //读取数据 dat |= 0x80; } return dat; } void Read_Temperature_DS18B20(void) //读取DS18B20温度数据 { unsigned char temp[2]; unsigned int t; if (Start_DS18B20()) { //启动DS18B20 Write_DS18B20(0xCC); //跳过ROM Write_DS18B20(0x44); //启动温度转换 while (!DS18B20_PIN); //等待转换结束 Start_DS18B20(); //启动DS18B20 Write_DS18B20(0xCC); //跳过ROM Write_DS18B20(0xBE); //读取温度数据 temp[0] = Read_DS18B20(); //读取LSB temp[1] = Read_DS18B20(); //读取MSB t = ((unsigned int)temp[1] << 8) | temp[0]; //计算温度值 t = t * 0.0625 * 10 + 0.5; sprintf(Send_Buffer, "Temperature: %d.%dC\r\n", t / 10, t % 10); //将温度值转化为字符串 flag = 1; //设置发送数据标志位 } } void Init_AS5600(void) //初始化AS5600 { AS5600_PIN = 1; //AS5600初始化 _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); } unsigned char Read_AS5600(void) //读取AS5600角度数据 { unsigned char i, dat = 0; for (i = 0; i < 8; i++) { dat <<= 1; //准备读取下一位数据 AS5600_PIN = 0; //读取数据开始 _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); dat |= AS5600_PIN; //读取数据 _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); AS5600_PIN = 1; //释放总线,等待AS5600响应 _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); } return dat; } void Read_Angle_AS5600(void) //读取AS5600角度数据 { unsigned char angle; Init_AS5600(); //初始化AS5600 AS5600_PIN = 0; //发送起始地址 _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); AS5600_PIN = 1; //释放总线,等待AS5600响应 _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); angle = Read_AS5600(); //读取角度数据 sprintf(Send_Buffer, "Angle: %d\r\n", angle); //将角度值转化为字符串 flag = 1; //设置发送数据标志位 } void Init_HX711(void) //初始化HX711 { HX711_PIN = 1; //HX711初始化 _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); } unsigned long Read_HX711(void) //读取HX711重量数据 { unsigned char i; unsigned long dat = 0; Init_HX711(); //初始化HX711 for (i = 0; i < 24; i++) { //读取24位数据 HX711_PIN = 0; //读取数据开始 _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); dat <<= 1; //准备读取下一位数据 if (HX711_PIN) dat++; _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); HX711_PIN = 1; //释放总线,等待HX711响应 _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); } HX711_PIN = 0; //读取校验位 _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); dat ^= 0x800000; _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); HX711_PIN = 1; //释放总线,等待HX711响应 _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); return dat; } void Read_Weight_HX711(void) //读取HX711重量数据 { unsigned long weight; weight = Read_HX711(); //读取重量数据 sprintf(Send_Buffer, "Weight: %ldg\r\n", weight); //将重量值转化为字符串 flag = 1; //设置发送数据标志位 } void Send_Data(void) //发送数据 { unsigned char i; for (i = 0; i < strlen(Send_Buffer); i++) { SBUF = Send_Buffer[i]; //发送数据 while (!TI); //等待数据发送完成 TI = 0; //清除发送完成标志位 } memset(Send_Buffer, 0, sizeof(Send_Buffer)); //清空发送缓存区 flag = 0; //清除发送数据标志位 } void main(void) { Init_UART(); //初始化UART while (1) { Read_Temperature_DS18B20(); //读取DS18B20温度数据 if (flag) Send_Data(); //发送数据 Read_Angle_AS5600(); //读取AS5600角度数据 if (flag) Send_Data(); //发送数据 Read_Weight_HX711(); //读取HX711重量数据 if (flag) Send_Data(); //发送数据 } } void UART_ISR(void) interrupt 4 //UART中断服务程序 { if (RI) { //接收数据 RI = 0; //清除接收完成标志位 Receive_Buffer[count++] = SBUF; //将接收数据存入接收缓存区 if (count >= sizeof(Receive_Buffer)) count = 0; //如果接收缓存区已满,重置计数器 } if (TI) TI = 0; //清除发送完成标志位 } ``` 需要注意的是,该程序中的DS18B20、AS5600和HX711的引脚定义是P2_3、P2_4和P2_5,可以根据实际硬件连接情况进行修改。此外,程序中使用了一个标志位flag来指示是否有数据需要发送,可以避免数据重复发送的问题。

相关推荐

最新推荐

recommend-type

DS18B20数据手册-中文版(带目录)

使用参见:https://handsome-man.blog.csdn.net/article/details/104530051
recommend-type

51单片机DS18B20测量温度实验

实验任务 用一片DS18B20构成测温系统,测量的温度精度达到0.1度,测量的温度的范围在-20度到+50度之间,用4位数码管显示出来。
recommend-type

基于51单片机的ds18b20汇编程序

是自己显得没事写的基于51单片机的ds18b20汇编程序,或许不太完善,欢迎指正
recommend-type

一种基于DS18B20的温度采集系统设计

与传统的模拟温度传感器相比,数字式温度传感器在器件微小化、抗干扰能力、可靠性、分辨率以及精度方面都具有明显的优点,此外,其输出的温度数据以及相关的温度控制量能够与各种微处理器相适配。
recommend-type

基于AT89C51和DS18B20的最简温度测量系统

本文介绍一种新型的可编程温度传感器DS18B20,他能代替模拟温度传感器和信号处理电路,直接与单片机沟通,完成温度采集和数据处理。DS18B20与AT89C51结合实现最简温度检测系统,该系统结构简单,抗干扰能力强,适合...
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

Redis验证与连接:安装成功验证技巧

![Redis从入门到精通](https://img-blog.csdnimg.cn/6f39d0a2adc3456b96e804eb45032480.png) # 1. Redis安装与验证** ### 2.2 Redis验证方法 Redis验证可以通过以下方法进行: - **命令行验证:** - 打开终端,输入 `redis-cli` 命令进入 Redis 命令行。 - 输入 `ping` 命令,如果返回 "PONG",则表示 Redis 正在运行。 - **客户端验证:** - 使用 Redis 客户端(如 RedisInsight)连接到 Redis 服务器。
recommend-type

3、自定义一个函数int compareStr(char *p1, char *p2),实现两个字符串的比较。相等返回0,大于返回1,小于返回0;编写主函数main()来调用自定义函数完成测试。

下面是自定义的 `compareStr` 函数的代码实现: ```c #include <stdio.h> int compareStr(char *p1, char *p2) { while (*p1 && *p2 && (*p1 == *p2)) { p1++; p2++; } return (*p1 > *p2) - (*p1 < *p2); } int main() { char str1[100], str2[100]; int result; printf("请输入第一个字符串:");
recommend-type

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

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