51单片机 简易温度采集与控制装置

使用IAP15F2K61S2单片机搭建的温度采集与控制装置已调试成功,但存在温度读数1度的波动问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

MCU型号:IAP15F2K61S2

还好是1T的单片机,不知道换成普通的12T单片机会不会跪。。终于调统了,不过温度采集不太稳定,有1度的波动。

/*
**********************************************************************
                    简易温度采集与控制装置
文件名:main.c
功能概述:
    初始化数码管显示温度区间和当前温度,温度上限和温度下限默认为30度
    和20度,用户可以通过矩阵键盘输入自己设定的温度区间,键盘提供set和clear
    功能,首先按下set进入设置模式,
    输入错了可以倒退并修改。如果输入的区间不符合逻辑,即最大值比
    最小值还小,则L2灯常亮,提示用户输入错误,需重新倒退回输入,直到
    输入正确后L2灯才熄灭。输入完后按下set键返回温度实时显示模式。
    将当前温度和温度区间比较得到三个area,
    根据不同的area,L1灯分别以0.8s,0.4s,0.2s的频率闪烁。当温度超过
    温度上限时,继电器打开,执行相应的动作,否则关闭。
**********************************************************************
*/
#include "stc15f2k60s2.h"
#include "stdint.h"

extern pdata uint8_t dspBuf[8];
extern uint8_t tmr0LowByte, tmr0HighByte, tmr1LowByte, tmr1HighByte;

extern void keyDriver();
extern void keyScan();
extern void configTmr0Millis(uint8_t ms);
extern void configTmr1Millis(uint8_t ms);
extern void digitalTubeScan();
extern bit startDs18b20();
extern bit getDs18b20Temperature(int16_t * temp);
extern uint8_t getIntPart(int16_t temp);
extern uint8_t getDecPart(int16_t temp);
//extern void ledScan();

sbit led1 = P0^0;
sbit led2 = P0^1;
sbit relay = P0^4;

int16_t temperature;
uint8_t maxT = 30, minT = 20, intT, decT, area, nowArea;
bit flag1s = 0;
bit setData = 0;
uint16_t upper;	//timer1
code uint8_t dspInitMode1[8] = {
	11, 10, 10, 10, 10, 11, 10, 10
};					  //0  1  2	 3	4  5  6	 7
//code uint8_t next[8] = {0, 2, 6, 0, 0, 0, 7, 1};
//code uint8_t pre[8] =  {0, 7, 1, 0, 0, 0, 2, 6};
code uint8_t pos[5] = {0, 1, 2, 6, 7};

void init();
uint8_t calcArea();
void responseArea();
void operateRelay();

void main() {
	bit res;

	//init();
    configTmr0Millis(2);
	configTmr1Millis(10);
	startDs18b20();
    while (1) {
		keyDriver();
		if (flag1s) {
			flag1s = 0;
			res = getDs18b20Temperature(&temperature);
			if (res) {
				intT = getIntPart(temperature);
				decT = getDecPart(temperature);
				nowArea = calcArea();
				if (nowArea != area) {
					area = nowArea;
					responseArea();
				}

				if (setData == 0) {
					dspBuf[7] = decT;
					dspBuf[6] = decT % 10;
					dspBuf[5] = intT / 10;
					dspBuf[4] = 10;
					dspBuf[3] = 10;
					dspBuf[2] = 10;
					dspBuf[1] = area;
					dspBuf[0] = 11;
				}
			}
			startDs18b20();
		}
	}
}

void init() {
	uint8_t i;

	//minT = 20;
	//maxT = 30;
	for (i = 0; i < 8; i
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值