基于STC89C51的单片机和TLC1543模数转换器的环境指标采集器

本文主要是介绍基于STC89C51的单片机和TLC1543模数转换器的环境指标采集器,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

本次设计采用TLC1543作为模数转换芯片,STC89C51系列单片机作为主控制器芯片,采集来自变送器(集成传感器)信号线端的电压(依据不同的传感器,可转换为相应的量值输出)。

采集到的数据可实现两种方式传输:1、通过Zigbee实现串口透传(无线传输) 

 2、串口(RS-232)传输(有线)。

软件平台:keil

本设计在8路模拟输入端(AI0~AI7)共地接入了250欧姆的精密电阻,可以采集到传感器的输出电压(0~5V),再通过欧姆定律,得到相应的输出电流。

根据单片机串口传输的字节要求,传输的数据格式设置为十六进制,并且为了得到较准确的电压输出,将电压放大10倍(考虑到十六进制转换为带小数的十进制较复杂。比如处理:实际输出电压为3.5V,处理后的为35V,对应的十六进制为23)。

为了区分采集到的每一路数据,在每路8位十六进制数据之后加上通道标志(8路分别是F0~F7),且数据每隔一秒钟(可修改)送至串口,通过有线或者无线的方式传输。

C语言代码如下:

1、main.c

#include <reg51.h>
#include "channel.h"
#include "math.h"int Channel8_Data[8]={0,0,0,0,0,0,0,0};
uchar i,j,k,q;
uint t2;
uchar keyNum;
unsigned char	datas[5] = {0, 0, 0, 0, 0};void Display( int);
void delay(uint);
void flag(uint);
uchar Key_Scan();
void delay1ms(uint);
void UsartConfiguration();		 //"串口通信初始化"void main()
{UsartConfiguration();while(1){//	for(j=0;j<1;j++)//	{//	delay1ms(20);//"延迟200ms"//Channel8_Data[j]=Ad_vldata(j);int a=Ad_vldata(4);	//	}//	for(i=0;i<8;i++)//	{	//		switch(i)//		{/*	case(0):if(port0==0){//Display((Channel8_Data[0]*0.04098-4)*4.375-20);flag(0);delay1ms(1000);break;	  //"温度   没乘以100"Display((Channel8_Data[0]*10.000));flag(0);delay1ms(1000);break;	   //"输出电流*10  4——>40"}elsebreak;case(1):if(port1==0){//Display((Channel8_Data[1]*0.06944-4)*125);	  //"CO2"Display((Channel8_Data[1]*0.04));flag(1);delay1ms(1000);break;}elsebreak;*///	case(1)://	if(port2==0)//	{//Display((Channel8_Data[2]*0.04098-4)*0.0625);	  //"大气湿度"//	Display((Channel8_Data[0]*0.1));//flag(2);Display(a);//Channel8_Data[0]=0;delay1ms(1000);//break;//	}//	else//		break;/*		case(3):if(port3==0){//Display((Channel8_Data[3]*0.04098-4)*0.0625);	  //"土壤湿度"Display((Channel8_Data[3]*0.04));flag(3);delay1ms(1000);break;}elsebreak;case(4):if(port4==0){//Display((Channel8_Data[4]*0.04098-4)*4.375-20);	  //"土壤温度"Display((Channel8_Data[4]*0.04));flag(4);delay1ms(1000);break;}elsebreak;case(5):if(port5==0){//Display((Channel8_Data[5]*0.04098-4)*937.5);	  //"盐分电导率"Display((Channel8_Data[5]*0.04));flag(5);delay1ms(1000);break;}elsebreak;								 case(6):if(port6==0){//Display((Channel8_Data[6]*0.04098-4)*12500);flag(6);delay1ms(1000);break;	  //"照度"Display((Channel8_Data[6]*0.04));flag(6);delay1ms(1000);break;}elsebreak;case(7):if(port7==0){//Display((Channel8_Data[7]*0.04098-4)*0.875);flag(7);delay1ms(1000);break; 	  //"PH "Display((Channel8_Data[7]*0.04));flag(7);delay1ms(1000);break;	}elsebreak;*/			//}}delay1ms(10000);}void delay1ms(uint y)
{uint x;for( ; y>0; y--){for(x=110; x>0; x--);}
}void Scan_Switch()
{}void Display( int  tt)
{long int  temp;temp=tt+0.5;/*	if(temp< 0)				  {	SBUF='-';             //"SBUF在左边,则为发送缓冲区" while(!TI);			  //"等待发送完毕"       TI=0;					 	    	temp=temp-1;				  //"处理温度"temp=~temp;	}else{				SBUF='+';while(!TI);			       TI=0;					}*///"将转化好的温度分别放入数组中,并通过串口传输"	 //"temp传送过的值是实际值*100"datas[0] = temp / 1000000;datas[1] = temp % 1000000 / 100000;datas[2] = temp % 100000 / 10000;datas[3] = temp % 10000 / 1000;datas[4] = temp % 1000 / 100;
//"小数点后2位"datas[5] = temp % 100 / 10;datas[6] = temp % 10;SBUF = '0'+datas[0];     while (!TI);			    		  TI = 0;SBUF = '0'+datas[1];        while (!TI);		TI = 0;SBUF = '0'+datas[2];      	 //"datas[2]为个位   '0'可用于温度补偿"while (!TI);			    TI = 0;SBUF = '0'+datas[3];       while (!TI);			  TI = 0;SBUF = '0'+datas[4];       while (!TI);			   TI = 0;SBUF = '.';            while (!TI);			TI = 0;SBUF = '0'+datas[5];       while (!TI);			  TI = 0;SBUF = '0'+datas[6];       while (!TI);			   TI = 0;	/*		t2=tt%100;SBUF = t2;while (!TI);	        TI = 0;SBUF = 255;while (!TI);	        TI = 0;
*/
}void flag(uint l)
{SBUF = 240+l;while (!TI);	        TI = 0;}void UsartConfiguration()		//"串口和定时器初始化"
{SCON=0X40;		TMOD=0X20;		PCON=0X00;		TH1=0XFD;			TL1=0XFD;
//	ES=1;					
//	EA=1;					TR1=1;		//"使能定时器1"	
}
2、channel.c

#include <reg51.h>
#include "channel.h"
#include "intrins.h"
#include "math.h"uint Ad_vldata(uchar port)
{uint ad=0;uint i;uchar al=0,ah=0;AD_clk=0;AD_cs=0;
//"取高四位地址	"port<<=4;for(i=0;i<4;i++){AD_add=(bit)(port&0x80);	 //"AD_add为AD地址寄存器"AD_clk=1;AD_clk=0;port<<=1;}//"补全剩下的6个时钟周期"for(i=0;i<6;i++){AD_clk=1;AD_clk=0;	//_nop_();  //???}
//"10时钟周期完成地址的输送,下面直接采集数据即为当前值"//"等待转换	  "AD_cs=1;for(i=0;i<20;i++){_nop_();}AD_cs=0;_nop_();_nop_();_nop_();_nop_();  //_nop_();//"获得测量的值"for(i=0;i<2;i++){AD_dat=1;AD_clk=1;ah<<=1;if(AD_dat)  ah|=0x01;AD_clk=0;	}for(i=0;i<8;i++){AD_dat=1;AD_clk=1;al<<=1;if(AD_dat) al|=0x01;AD_clk=0;	}	
//" 结束 "AD_cs=1;ad=(uint)ah;ad<<=8;ad|=(uint)al;ad=(ad*0.004887)*100;	  //"(ad*0.004887)实际电压值,转化要*100,为了要测试输出电压"
//	ad=ad*5/1024*100;return(ad);	}
3.头文件部分代码

sbit AD_eoc=P3^7;
sbit AD_clk=P3^6;
sbit AD_add=P3^5; //D_IN
sbit AD_dat=P3^4; //D_OUT
sbit AD_cs=P3^3;/*sbit port0=P1^0;
sbit port1=P1^1;
sbit port2=P1^2;
sbit port3=P1^3;
sbit port4=P1^4;
sbit port5=P1^5;
sbit port6=P1^6;
sbit port7=P1^7;
*/


这篇关于基于STC89C51的单片机和TLC1543模数转换器的环境指标采集器的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/604466

相关文章

阿里开源语音识别SenseVoiceWindows环境部署

SenseVoice介绍 SenseVoice 专注于高精度多语言语音识别、情感辨识和音频事件检测多语言识别: 采用超过 40 万小时数据训练,支持超过 50 种语言,识别效果上优于 Whisper 模型。富文本识别:具备优秀的情感识别,能够在测试数据上达到和超过目前最佳情感识别模型的效果。支持声音事件检测能力,支持音乐、掌声、笑声、哭声、咳嗽、喷嚏等多种常见人机交互事件进行检测。高效推

安装nodejs环境

本文介绍了如何通过nvm(NodeVersionManager)安装和管理Node.js及npm的不同版本,包括下载安装脚本、检查版本并安装特定版本的方法。 1、安装nvm curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.0/install.sh | bash 2、查看nvm版本 nvm --version 3、安装

【IPV6从入门到起飞】5-1 IPV6+Home Assistant(搭建基本环境)

【IPV6从入门到起飞】5-1 IPV6+Home Assistant #搭建基本环境 1 背景2 docker下载 hass3 创建容器4 浏览器访问 hass5 手机APP远程访问hass6 更多玩法 1 背景 既然电脑可以IPV6入站,手机流量可以访问IPV6网络的服务,为什么不在电脑搭建Home Assistant(hass),来控制你的设备呢?@智能家居 @万物互联

高并发环境中保持幂等性

在高并发环境中保持幂等性是一项重要的挑战。幂等性指的是无论操作执行多少次,其效果都是相同的。确保操作的幂等性可以避免重复执行带来的副作用。以下是一些保持幂等性的常用方法: 唯一标识符: 请求唯一标识:在每次请求中引入唯一标识符(如 UUID 或者生成的唯一 ID),在处理请求时,系统可以检查这个标识符是否已经处理过,如果是,则忽略重复请求。幂等键(Idempotency Key):客户端在每次

pico2 开发环境搭建-基于ubuntu

pico2 开发环境搭建-基于ubuntu 安装编译工具链下载sdk 和example编译example 安装编译工具链 sudo apt install cmake gcc-arm-none-eabi libnewlib-arm-none-eabi libstdc++-arm-none-eabi-newlib 注意cmake的版本,需要在3.17 以上 下载sdk 和ex

pip-tools:打造可重复、可控的 Python 开发环境,解决依赖关系,让代码更稳定

在 Python 开发中,管理依赖关系是一项繁琐且容易出错的任务。手动更新依赖版本、处理冲突、确保一致性等等,都可能让开发者感到头疼。而 pip-tools 为开发者提供了一套稳定可靠的解决方案。 什么是 pip-tools? pip-tools 是一组命令行工具,旨在简化 Python 依赖关系的管理,确保项目环境的稳定性和可重复性。它主要包含两个核心工具:pip-compile 和 pip

基于51单片机的自动转向修复系统的设计与实现

文章目录 前言资料获取设计介绍功能介绍设计清单具体实现截图参考文献设计获取 前言 💗博主介绍:✌全网粉丝10W+,CSDN特邀作者、博客专家、CSDN新星计划导师,一名热衷于单片机技术探索与分享的博主、专注于 精通51/STM32/MSP430/AVR等单片机设计 主要对象是咱们电子相关专业的大学生,希望您们都共创辉煌!✌💗 👇🏻 精彩专栏 推荐订阅👇🏻 单片机

跨系统环境下LabVIEW程序稳定运行

在LabVIEW开发中,不同电脑的配置和操作系统(如Win11与Win7)可能对程序的稳定运行产生影响。为了确保程序在不同平台上都能正常且稳定运行,需要从兼容性、驱动、以及性能优化等多个方面入手。本文将详细介绍如何在不同系统环境下,使LabVIEW开发的程序保持稳定运行的有效策略。 LabVIEW版本兼容性 LabVIEW各版本对不同操作系统的支持存在差异。因此,在开发程序时,尽量使用

Go Playground 在线编程环境

For all examples in this and the next chapter, we will use Go Playground. Go Playground represents a web service that can run programs written in Go. It can be opened in a web browser using the follow

沁恒CH32在MounRiver Studio上环境配置以及使用详细教程

目录 1.  RISC-V简介 2.  CPU架构现状 3.  MounRiver Studio软件下载 4.  MounRiver Studio软件安装 5.  MounRiver Studio软件介绍 6.  创建工程 7.  编译代码 1.  RISC-V简介         RISC就是精简指令集计算机(Reduced Instruction SetCom