第16届蓝桥杯单片机模拟试题Ⅲ

news2025/4/16 14:03:20

试题

代码 

sys.h

#ifndef __SYS_H__
#define __SYS_H__

#include <STC15F2K60S2.H>
//sys.c
extern unsigned char UI;					//界面标志(0湿度界面、1参数界面、2时间界面)
extern unsigned char time;				//时间间隔(1s~10S)
extern bit ssflag;								//启动/停止标志(0启动、1停止)
void init74hc138(unsigned char n);//译码器选通
void init();											//系统初始化
void relay(bit flag);							//继电器吸合控制
void led(unsigned char n);				//LED控制
void led_if();										//led指示灯
//iic.c
extern unsigned char shidu;						//湿度值
extern unsigned char shidu_canshu;		//湿度参数(30%~90%)
extern bit flag_relay;								//继电器状态
unsigned char adc(unsigned char addr);//模数转换选通
float get_Vrb2();											//获取RB2电压值
void get_shidu();											//RB2电压值转换为湿度数据
//seg_key.c
extern unsigned char Seg_Buff[8];//数码管缓存
void Key_Loop();								 //按键扫描
void Seg_Loop();								 //数码管刷新
void seg_ui();									 //界面选择
#endif

main.c

#include "sys.h"
bit flag_seg=0;
bit flag_key=0;
bit flag_shidu=0;
bit flag_relay_con=0;
void Timer0_Init(void)		//100微秒@12.000MHz
{
	AUXR |= 0x80;			//定时器时钟1T模式
	TMOD &= 0xF0;			//设置定时器模式
	TL0 = 0x50;				//设置定时初始值
	TH0 = 0xFB;				//设置定时初始值
	TF0 = 0;				//清除TF0标志
	TR0 = 1;				//定时器0开始计时
	ET0 = 1;				//使能定时器0中断
	EA = 1;
}
void main(){
	init();
	Timer0_Init();
	get_shidu();
	while(1){
		if(flag_seg){
			flag_seg=0;
			Seg_Loop();
		}
		if(flag_key){
			flag_key=0;
			Key_Loop();
			seg_ui();
		}
		if(flag_shidu){
			flag_shidu=0;
			get_shidu();
			seg_ui();
		}
		if(flag_relay_con){
			flag_relay_con=0;
			flag_relay=0;
			relay(0);
		}
		led_if();
	}
}
void Timer0_Isr(void) interrupt 1
{
	static unsigned char count1=0;
	static unsigned char count2=0;
	static unsigned int count3=0;
	static unsigned int count4=0;
	count1++;count2++;count3++;
	if(count1==2){
		count1=0;
		flag_seg=1;
	}
	if(count2==50){
		count2=0;
		flag_key=1;
	}
	if(count3==1000){
		count3=0;
		flag_shidu=1;
	}
	if(flag_relay){
		count4++;
		if(count4==((unsigned int)time*10000)){
			count4=0;
			flag_relay_con=1;
		}
	}
}

sys.c

#include "sys.h"
unsigned char UI=0;
unsigned char time=3;
bit ssflag=1;
void init74hc138(unsigned char n){
	P2=(P2&0x1f)|(n<<5);
	P2&=0x1f;
}
void init(){
	P0=0x00;
	init74hc138(5);
	P0=0xff;
	init74hc138(4);
}
void relay(bit flag){
	if(flag) P0=0x10;
	else P0=0x00;
	init74hc138(5);
}
void led(unsigned char n){
	P0=~(0x01<<(n-1));
	init74hc138(4);
}
void led_if(){
	switch(UI){
		case 0:led(1);break;
		case 1:led(2);break;
		case 2:led(3);break;
	}
	if(!ssflag) led(8);
}

seg_key.c

#include "sys.h"
sbit COL1=P4^4;
sbit COL2=P4^2;
sbit ROW3=P3^2;
sbit ROW4=P3^3;
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
	0xc6,//C 10
	0x86,//E 11 
	0x89,//H 12
	0xff	//熄灭 13
};
unsigned char Seg_Buff[8]={13,13,13,13,13,13,13,13};
unsigned char keyval,keyold,keyup,keydown;
unsigned char key_scan(){
	COL1=0;COL2=1;
	if(ROW4==0) return 4;
	if(ROW3==0) return 5;
	COL1=1;COL2=0;
	if(ROW4==0) return 8;
	if(ROW3==0) return 9;
	return 0;
}
void Key_Loop(){
	keyval=key_scan();
	keydown=keyval&(keyold^keyval);
	keyup=~keyval&(keyold^keyval);
	//s4为界面切换按键
	if(keyval==4&&keyold!=4){
		UI++;
		if(UI==3) UI=0;
	}
	//s5为启动停止按键
	if(keyval==5&&keyold!=5){
		ssflag=!ssflag;
	}
	//s8为减按键
	if(keyval==8&&keyold!=8){
		if(UI==1){
			if(shidu_canshu>30)
				shidu_canshu-=5;
			else
				shidu_canshu=90;
		}else if(UI==2){
			if(time>1)
				time--;
			else
				time=10;
		}
	}
	//s9为加按键
	if(keyval==9&&keyold!=9){
		if(UI==1){
			if(shidu_canshu<90)
				shidu_canshu+=5;
			else
				shidu_canshu=30;
		}else if(UI==2){
			if(time<10)
				time++;
			else
				time=1;
		}
	}
	keyold=keyval;
	keyval=0;
}
void seg(unsigned char addr,num){
	P0=0xff;
	init74hc138(7);
	P0=0x01<<addr;
	init74hc138(6);
	P0=Seg_Table[num];
	init74hc138(7);
}
void Seg_Loop(){
	static unsigned char i=0;
	seg(i,Seg_Buff[i]);
	i++;
	if(i==8) i=0;
}
//湿度界面
void ui0(){
	Seg_Buff[7]=shidu%10;
	Seg_Buff[6]=shidu/10;
	Seg_Buff[5]=13;
	Seg_Buff[4]=13;
	Seg_Buff[3]=13;
	Seg_Buff[2]=13;
	Seg_Buff[1]=13;
	Seg_Buff[0]=10;//C
}
//参数界面
void ui1(){
	Seg_Buff[7]=shidu_canshu%10;
	Seg_Buff[6]=shidu_canshu/10;
	Seg_Buff[5]=13;
	Seg_Buff[4]=13;
	Seg_Buff[3]=13;
	Seg_Buff[2]=13;
	Seg_Buff[1]=13;
	Seg_Buff[0]=11;//E
}
//参数界面
void ui2(){
	Seg_Buff[7]=time%10;
	if(time<10)
		Seg_Buff[6]=13;
	else
		Seg_Buff[6]=1;
	Seg_Buff[5]=13;
	Seg_Buff[4]=13;
	Seg_Buff[3]=13;
	Seg_Buff[2]=13;
	Seg_Buff[1]=13;
	Seg_Buff[0]=12;//H
}
void seg_ui(){
	switch(UI){
		case 0:ui0();break;
		case 1:ui1();break;
		case 2:ui2();break;
	}
}

ii.c

#include "sys.h"
#include "intrins.h"
#define DELAY_TIME	10
sbit scl=P2^0;
sbit sda=P2^1;
unsigned char shidu;
unsigned char shidu_canshu=50;
bit flag_relay=0;
static void I2C_Delay(unsigned char n)
{
    do
    {
        _nop_();_nop_();_nop_();_nop_();_nop_();
        _nop_();_nop_();_nop_();_nop_();_nop_();
        _nop_();_nop_();_nop_();_nop_();_nop_();		
    }
    while(n--);      	
}
void I2CStart(void)
{
    sda = 1;
    scl = 1;
	I2C_Delay(DELAY_TIME);
    sda = 0;
	I2C_Delay(DELAY_TIME);
    scl = 0;    
}
void I2CStop(void)
{
    sda = 0;
    scl = 1;
	I2C_Delay(DELAY_TIME);
    sda = 1;
	I2C_Delay(DELAY_TIME);
}
void I2CSendByte(unsigned char byt)
{
    unsigned char i;
	
    for(i=0; i<8; i++){
        scl = 0;
		I2C_Delay(DELAY_TIME);
        if(byt & 0x80){
            sda = 1;
        }
        else{
            sda = 0;
        }
		I2C_Delay(DELAY_TIME);
        scl = 1;
        byt <<= 1;
		I2C_Delay(DELAY_TIME);
    }
	
    scl = 0;  
}
unsigned char I2CReceiveByte(void)
{
	unsigned char da;
	unsigned char i;
	for(i=0;i<8;i++){   
		scl = 1;
		I2C_Delay(DELAY_TIME);
		da <<= 1;
		if(sda) 
			da |= 0x01;
		scl = 0;
		I2C_Delay(DELAY_TIME);
	}
	return da;    
}
unsigned char I2CWaitAck(void)
{
	unsigned char ackbit;
	
    scl = 1;
	I2C_Delay(DELAY_TIME);
    ackbit = sda; 
    scl = 0;
	I2C_Delay(DELAY_TIME);
	
	return ackbit;
}
void I2CSendAck(unsigned char ackbit)
{
    scl = 0;
    sda = ackbit; 
	I2C_Delay(DELAY_TIME);
    scl = 1;
	I2C_Delay(DELAY_TIME);
    scl = 0; 
	sda = 1;
	I2C_Delay(DELAY_TIME);
}
unsigned char adc(unsigned char addr){
	unsigned char temp;
	I2CStart();
	EA = 0;
	I2CSendByte(0x90);
	I2CWaitAck();
	I2CSendByte(addr);
	I2CWaitAck();
	
	I2CStart();
	I2CSendByte(0x91);
	I2CWaitAck();
	temp=I2CReceiveByte();
	I2CSendAck(1);
	I2CStop();
	EA = 1;
	return temp;
}
float get_Vrb2(){
	return (float)adc(3)/255.0*5.0;
}
void get_shidu(){ 
	float temp;
	temp=get_Vrb2();
	if(temp<1.0){
		shidu=10;
	}else if(temp<=4){
		shidu=(unsigned char)(80.0/3.0*(temp-1)+10+0.5);
	}else{
		shidu=90;
	}
	if(ssflag){
		flag_relay=0;
		relay(0);
	}else{
		if(shidu<shidu_canshu&&!flag_relay){
			flag_relay=1;
			relay(1);
		}
	}
}

测评结果

尚待解决的问题

 最后一项测评一直不正确,在板子上显示正常。感谢各位大佬们批评指导

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2335078.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

打造现代数据基础架构:MinIO对象存储完全指南

目录 打造现代数据基础架构&#xff1a;MinIO对象存储完全指南1. MinIO介绍1.1 什么是对象存储&#xff1f;1.2 MinIO核心特点1.3 MinIO使用场景 2. MinIO部署方案对比2.1 单节点单驱动器(SNSD/Standalone)2.2 单节点多驱动器(SNMD/Standalone Multi-Drive)2.3 多节点多驱动器(…

OOM问题排查和解决

问题 java.lang.OutOfMemoryError: Java heap space 排查 排查手段 jmap命令 jmap -dump,formatb,file<file-path> <pid> 比如 jmap -dump:formatb,file./heap.hprof 44532 使用JVisualVM工具&#xff1a; JVisualVM是一个图形界面工具&#xff0c;它可以帮…

「出海匠」借助CloudPilot AI实现AWS降本60%,支撑AI电商高速增长

&#x1f50e;公司简介 「出海匠」&#xff08;chuhaijiang.com&#xff09;是「数绘星云」公司打造的社交内容电商服务平台&#xff0c;专注于为跨境生态参与者提供数据支持与智能化工作流。平台基于大数据与 AI 技术&#xff0c;帮助商家精准分析市场趋势、优化运营策略&…

【Python爬虫】简单案例介绍3

本文继续接着我的上一篇博客【Python爬虫】简单案例介绍2-CSDN博客 目录 3.3 代码开发 3.3 代码开发 编写代码的步骤&#xff1a; request请求科普中国网站地址url&#xff0c;解析得到类名为"list-block"的div标签。 for循环遍历这个div列表里的每个div&#xff0…

swift菜鸟教程6-10(运算符,条件,循环,字符串,字符)

一个朴实无华的目录 今日学习内容&#xff1a;1.Swift 运算符算术运算符比较运算符逻辑运算符位运算符赋值运算区间运算符其他运算符 2.Swift 条件语句3.Swift 循环4.Swift 字符串字符串属性 isEmpty字符串常量let 变量var字符串中插入值字符串连接字符串长度 String.count使用…

如何通过技术手段降低开发成本

通过技术手段降低开发成本的关键在于&#xff1a; 自动化工具的使用、优化开发流程、云计算资源的利用、开发技术栈的精简与创新、团队协作平台的高效管理。 其中&#xff0c;自动化工具的使用是最为有效的技术手段之一。自动化工具通过减少人工干预和重复性工作&#xff0c;大…

Ubuntu上docker、docker-compose的安装

今天来实践下Ubuntu上面安装docker跟docker-compose&#xff0c;为后面安装dify、fastgpt做准备。 一、安装docker sudo apt-get updatesudo apt-get install docker.io 然后系统输入 docker --version 出现下图即为docker安装成功。 二、安装docker-compose 我先看下系统…

OpenCV图像处理进阶教程:几何变换与频域分析全解析

OpenCV图像处理进阶教程&#xff1a;几何变换与频域分析全解析 &#x1f4da; 本文提供了OpenCV图像处理的核心操作详解&#xff0c;从基础的几何变换到高级的频域分析&#xff0c;代码示例清晰易懂&#xff0c;实用性强。完整代码已开源至GitHub&#xff1a;https://github.co…

AJAX与Axios基础

目录 一、AJAX 核心概念解析 1.1 AJAX 的核心概念 1.2 AJAX 工作原理 1.3 AJAX 局限性 二、axios 库介绍 2.1 Axios 核心特性 2.2 快速上手 2.3 核心配置项 2.4 错误处理标准方案 三、Axios 核心配置项 3.1 常用核心配置项 1. url 2. method 3. params 4. data …

[OS] vDSO + vvar(频繁调用的处理) | 存储:寄存器(高效)和栈(空间大)| ELF标准包装规范(加速程序加载)

vDSO vvar 一、社区公告板系统&#xff08;类比 vDSO vvar&#xff09; 想象你住在一个大型社区&#xff0c;管理员&#xff08;内核&#xff09;需要向居民&#xff08;用户程序&#xff09;提供实时信息&#xff08;如天气预报、社区活动时间等&#xff09;。直接让每个居…

Sentinel源码—1.使用演示和简介二

大纲 1.Sentinel流量治理框架简介 2.Sentinel源码编译及Demo演示 3.Dashboard功能介绍 4.流控规则使用演示 5.熔断规则使用演示 6.热点规则使用演示 7.授权规则使用演示 8.系统规则使用演示 9.集群流控使用演示 5.熔断规则使用演示 (1)案例说明熔断和降级 (2)Sentin…

IDEA的常用设置(更新中......)

文章目录 1. 自动导包2. 忽略大小写3. 设置项目文件编码格式4. 设置方法之间分割线5. 设置字体大小6. 设置IDEA默认不打开项目持续更新中...... 1. 自动导包 File->Settings->Editor->General>Auto Import 2. 忽略大小写 File->Editor->General->Code…

c# Kestrel

Kestrel 是 .NET 中用于 ASP.NET Core 应用程序的跨平台 Web 服务器。它是轻量级且高性能的&#xff0c;能够处理大量并发连接&#xff0c;常被用作 ASP.NET Core 应用的默认服务器。以下为你介绍 Kestrel 的基本使用和配置&#xff1a; 基本使用 创建一个简单的 ASP.NET Cor…

x86 保护模式中的GDT表是什么?

GDT&#xff08;全局描述符表&#xff0c;Global Descriptor Table&#xff09;是 x86 保护模式下用于描述不同类型内存段的一个重要数据结构。在保护模式下&#xff0c;GDT 用于管理和保护系统内存&#xff0c;它通过提供一组段描述符来定义内存的访问权限、大小、类型等属性 …

筛选条件在on和where中的区别(基于hivesql)

理解筛选条件在on和where中的区别&#xff0c;最好先理解sql的执行顺序&#xff0c;尽管实际执行时不同的物理执行引擎可能会有特定的优化&#xff0c;但是逻辑执行顺序必须遵循&#xff1a; 1&#xff09;from&#xff1a;确定数据源是什么&#xff0c;from后可以是单表&#…

vue3+vite+ts使用daisyui/tailwindcss

vite创建vue3脚手架 npm init vitelatest myVue3 – --template vue cd .\myVue3\ npm i npm run dev 安装tailwindcss/daisyui 依赖安装 npm install -D tailwindcss postcss autoprefixer daisyui npx tailwindcss init -p 这条命令将生成postcss.config.js(因为加了…

大联盟(特别版)双端互动平台完整套件分享:含多模块源码+本地部署环境

这是一套结构清晰、功能完整的互动平台组件&#xff0c;适合有开发经验的技术人员进行模块参考、结构研究或本地部署实验使用。 该平台覆盖前端展示、后端服务、移动端资源以及完整数据库&#xff0c;采用模块化架构&#xff0c;整体部署流程简单清晰&#xff0c;适合自研团队参…

Spark-SQL

Spark-SQL 概述 Spark SQL 是 Spark 用于结构化数据(structured data)处理的 Spark 模块 Shark 是伯克利实验室 Spark 生态环境的组件之一&#xff0c;是基于 Hive 所开发的工具&#xff0c;它修改了内存管理、物理计划、执行三个模块&#xff0c;并使之能运行在 Spark 引擎上…

无人机气动-结构耦合技术要点与难点

一、技术要点 1. 多学科耦合建模 气动载荷与结构响应的双向耦合&#xff1a;气动力&#xff08;如升力、阻力、力矩&#xff09;导致结构变形&#xff0c;而变形改变气动外形&#xff0c;进一步影响气流分布&#xff0c;形成闭环反馈。 建模方法&#xff1a; 高精度C…

element-ui plus 中 filter-method 函数多次触发问题解决

前情提要 点进这个文章的小伙伴&#xff0c;应该都是为了解决一个需求&#xff0c;把原本的前端过滤改为后端过滤&#xff0c;但是将filter-method修改为后端取数据后&#xff0c;发现其触发了很多次。博主也是在修改表格过滤时用到了这个坑&#xff0c;本篇文章为大家解决一下…