第十四届蓝桥杯单片机组(赛题+程序)
该赛题考于2023.4.8 ,于2023.4.28 复盘。
今年的题目是比较难的了,模块多,而且逻辑也更加复杂,考了NE555、I2C、DS1302、DS18B20,同时客观题也不好做。
笔者客观题只对3个,程序题大概完成80%,勉强进入省一。
一、赛题
1.客观题
答案: 1.D 2.B 3.ABC 4.D 5.A 6.AC 7.A 8.B 9.D 10.ABD
2.程序题
二、程序
1.main.c
/* ***************************
第十四届蓝桥杯单片机组程序
by wull
2023.4.28
**************************** */
#include "STC15.h"
#include "iic.h"
#include "onewire.h"
#include "ds1302.h"
#include "intrins.h"
#define uchar unsigned char
#define uint unsigned int
code unsigned char Seg_Table[] =
{
0xc0, //0
0xf9, //1
0xa4, //2
0xb0, //3
0x99, //4
0x92, //5
0x82, //6
0xf8, //7
0x80, //8
0x90, //9
0x88, //A
0x83, //b
0xc6, //C
0xa1, //d
0x86, //E
0x8e, //F 15
0xff, //灭 16
0xbf, //- 17 10111111
0x89, //H 18 10001001
0x8c //P 19 10001100
};
//********************温湿度采集数据记录变量**************
uchar xdata temper_caiji[100]={0}; // 温度存放
uchar temper_max; // 温度最大值
long int temper_sum=0; // 温度总和
float temper_ave; // 温度平均值(浮点数)
uint temper_aver; // 温度平均值(整数)
uchar xdata shidu_caiji[100]={0}; // 湿度存放
uchar shidu_max; // 湿度最大值
long int shidu_sum=0; // 湿度总和
float shidu_ave; // 湿度平均值(浮点数)
uint shidu_aver; // 湿度平均值(整数)
//******************************************************
uchar dspcom=0; // 数码管位选标志位
uchar dspbuff[8]={16,16,16,16,16,16,16,16}; // 8个数码管
uchar now[7]={0}; // 时间的 时分秒存放
uchar ad_value; // 光敏电阻电压
uint v_value; // 光敏电阻电压*10
uchar temper,Shidu,Canshu=30,Chufa=0; // 温度,湿度,参数,触发值
uchar Jiemian=1,Huixian=1; // 界面切换值,回显界面切换值
uint count_t=0,intr=0,intr1=0,intr2=0; // 计数变量
uint count_f; // 频率计数
uint dat_f; // 频率值
bit F_key = 0,Lightstate; // 按键按下标志
uint keycount= 0; // 按键计数变量
bit flag,flag1,flag2; // 标志位
//***********************初始化**************************
void InitAll() // 初始化 关闭LED 蜂鸣器等
{
P2=(P2&0x1f)|0xa0;
P0=0x00;
P2=(P2&0x1f)|0x80;
P0=0xff;
P2=(P2&0x1f);
}
void Timer0_Init(void) // 定时器1 计数
{
TMOD = 0x1F; //设置定时器模式
TL0 = 0xff; //设置定时初始值
TH0 = 0xff; //设置定时初始值
TR0 = 1; //定时器1开始计时
ET0=1;
EA=1;
}
void Timer1_Init(void) //2毫秒@12.000MHz // 定时器2 定时2ms
{
AUXR &= 0xBF; //定时器时钟12T模式
TMOD &= 0x0F; //设置定时器模式
TL1 = 0x30; //设置定时初始值
TH1 = 0xF8; //设置定时初始值
TF1 = 0; //清