《蓝桥杯真题》:2021单片机省赛第二场(第十二届第二场)暨第十三届蓝桥杯赛前模拟试题

这篇博客主要介绍了2021年单片机省赛中涉及的程序设计,包括频率测量、通道切换、电压读取等功能。代码实现了通过P34引脚测量信号频率,并在数码管上显示。同时,利用PCA8591读取光敏电阻和电位器电压,处理数据时考虑了精度问题。此外,还涉及了按键处理和LED显示逻辑,以及定时器的使用。

2021单片机省赛第二场

有关题目

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

实现代码

注意:
频率测量功能:单片机 P34 引脚与J3 排针上的 SIGNAL 引脚短接
限制条件方面:①切换通道生效仅在电压界面。
②定时器T0作为计数器时,除了中断溢出标志TF0可以不用外,TR0也得正常开启
长按键判断完之后,要清零
④周期的单位us,不是秒!
数据准确度问题:在C语言中,1000 / 33 和 1000.0 / 33不是同样的结果!这点我们在处理电压值和频率值时会用到
处理数据:由于pcf8591读取电压读取的为上一次的值,读取光敏电阻和电位器两端电压时可能会读取不正确,为此解决方法有两个:①可以读两次,就如我们在下面main.c中所写rd_pcf8591
②可以将读取的光敏电阻和电位器两端电压值进行交换即可!
底层代码:rd_pcf8591()函数读取最后需调用iic.c中IIC_SendAck()发送非应答信号,即SDA发送一个高电平

main.c

#include "STC15F2K60S2.h"
#include "iic.h"

#define uchar unsigned char
#define uint unsigned int

sbit S7 = P3^0;
sbit S6 = P3^1;
sbit S5 = P3^2;
sbit S4 = P3^3;

sbit L1 = P0^0;
sbit L2 = P0^1;
sbit L3 = P0^2;
sbit L4 = P0^3;
sbit L5 = P0^4;

uchar jm = 0;//界面初始化频率界面
code uchar tab[] = {
   
   0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff,0x8e,0xc8,0xc1,0xbf}; 
//f、下U,U, - 11 12 13 14

uint cnt_freq;//计数1s多少个脉冲
uint curr_freq;//实时频率值

uint curr_light, curr_ain3;//分别对应通道1和3的值
uint vol, freq;//缓存电压和频率值
uchar cnt_press;//计算s7按压下去多少秒,超过20,则为长按键

bit flag_channel;//0为初始话进入通道1,1就进入通道3
bit press_s7_flag;//s7按下标志位, 1为s7按下
bit led_flag = 1;//0为熄灭,1为打开

void sys_init();
uchar rd_pcf8591(uchar addr);
void key_handle();

void dsp_smg_bit(uchar pos, val);
void display();//显示功能,分三个大块
void dsp_freq();
void dsp_period();
void dsp_vol();
void delay_k(uchar t);//延时t * 10us
void Delay1ms();		//1ms@12.000MHz,延时1ms用于给足数码管足够显示时间
void led();

void main()
{
   
   
	sys_init();
	while(1)
	{
   
   
		curr_light = (uint)(rd_pcf8591(0x01) * 100.0 / 51);
		curr_ain3 = (uint)(rd_pcf8591(0x03) * 100.0 / 51);
		key_handle();
		display();
		led();
	}
}

void led()
{
   
   
	if (led_flag)//led此时正常点亮
	{
   
   
		if (curr_ain3 > vol)
		{
   
   
			P2 = (P2 & 0x1f) | 0x80;
			L1 = 0;
		}
		if (curr_freq > freq)
		{
   
   
			P2 = (P2 
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值