蓝桥杯单片机——第十二届省赛部分问题

题目要求:

 

 根据题目要求本次涉及到了数码管显示、LED、NE555测量频率、PCF8091模块、独立按键

数码管显示:共有三个界面要显示。周期界面我理解为T= \frac{1}{f} (也来自于NE555)

LED显示:

这个模块与S7的长短按键关系十分密切。其中S7长短按键的用法参考了小蜜蜂老师的定时器方法https://blog.csdn.net/ohy3686/article/details/82927113

unsigned char count_7 = 0;//用于定时器计时
unsigned char K_7 = 0;//当开关按下后变为1开关断开后变为0
unsigned char K_7_flag = 0;//用于长按键循环
void key()
{
   if(S7 == 0)
   {
   	  delay(10);
	  if(S7 == 0)
	  {
	      K_7 = 1;
		  while(S7 == 0)
		  {
		     Display();
		  }
		     K_7 = 0;
			 if(count_7 > 5)   //按键长按
             {    
               K_7_flag++;
			   if(K_7_flag > 1)
			   {
			   	 K_7_flag = 0;
			   }
             }
             else              //按键短按
             {
               temp_1_stay = temp_1;//保存当前采集到的频率数据
             }
             count_7 = 0;      //按键计数值清零
		   
	  }
   }
}
//定时器
void InitTimer() //定时器1定时,定时器0计数
{
  TMOD = 0x16;
  
  TH0 = 0xff;
  TL0 = 0xff;
  TH1 = (65536-50000)/256;
  TL1 = (65536-50000)%256;

  EA = 1;
  ET0 = 1;
  ET1 = 1;
  TR0 = 1;
  TR1 = 1;
} 
void Timer1() interrupt 3
{
  TH1 = (65536-50000)/256;
  TL1 = (65536-50000)%256;
  
  count_t++;//测量频率用
  if(count_t == 20)
  {
  	 temp_1 = count_f;
	 temp_2 = 100000/count_f;
	 count_t = 0;
	 count_f = 0;
  } 

  if(K_7 != 0)
  {
  	count_7++;
  }
}
//S7长按键的功能判断在main函数中

PCF8091 :

涉及到光敏电阻、电位器的电压AD转换结果的显示问题。需要把0~255转换为0~5V内的电压显示

unsigned char i;//选择通道变量
unsigned char date;//存放得到的数据
//==================================电压
void ad_read()
{
  IIC_Start();
  IIC_SendByte(0x90);
  IIC_WaitAck();
  IIC_SendByte(i);
  IIC_WaitAck();
  IIC_Stop();

  IIC_Start();
  IIC_SendByte(0x91);
  IIC_Stop();
  date = IIC_RecByte();
  IIC_SendAck(0);
}

在电压显示:

void work()
{
    ad_read();
	temp_3 = date*(50000/255)/100;//此时数码管显示两位小数的0~5v电压
	a = 0xc1;//1100 0001
	b = 0xbf;//1011 1111
	c = SMG[i];
	d = 0xff;
	e = 0xff;
	f = SMG_Point[temp_3/100];
	g = SMG[(temp_3/10)%10];
	h = SMG[temp_3%10];
}
//abcdefgh对于数码管的8位显示内容

主函数:

长按键循环功能判断尝试了很多方法。如果只是简单的在key函数中判断K_7_flag对应的是关灯还是显示,这样得到的结果虽然能实现长按后关灯再长按后开灯,但是LED灯不再具有实时显示的功能。最终尝试放入主函数中的while(1)后完成了题目要求。

void main()
{  
  InitSystem();
  InitTimer();
  while(1)
  {
	key();
  	Work();

	Display();

	if(K_7_flag == 1)//长按键循环功能判断
    {
  	   stat_LED = 0xff;
	   InitHC138(4);
	   P0 = stat_LED;
    }
    else 
    {
       LED ();//只有将判断放入while(1)中LED才能实时显示
    }
  }
}

如果有更简单的方法欢迎大家提出。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
蓝桥杯单片机第十一省赛题目要求参赛选手使用单片机实现一个特定的功能,具体要求可能会随着每一比赛的不同而有所变化。在回答此问题时,需要明确具体的题目要求和实现功能,并进行详细的说明。 由于没有提供具体的第十一省赛题目的信息,我无法给出具体的答案。不过,可以给出一个示例性的回答来说明如何回答此类问题。 示例回答: 根据蓝桥杯单片机第十一省赛题目要求,我们的任务是设计一个智能家居控制系统。该系统需要能够实现以下功能: 1. 控制家中的照明系统:可以通过单片机控制灯的开关,调节灯的亮度和颜色。 2. 控制家中的窗帘系统:可以通过单片机控制窗帘的升降和角度。 3. 监测室内温湿度:单片机需要连接温湿度传感器,实时获取室内的温度和湿度数据,并可以进行显示或记录。 4. 天气预报功能:通过网络模块连接互联网,获取实时的天气数据,并在单片机上进行显示或语音输出。 5. 安全警报系统:单片机需要能够检测门窗是否关闭,若有异常情况,比如门窗未关闭或有人非法进入,则触发警报。 6. 远程控制功能:通过手机APP或网页,可以远程控制智能家居系统。 根据以上的题目要求,我们可以先设计硬件部分,选择合适的传感器和执行器,并将其与单片机进行连接。然后,编写相应的代码,实现上述功能。最后,进行调试和测试,确保系统的正常运行和功能完备。 这仅为一个示例回答,具体的第十一省赛题目要求可能与此不同。如需了解具体题目要求,请参考官方的赛题公告。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值