蓝桥杯单片机第十届省赛

 

 

 

#include <reg52.h>
#include	<iic.h>
sbit s4=P3^3;
sbit s5=P3^2;
sbit s6=P3^1;
sbit s7=P3^0;
sbit L1=P0^0;
sbit L2=P0^1;
sbit L3=P0^2;
sbit L4=P0^3;
sbit L5=P0^4;
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};
unsigned int dat_f;//频率数据
unsigned int dat_uu;//采取电阻数据
float dat_uuu;//电压转换数据
unsigned int dat_u;//电压数据
unsigned int count_f;
unsigned char count;
unsigned char flag_s4=0;
bit flag_s5=0;
bit led_s6=0;
bit smg_s7=0;
void led();
void delaysmg(unsigned int t)
{
 	while(t--);
}
void displaysmg_byte(unsigned char pos,unsigned char value)
{
  P2=0XE0;P0=0XFF;
  P2=0XC0;P0=0X01<<pos;
  P2=0XE0;P0=value;
}
void init_Time()
{
  TH0=0XFF;
  TL0=0XFF;
  TH1=(65535-50000)/256;
  TL1=(65535-50000)%256;//定时50ms
  TMOD=0X16;
  EA=1;
  ET0=1;
  ET1=1;
  TR0=1;
  TR1=1;
}
void service_t0() interrupt 1
{
	count_f++;
}
void service_t1() interrupt 3
{
 	TH1=(65535-50000)/256;
   TL1=(65535-50000)%256;//定时50ms
	count++;
	if(count==20)//定时1s
	{
		 dat_f=count_f;
		 count=0;
		 count_f=0;
	}	
}
void display_f()//频率显示界面
{
	if(dat_f>9999)
	{
	 	displaysmg_byte(3,smg_nodot[dat_f/10000]);
		delaysmg(100);
	}
	if(dat_f>999)
	{
	 	displaysmg_byte(4,smg_nodot[(dat_f/1000)%10]);
		delaysmg(100);
	}
	if(dat_f>99)
	{
	 	displaysmg_byte(5,smg_nodot[(dat_f/100)%10]);
		delaysmg(100);
	}
	if(dat_f>9)
	{
	 	displaysmg_byte(6,smg_nodot[(dat_f/10)%10]);
		delaysmg(100);
	}
	displaysmg_byte(7,smg_nodot[dat_f%10]);
	delaysmg(100);
	displaysmg_byte(0,0x8e);
	delaysmg(100);
	displaysmg_byte(1,0xff);
	delaysmg(100);
	displaysmg_byte(2,0xff);
	delaysmg(100);
}
void display_U()//电压显示界面
{
	displaysmg_byte(5,smg_dot[dat_u/100]);
	delaysmg(100);
	displaysmg_byte(6,smg_nodot[(dat_u/10)%10]);
	delaysmg(100);
	displaysmg_byte(7,smg_nodot[dat_u%10]);
	delaysmg(100);
	displaysmg_byte(0,0xc1);
	delaysmg(100);
	displaysmg_byte(1,0xff);
	delaysmg(100);
	displaysmg_byte(2,0xff);
	delaysmg(100);
	displaysmg_byte(3,0xff);
	delaysmg(100);
	displaysmg_byte(4,0xff);
	delaysmg(100);
}
void read_Rb2()
{
	IIC_Start();
	IIC_SendByte(0x90);
	IIC_WaitAck();
	IIC_SendByte(0x03);
	IIC_WaitAck();
	IIC_Stop();

	IIC_Start();
	IIC_SendByte(0x91);
	IIC_WaitAck();
	dat_uu=IIC_RecByte();
	IIC_WaitAck();
	IIC_SendAck(1);
	IIC_Stop();

	dat_uuu=dat_uu*(5.0/255);
	dat_u=dat_uuu*100;
}
void display()
{
	 if(smg_s7==0)//数码管显示功能启用
	 {
		 switch(flag_s4)
		 {
		 	 case 0:
			 display_f();break;
			 case 1:
			 if(flag_s5==1)//电压随电位器Rb2变化模式
			 {
			 	read_Rb2();
				display_U();
			 }
			 else if(flag_s5==0)//电压固定为2.0v模式 
			 {
			 	dat_u=200;
				display_U();
			 }
		 }
	}
	else if(smg_s7==1)//数码管显示功能启用
	{
	 	P2=0XC0;P0=0XFF;
		P2=0XE0;P0=0XFF;
		led();
	}
}
void key()
{
	if(s4==0)//s4,界面切换按键
	{
	 	delaysmg(100);
		if(s4==0)
		{
			while(s4==0)
			{
				display();
			}
		   flag_s4++;
		}
		if(flag_s4==2)
		{
		  flag_s4=0;
		}
	}
	if(s5==0) //s5,电压输出模式切换按键
	{
		delaysmg(100);
		if(s5==0)
		{
		 	while(s5==0)
			{
				display();
			}
		   flag_s5=~flag_s5;
		}
	}
	if(s6==0)//s6,led功能控制按键
	{
		delaysmg(100);
		if(s6==0)
		{
			while(s6==0)
			{
				display();
			}
			led_s6=~led_s6;
		}
	}
	if(s7==0)//s7,数码管显示功能按键
	{
		delaysmg(100);
		if(s7==0)
		{
			while(s7==0)
			{
				display();
			}
			smg_s7=~smg_s7;
		}
	}
}
void led()//led模块
{
	 P2=0X80;
	 if(led_s6==0)//启用led功能模式
	 {
	  	read_Rb2();
		if(flag_s4==1)  L1&=0;

		if(flag_s4==0)  L2&=0;

		if(dat_u<150)   L3&=1;
		if(dat_u>=150&&dat_u<250)   L3&=0;
		if(dat_u>=250&&dat_u<350)	 L3&=1;
		if(dat_u>=350)	 L3&=0;

		if(dat_f<1000)	L4&=1;
		if(dat_f>=1000&&dat_f<5000)	L4&=0;
		if(dat_f>=5000&&dat_f<10000)	L4&=1;
		if(dat_f>=10000)	L4&=0;

		if(flag_s5==0)	  L5&=1;
		if(flag_s5==1)	  L5&=0;
	 }
	 else if(led_s6==1)//关闭led功能模式
	 {
	  	P0=0xff;
	 }
}
void main()
{
  P2=0XA0;P0=0X00;P2=0X80;P0=0XFF;
  init_Time();
  while(1)
  {
  	  key();
	  led();
	  display();
  }
}

 

 

猜你喜欢

转载自blog.csdn.net/m0_57263863/article/details/123962932