单片机项目 温度记录仪




单片机项目 温度记录仪_第1张图片




main.c

/**
 *	工程名称:温度记录仪
 *	Mode 0: 温度采集间隔选择模式,用以确定温度采集间隔
 *	Mode 1: 采集并显示实时时间,采集温度并缓存
 *  Mode 2: 查看采集到的10个温度样本   
 *    
 *
 */

#include <stc15f2k60s2.h>
#include "stdint.h"
#include "timer.h"
#include "digitalTube.h"
#include "independentKey.h"
#include "DS18B20.h"
#include "DS1302.h"

uint8_t mode = 0;	//工作模式
uint8_t code collectingPeriod[4] = { 1, 10, 30, 60 };	//温度采集间隔
uint8_t periodIndex = 0;	//温度采集间隔选择索引
//bit realTimeLock = 1, temperatureLock = 1;	//采集温度和实时时间的锁变量
int16_t temperature;	//采集到的温度
uint8_t temperIntBuf[10];	//采集到的温度的整数部分缓冲
uint8_t temperIndex = 0, temperLookingIndex = 0;
bit flag200ms = 0, flagTemper = 0;	//200ms采集一次RTC,采集温度的标志

sTime_t time;
uint16_t cnt200ms = 0, maxCnt;

void displayMode0();
void displayMode1();
void displayMode2();
void L1On();
void L1Off();

void main() {
	uint8_t temperInt, temperDec;
	uint8_t preSec = 0;

	configTmr0(2);
	DS18B20_start();
	DS1302init();
	displayMode0();

	while (1) {
		keyDriver();	//驱动按键
		if (mode == 1) {	//如果是模式1(采样温度和时间)
			if (flag200ms) {
				flag200ms = 0;
				cnt200ms++;
				getRealTime(&time);	//200ms到了,采样一次实时时间
				if (time.sec != preSec) {	//秒有变化,更新显示
					displayMode1();
				}
				preSec = time.sec;

				if (cnt200ms == maxCnt) {  //该采样温度了
					cnt200ms = 0;
					DS18B20_getTemperature(&temperature);
					DS18B20_start();	//要重新启动!
					temperInt = getIntPart(temperature);
					temperDec = getDecPart(temperature);
					if (temperDec >= 5)	//四舍五入
						temperInt++;
					temperIntBuf[temperIndex] = temperInt;
					if (temperIndex == 9) {	//温度采样达到10个
						mode = 2;			//转模式2
						displayMode2();
						L1On();
					} else {
						temperIndex++;
					}
					
				}
			}
		}
	}
} 

void keyAction(uint8_t keyCode) {	//在主循环中
	switch (keyCode) {
	case 3:		//按键是S4
		if (mode == 0) {	//如果当前是模式0
			if (periodIndex == 3) {	//切换至下一索引
				periodIndex = 0;
			} else {
				periodIndex++;
			}
			dspBuf[7] = collectingPeriod[periodIndex] % 10;	//更新显示
			dspBuf[6] = collectingPeriod[periodIndex] / 10;
		}
		break;
	case 2:		//按键是S5
		if (mode == 0) {	//如果当前是模式0
			mode = 1;		//切换至模式1
			maxCnt = collectingPeriod[periodIndex] * 5;	//计算200ms的个数
			displayMode1();
			//realTimeLock = 0;
			//temperatureLock = 0;
		}
		break;
	case 1:		//按键是S6
		if (mode == 2) {	//如果当前是模式2
			if (temperLookingIndex == 9) {	//切换至下一索引
				temperLookingIndex = 0;
			} else {
				temperLookingIndex++;
			}
			dspBuf[7] = temperIntBuf[temperLookingIndex] % 10;	 //更新显示
			dspBuf[6] = temperIntBuf[temperLookingIndex] / 10;
			dspBuf[2] = temperLookingIndex % 10;
			dspBuf[1] = temperLookingIndex / 10;
		}
		break;
	case 0:		//按键是S7
		if (mode == 2) {	//如果当前是模式2
			mode = 0;		//切换至模式0
			temperIndex = 0;
			temperLookingIndex = 0;
			periodIndex = 0;	//初始化
			displayMode0();
			L1Off();
		}
	}
}

void tmr0ISR() interrupt 1 {
	//static uint16_t cnt = 0;
	static uint8_t cnt = 0;

	TL0 = tmr0LowByte; //不要忘了
	TH0 = tmr0HighByte;

	digitalTubeScan();
	if ((cnt & 0x03) == 0)
		keyScan();
	
	cnt++;
	if (cnt == 100) {
		cnt = 0;
		flag200ms = 1; 
	}
}

void displayMode0() {
	dspBuf[0] = 10;		//不显示
	dspBuf[1] = 10;
	dspBuf[2] = 10;
	dspBuf[3] = 10;
	dspBuf[4] = 10;
	dspBuf[5] = 11;		//分隔符
	dspBuf[6] = collectingPeriod[periodIndex] / 10;
	dspBuf[7] = collectingPeriod[periodIndex] % 10;
}

void displayMode1() {
	static bit flag = 0;

	dspBuf[0] = time.hour >> 4;	//BCD码
	dspBuf[1] =	time.hour & 0x0F;
	dspBuf[2] = (flag ? 10 : 11);//间隔一秒显示一次
	dspBuf[3] = time.minute >> 4;
	dspBuf[4] = time.minute & 0x0F;
	dspBuf[5] = (flag ? 10 : 11);
	dspBuf[6] = time.sec >> 4;
	dspBuf[7] = time.sec & 0x0F;
	flag = ~flag;
}

void displayMode2() {
	dspBuf[0] = 10;
	dspBuf[1] = temperLookingIndex / 10;
	dspBuf[2] = temperLookingIndex % 10;
	dspBuf[3] = 10;
	dspBuf[4] = 10;
	dspBuf[5] = 10;
	dspBuf[6] = temperIntBuf[temperLookingIndex] / 10;
	dspBuf[7] = temperIntBuf[temperLookingIndex] % 10;		
}

void L1On() {
	P2 = (P2 & 0x1F) | 0x80;
	//P0 &= 0xFE;	//最低位清0
	P0 = 0xFE;
	P2 &= 0x1F;
}

void L1Off() {
	P2 = (P2 & 0x1F) | 0x80;
	//P0 |= 0x01;
	P0 = 0xFF;
	P2 &= 0x1F;
}


你可能感兴趣的:(单片机项目 温度记录仪)