1. 程式人生 > 其它 >藍橋杯-微控制器-簡易溫度採集與控制裝置

藍橋杯-微控制器-簡易溫度採集與控制裝置

技術標籤:藍橋杯

一、題目來源

我的題目說明是來自這個博主的部落格:(感謝)https://blog.csdn.net/fanjufei123456/article/details/105134291

二、程式碼實現

main.c檔案內容

#include <STC15F2K60S2.H>
#include "port.h"
#include "key.h"
#include "onewire.h"

unsigned char code smg_duan[] = {0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F
,0x6F,0x00,0x40}; unsigned char code smg_wei[8] = {0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80}; unsigned char menu[][8] = {{11, 0, 11, 10, 10, 10, 0, 0}, {11, 10, 10, 10, 10, 11, 10, 10}}; unsigned char oper_mode, disp_index, Tmax = 30, Tmin = 20, temperature, range, input[4], input_cnt; unsigned char key_val; unsigned int timer2_count; bit keyflag,
tick_200ms; void Timer2Init(void) //1000微秒@11.0592MHz { AUXR |= 0x04; //定時器時鐘1T模式 T2L = 0xCD; //設定定時初值 T2H = 0xD4; //設定定時初值 AUXR |= 0x10; //定時器2開始計時 IE2 |= 0x04; //開定時器2中斷 } //中斷服務程式 void t2int() interrupt 12 //中斷入口 { static unsigned char i; LED_Com(0x00); LED_Bit(smg_wei[i]); LED_Com
(smg_duan[menu[disp_index][i]]); if(++i == 8) i = 0; if(timer2_count % 20 == 0) { key_val = KeyScan(); keyflag = 1; } if(timer2_count % 200 == 0) tick_200ms = 1; if(++timer2_count == 1000) { timer2_count = 0; } } void Set_clear(void) { unsigned char i; for(i = 0; i < 4; ++i) input[i] = 10; input_cnt = 0; menu[1][1] = 10; menu[1][2] = 10; menu[1][6] = 10; menu[1][7] = 10; } void main(void) { unsigned char tmp_max, tmp_min, cnt_200ms; bit led_800ms, led_400ms, led_200ms; Relay(0); Buzzer(0); LED(0x00); Timer2Init(); EA = 1; Gettemperature(); while(1) { if(keyflag) { keyflag = 0; if(0 <= key_val && key_val <= 9 && oper_mode == 1 && input_cnt < 4) input[input_cnt++] = key_val; else if(key_val == 10) { if(oper_mode == 0) { oper_mode = 1; disp_index = 1; Set_clear(); } else if(oper_mode == 1) { if(input_cnt == 4) { tmp_max = input[0]*10 + input[1]; tmp_min = input[2]*10 + input[3]; if(tmp_max <= tmp_min) LED(0x02);//L2常亮 else { oper_mode = 0; disp_index = 0; Tmax = tmp_max; Tmin = tmp_min; Set_clear(); } } else { oper_mode = 0; disp_index = 0; Set_clear(); } } else if(oper_mode == 1 && input_cnt < 4) { } } else if(key_val == 11 && oper_mode == 1)//清除鍵 { Set_clear(); LED(0x00); } } if(tick_200ms) { tick_200ms = 0; if(oper_mode == 0)//溫度顯示模式 { temperature = Gettemperature(); ++cnt_200ms; if(temperature < Tmin) { range = 0; Relay(0); led_800ms = 1; LED(cnt_200ms/2%2); } else if(temperature > Tmax) { Relay(1); led_200ms = 1; range = 2; LED(cnt_200ms/8%2); } else if(Tmin <= temperature && temperature <= Tmax) { range = 1; Relay(0); led_400ms = 1; LED(cnt_200ms/4%2); } menu[0][1] = range; menu[0][6] = temperature / 10; menu[0][7] = temperature % 10; } else if(oper_mode == 1)//溫度上下限設定模式 { menu[1][1] = input[0]; menu[1][2] = input[1]; menu[1][6] = input[2]; menu[1][7] = input[3]; } } } }

port.c檔案內容

#include <STC15F2K60S2.H>
#include <intrins.h>
#include "port.h"

unsigned char bdata control;
sbit relay = control^4;
sbit buzzer = control^6;

void Relay(unsigned char k)
{
	relay = k;
	P0 = control;
	P2 = 0xa0;
	_nop_();
	P2 = 0x00;
}

void Buzzer(unsigned char k)
{
	buzzer = k;
	P0 = control;
	P2 = 0xa0;
	_nop_();
	P2 = 0x00;
}

void LED(unsigned char k)
{
	P0 = ~k;
	P2 = 0x80;
	_nop_();
	P2 = 0x00;
}

void LED_Bit(unsigned char k)
{
	P0 = k;
	P2 = 0xc0;
	_nop_();
	P2 = 0x00;
}

void LED_Com(unsigned char k)
{
	P0 = ~k;
	P2 = 0xe0;
	_nop_();
	P2 = 0x00;
}

key.c檔案內容

#include <STC15F2K60S2.H>
#include "key.h"

unsigned char KeyScan(void)
{
	static unsigned char tmp2;
	unsigned char key1, key2, readData, val, tmp1;
	
	P44 = 1; P42 = 1; P3 = 0xf0;
	if(P44 == 0)
		key1 = 0x80;
	else if(P42 == 0)
		key1 = 0x40;
	else if(P35 == 0)
		key1 = 0x20;
	else if(P34 == 0)
		key1 = 0x10;
	else
		key1 = 0x00;
	
	P44 = 0; P42 = 0; P3 = 0x0f;
	key2 = ~P3 & 0x0f;
	
	readData = key1 | key2;
	tmp1 = readData &(readData ^ tmp2);
	tmp2 = readData;
	switch(tmp1)
	{
		case 0x88:val = 9;break;
		case 0x84:val = 6;break;
		case 0x82:val = 3;break;
		case 0x81:val = 0;break;
		
		case 0x48:val = 10;break;//設定
		case 0x44:val = 7;break;
		case 0x42:val = 4;break;
		case 0x41:val = 1;break;
		
		case 0x28:val = 11;break;//清除
		case 0x24:val = 8;break;
		case 0x22:val = 5;break;
		case 0x21:val = 2;break;
		
		default:val = 12;break;
	}
	return val;
}

onewire.c檔案內容

/*
  ԌѲ˵ķ: ե؜ПȽ֯ԌѲ
  ɭݾ۷޳: Keil uVision 4.10 
  Ӳݾ۷޳: CT107եƬܺ؛ۏʵѵƽ̨(΢ҿާֱ12MHz) STC89C52RCեƬܺ
  ɕ    ǚ: 2011-8-9
*/
#include "reg52.h"
#include "onewire.h"

sbit DQ = P1^4;  //ե؜Пޓࠚ

//ե؜Пғʱگ˽
void Delay_OneWire(unsigned int t)  //STC89C52RC
{
	t *= 7;
	while(t--);
}

//ͨڽե؜ПвDS18B20дһٶؖޚ
void Write_DS18B20(unsigned char dat)
{
	unsigned char i;
	for(i=0;i<8;i++)
	{
		DQ = 0;
		DQ = dat&0x01;
		Delay_OneWire(5);
		DQ = 1;
		dat >>= 1;
	}
	Delay_OneWire(5);
}

//ՓDS18B20ׁȡһٶؖޚ
unsigned char Read_DS18B20(void)
{
	unsigned char i;
	unsigned char dat;
  
	for(i=0;i<8;i++)
	{
		DQ = 0;
		dat >>= 1;
		DQ = 1;
		if(DQ)
		{
			dat |= 0x80;
		}	    
		Delay_OneWire(5);
	}
	return dat;
}

//DS18B20ʨѸԵʼۯ
bit init_ds18b20(void)
{
  	bit initflag = 0;
  	
  	DQ = 1;
  	Delay_OneWire(12);
  	DQ = 0;
  	Delay_OneWire(80);
  	DQ = 1;
  	Delay_OneWire(10); 
    initflag = DQ;     
  	Delay_OneWire(5);
  
  	return initflag;
}

float Gettemperature(void)
{
	unsigned char th, tl;
	unsigned int temp;
	
	init_ds18b20();
	Write_DS18B20(0xcc);
	Write_DS18B20(0x44);
	Delay_OneWire(400);
	
	init_ds18b20();
	Write_DS18B20(0xcc);
	Write_DS18B20(0xbe);
	tl = Read_DS18B20();
	th = Read_DS18B20();
	
	temp = th << 8 | tl;
	return temp * 0.0625f;
}