蓝桥杯单片机第十四届模拟题

本文介绍了如何使用国信长天单片机竞赛实训平台完成一个项目,涉及硬件配置、DS18B20温度传感器读取、PCF8591电压测量、数码管显示、串口通信、按键处理、LED指示以及继电器和蜂鸣器控制。参赛者需按照特定要求编写并调试程序以获取满分。
摘要由CSDN通过智能技术生成

一、基本要求


使用大赛组委会提供的国信长天单片机竞赛实训平台,完成本试题的程序设计与调试。程序编写、调试完成后,选手需通过考试系统提交以准考证号命名的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°C

使用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)串口返回数据格式:

“TEMP27.5°C”“Voltage1.35V”

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

3.6 LED指示灯功能

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

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

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

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

3.7 继电器控制功能

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

温度≥28°C

3.8 蜂鸣器控制功能

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

V>3.6V

3.9 初始化

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

界面切换处于解锁状态。

指示灯全部熄灭。

 代码如下

#include <STC15F2K60S2.H>
#include "onewire.h"
#include "iic.h"
#include "intrins.h"
#include "stdio.h"
sbit h1 = P3^2;
sbit h2 = P3^3;
sbit s1 = P4^4;
sbit s3 = P3^5;
void DisplaySMG_Info();
unsigned char code SMG_NoDot[18]={0xc0,0xf9,
    0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,
    0x88,0x80,0xc6,0xc0,0x86,0x8e,0xbf,0x7f};

unsigned char code SMG_Dot[10]={0x40,0x79,
    0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10};
unsigned char stat_LM = 0;
unsigned char stat_U9 = 0x00;
unsigned char num_01s = 0;
unsigned char stat_led = 0xff;
unsigned char stat_shan = 0;
unsigned char stat_UI0 = 0;
unsigned char stat_UI1 = 0;
unsigned char stat_send = 0;
unsigned char receive_data = 0;
unsigned char adc_value = 0;
float adc_volt = 0;
unsigned int adc_smg = 0;
float temp_value = 0;
unsigned int temp_smg = 0;
unsigned char UI = 0; // 0-温度界面 1-电压界面
unsigned char send_data[100];
void Delay20ms()		//@11.0592MHz
{
	unsigned char i, j, k;

	_nop_();
	_nop_();
	i = 1;
	j = 216;
	k = 35;
	do
	{
		do
		{
			while (--k);
		} while (--j);
	} while (--i);
}
void Init_timer0()
{
	TMOD = TMOD & 0xf0;
	TMOD = TMOD | 0x01;
	TH0 = (65535 - 10000) / 256;
	TL0 = (65535 - 10000) % 256;
	ET0 = 1;
	EA = 1;
	TR0 = 1;
	PT0 = 0;
}
void seveice_timer0() interrupt 1
{
	TH0 = (65535 - 10000) / 256;
	TL0 = (65535 - 10000) % 256;
	if(stat_shan == 1)
	{
		num_01s++;
		if(num_01s == 10)
		{
			num_01s = 0;
			if(stat_LM == 0)
			{
				stat_LM = 1;
			}
			else
			{
				stat_LM = 0;
			}
			
		}
	}
}
void UartInit(void)		//9600bps@12.000MHz
{
	PCON &= 0x7F;		//波特率不倍速
	SCON = 0x50;		//8位数据,可变波特率
	AUXR |= 0x40;		//定时器1时钟为Fosc,即1T
	AUXR &= 0xFE;		//串口1选择定时器1为波特率发生器
	TMOD &= 0x0F;		//清除定时器1模式位
	TMOD |= 0x20;		//设定定时器1为8位自动重装方式
	TL1 = 0xD9;		//设定定时初值
	TH1 = 0xD9;		//设定定时器重装值
	ET1 = 0;		//禁止定时器1中断
	TR1 = 1;		//启动定时器1
	EA = 1;
	ES = 1;
	PS = 1;
}
void Sevice_Uart() interrupt 4
{
	if(RI == 1)
	{
		receive_data = SBUF;
		RI = 0;
	}
	if(receive_data == 'A')
	{
		if(stat_UI0 == 0)
		{
			UI = 0;
		}
	}
	if(receive_data == 'B')
	{
		if(stat_UI1 == 0)
		{
			UI = 1;
		}
	}
}
void sendByte_Uart(unsigned char senddata)
{
	SBUF = senddata;
	while(TI == 0);
	TI = 0;
}
void sendstring_Uart(unsigned char *dat)
{
	while(*dat != '\0')
	{
		sendByte_Uart(*dat++);
	}
}
void SelectHC573(unsigned char channel,unsigned char dat)
{
	P2 = (P2 & 0x1f) | 0x00;
	P0 = dat;
	switch(channel)
	{
		case 4:
			P2 = (P2 & 0x1f) | 0x80;
		break;
		case 5:
			P2 = (P2 & 0x1f) | 0xa0;
		break;
		case 6:
			P2 = (P2 & 0x1f) | 0xc0;
		break;
		case 7:
			P2 = (P2 & 0x1f) | 0xe0;
		break;
		case 0:
			P2 = (P2 & 0x1f) | 0x00;
		break;
	}
	P2 = (P2 & 0x1f) | 0x00;
}
void DelaySMG(unsigned int t)
{
	while(t--);
}
void DisplaySMG_Bit(unsigned char pos,unsigned char value)
{
	SelectHC573(6,0x01 << pos);
	SelectHC573(7,value);
	DelaySMG(500);
	SelectHC573(6,0x01 << pos);
	SelectHC573(7,0xff);
}
void DisplaySMG_All(unsigned char value)
{
	SelectHC573(6,0xff);
	SelectHC573(7,value);
}
void Init_DS18B20_temp()
{
	unsigned char MSB,LSB;
	init_ds18b20();
	Write_DS18B20(0xcc);
	Write_DS18B20(0x44);
	do{
	init_ds18b20();
	Write_DS18B20(0xcc);
	Write_DS18B20(0xbe);
	LSB = Read_DS18B20();
	MSB = Read_DS18B20();
	MSB = (MSB << 4) | (LSB >> 4);
	}while(MSB == 85);
}
void read_DS18B20_temp()
{
	unsigned char MSB,LSB;
	unsigned int temp;
	init_ds18b20();
	Write_DS18B20(0xcc);
	Write_DS18B20(0x44);
	DisplaySMG_Info();
	init_ds18b20();
	Write_DS18B20(0xcc);
	Write_DS18B20(0xbe);
	DisplaySMG_Info();
	LSB = Read_DS18B20();
	MSB = Read_DS18B20();
	temp = MSB << 8;
	temp = temp | LSB;
	if((temp & 0xf800) == 0x0000)
	{
		temp_value = temp * 0.0625;
		temp_smg = temp_value * 10;
		if(temp_value >= 23)
		{
			stat_U9 = stat_U9 | 0x10;
			SelectHC573(5,stat_U9);
		}
		else
		{
			stat_U9 = stat_U9 & 0xef;
			SelectHC573(5,stat_U9);
		}
	}
}
void read_adc_AIN3()
{
	IIC_Start();
	IIC_SendByte(0x90);
	IIC_WaitAck();
	IIC_SendByte(0x03);
	IIC_WaitAck();
	IIC_Stop();
	
	IIC_Start();
	IIC_SendByte(0x91);
	IIC_WaitAck();
	adc_value = IIC_RecByte();
	IIC_SendAck(1);
	IIC_Stop();
	adc_volt = adc_value * (5.0 / 255);
	adc_smg = adc_volt * 100;
	if(adc_volt > 3.6)
	{
		stat_U9 = stat_U9 | 0x40;
		SelectHC573(5,stat_U9);
	}
	else
	{
		stat_U9 = stat_U9 & 0xbf;
		SelectHC573(5,stat_U9);
	}
}
void DisplaySMG_Info()
{
	if(UI == 0)
	{
		DisplaySMG_Bit(0,0xc1);
		DisplaySMG_Bit(1,SMG_NoDot[1]);
		DisplaySMG_Bit(5,SMG_NoDot[temp_smg / 100]);
		DisplaySMG_Bit(6,SMG_Dot[temp_smg / 10 % 10]);
		DisplaySMG_Bit(7,SMG_NoDot[temp_smg % 10]);
	}
	else if(UI == 1)
	{
		DisplaySMG_Bit(0,0xc1);
		DisplaySMG_Bit(1,SMG_NoDot[2]);
		DisplaySMG_Bit(5,SMG_Dot[adc_smg / 100]);
		DisplaySMG_Bit(6,SMG_NoDot[adc_smg / 10 % 10]);
		DisplaySMG_Bit(7,SMG_NoDot[adc_smg % 10]);
	}
}
void scan_key()
{
	s1 = 0;
	s3 = h1 = h2 = 1;
	if(h1 == 0) //S5
	{
		Delay20ms();
		if(h1 == 0)
		{
			stat_UI0 = 0;
			stat_UI1 = 0;
			while(h1 == 0)
			{
				DisplaySMG_Info();
			}
		}
	}
	else if(h2 == 0) // S4
	{
		Delay20ms();
		if(h2 == 0)
		{
			stat_UI0 = 1;	
			stat_UI1 = 1;
			while(h2 == 0)
			{
				DisplaySMG_Info();
			}
		}
	}
	s3 = 0;
	s1 = h1 = h2 = 1;
	if(h2 == 0)
	{
		Delay20ms();
		if(h2 == 0)
		{
			if(UI == 0)
			{
				sprintf(send_data,"TEMP:%.1f'C\r\n",temp_value);
				sendstring_Uart(send_data);
			}
			else if(UI == 1)
			{
				sprintf(send_data,"Voltage:%.2fV\r\n",adc_volt);
				sendstring_Uart(send_data);
			}
			while(h2 == 0)
			{
				DisplaySMG_Info();
			}
		}
	}
}
void led_jdq_fmq_control()
{
	if(UI == 0)
	{
		stat_led = 0xfe;
		SelectHC573(4,stat_led);
	}
	else if(UI == 1)
	{
		stat_led = 0xfd;
		SelectHC573(4,stat_led);
	}
	if(stat_UI0 == 1)
	{
		stat_shan = 1;
		if(stat_LM == 0)
		{
			stat_led = stat_led & 0xfb;
			SelectHC573(4,stat_led);
		}
		else
		{
			stat_led = stat_led | 0x04;
			SelectHC573(4,stat_led);
		}
	}
}
void main()
{
	Init_timer0();
	UartInit();
	DisplaySMG_All(0xff);
	SelectHC573(4,0xff);
	SelectHC573(5,0x00);
	Init_DS18B20_temp();
	while(1)
	{
		led_jdq_fmq_control();
		read_adc_AIN3();
		read_DS18B20_temp();
		DisplaySMG_Info();
		scan_key();
	}
}

  • 25
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值