十四届蓝桥杯单片机模拟考试2程序题

本文介绍了一个使用IAP15F2K61S2单片机的程序,实现温度和电压的显示、DS18B20传感器读取、PCF8591电压测量、按键处理、LED指示和串口通信等功能,以及对继电器和蜂鸣器的控制,满足特定的性能和响应时间要求。
摘要由CSDN通过智能技术生成

代码

main.c

#include <tim.h>
#include <seg.h>
#include <key.h>
#include <iic.h>
#include <uart.h>
#include <stdio.h>
#include <onewire.h>

unsigned char Seg_Buf[10],Seg_Code[8],Seg_Pos,Seg_Dly;
unsigned char Key_Up,Key_Down,Key_Old,Key_Val,Key_Dly;
unsigned char ucStr[15],Uart_Buf,Uart_Mod;
unsigned char Sys_Mod;
unsigned int  Temper;
unsigned char volt;
unsigned char ucLED,LED_Dly,LED_t;
unsigned char ucBuzz,Buzz_Dly;

void Seg_Proc(void);
void Key_Proc(void);
void Uart_Proc(void);
void LED_Proc(void);
void Buzz_Proc(void);

void main(void)
{
	Close_Ws();
	Timer1_Init();
	UartInit();
	
	while(1)
	{
		Seg_Proc();
		Key_Proc();
		Uart_Proc();
		LED_Proc();
		Buzz_Proc();
	}
}

void Seg_Proc(void)
{
	if(Seg_Dly) return;
	Seg_Dly=1;
	
	switch(Sys_Mod)
	{
		case 0:
			Temper=Read_Temper();
			if(Temper/16 == 85) sprintf(Seg_Buf,"U1      ");
			else sprintf(Seg_Buf,"U1   %03.1f",Temper/16.0);
			Seg_Tran(Seg_Buf,Seg_Code);
		break;
		case 1:
			volt=Raed_ADC();
			sprintf(Seg_Buf,"U2   %03.2f",(unsigned int)(volt*5.00)/255.00);
			Seg_Tran(Seg_Buf,Seg_Code);
		break;
			
	}
}

void Key_Proc(void)
{
	if(Key_Dly) return;
	Key_Dly=1;
	
	Key_Val=Read_Key();
	Key_Down=Key_Val&(Key_Old^Key_Val);
	Key_Up=~Key_Val&(Key_Old^Key_Val);
	Key_Old=Key_Val;
	
	if(Key_Down==4) Uart_Mod=1;

	if((Key_Down==5)&&(Uart_Mod==1)) 
	{
		Uart_Buf=0xff;
		Uart_Mod=0;
	}
	
	if(Key_Down==12) 
	{
		switch(Sys_Mod)
		{
			case 0:
				sprintf(ucStr,"TEMP:%03.1f℃",Temper/16.0);
				Send_UartStr(ucStr);
			break;
			case 1:
				sprintf(ucStr,"Voltage:%03.2fV",(unsigned int)(volt*5.00)/255.00);
				Send_UartStr(ucStr);
			break;
		}
	}
	
}

void Uart_Proc(void)
{
	if(Uart_Mod==0)
	{
		if(Uart_Buf == 'A') Sys_Mod=0;
		else if(Uart_Buf == 'B') Sys_Mod=1;
	}
}

void LED_Proc(void)
{
	if(LED_Dly) return;
	LED_Dly=1;
	
	switch(Sys_Mod)
	{
		case 0:ucLED=ucLED&0xfc|0x01;break;
		case 1:ucLED=ucLED&0xfc|0x02;break;
	}
	
}

void Buzz_Proc(void)
{
	if(Buzz_Dly) return;
	Buzz_Dly=1;
	
	if(((Temper/16)>=28) && (Temper/16 != 85))	ucBuzz=ucBuzz&0xef|0x10;
	else ucBuzz=ucBuzz&0xef;
	
	if(((volt*5.0)/255.0)>3.6) ucBuzz=ucBuzz&0xbf|0x40;
	else ucBuzz=ucBuzz&0xbf;
	
	
	Buzz_Disp(ucBuzz);
}

void Uart_Isr(void) interrupt 4
{
	if(RI)
	{
		Uart_Buf=SBUF;
		RI=0;
	}
}

void Timer1_Isr(void) interrupt 3
{
	if(Uart_Mod==1)
	{
		LED_t++;
		if(LED_t==100)
		{
			ucLED^=0x04;
			LED_t=0;
		}
	}
	else ucLED=ucLED&0xfb;
	
	LED_Disp(ucLED);
	
	Seg_Disp(Seg_Code,Seg_Pos);
	if(++Seg_Pos==8) Seg_Pos=0;
	
	if(++Seg_Dly==200) Seg_Dly=0;
	
	if(++Key_Dly==10) Key_Dly=0;
	
	if(++LED_Dly==100) LED_Dly=0;
	
	if(++Buzz_Dly==10) Buzz_Dly=0;
}

题目

一、基本要求


使用大赛组委会提供的国信长天单片机竞赛实训平台,完成本试题的程序设计与调试。程序编写、调试完成后,选手需通过考试系统提交以准考证号命名的hex文件。不符合以上文件提交要求的作品将被评为零分或者被酌情扣分。

硬件设置:

将IAP15F2K61S2单片机内部振荡器频率设定为12MHz,串口通信波特率为9600bps

键盘工作模式跳线J5配置为KBD矩阵按键模式。

扩展方式跳线J13配置为IO模式。

请注意:选手需严格按照以上要求配置竞赛板,编写和调试程序,不符合以上配置要求的作品将被评为零分或者被酌情扣分。

二、硬件框图


图1 系统硬件框图

三、功能描述 


3.1 基本功能描述

1)通过串口控制数码管显示界面:“温度显示界面”或“电压显示界面”;也可以返回当前数码管显示的数据。  

2)通过读取DS18B20温度传感器,获取环境温度。

3)通过 PCF8591 的 ADC 通道测量电位器 RB2 的输出电压。

4)通过数码管显示获取的温度数据和采集的电压数据,显示界面可以通过串口切换。

5)通过LED指示灯完成题目要求的指示功能。

6)根据题目要求完成继电器和蜂鸣器的控制功能。

3.2 性能要求

1)按键动作响应时间:≤0.2 秒

2)指示灯动作响应时间:≤0.1 秒

3.3 显示功能

温度显示界面

温度显示界面如图2所示,显示内容包括界面提示符(U1)和温度数据,单位为℃。

图2 温度显示界面(27.5℃)

使用3位数码管显示温度数据,温度数据保留小数点后1位有效数字。

电压显示界面

电压显示界面如图3所示,显示内容包括界面提示符(U2)和电压数据,单位为V。

图3 电压显示界面(1.35V)

使用3位数码管显示电压数据,电压数据保留小数点后2位有效数字。

3.4 按键功能

1)按键S4定义为“锁定”按键,按下S4按键,能够锁定当前界面“温度显示界面”或“电压显示界面”,串口切换界面指令失效。

2)按键S5定义为“解锁”按键,在界面锁定时,按下S5按键,可取消界面锁定,串口指令恢复控制。

3)按键S12定义为“发送”按键,每次按下,串口将当前数码管显示的数据发送给PC端的串口调试工具。

注意:

(1)按键S5仅在界面锁定时有效。

(2)判断按键是否按下时,需进行消抖操作,避免单次按键操作,触发多次结果。

3.5 串口功能

1)串口接收到指令字符‘A’,进入温度显示界面。

2)串口接收到指令字符‘B’,进入电压显示界面。

3)串口返回数据格式:

 “TEMP:27.5℃”或“Voltage:1.35V”

注意: 注意区分字母大小写。

3.6 LED指示灯功能

当前界面处于温度显示界面时,L1指示灯点亮,否则熄灭。

当前界面处于电压显示界面时,L2指示灯点亮,否则熄灭。

当前界面处于锁定状态时,L3指示灯以0.1s的时间间隔亮、灭,否则熄灭。

其余指示灯均处于熄灭状态。

3.7 继电器控制功能

继电器状态受温度控制,将采集的温度数据记为T,若当前采集的温度满足下列条件时,继电器吸合,否则,继电器断开。

T≥28℃

3.8 蜂鸣器控制功能

蜂鸣器状态受电压控制,将采集的电压数据记为V,若当前采集的电压满足下列条件时,蜂鸣器发声,否则蜂鸣器静音。

V>3.6V

3.9 初始化

上电数码管默认处于温度显示界面。

界面切换处于解锁状态。

指示灯全部熄灭。

  • 15
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
第十三届蓝桥杯单片机模拟是一个使用单片机来实现一定功能目。具体要求如下: 目要求使用单片机控制一个LED灯,根据输入的字进行闪烁的频率控制。在开始时,需要通过按键输入一个0-9之间的字,该字代表了闪烁的频率,字越大表示闪烁的频率越快。然后,用一个LED灯来表示这个输入的字。 解决这个目的思路如下: 首先,我们需要配置单片机的IO口,将一个IO口连接到LED灯上,用于控制LED的亮灭。 然后,我们需要添加中断功能,使得按键输入可以被响应。当按键被按下时,会触发一个外部中断,进入中断服务函。 在中断服务函中,我们可以通过读取按键的状态得到输入的字,并将该字储存起来。 接下来,我们使用定时器来控制LED灯的闪烁频率。我们设置一个定时器,周期性地执行一个中断服务函。在这个中断服务函中,我们可以控制LED灯的亮灭状态。利用先前输入的字,可以确定LED灯的闪烁频率。 最后,我们需要在主函中进行一些初始化操作,如配置IO口、中断和定时器,并进入一个无限循环中。在循环中,程序将一直等待按键输入,并根据输入的字进行相关操作。 总结起来,第十三届蓝桥杯单片机模拟通过按键输入一个字来控制LED灯的闪烁频率。通过配置IO口、中断和定时器,我们可以实现这个功能。这道目考察了对单片机的基本操作和中断定时器的使用,是一个综合性较强的目。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值