关于第一个蓝桥杯省赛题目功能全部实现——十二届

首先是,对于越界问题,在定义时int型搞成了char型以至于越界,问题出现在,DA转换

对于题目最后出现的LED,一开始搞在了按键,出现的问题是,只有按住才会亮,最后放在数码管位置,问题解决。

对于键盘这部分,仁者见仁智者见智,问题出现在不大。

对于键盘加减这部分,一开始想着在定义一个,后来发现完全没必要,在界面切换部分,使用mode,完全没必要在定义一个。

十二届里面最考验人的,莫过于模式二部分,想了好久,后来参考小蜜蜂代码,详情请浏览WWW.XMF393.com (真心牛的老师)

IIc以及onewier下载在蓝桥杯官网,改动部分,这里就不在赘述了。

接下来,看代码:

<乱码部分,是编辑器之间转换问题,不影响程序运行>

<因为作者英语不是很好,部分函数名是拼音首字母/🤦‍>

#include "stc15f2k60s2.h"
#include "iic.h"
#include "onewire.h"

sbit R1=P3^2;
sbit R2=P3^3;
sbit C1=P4^4;
sbit C2=P4^2;

#define TSMG 500

unsigned char code SMG_NODOT[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
unsigned char code SMG_DOT[10]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10};

float temp_ds18b20=0;
unsigned char mode=0;
unsigned int smg_ds18b20=0;
unsigned int param=25;//²ÎÊýÉèÖÃ
unsigned char ms=1;
unsigned int adc_val=0;//===============>>
unsigned char star_led=0xff;


//======================Ëø´æÆ÷Ñ¡Ôñ======================================
void Service_HC573(unsigned char channel,unsigned char val)
{
	P2=(P2&0x1f)|0x00;
	P0=val;
	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;
	}
}
//==========================ÊýÂë¹ÜÏÔʾ================================
void DelaySMG(unsigned int t)
{
	while(t--);
}
void DisplaySMG_Bit(unsigned char pos,unsigned char val)
{
	Service_HC573(6,0x01<<pos);
	Service_HC573(7,val);
	DelaySMG(TSMG);
	Service_HC573(6,0x01<<pos);
	Service_HC573(7,0xff);
}
void DisplaySMG_All(unsigned char val)
{
	Service_HC573(6,0xff);
	Service_HC573(7,val);
}
void DisplaySMG()
{
	switch(mode)
	{
		case 0:
			Service_HC573(4,(star_led|0xfe)&0xfd);
			smg_ds18b20=temp_ds18b20*100;
			DisplaySMG_Bit(7,SMG_NODOT[smg_ds18b20%10]);
			DisplaySMG_Bit(6,SMG_NODOT[(smg_ds18b20/10)%10]);
			DisplaySMG_Bit(5,SMG_DOT[(smg_ds18b20/100)%10]);
			DisplaySMG_Bit(4,SMG_NODOT[smg_ds18b20/1000]);
			DisplaySMG_Bit(0,0xc6);
		break;
		case 1:
			Service_HC573(4,(star_led|0xfe)&0xfb);
			DisplaySMG_Bit(7,SMG_NODOT[param%10]);
			DisplaySMG_Bit(6,SMG_NODOT[param/10]);
			DisplaySMG_Bit(0,0x8c);
		break;
		case 2:
			Service_HC573(4,(star_led|0xfe)&0xf7);
			DisplaySMG_Bit(7,SMG_NODOT[adc_val%10]);
			DisplaySMG_Bit(6,SMG_NODOT[(adc_val/10)%10]);
			DisplaySMG_Bit(5,SMG_DOT[adc_val/100]);
			DisplaySMG_Bit(0,0x88);
		break;
	}
}
//=====================DS18B20==========

void Init_DS18B20_temp()
{
	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_DS18B20_temp()
{
	unsigned char LSB,MSB;
	unsigned int temp=0;
	init_ds18b20();
	DisplaySMG();
	Write_DS18B20(0xcc);
	Write_DS18B20(0x44);
	DisplaySMG();
	
	init_ds18b20();
	DisplaySMG();
	Write_DS18B20(0xcc);
	Write_DS18B20(0xbe);
	LSB=Read_DS18B20();
	MSB=Read_DS18B20();
	
	temp=MSB;
	temp=(temp<<8)|LSB;
	if((temp&0xf800)==0x0000)
	{
		temp_ds18b20=temp*0.0625;
	}
	DisplaySMG();
}


//=================Ä£ÄâÁ¿Êä³ö====================
void Set_PCF8591_DAC(unsigned char dat)
{
	IIC_Start();
	IIC_SendByte(0x90);
	IIC_WaitAck();
	IIC_SendByte(0x40);
	IIC_WaitAck();
	IIC_SendByte(dat);
	IIC_WaitAck();
	IIC_Stop();
}
//==================ģʽÅжÏ=====================
void MSpd()
{

	unsigned char adc_vol=0;
	Read_DS18B20_temp();
	switch(ms)
	{
		case 1:
			if(smg_ds18b20<(param*100))
			{
				adc_val=0;
			}
			if(smg_ds18b20>(param*100))
			{
				adc_val=500;
			}
			star_led=star_led&~0x01;
			Service_HC573(4,star_led);//==============>>
		break;
			case 2:
			if(smg_ds18b20<2000)
			{
				adc_val=100;
			}
			if(smg_ds18b20>4000)
			{
				adc_val=400;
			}
			if((smg_ds18b20>2000)&&(smg_ds18b20<4000))
			{
				adc_val=15*(smg_ds18b20-2000);
				adc_val=(adc_val/100)+100;
			}
			star_led=0xff;
			Service_HC573(4,star_led);
		break;
	}
	adc_vol=adc_val*0.51;
	Set_PCF8591_DAC(adc_vol);
}


void Delay(unsigned int t)
{
	while(t--);
}
void Scan_keys()
{
	R1=1;R2=0;
	C1=1;C2=1;
	if(C1==0)//S4
	{
		Delay(500);
		if(C1==0)
		{
			switch(mode)
			{
				case 0://ζÈ
					mode=1;
//					Service_HC573(4,star_led&(~0x02));
				break;
				case 1://²ÎÊý
					mode=2;
//					Service_HC573(4,star_led&(~0x04));
				break;
				case 2://DACÊä³ö
					mode=0;
//					Service_HC573(4,star_led&(~0x08));
				break;
			}
			while(C1==0)
			{
				if(mode==0)
				{
					Read_DS18B20_temp();
				}
				DisplaySMG();
			}
		}	
	}
	R1=0;R2=1;
	if(C1==0)//S5
	{
		Delay(500);
		if(C1==0)
		{
			switch(ms)
			{
				case 1:
					ms=2;
				break;
				case 2:
					ms=1;
				break;
			}
			while(C1==0)
			{
				DisplaySMG();
			}
		}
	}
	if(C2==0)//S9
	{
		Delay(500);
		if(C2==0)
		{
			if(mode==1)
			{
				param=param+1;
			}
			while(C2==0)
			{
				DisplaySMG();
			}
		}
	}
	R1=1;R2=0;
	if(C2==0)
	{
		Delay(500);
		if(C2==0);
		{
			if(mode==1)
			{
				param=param-1;
			}
			while(C2==0)
			{
				DisplaySMG();
			}
		}
	}
}
//===================³õʼ»¯========
void Init_System()
{
	Service_HC573(5,0x00);
	Service_HC573(4,0xff);
	Init_DS18B20_temp();
}


void main()
{
	Init_System();
	while(1)
	{
		MSpd();
		Read_DS18B20_temp();
		DisplaySMG();
		Scan_keys();
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值