其他分享
首页 > 其他分享> > 【蓝桥杯】第十届蓝省赛-电压频率测量

【蓝桥杯】第十届蓝省赛-电压频率测量

作者:互联网

先上完整代码文件(自己写的,如果不足请评论区指教)
链接:https://pan.baidu.com/s/1_mdV1GQSQFg86EAKvMGnEQ
提取码:ag6i

1、题目要求

在这里插入图片描述
题目有点长,越长反而要求说的越明确,不怕代码不会写,就怕要求读不懂

2、主函数

#include<iic.h>
#include<smg.h>
#include<config.h>
u8 key,key_flag,dis=1; 
u8 buf[9],duanma[8],i;
u8 led=0xff; 
u32 k;
void Count0Init() //定时器0计数模式初始化,计数脉冲引脚P3.4
{
   TMOD = TMOD|0x05;//计数器模式工作方式1,TL0作为低八位,TH0作为高八位
   TL0 = 0;
   TH0 = 0;
   TF0 = 0;
   TR0 = 1;
   ET0 = 1;
   EA = 1;
}
void Timer1Init(void)		//1毫秒@11.0592MHz
{
	AUXR |= 0x40;		//定时器时钟1T模式
	TMOD &= 0x0F;		//设置定时器模式
	TL1 = 0xCD;		//设置定时初值
	TH1 = 0xD4;		//设置定时初值
	TF1 = 0;		//清除TF1标志
	TR1 = 1;		//定时器1开始计时
	EA = 1;
	ET1 = 1;
}
void close()
{
  P2 = (P2&0X1F)|0X80;
  P0 = 0xff;
  P2 = (P2&0X1F)|0XA0;
  P0 = 0x00;
  P2 &= 0X1F;
}

void LED(u8 i)
{
  P2 = (P2&0X1F)|0X80;
  P0 = i;
  P2 &= 0X1F;
}
u8 readkey()
{
  static u8 key_count,key_return;
  u8 key_press;
  static bit key_flag=0;
  
  key_press = P3&0x0f;
  if(key_press!=0x0f)key_count++;
  else key_count=0;

  if(key_count==2)
  {
    key_count=0;
	key_flag=1;
	switch(key_press)
	{
	  case 0x0e:key_return=7;break;
	  case 0x0d:key_return=6;break;
	  case 0x0b:key_return=5;break;
	  case 0x07:key_return=4;break;
	}
  }

  if(key_press==0x0f&&key_flag==1)
  {
    key_flag=0;
	return key_return;
  }
    return 0;
}
void main()
{
   float temp;
   u8 L1,L3,L4,L5;
   bit mode,dis_flag=0,DC_flag=1,LED_flag=1; 
   Timer1Init();close();
   Count0Init();
  while(1)
  {	  
      
      //按键扫描处理
      if(key_flag==1)
	  {
	    key_flag=0;
		temp=read_rb(3)/51.0;
		key=readkey();
		if(key!=0)
	    { 
		    switch(key)
			{
			  case 7: dis_flag=~dis_flag;break;
			  case 6: LED_flag=~LED_flag;break;
			  case 5: DC_flag=~DC_flag;break;
			  //“显示界面切换”按键,按下 S4 按键,切换选择频率显示界面和电压显示界面
			  case 4: mode=~mode;break;
			}
	    }
	  }

	  if(DC_flag)
	  {write_DAC(102);}
	  else{write_DAC(temp*51);}

	  //led处理
	  if(LED_flag)
	  {
	   if(dis_flag)L1 = 0xfe;else L1 = 0xfd;
	   if(temp<=1.5)L3=0XFF;else if(temp<2.5)L3=0xfb;else if(temp<3.5)L3=0XFF;else L3=0xfb;
	   if(k<1000)L4=0xff;else if(k<5000)L4 =0XF7;else if(k<10000)L4 =0xff;else L4 = 0xf7;
	   if(DC_flag)L5=0xff;else L5=0xef;
	   led=L1&L3&L4&L5;
	  }else led=0xff;
	  LED(led);

	   if(dis==1)
	   {
	      dis=0;
	      //数码管显示
		  if(dis_flag)
		  {
		     if(mode==0){sprintf(buf,"U%8.2f",temp);}
		     else{sprintf(buf,"F%7ld",k);}
		  }
		  else 	sprintf(buf,"        ");
		  conversion(&buf,&duanma);
	  }
	  
  }
}
void Timer1() interrupt 3
{
  static u8 m;
  static u16 n;
  if(++m==10){key_flag=1;m=0;}
  if(++i==8){i=0;}display(i,&duanma);
  if(++n%500==0)
  {
     dis=1;
  }
  //每一秒更新一次频率
  if(n==1000)
  {
      k=TH0*256+TL0;
	  TH0=0;TL0=0;
	  n=0;
  }
}

标签:break,return,u8,第十届,蓝桥,flag,key,蓝省赛,dis
来源: https://blog.csdn.net/C_white_llj/article/details/122715213