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

news2025/4/8 9:34:36

试题

代码

 sys.h

#ifndef __SYS_H__
#define __SYS_H__

#include <STC15F2K60S2.H>
//onewire.c
float getT();
//sys.c
extern unsigned char UI;
extern bit touch_mode;
extern float jiaozhun;
extern float canshu;
extern float temper;
void init74hc138(unsigned char n);
void init();
void get_temper();
void led_ui_touch_c();
//seg_key.c
extern unsigned char Seg_Buff[8];
void Seg_Loop();
void Key_Loop();
void seg_ui();
#endif

main.c

 

#include "sys.h"
bit flag_seg=0;
bit flag_key=0;
bit flag_temper=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();
	while(getT()==85.0);
	while(1){
		led_ui_touch_c();
		if(flag_seg){
			flag_seg=0;
			Seg_Loop();
		}
		if(flag_key){
			flag_key=0;
			Key_Loop();
			seg_ui();
		}
		if(flag_temper){
			flag_temper=0;
			get_temper();
			seg_ui();
		}
	}
}
void Timer0_Isr(void) interrupt 1
{
	static unsigned char count1=0;
	static unsigned char count2=0;
	static unsigned int count3=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_temper=1;
	}
}

sys.c

#include "sys.h"
unsigned char UI=0;//0为温度界面,1为校准值界面,2为参数界面
bit touch_mode=0;//0为上触发模式,1为下触发模式
float jiaozhun=0.0;//校准值
float canshu=26.0;//参数
float temper;
void init74hc138(unsigned char n){
	P2=(P2&0x1f)|(n<<5);
	P2&=0x1f;
}
void init(){
	P0=0x00;
	init74hc138(5);
	P0=0xff;
	init74hc138(4);
}
void get_temper(){
	temper=getT()+jiaozhun;
}
void led(unsigned char addr){
	P0=~(0x01<<(addr-1));
	init74hc138(4);
}
void led_ui_touch_c(){
	switch(UI){
		case 0:
			led(1);break;
		case 1:
			led(2);break;
		case 2:
			led(3);break;
	}
	if(!touch_mode){
		led(4);
		if(temper>canshu) led(8);
	}else{
		led(5);
		if(temper<canshu) 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
0xbf, //- 13
0xff  //熄灭 14
};
unsigned char Seg_Buff[8]={14,14,14,14,14,14,14,14};
unsigned char keyval,keyold,keyup,keydown;
void seg(unsigned char addr,unsigned char num){
	P0=0xff;
	init74hc138(7);
	P0=0x01<<addr;
	init74hc138(6);
	P0=Seg_Table[num];
	if(UI==0&&addr==6) P0&=0x7f;
	init74hc138(7);
}
void Seg_Loop(){
	static unsigned char i=0;
	seg(i,Seg_Buff[i]);
	i++;
	if(i==8) i=0;
}
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){
		touch_mode=~touch_mode;
	}
	//s8负责减
	if(keyval==8&&keyold!=8){
		if(UI==1){
			if(jiaozhun>-99) jiaozhun--;
		}
		if(UI==2){
			if(canshu>-99) canshu--;
		}
	}
	//s9负责加
	if(keyval==9&&keyold!=9){
		if(UI==1){
			if(jiaozhun<99) jiaozhun++;
		}
		if(UI==2){
			if(canshu<99) canshu++;
		}
	}
	keyold=keyval;
	keyval=0;
}
void ui0(){//温度界面
	Seg_Buff[7]=(unsigned char)((temper+0.05)*10)%10;
	Seg_Buff[6]=(unsigned char)(temper+0.05)%10;
	Seg_Buff[5]=(unsigned char)temper/10;
	Seg_Buff[4]=14;
	Seg_Buff[3]=14;
	Seg_Buff[2]=14;
	Seg_Buff[1]=14;
	Seg_Buff[0]=10; //C
}
void ui1(){//校准值界面
	float temp=jiaozhun;
	if(jiaozhun<0) temp=-jiaozhun;
	Seg_Buff[7]=(unsigned char)temp%10;
	if((unsigned char)temp>=10){
		Seg_Buff[6]=(unsigned char)temp/10;
		Seg_Buff[5]=14;
		if(jiaozhun<0)
			Seg_Buff[5]=13;
	}else{
		Seg_Buff[6]=14;
		Seg_Buff[5]=14;
		if(jiaozhun<0)
			Seg_Buff[6]=13;
	}
	Seg_Buff[4]=14;
	Seg_Buff[3]=14;
	Seg_Buff[2]=14;
	Seg_Buff[1]=14;
	Seg_Buff[0]=11; //E
}
void ui2(){//参数界面
	float temp=canshu;
	if(canshu<0) temp=-canshu;
	Seg_Buff[7]=(unsigned char)temp%10;
	if((unsigned char)temp>=10){
		Seg_Buff[6]=(unsigned char)temp/10;
		Seg_Buff[5]=14;
		if(canshu<0)
			Seg_Buff[5]=13;
	}else{
		Seg_Buff[6]=14;
		Seg_Buff[5]=14;
		if(canshu<0)
			Seg_Buff[6]=13;
	}
	Seg_Buff[4]=14;
	Seg_Buff[3]=14;
	Seg_Buff[2]=14;
	Seg_Buff[1]=14;
	Seg_Buff[0]=12; //H
}
void seg_ui(){
	switch(UI){
		case 0:
			ui0();break;
		case 1:
			ui1();break;
		case 2:
			ui2();break;
	}
}

onewire.c

#include "sys.h"
sbit DQ=P1^4;
void Delay_OneWire(unsigned int t)  
{
	unsigned char i;
	while(t--){
		for(i=0;i<12;i++);
	}
}
void Write_DS18B20(unsigned char dat)
{
	unsigned char i;
	for(i=0;i<8;i++)
	{
		DQ = 0;
		DQ = dat&0x01;
		Delay_OneWire(5);
		DQ = 1;
		dat >>= 1;
	}
	Delay_OneWire(5);
}
unsigned char Read_DS18B20(void)
{
	unsigned char i;
	unsigned char dat;
  
	for(i=0;i<8;i++)
	{
		DQ = 0;
		dat >>= 1;
		DQ = 1;
		if(DQ)
		{
			dat |= 0x80;
		}	    
		Delay_OneWire(5);
	}
	return dat;
}
bit init_ds18b20(void)
{
  	bit initflag = 0;
  	
  	DQ = 1;
  	Delay_OneWire(12);
  	DQ = 0;
  	Delay_OneWire(80);
  	DQ = 1;
  	Delay_OneWire(10); 
    initflag = DQ;     
  	Delay_OneWire(5);
  
  	return initflag;
}
float getT(){
	unsigned char tH,tL;
	float temp;
	init_ds18b20();
	Write_DS18B20(0xcc);
	Write_DS18B20(0x44);
	init_ds18b20();
	
	Write_DS18B20(0xcc);
	Write_DS18B20(0xbe);
	tL=Read_DS18B20();
	tH=Read_DS18B20();
	temp=(float)(tH<<8|tL)*0.0625;
	return temp;
}

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

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

相关文章

mac 卸载流氓软件安全助手

之前个人电脑在公司使用过一段时间&#xff0c;为了使用网线联网安装了公司指定的 联软上网助手&#xff0c;谁知安装容易卸载难&#xff0c;后来找运维来卸载&#xff0c;输入管理员密码后&#xff0c;也无反应&#xff0c;最后不了了之了&#xff0c;这个毒瘤软件长期在后台驻…

⭐算法OJ⭐滑动窗口最大值【双端队列(deque)】Sliding Window Maximum

文章目录 双端队列(deque)详解基本特性常用操作1. 构造和初始化2. 元素访问3. 修改操作4. 容量操作 性能特点时间复杂度&#xff1a;空间复杂度&#xff1a; 滑动窗口最大值题目描述方法思路解决代码 双端队列(deque)详解 双端队列(deque&#xff0c;全称double-ended queue)是…

沧州铁狮子

又名“镇海吼”&#xff0c;是中国现存年代最久、形体最大的铸铁狮子&#xff0c;具有深厚的历史文化底蕴和独特的艺术价值。以下是关于沧州铁狮子的详细介绍&#xff1a; 历史背景 • 铸造年代&#xff1a;沧州铁狮子铸造于后周广顺三年&#xff08;953年&#xff09;&#…

Python•判断循环

ʕ⸝⸝⸝˙Ⱉ˙ʔ ♡ 判断🍰常用的判断符号(比较运算符)andor括号notin 和 not inif-elif-else循环🍭计数循环 forrange()函数简易倒计时enumerate()函数zip()函数遍历列表遍历元组遍历字符串遍历字典条件循环 while提前跳转 continue跳出循环 break能量站😚判断🍰 …

【力扣hot100题】(060)分割回文串

每次需要判断回文串&#xff0c;这点比之前几题回溯题目复杂一些。 还有我怎么又多写了循环…… class Solution { public:vector<vector<string>> result;string s;bool palindromic(string s){for(int i0;i<s.size()/2;i) if(s[i]!s[s.size()-1-i]) return …

C++---day7

#include <iostream> #include <cstring> #include <cstdlib> #include <unistd.h> #include <sstream> #include <vector> #include <memory>using namespace std;class Stu { private:public:};// 自定义 vector 类&#xff0c;重…

SvelteKit 最新中文文档教程(17)—— 仅服务端模块和快照

前言 Svelte&#xff0c;一个语法简洁、入门容易&#xff0c;面向未来的前端框架。 从 Svelte 诞生之初&#xff0c;就备受开发者的喜爱&#xff0c;根据统计&#xff0c;从 2019 年到 2024 年&#xff0c;连续 6 年一直是开发者最感兴趣的前端框架 No.1&#xff1a; Svelte …

flink 增量快照同步文件引用关系和恢复分析

文章目录 文件引用分析相关代码分析从state 恢复&#xff0c;以rocksdb为例不修改并行度修改并行度keyGroupRange过程问题 文件引用分析 每次生成的checkpoint 里都会有所有文件的引用信息 问题&#xff0c;引用分析里如何把f1,f2去掉了&#xff0c;可以参考下面的代码&#…

c++概念—内存管理

文章目录 c内存管理c/c的内存区域划分回顾c语言动态内存管理c动态内存管理new和delete的使用new和delete的底层逻辑operator new函数和operator delete函数new和delete的实现操作方式不匹配的情况定位new new/delete和malloc/free的区别 c内存管理 在以往学习c语言的过程中&…

无人机双频技术及底层应用分析!

一、双频技术的核心要点 1. 频段特性互补 2.4GHz&#xff1a;穿透力强、传输距离远&#xff08;可达5公里以上&#xff09;&#xff0c;适合复杂环境&#xff08;如城市、建筑物密集区&#xff09;&#xff0c;但易受Wi-Fi、蓝牙等设备的干扰。 5.8GHz&#xff1a;带宽更…

【电视软件】小飞电视v2.7.0 TV版-清爽无广告秒换台【永久更新】

软件介绍 小飞电视是一款电视端的直播软件&#xff0c;无需二次付费和登录&#xff0c;资源丰富&#xff0c;高清流畅。具备开机自启、推送功能、自定义直播源、个性化设置及节目预告等实用功能&#xff0c;为用户带来良好的观看体验。基于mytv开源项目二改&#xff0c;涵盖央…

Valgrind——内存调试和性能分析工具

文章目录 一、Valgrind 介绍二、Valgrind 功能和使用1. 主要功能2. 基本用法2.1 常用选项2.2 内存泄漏检测2.3 详细报告2.4 性能分析2.5 多线程错误检测 三、在 Ubuntu 上安装 Valgrind四、示例1. 检测内存泄漏2. 使用未初始化的内存3. 内存读写越界4. 综合错误 五、工具集1. M…

学习MySQL第七天

夕阳无限好 只是近黄昏 一、子查询 1.1 定义 将一个查询语句嵌套到另一个查询语句内部的查询 我们通过具体示例来进行演示&#xff0c;这一篇博客更侧重于通过具体的小问题来引导大家独立思考&#xff0c;然后熟悉子查询相关的知识点 1.2 问题1 谁的工资比Tom高 方…

Spring启示录、概述、入门程序以及Spring对IoC的实现

一、Spring启示录 阅读以下代码&#xff1a; dao package org.example1.dao;/*** 持久层* className UserDao* since 1.0**/ public interface UserDao {/*** 根据id删除用户信息*/void deleteById(); } package org.example1.dao.impl;import org.example1.dao.UserDao;/**…

电机的了解到调试全方面讲解

一、什么是电机 电机是一种将电能转换为机械能的装置,通常由定子、转子和电磁场组成。 当电流通过电机的绕组时,产生的磁场会与电机中的磁场相互作用,从而使电机产生旋转运动。电机广泛应用于各种机械设备和工业生产中,是现代社会不可或缺的重要设备之一。 常见的电机种…

笔试专题(七)

文章目录 乒乓球筐&#xff08;哈希&#xff09;题解代码 组队竞赛题解代码 删除相邻数字的最大分数&#xff08;线性dp&#xff09;题解代码 乒乓球筐&#xff08;哈希&#xff09; 题目链接 题解 1. 两个哈希表 先统计第一个字符串中的字符个数&#xff0c;再统计第二个字…

【嵌入式学习3】UDP发送端、接收端

目录 1、发送端 2、接收端 3、UDP广播 1、发送端 from socket import *udp_socket socket(AF_INET,SOCK_DGRAM) udp_socket.bind(("127.0.0.1",3333))data_str "UDP发送端数据" data_bytes data_str.encode("utf-8") udp_socket.sendto(d…

Linux 系统 SVN 源码安装与配置全流程指南

Linux系统SVN源码安装与配置全流程指南 一、环境准备 系统要求 CentOS 7及以上版本需安装GCC编译工具链 依赖项 APR/APR-UTIL&#xff08;Apache可移植运行库&#xff09;SQLite&#xff08;嵌入式数据库&#xff09;zlib&#xff08;数据压缩库&#xff09; 二、下载及安装…

Redis 的五种数据类型面试回答

这里简单介绍一下面试回答、我之前有详细的去学习、但是一直都觉得太多内容了、太深入了 然后面试的时候不知道从哪里讲起、于是我写了这篇CSDN帮助大家面试回答、具体的深入解析下次再说 面试官你好 我来介绍一下Redis的五种基本数据类型 有String List Set ZSet Map 五种基…

关于类模板STL中vector容器的运用和智能指针的实现

代码题&#xff1a;使用vector实现一个简单的本地注册登录系统 注册&#xff1a;将账号密码存入vector里面&#xff0c;注意防重复判断 登录&#xff1a;判断登录的账号密码是否正确 #include <iostream> #include <cstring> #include <cstdlib> #in…