51单片机

您所在的位置:网站首页 电流变送器设计实验报告总结 51单片机

51单片机

2024-07-17 06:47| 来源: 网络整理| 查看: 265

一、前言

在我们学习51单片机的过程中,提到温度测量,很多同学的第一反映一定是DS18B20温度传感器。DS18B20是一款物美价廉且十分简单的传感器,它的体积小,测量精度高,使得其成为很多同学的选择。但其实,除了DS18B20,还有一些其他的温度传感器可以选择,例如PT100温度变送器,它将温度信号转变为可以观测到的电信号。在日程生活中,我们所能买到的PT100,一般都是已经设计好的温度变送器,可以将0-100的温度变换为1-5V的电压,不再需要我们去自己调节。

本文将通过一个滑动变阻器模拟出PT100温度变送器所产生的4-20mA电流。首先,我们制定程序实现的功能如下:

读取PT100温度变送器产生的电流通过电阻转换为1-5V电压(滑动变阻器模拟)产生的电压,将其通过ADC0804芯片转换为数字信号。

读取转换后的数字信号,进行数字滤波。本文采取平均值滤波。

将过滤后的数字信号通过标度变换转换为温度值

将温度值通过LED数码管显示。本文采取四位数码管进行显示,包含一位小数。

当温度高于某一设定值时(本文为70摄氏度),启动蜂鸣器报警。

为了方便大家学习与测试,文末附有源码与仿真文件。如有疏漏错误之处,还请多包涵并指出。

二、装置介绍

本次实验涉及的装置如下:AT89C51芯片、12MHZ晶振、复位按钮、ADC0804芯片、1K欧姆滑动变阻器,1K欧姆电阻,蜂鸣器、三极管。

ADC0804

这是一个8位的AD转换芯片,可以将0-5V电压转换为0-255的数字。关于其的使用,网上的资料很多,这里就不在多加赘叙。

蜂鸣器

本文采取的是低电平触发的有源蜂鸣器。顾名思义,即当控制引脚为低电平时,蜂鸣器响起。由于芯片引脚电流较小,无法驱动蜂鸣器,我们一般需要增加一个三极管用来驱动。

温度变送器

LED数码管

三、代码展示

#include #include sbit adrd=P3^7; //ADC0804IO口定义 sbit adwr=P3^6; sbit adcs=P3^4; sbit intr=P2^2; sbit w1=P2^0; //数码管引脚定义 sbit w2=P2^1; sbit w3=P2^3; sbit w4=P2^4; sbit dp=P2^5; sbit buzzer=P2^7; //蜂鸣器引脚 unsigned char ad_data; int t_data; unsigned char i, j; unsigned int t_temp; unsigned char data_1=0,data_2=0,data_3=0,data_4=0,data_5=0; void ad0804(); //ADC0804函数声明 void number(); //数字滤波函数声明 void display(); //LED显示函数 unsigned char seg7code[]={0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x40}; //LED共阴字码 unsigned char n_1,n_2,n_3,n_4; /*函数:延时函数 功能:实现约2us延时*/ void delay(unsigned int t) { for(;t>0;t--); } /*函数:AD转化程序(ADC0804) 功能:将输入电压信号转为数字信号 基准电压:5V*/ void ad0804 () { P1=0xff; adcs=0; //芯片有效,启动时序 adwr =0; //启动ADC0804进行ADC采集 delay(2); //延时片刻 adwr =1; //高电平变低电平触发一次ADC转换 while(intr); // ADC转换完成后intr = 0 adcs=0; //芯片有效,读数据时序 adrd=0; //启动读数 delay(10); number(); //读数并进行数字滤波 adrd=0; adrd=1; delay(10); /*使INTR引脚自动拉高, 为下一次转化做准备*/ } /*函数:数字滤波函数 功能:读数并进行平均值数字滤波*/ void number () { switch(j) { case 1 : data_1=P1; break; case 2 : data_2=P1; break; case 3 : data_3=P1; break; case 4 : data_4=P1; break; case 5 : data_5=P1; break; } ad_data=(data_1+data_2+data_3+data_4+data_5)/5; } /*函数:温度转换函数 功能:将ADC0804数值转化为摄氏度值*/ void ad_compute() { t_data=ad_data-51; if(ad_data>=51) { t_temp=(t_data/2.04)*10; //数值转化 n_1=t_temp/1000; n_2=t_temp/100-n_1*10; n_3=t_temp/10-n_1*100-n_2*10; n_4=t_temp%10; } if(ad_data700||ad_data=51&&t_temp


【本文地址】


今日新闻


推荐新闻


    CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3