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