文章目录
一、电路原理图
本课题用一种基于单片机的数据采集系统方案,该方案根据热敏电阻随温度变化而变化的特性,采用串联分压电路。单片机采集热敏电阻的电压,通过A/D转换将模拟量电压信号转换成数字量电压信号,经过查表转换得到温度值,控制LCD实时显示温度值。
二、源码
1.main
代码如下:
#include<reg52.h>
#include<intrins.h>
#include"eeprom52.h" //调用STC89C52单片机的EEPROM控制程序
#include "math.h"
#include"ADC0832.H"
#define uchar unsigned char
#define uint unsigned int
#define LCD1602_dat P0 //LCD1602的数据传输IO口
sbit LCD1602_rs=P2^5;
sbit LCD1602_rw=P2^6;
sbit LCD1602_e=P2^7;
sbit beep=P2^0; //蜂鸣器IO
sbit led_1=P1^5; //超上限指示灯
sbit led_2=P1^6;//超下限指示灯
sbit key_1=P3^5; //设置按键
sbit key_2=P3^6;//加按键
sbit key_3=P3^7;//减按键
uchar dat=0; //AD值
uint c,d;
uint DY_dat=0;
uchar ad_dat1=0; //读取滤波后的AD值
float zhi; //暂存读取的输入变量
int temp; //读取
char temp_h,temp_l; //温度上下限制存储变量
uchar state,ms; //系统设置项变量、50ms定时变量
bit s1,beep1; //设置闪烁标志位、报警标志位
void delay(uint T) //系统延时程序
{
while(T--);
}
//延时函数,i=1时,大约延时10us
void delay10us(uint c)
{
uchar a,b;
for (; c>0; c--)
{
for (b=199;b>0;b--)
{
for(a=1;a>0;a--);
}
}
}
void Read_ad()
{
static uint AD_DAT=0;
float ad_buf=0;
static uchar i=0; //定义三个变量
if(i<5) //累加,然后除以5,求取5次的平均值
{
i++;
AD_DAT+=A_D(); // 波
}
else
{
i=0; //清零,方便下次计算
ad_dat1=(uchar)(AD_DAT/5); //求取平均值
ad_buf=(float)(ad_dat1/0.51);
DY_dat=(uint)(ad_buf);
AD_DAT=0; //清零
}
}
//1602写如数据函数
void LCD1602_write(uchar order,dat) //1602 一个字节
{
LCD1602_e=0;
LCD1602_rs=order;
LCD1602_dat=dat;
LCD1602_rw=0;
LCD1602_e=1;
delay(1);
LCD1602_e=0;
}
//1602写入数据函数 指针式
void LCD1602_writebyte(uchar *prointer)
{
while(*prointer!='\0')
{
LCD1602_write(1,*prointer);
prointer++;
}
}
//初始化1602液晶
void LCD1602_cls()
{
LCD1602_write(0,0x01); //1602 清屏 指令
delay(1500);
LCD1602_write(0,0x38); // 功能设置 8位、5*7点阵
delay(1500);
LCD1602_write(0,0x0c); //设置 光标
LCD1602_write(0,0x06);
LCD1602_write(0,0xd0);
delay(1500);
}
//LCD1602液晶显示程序
void show() //显示数据
{
LCD1602_write(0,0x80); //显示位置设定
LCD1602_writebyte("Temp:");