蓝桥杯51单片机国赛(9)

 

 

本次的长短按键部分有点问题,但目前没有想出原因,这套题一开始把数据储存界面的切换状态看成S7控制/(ㄒoㄒ)/~~后期改的可能有点乱,以后有时间可能会重新完善一下,这套题我认为要注意EEPROM一个地址最大放255因此存储的时候要处理一下,至于L8的闪烁,我觉得在电压状态下闪比较合理(主要这样可以偷懒),但是如果要所以界面都可以闪的话,我也还是没有想好怎么写,其他的应该没有什么问题了,欢迎大家批评指正~~~

main.c 

#include<stc15f2k60s2.h>
#include"onewire.h"
#include"iic.h"
unsigned char wei[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
unsigned char duan[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf,0xff,0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10,0x8e,0xc1,0xc6,0x8c,0x89};//0~11不带点,22F,23U,24c,25p,26h
unsigned char tab[8]={11,11,11,11,11,11,11,11};
unsigned int count_f;//频率计数中间值
unsigned int dat_f;//频率计数最终值
unsigned char key_mode=0;
unsigned char pageadd=0;//回显状态下的翻页计数
unsigned char setadd=0;//设置状态下的增加
bit show_xb=0;//测量和回显
bit show_xs=0;//测量和设置
bit key_save=0;
bit key_showback=0;
bit flag_L8=0;
bit led_flag=0;
bit key_flag=0;
bit flag_fast=0;


void delayms(unsigned int ms)
{
	int i,j;
	for(i=0;i<ms;i++)
	for(j=0;j<845;j++);
}

void HC_138(unsigned char m)
{
	switch(m)
	{
		case(4):P2|=0X80;P2&=0X9F;break;
		case(5):P2|=0XA0;P2&=0XBF;break;
		case(6):P2|=0XC0;P2&=0XDF;break;
		case(7):P2|=0XE0;P2&=0XFF;break;
	}
}

void allinit()
{
	HC_138(4);P0=0XFF;
	HC_138(5);P0=0X00;
	HC_138(6);P0=0X00;
	HC_138(7);P0=0XFF;
}

void timerinit()
{
	TMOD=0x16;
	TH1=(65536-1000)/256;
	TL1=(65536-1000)%256;  
	TH0=0xff;
	TL0=0xff;
	EA=1;
	TR1=1;
	ET1=1;
	ET0=1;
	TR0=1;
}

void time0() interrupt 1
{
    count_f++;
}

void time1() interrupt 3
{
	static int t=0,i=0,m=0,k=0,n=0;
	TH1=(65536-1000)/256;
	TL1=(65536-1000)%256;
	t++;
	if(t==1000)
	{
		dat_f=count_f;
		count_f=0;
		t=0;
	}
	HC_138(6);
	P0=wei[i];
	HC_138(7);
	P0=duan[tab[i]];
	i++;
	if(i==8)
	i=0;
	m++;
	if(m==100)
	{
		m=0;
		led_flag=~led_flag;
	}
	if(key_flag==1)
	{
		k++;
		if(k==2000)
		{
			k=0;
			flag_fast=1;
			key_flag=0;
		}
		else
		flag_fast=0;
	}
	if(flag_L8==1)
	{
		n++;
		if(n==800)
		{
			HC_138(4);
			P0=0x7b;
			n=0;
		}
	}
}
//三种模式下的数码管显示
void show_f()
{
	tab[0]=22;
	tab[1]=11;
	tab[2]=11;
	if(dat_f>=10000)
	{
		tab[3]=dat_f/10000;
		tab[4]=dat_f%10000/1000;
		tab[5]=dat_f%1000/100;
		tab[6]=dat_f%100/10;
		tab[7]=dat_f%10;
	}
	if(dat_f>=1000&dat_f<10000)
	{
		tab[3]=11;
		tab[4]=dat_f/1000;
		tab[5]=dat_f%1000/100;
		tab[6]=dat_f%100/10;
		tab[7]=dat_f%10;
	}
	if(dat_f>=100&dat_f<1000)
	{
		tab[3]=11;
		tab[4]=11;
		tab[5]=dat_f/100;
		tab[6]=dat_f%100/10;
		tab[7]=dat_f%10;
	}
}

void show_t()
{
	tab[0]=24;
	tab[1]=11;
	tab[2]=11;
	tab[3]=11;
	tab[4]=tempget()/1000;
	tab[5]=tempget()%1000/100+12;
	tab[6]=tempget()%100/10;
	tab[7]=tempget()%10;
}

void show_u()
{
	tab[0]=23;
	tab[1]=11;
	tab[2]=11;
	tab[3]=11;
	tab[4]=11;
	tab[5]=11;
	tab[6]=(AD_read(0x03)*19)/1000+12;
	tab[7]=(AD_read(0x03)*19)%1000/100;
	
}
按键
void keyscan()
{
	if(P33==0)
	{
		delayms(10);
		if(P33==0) //s4
		{
			if(key_showback==0)
			{
				key_mode++;
				show_xb=0;
				pageadd=0;
			}
	        if(key_showback==1)
			{
				pageadd++;
				if(pageadd==3)
				pageadd=0;
			}
	    }
		while(!P33);
    }
	if(P32==0) //s5
	{
		delayms(10);
		if(P32==0)
		{
		key_save=1;
		}
		while(!P32);
	}
	if(P31==0)//s6
	{
//		delayms(10);
//		if(P31==0)
//		{
			key_flag=1;
			flag_L8=0;
			if(flag_fast==0)
			{
				key_mode=0;
			    HC_138(4);
		        P0=0xff;
				if(show_xs==0)
				{
					key_showback=~key_showback;
					show_xb=~show_xb;
				}
				if(show_xs==1)
				{
					setadd++;
					EEPROM_WRITE(0x34,setadd);//设定值
		            delayms(10);
					if(setadd>=51)
					setadd=0;
				}
			}
			else if(flag_fast==1)
			{
				
				if(show_xs==1)
					{
						setadd=setadd+10;
						if(setadd>=51)
						setadd=0;
						key_flag=0;
						flag_fast=0;
					}
			}
		
		    while(!P31);
//		}
	}

	if(P30==0)//s7
	{
		delayms(10);
		if(P30==0)
		{
			HC_138(4);
	        P0=0xff;
			flag_L8=0;
			key_mode=0;
			if(key_showback==0)
			{
			show_xs=~show_xs;
			}
		}
		while(!P30);
	}

}

void keyshow()
{

	if(show_xb==0&show_xs==0)
	{
		if(key_mode%3==0)
		{
			show_t();
			if(led_flag==1)
			{
				HC_138(4);
				P0=~0x01;
			}
		}
		if(key_mode%3==1)
		{
			show_u();
			if(led_flag==1)
			{
				HC_138(4);
				P0=~0x04;
			}
			if(setadd<(AD_read(0x03)*0.19))
			{
			flag_L8=1;
			}
			else
			flag_L8=0;
		}
		if(key_mode%3==2)
		{
			show_f();
			if(led_flag==1)
				{
					HC_138(4);
					P0=~0x02;
				}
		}
	}

	if(show_xs==1)
	{
		tab[0]=25;
		tab[1]=11;
		tab[2]=11;
		tab[3]=11;
		tab[4]=11;
		tab[5]=11;
		tab[6]=EEPROM_READ(0x34)/10+12;
		tab[7]=EEPROM_READ(0x34)%10;
	}
	if(key_save==1)
	{
		unsigned char low,high;
		unsigned char p1,p2,p3;
		p1=dat_f/10000;
		p2=dat_f%1000/100;
		p3=dat_f%100;
		high=tempget()/100;
		low=tempget()-100*high;
		key_save=0;
		EEPROM_WRITE(0x01,low);//温度值
		delayms(10);
		EEPROM_WRITE(0x02,high);//温度值
		delayms(10);
		EEPROM_WRITE(0x12,(AD_read(0x03)*0.19));//电压值
		delayms(10);
		EEPROM_WRITE(0x13,p1);//频率值
		delayms(10);
		EEPROM_WRITE(0x23,p2);//频率值
		delayms(10);
		EEPROM_WRITE(0x33,p3);//频率值
		delayms(10);
//		EEPROM_WRITE(0x34,setadd);//设定值
//		delayms(10);
	}
	if(key_showback==1&show_xb==1)
	{
		tab[0]=26;
		tab[2]=11;
		if(pageadd==0)
		{
			delayms(10);
			tab[1]=24;
			tab[3]=11;
			tab[4]=EEPROM_READ(0x02)/10;
			tab[5]=EEPROM_READ(0x02)%10+12;
			tab[6]=EEPROM_READ(0x01)/10;
			tab[7]=EEPROM_READ(0x01)%10;
		}
		if(pageadd==1)
		{
			tab[1]=23;
			tab[3]=11;
			tab[4]=11;
			tab[5]=11;
			tab[6]=EEPROM_READ(0x12)/10+12;
			tab[7]=EEPROM_READ(0x12)%10;
		}
		if(pageadd==2)
		{
			tab[1]=22;
			if(EEPROM_READ(0x13)!=0)
			{
				tab[3]=EEPROM_READ(0x13);
				tab[4]=EEPROM_READ(0x23)/10;
				tab[5]=EEPROM_READ(0x23)%10;
				tab[6]=EEPROM_READ(0x33)/10;
				tab[7]=EEPROM_READ(0x13)%10;
			}
			if(EEPROM_READ(0x13)==0&(EEPROM_READ(0x23)/10!=0))
			{
				tab[3]=11;
				tab[4]=EEPROM_READ(0x23)/10;
				tab[5]=EEPROM_READ(0x23)%10;
				tab[6]=EEPROM_READ(0x33)/10;
				tab[7]=EEPROM_READ(0x13)%10;
			}
			if(EEPROM_READ(0x13)==0&(EEPROM_READ(0x23)/10==0))
			{
				tab[3]=11;
				tab[4]=11;
				tab[5]=EEPROM_READ(0x23)%10;
				tab[6]=EEPROM_READ(0x33)/10;
				tab[7]=EEPROM_READ(0x13)%10;
			}
			if(EEPROM_READ(0x13)==0&(EEPROM_READ(0x23)==0))
			{
				tab[3]=11;
				tab[4]=11;
				tab[5]=11;
				tab[6]=EEPROM_READ(0x33)/10;
				tab[7]=EEPROM_READ(0x13)%10;
			}

		}

	}




}
void main()
{
	allinit();
	timerinit();
	while(1)
	{
		keyscan();
		keyshow();
		
	}
}




iic自己写的部分,其他就是用的给定的驱动代码 

//AD读数据
unsigned char AD_read(unsigned char add)
{
	 unsigned char temp;
	 IIC_Start(); 
	 IIC_SendByte(0x90);
	 IIC_WaitAck();
	 IIC_SendByte(add);
	 IIC_WaitAck();  
	 IIC_Stop();
	 IIC_Start(); 
	 IIC_SendByte(0x91);
	 IIC_WaitAck();
	 temp=IIC_RecByte();
	 IIC_Stop();
	 return temp;
}
///EEPROM存储
void EEPROM_WRITE(unsigned char add,unsigned int dat)
{
     IIC_Start(); 
	 IIC_SendByte(0xA0);
	 IIC_WaitAck();
	 IIC_SendByte(add);
	 IIC_WaitAck();
	 IIC_SendByte(dat);
	 IIC_WaitAck();
	 IIC_Stop();  
}
///EEPROM读取
unsigned char EEPROM_READ(unsigned char add)
{
     unsigned char temp;
     IIC_Start(); 
	 IIC_SendByte(0xA0);
	 IIC_WaitAck();
	 IIC_SendByte(add);
	 IIC_WaitAck();  
	 IIC_Stop();
	 IIC_Start(); 
	 IIC_SendByte(0xA1);
	 IIC_WaitAck(); 
	 temp=IIC_RecByte();
	 IIC_Stop();
	 return temp;
}

onewire自己补充的部分,要注意的是延时时间要扩大10倍 

unsigned int tempget()
{
	unsigned char low,high;
	unsigned int temp;
	init_ds18b20();
	Write_DS18B20(0xcc);
	Write_DS18B20(0x44);
	Delay_OneWire(200);
	init_ds18b20();
	Write_DS18B20(0xcc);
	Write_DS18B20(0xbe);
	low=Read_DS18B20();
	high=Read_DS18B20();
	high=high&0x0f;
	temp=(unsigned int)(((high<<8)|low)*6.25 );
	return temp;
}

 

 

 

  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值