蓝桥杯第十四届蓝桥杯单片机国赛

代码参考如下

#include <STC15F2K60S2.H>
#include "iic.h"
#include "onewire.h"
#include "intrins.h"
#define TSMG 500
sbit h1 = P3^2;
sbit h2 = P3^3;
sbit s1 = P4^4;
sbit s2 = P4^2;
sbit TX = P1^0;
sbit RX = P1^1;
void read_myDistance();
void DisplaySMG_Info();
code unsigned char Seg_Table[] = {0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82,0xf8,
	                              0x80, 0x90, 0x88, 0x83, 0xc6, 0xa1, 0x86,0x8e };
code unsigned char nodot[] = {0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10};
float temp_value = 0;//采集到的温度值
unsigned int distance = 0;//采集到的距离
unsigned int temp_smg;//数码管显示的温度值
unsigned char cm_m = 0;//0-cm 1-m
unsigned char UI = 0;//0-测距 1-参数 2-工厂模式
unsigned char UI_param = 0;//0-距离参数 1-温度参数
unsigned char param_temp = 30;//温度参数
unsigned char param_dis = 40;//距离参数
unsigned char GC_mode = 0;//0-校准值设置 1-介质设置 2-DAC输出设置
char value_JZ = 0;//校准值的大小
unsigned int speed = 340;//速度大小
unsigned char dac_down = 10;//dac下限
unsigned char stat_JL = 0;//记录的标志,为1开始记录
unsigned int count_6s = 0;//6s计时
unsigned int JL_dis[50];//6S内采集到的数据
unsigned char stat_old = 0;//采集的第一个数据标志
unsigned char old_value = 0;//上一个数据
unsigned char num = 0;//6s内采集的数据总数
unsigned char stat_over = 0;//数据以完成记录
unsigned char stat_out = 0;//dac输出标志
unsigned char adc_value = 0;
unsigned char count_200ms = 0;
unsigned char stat_double = 0;//双按键
unsigned char count_2s = 0;
unsigned char stat_Init = 0;
unsigned char stat_led = 0xff;//led灯初始状态
unsigned char count_01s = 0;
unsigned char stat_shan = 0;//led灯闪的标志
unsigned char stat_JDQ = 0x00;//继电器初始状态
void Init_timer2()
{
	AUXR &= 0xfb;
	T2L = 0xf0;
	T2H = 0xd8;
	AUXR |= 0x10;
	EA = 1;
	IE2 |= 0x04;
}
void Sevece_timer2() interrupt 12
{
	DisplaySMG_Info();
	if(UI == 2)
	{
		count_01s++;
		if(count_01s == 10)
		{
			count_01s = 0;
			if(stat_shan == 0)
			{
				stat_shan = 1;
			}
			else
			{
				stat_shan = 0;
			}
		}
	}
}
void Init_timer0()
{
	TMOD &= 0xf0;
	TMOD |= 0x01;
	TH0 = 0x3c;
	TL0 = 0xb0;
	TR0 = 1;
	ET0 = 1;
	EA = 1;
}
void Sevice_timer0() interrupt 1
{
	TH0 = 0x3c;
	TL0 = 0xb0;
	count_200ms++;
	if(stat_JL == 1)
	{
		count_6s++;
		if(count_6s == 120)
		{
			stat_JL = 0;
			stat_over = 1;
		}
	}
	if(stat_double == 1)
	{
		count_2s++;
	}
	
	if(count_200ms == 4)
	{
		read_myDistance();
		count_200ms = 0;
	}
}
void Delay20ms()		//@12.000MHz
{
	unsigned char i, j, k;

	_nop_();
	_nop_();
	i = 1;
	j = 234;
	k = 113;
	do
	{
		do
		{
			while (--k);
		} while (--j);
	} while (--i);
}

void Delay12us()		//@12.000MHz
{
	unsigned char i;

	_nop_();
	_nop_();
	i = 33;
	while (--i);
}

void Init_mytemp()
{
	unsigned char LSB,MSB;
	init_ds18b20();
	Write_DS18B20(0xcc);
	Write_DS18B20(0x44);
	do{
		init_ds18b20();
		Write_DS18B20(0xcc);
		Write_DS18B20(0xBE);
		LSB = Read_DS18B20();
		MSB = Read_DS18B20();
		MSB = (MSB << 4) | (LSB >> 4);
	}while(MSB == 85);
}
void read_mytemp()
{
	unsigned char LSB,MSB;
	unsigned int temp;
	init_ds18b20();
	Write_DS18B20(0xcc);
	Write_DS18B20(0x44);
	
	init_ds18b20();
	Write_DS18B20(0xcc);
	Write_DS18B20(0xBE);
	LSB = Read_DS18B20();
	MSB = Read_DS18B20();
	temp = MSB << 8;
	temp = temp | LSB;
	if((temp & 0xf800) == 0x0000)
	{
		temp_value = temp * 0.0625;
		temp_smg = temp_value * 10;
	}
}
void Init_Wave()
{
	unsigned char i;
	for(i = 0;i < 8;i++)
	{
		TX = 1;
		Delay12us();
		TX = 0;
		Delay12us();
	}
}
void read_myDistance()
{
	unsigned int timer;
	TMOD &= 0x0f;
	TMOD |= 0x10;
	TH1 = 0;
	TL1 = 0;
	TR1 = 0;
	Init_Wave();
	TR1 = 1;
	while((RX == 1) && (TF1 == 0));
	TR1 = 0;
	if(TF1 == 0)
	{
		timer = (TH1 << 8) | TL1;
		distance = ((float)speed/20000 * timer+ value_JZ);	
	}
	else
	{
		TF1 = 0;
		distance = 0;
	}
}
void set_mydac(unsigned char value)
{
	I2CStart();
	I2CSendByte(0x90);
	I2CWaitAck();
	I2CSendByte(0x40);
	I2CWaitAck();
	I2CSendByte(value);
	I2CWaitAck();
	I2CStop();
}
void SelectHC573(unsigned char channel,unsigned char dat)
{
	P2 = (P2 & 0x1f) | 0x00;
	P0 = dat;
	switch(channel)
	{
		case 4:			
			P2 = (P2 & 0x1f) | 0x80;
		break;
		case 5:			
			P2 = (P2 & 0x1f) | 0xa0;
		break;
		case 6:			
			P2 = (P2 & 0x1f) | 0xc0;
		break;
		case 7:			
			P2 = (P2 & 0x1f) | 0xe0;
		break;
		case 0:			
			P2 = (P2 & 0x1f) | 0x00;
		break;
	}
	P2 = (P2 & 0x1f) | 0x00;
}
void DelaySMG(unsigned int t)
{
	while(t--);
}
void DisplaySMG_Bit(unsigned char pos,unsigned char value)
{
	SelectHC573(6,0x01 << pos);
	SelectHC573(7,value);
	DelaySMG(TSMG);
	SelectHC573(6,0x01 << pos);
	SelectHC573(7,0xff);
}
void DisplaySMG_All(unsigned char value)
{
	SelectHC573(6,0xff);
	SelectHC573(7,value);
}
void DisplaySMG_Info()
{
	switch(UI)
	{
		case 0:
			DisplaySMG_Bit(0,Seg_Table[temp_smg / 100]);
			DisplaySMG_Bit(1,nodot[temp_smg / 10 % 10]);
			DisplaySMG_Bit(2,Seg_Table[temp_smg % 10]);
			DisplaySMG_Bit(3,0xbf);
			if(cm_m == 0)
			{
				if(distance > 999)
				DisplaySMG_Bit(4,Seg_Table[distance / 1000]);
				if(distance > 99)
				DisplaySMG_Bit(5,Seg_Table[distance / 100 % 10]);
				if(distance > 9)
				DisplaySMG_Bit(6,Seg_Table[distance / 10 % 10]);
				DisplaySMG_Bit(7,Seg_Table[distance % 10]);
			}
			else if(cm_m == 1)
			{
				if(distance > 999)
				DisplaySMG_Bit(4,Seg_Table[distance / 1000]);
				DisplaySMG_Bit(5,nodot[distance / 100 % 10]);
				DisplaySMG_Bit(6,Seg_Table[distance / 10 % 10]);
				DisplaySMG_Bit(7,Seg_Table[distance % 10]);
			}
		break;
		case 1:
			if(UI_param == 0)
			{
				DisplaySMG_Bit(0,0x8c);
				DisplaySMG_Bit(1,Seg_Table[1]);
				DisplaySMG_Bit(6,Seg_Table[param_dis / 10]);
				DisplaySMG_Bit(7,Seg_Table[param_dis % 10]);
//				dp g f e d c b a
//				1  0 0 0 1 1 1 0
			}
			else if(UI_param == 1)
			{
				DisplaySMG_Bit(0,0x8c);
				DisplaySMG_Bit(1,Seg_Table[2]);
				DisplaySMG_Bit(6,Seg_Table[param_temp / 10]);
				DisplaySMG_Bit(7,Seg_Table[param_temp % 10]);
			}
		break;
		case 2:
			if(GC_mode == 0)
			{
				DisplaySMG_Bit(0,0x8e);
				DisplaySMG_Bit(1,Seg_Table[1]);
				if(value_JZ >= 0)
				{
					if(value_JZ > 9)
					DisplaySMG_Bit(6,Seg_Table[value_JZ / 10]);
					DisplaySMG_Bit(7,Seg_Table[value_JZ % 10]);
				}
				if(value_JZ < 0)
				{
					if((value_JZ *(-1)) > 9)
					{
						DisplaySMG_Bit(5,0xbf);
						DisplaySMG_Bit(6,Seg_Table[(value_JZ*(-1)) / 10]);
						DisplaySMG_Bit(7,Seg_Table[(value_JZ*(-1)) % 10]);
					}
					else
					{
						DisplaySMG_Bit(6,0xbf);
						DisplaySMG_Bit(7,Seg_Table[(value_JZ*(-1))]);
					}
				}
			}
			else if(GC_mode == 1)
			{
				DisplaySMG_Bit(0,0x8e);
				DisplaySMG_Bit(1,Seg_Table[2]);
				DisplaySMG_Bit(5,Seg_Table[speed / 100]);
				DisplaySMG_Bit(6,Seg_Table[speed / 10 % 10]);
				DisplaySMG_Bit(7,Seg_Table[speed % 10]);
			}
			else if(GC_mode == 2)
			{
				
				DisplaySMG_Bit(0,0x8e);
				DisplaySMG_Bit(1,Seg_Table[3]);
				DisplaySMG_Bit(6,nodot[dac_down / 10]);
				DisplaySMG_Bit(7,Seg_Table[dac_down % 10]);
			}
		break;
	}
}
void scan_key()
{
	s1 = 0;
	h1 = h2 = s2 = 1;
	if(h1 == 0)//s5
	{
		Delay20ms();
		if(h1 == 0)
		{
			if(UI == 0)
			{
				if(cm_m == 0)
				{
					cm_m = 1;
				}
				else
				{
					cm_m = 0;
				}
			}
			else if(UI == 1)
			{
				if(UI_param  == 0)
				{
					UI_param = 1;
				}
				else if(UI_param == 1)
				{
					UI_param = 0;
				}
			}
			else if(UI == 2)
			{
				if(GC_mode == 0)
				{
					GC_mode = 1;
				}
				else if(GC_mode == 1)
				{
					GC_mode = 2;
				}
				else if(GC_mode  == 2)
				{
					GC_mode = 0;
				}
			}
			while(h1 == 0);
		}
	}
	else if(h2 == 0)//s4
	{
		Delay20ms();
		if(h2 == 0)
		{
			if(UI == 0)
			{
				UI_param = 0;
				UI = 1;
			}
			else if(UI == 1)
			{
				GC_mode = 0;
				UI = 2;
			}
			else if(UI == 2)
			{
				UI = 0;
				cm_m = 0;
			}
			while(h2 == 0);
		}
	}

	s2 = 0;
	h1 = h2 = s1 = 1;
	if((h1 == 0) && (h2 == 0))
	{
		Delay20ms();
		if((h1 == 0) && (h2 == 0))
		{
			stat_double = 1;
			while((h1 == 0) && (h2 == 0));
			stat_double = 2;
		}
		
	}
	if(h1 == 0 && h2 != 0)//s9
	{
		Delay20ms();
		if(h1 == 0 && h2 != 0)
		{
			if((UI == 1) && (UI_param == 0))
			{
				if(param_dis == 10)
				{
					param_dis = 90;
				}
				else
				{
					param_dis -= 10;
				}
			}
			else if((UI == 1) && (UI_param == 1))
			{
				if(param_temp == 0)
				{
					param_temp = 80;
				}
				else
				{
					param_temp -= 1;
				}
			}
			else if((UI == 2) && (GC_mode == 0))
			{
				if(value_JZ == -90)
				{
					value_JZ = 90;
				}
				else
				{
					value_JZ -= 5;
				}
			}
			else if((UI == 2) && (GC_mode == 1))
			{
				if(speed == 10)
				{
					speed = 9990;
				}
				else
				{
					speed -= 10;
				}
			}
			else if((UI == 2) && (GC_mode == 2))
			{
				if(dac_down == 1)
				{
					dac_down = 20;
				}
				else
				{
					dac_down -= 1;
				}
			}
			if((UI == 0) && (stat_over == 1))
			{
				stat_out = 1;
			}
			while(h1 == 0);
		}
		
	}
	if(h2 == 0 && h1 != 0)//s8
	{
		Delay20ms();
		if(h2 == 0 && h1 != 0)
		{
			if((UI == 1) && (UI_param == 0))
			{
				if(param_dis == 90)
				{
					param_dis = 10;
				}
				else
				{
					param_dis += 10;
				}
			}
			else if((UI == 1) && (UI_param == 1))
			{
				if(param_temp == 80)
				{
					param_temp = 0;
				}
				else
				{
					param_temp += 1;
				}
			}
			else if((UI == 2) && (GC_mode == 0))
			{
				if(value_JZ == 90)
				{
					value_JZ = -90;
				}
				else
				{
					value_JZ += 5;
				}
			}
			else if((UI == 2) && (GC_mode == 1))
			{
				if(speed == 9990)
				{
					speed = 10;
				}
				else
				{
					speed += 10;
				}
			}
			else if((UI == 2) && (GC_mode == 2))
			{
				if(dac_down == 20)
				{
					dac_down = 1;
				}
				else
				{
					dac_down += 1;
				}
			}
			if(UI == 0)
			{
				stat_JL = 1;
			}
			while(h2 == 0);
		}
		
	}
}
void data_dac_deal()
{
	unsigned char i;
	if(stat_JL == 1)
	{
		if(stat_old == 0)
		{
			old_value = distance;
			stat_old = 1;
			JL_dis[num++] = stat_old;
		}
		if(distance != old_value)
		{
			JL_dis[num++] = stat_old;
		}
		old_value = distance;
		
	}
	if(stat_over == 1)
	{
		for(i = 0;i < num;i++)
		{
			if(JL_dis[i] < 10)
			{
				adc_value = (255.0 / 50) * dac_down;
				set_mydac(adc_value);
			}
			else if(JL_dis[i] < 90)
			{
				adc_value = ((float)(5-(float)dac_down/10)/80*JL_dis[i] + (float)(0.9*dac_down-5)/8)/(5.0/255);
			}
			else
			{
				adc_value = 255;
				set_mydac(adc_value);
			}
		}
	}
	if(stat_double == 2)
	{	
		if(count_2s > 40)
		{
			count_2s = 0;
			stat_double = 0;
			UI = 0;
			param_temp = 30;
			param_dis = 40;
			value_JZ = 0;
			speed = 340;
			dac_down = 10;
		}
	}
	
}
void led_control()
{
	if(UI == 0)
	{
		stat_led = ~(distance);
		SelectHC573(4,stat_led);
	}
	else if(UI == 1)
	{
		stat_led = 0x7f;
		SelectHC573(4,stat_led);
	}
	else if(UI == 2)
	{
		if(stat_shan == 0)
		{
			stat_led = 0xfe;
			SelectHC573(4,stat_led);
		}
		else
		{
			stat_led = 0xff;
			SelectHC573(4,stat_led);
		}
	}
	if((((param_dis - 5) <= distance) && ((param_dis + 5) >= distance)) && (temp_value <= param_temp)) 
	{
		stat_JDQ |= 0x10;
		SelectHC573(5,stat_JDQ);
	}
	else
	{
		stat_JDQ &= 0xef;
		SelectHC573(5,stat_JDQ);
	}
}
void main()
{
	Init_mytemp();
	Init_Wave();
	Init_timer0();
	Init_timer2();
	DisplaySMG_All(0xff);
	SelectHC573(4,0xff);
	SelectHC573(5,0x00);
	while(1)
	{
		if(stat_JL == 0)
		{
			scan_key();
		}
		read_mytemp();
		data_dac_deal();
		led_control();
	}
}

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值