第十三届蓝桥杯单片机省赛程序设计试题

news2025/3/30 21:07:56

目录

试题

各程序块代码

init.c

main.c

other.h

other.c

key.c

seg.c

onewire.c部分

ds1302.c部分


试题

 

各程序块代码

init.c

#include "other.h"

void init74hc138(unsigned char n){
	P2=(P2&0x1f)|(n<<5);
	P2&=0x1f;
}
void init(){
	P0=0x00;
	init74hc138(5);
	P0=0xff;
	init74hc138(4);
}

main.c

#include "other.h"
void Timer0_Init(void)		//1毫秒@12.000MHz
{
	AUXR |= 0x80;			//定时器时钟1T模式
	TMOD &= 0xF0;			//设置定时器模式
	TL0 = 0x20;				//设置定时初始值
	TH0 = 0xD1;				//设置定时初始值
	TF0 = 0;				//清除TF0标志
	TR0 = 1;				//定时器0开始计时
	ET0 = 1;				//使能定时器0中断
	EA=1;
}
void Timer1_Init(void)		//1毫秒@12.000MHz
{
	AUXR |= 0x40;			//定时器时钟1T模式
	TMOD &= 0x0F;			//设置定时器模式
	TL1 = 0x20;				//设置定时初始值
	TH1 = 0xD1;				//设置定时初始值
	TF1 = 0;				//清除TF1标志
	TR1 = 1;				//定时器1开始计时
	ET1 = 1;				//使能定时器1中断
	EA=1;
}
void  main(){
	Timer0_Init();
	Timer1_Init();
	w_ds1302();
	temper=getT();
	while((int)temper==85)temper=getT();
	//解决初始温度数值为85°C的问题
	init();
	while(1){
		if(flag_seg){
			flag_seg=0;
			seg_ui(UI);//界面选择
			Seg_Loop();
		}//数码管动态显示

		if(flag_key){
			flag_key=0;
			Key_Loop();
		}//按键动态刷新

		if(flag_temper){
			flag_temper=0;
			temper=getT();
		}//获取温度值

		if(flag_time){
			flag_time=0;
			r_ds1302();
		}//获取时钟信息

		mod();    //温度/时间模式选择
		led();    //LED效果函数
	}
}
//定时器0用于基础模块
void Timer0_Isr(void) interrupt 1
{
	static unsigned char count1=0,count2=0;
	static unsigned int count3=0,count4=500;
	count1++;count2++;count3++;count4++;
	if(count1==2){
		count1=0;
		flag_seg=1;
	}
	if(count2==50){
		count2=0;
		flag_key=1;
	}
	if(count3==500){
		count3=0;
		flag_temper=1;
	}
	if(count4==1000){
		count4=500;
		flag_time=1;
	}
}
//定时器1用于LED效果和继电器吸合控制
void Timer1_Isr(void) interrupt 3
{
	static unsigned int count_relay=0,count_led1=0;
	static unsigned char count_led3=0;

	if(mod_relay_1){
		count_relay++;
		if(count_relay==5000){
			count_relay=0;
			no_relay();
			mod_relay_1=0;
		}
	}//时间控制模式下,继电器吸合5s

	if(led_time){
		count_led1++;
		if(count_led1==5000){
			count_led1=0;
			P0=0xff;
			init74hc138(4);
		}
	}//整点LED1闪烁5s

	if(led_relay){
		if(count_led3==0){
			P0=0xff;
			init74hc138(4);
		}else if(count_led3==100){
			P0=0xfb;
			init74hc138(4);
			P0=0xff;
		}else if(count_led3==200){
			count_led3=0;
		}
		count_led3++;
	}else{
		count_led3=0;
	}//继电器吸合时,LED3闪烁
}

other.h

#ifndef __OTHER_H__
#define __OTHER_H__

#include <STC15F2K60S2.H>
#include "intrins.h"

//onewire.c中的I/O口定义
sbit DQ=P1^4;
//ds1302.c中的I/O口定义
sbit SCK=P1^7;
sbit SDA=P2^3;
sbit RST=P1^3;

//相关自定义变量
extern unsigned char keyval,keyold,keyup,keydown;//按键
extern unsigned char Seg_Buff[];//数码管缓存
extern unsigned char time[];//时钟数据
extern unsigned char UI;//界面控制字
extern float temper;//温度数据
extern unsigned char temper_max;//设定的温度参数
extern bit time_h_m_s;//时-分/分-秒标志位
extern bit mod_relay_1;//时间控制模式下的继电器吸合标志位
extern bit mod_relay_0;//温度控制模式下的继电器吸合标志位
extern bit led_time;//整点标志位
extern bit led_relay;//继电器吸合时,LED闪烁标志位
extern bit flag_mod;//控制模式转换标志位
extern bit flag_seg;//数码管扫描标志
extern bit flag_key;//按键扫描标志
extern bit flag_time;//时钟值获取标志
extern bit flag_temper;//温度值获取标志

//init.c
void init74hc138(unsigned char n);
void init();

//other.c
void relay();
void no_relay();
void mod();
void led();

//onewire.c
float getT();

//key.c
void Key_Loop();

//ds1302.c
void w_ds1302();
void r_ds1302();

//seg.c
void seg(unsigned char addr,num);
void Seg_Loop();
void seg_ui(unsigned char ui);

#endif

other.c

#include "other.h"
unsigned char keyval,keyold,keyup,keydown;
unsigned char temper_max=23;
unsigned char UI=1;
float temper=0;
bit flag_mod=0;
bit time_h_m_s=0; 
bit mod_relay_1=0;
bit mod_relay_0=0;
bit led_time=0;
bit led_relay=0;
bit flag_seg=0;
bit flag_key=0;
bit flag_time=0;
bit flag_temper=0;

void relay(){
	P0=0x10;
	init74hc138(5);
	P0=0xff;
}//继电器吸合
void no_relay(){
	P0=0x00;
	init74hc138(5);
	P0=0xff;
}//继电器松开

//控制模式转换
void mod(){
	//时间控制模式
	if(flag_mod){
		no_relay();
		mod_relay_0=0;
		P0=0xff;
		init74hc138(4);
		if(time[0]==0&&time[1]==0){
			relay();//继电器吸合
			mod_relay_1=1;
			//由于需要持续5s
			//故继电器关闭写在主函数里
		}
	}
	//温度控制模式
	else{
		P0=0xfd;
		init74hc138(4);
		P0=0xff;
		if((int)(temper*10)>(temper_max*10)){
			relay();//继电器吸合
			mod_relay_0=1;
		}else{
			no_relay();//关闭继电器
			mod_relay_0=0;
		}
	}
}

//LED效果
void led(){
	if(time[0]==0&&time[1]==0){
		P0=0xfe;
		init74hc138(4);
		P0=0xff;
		led_time=1;
	}
	if(mod_relay_0||mod_relay_1){
		if(!led_relay){
			P0=0xfb;
			init74hc138(4);
			P0=0xff;
			led_relay=1;
		}
	}else{
		P0=0xff;
		init74hc138(4);
		led_relay=0;
	}
}

key.c

#include "other.h"

unsigned char Key_Scan(){
	unsigned char temp=0;
	P35=0;P34=1;
		if(P32==0){temp=13;return temp;}
		if(P33==0){temp=12;return temp;}
	P34=0;P35=1;
		if(P32==0){temp=17;return temp;}
		if(P33==0){temp=16;return temp;}
	return 0;
}
void Key_Loop(){
	keyval=Key_Scan();
	keydown=keyval&(keyold^keyval);
	keyup=~keyval&(keyold^keyval);
	if(keyval==12&&keyold!=12){UI++;if(UI==4)UI=1;}
	if(keyval==13&&keyold!=13){flag_mod=!flag_mod;}
	if(keyval==16&&keyold!=16&&UI==3){if(temper_max<99)temper_max++;}
	if(keyval==17&&keyold!=17&&UI==3){if(temper_max>10)temper_max--;}
	if(keyval==17&&UI==2){time_h_m_s=1;}else{time_h_m_s=0;}
	keyold=keyval;
}

seg.c

#include "other.h"

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
0xbf, //-  10
0xc1, //U  11
0xff //熄灭 12
};
unsigned char Seg_Buff[]={11,12,12,12,12,12,12,12};

void seg(unsigned char addr,num){
	P0=0xff;
	init74hc138(7);
	P0=0x01<<addr;
	init74hc138(6);
	P0=Seg_Table[num];
	if(UI==1&&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;
}

void seg_u1(){
	Seg_Buff[7]=(int)((temper+0.05)*10)%10;
	Seg_Buff[6]=(int)((temper+0.05)*10)/10%10;
	if((int)temper>=10)
		Seg_Buff[5]=(int)((temper+0.05)*10)/100%10;
	else
		Seg_Buff[5]=12;
	Seg_Buff[4]=12;
	Seg_Buff[3]=12;
	Seg_Buff[2]=12;
	Seg_Buff[1]=1;
}

void seg_u2(){
	if(time_h_m_s){//分_秒
		Seg_Buff[7]=time[0]%10;
		Seg_Buff[6]=time[0]/10;
		Seg_Buff[4]=time[1]%10;
		Seg_Buff[3]=time[1]/10;
	}else{//时_分
		Seg_Buff[7]=time[1]%10;
		Seg_Buff[6]=time[1]/10;
		Seg_Buff[4]=time[2]%10;
		Seg_Buff[3]=time[2]/10;
	}
	Seg_Buff[5]=10;
	Seg_Buff[2]=12;
	Seg_Buff[1]=2;
}

void seg_u3(){
	Seg_Buff[7]=temper_max%10;
	Seg_Buff[6]=temper_max/10;
	Seg_Buff[5]=12;
	Seg_Buff[4]=12;
	Seg_Buff[3]=12;
	Seg_Buff[2]=12;
	Seg_Buff[1]=3;
}

//界面选择
void seg_ui(unsigned char ui){
	switch(ui){
		case 1:seg_u1();break;
		case 2:seg_u2();break;
		case 3:seg_u3();break;
	}
}

onewire.c部分

#include "other.h"

float getT(){
	unsigned int tH,tL;
	float temp;
	EA=0;
	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;
	EA=1;
	return temp;
}

ds1302.c部分

#include "other.h"
unsigned char time[]={0,25,23};

void Write_Ds1302_Byte( unsigned char address,unsigned char dat )     
{
    //......................
 	Write_Ds1302(dat/10*16|dat%10);		//十进制数——>BCD码
 	RST=0; 
}
unsigned char Read_Ds1302_Byte ( unsigned char address )
{
 	unsigned char i,temp=0x00;
	unsigned char dat1,dat2;
    //......................
    dat1=temp/16*10;
	dat2=temp%16;
	temp=dat1+dat2;    //BCD码——>十进制数
	return (temp);		
}

void w_ds1302(){
	unsigned char i,addr=0x80;
	Write_Ds1302_Byte(0x8e,0x00);
	for(i=0;i<3;i++){
		Write_Ds1302_Byte(addr,time[i]);
		addr+=2;
	}
	Write_Ds1302_Byte(0x8e,0x80);
}
void r_ds1302(){
	unsigned char i,addr=0x81;
		for(i=0;i<3;i++){
		time[i]=Read_Ds1302_Byte(addr);
		addr+=2;
	}
}

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

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

相关文章

QOpenGLWidget动态加载功能实现教程(Qt+OpenGL)

QOpenGLWidget动态加载功能实现教程 我需要在Qt里面使用QOpenGLWidget显示OpenGL窗口&#xff0c;并且需要实现加载模型后重新渲染更新窗口的功能&#xff0c;但是一直无法更新被卡住了&#xff0c;现在把问题解决了总结一下整个实现过程。 创建一个自己的OpenGLWidget类 QOp…

ESP32驱动BMP280和MQ4传感器

文章目录 前言 一、硬件准备 所需组件 连接方式&#xff1a; 二、软件实现 1.所需库 2.代码实现 效果演示 三、上传Qt端 前言 在物联网和环境监测应用中&#xff0c;传感器是获取环境数据的关键组件。本文将详细介绍如何使用ESP32微控制器同时驱动BMP280大气压力传感器…

MQTT协议笔记

消息格式 MQTT&#xff08;Message Queuing Telemetry Transport&#xff09;是一种轻量级的消息协议&#xff0c;专为低带宽、高延迟或不可靠的网络设计&#xff0c;广泛应用于物联网&#xff08;IoT&#xff09;设备之间的通信。MQTT消息体的结构遵循MQTT协议规范&#xff0…

“征服HTML引号恶魔:“完全解析手册”!!!(quot;表示双引号)

&#x1f6a8;&#x1f4e2; "征服HTML引号恶魔&#xff1a;“完全解析手册” &#x1f4e2;&#x1f6a8; &#x1f3af; 博客引言&#xff1a;当引号变成"恶魔" &#x1f631; 是否遇到过这种情况&#xff1a; 写HTML时满心欢喜输入<div title"他…

如何使用VS中的Android Game Development Extension (AGDE) 来查看安卓 Logcat 日志

一、首先按照以下 指引 中的 第1、2步骤&#xff0c;安装一下 AGDE &#xff0c;AGDE 的安装包可以在官网上找到。 UE4 使用AndroidGameDevelopmentExtension&#xff08;AGDE&#xff09;对安卓客户端做“断点调试”与“代码热更”-CSDN博客 在执行第二步骤前&#xff0c;记得…

VSCode 生成HTML 基本骨架

在VSCode 新建html文件中敲一个英文感叹号 ! <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><titl…

【Spring AI】基于专属知识库的RAG智能问答小程序开发——功能优化:用户鉴权相关工具类代码

系列文章目录 【Spring AI】基于专属知识库的RAG智能问答小程序开发——完整项目&#xff08;含完整前端后端代码&#xff09;【Spring AI】基于专属知识库的RAG智能问答小程序开发——代码逐行精讲&#xff1a;核心ChatClient对象相关构造函数【Spring AI】基于专属知识库的R…

Solr-搜索引擎-入门到精通

以下是对 Apache Solr 的简介及其常用语法的快速入门指南&#xff1a; 一、Solr 是什么&#xff1f; • 核心定位&#xff1a;Apache Solr 是一个基于 Lucene 的高性能、开源的搜索平台&#xff0c;支持全文检索、分词、高亮、聚合统计等功能。 • 核心功能&#xff1a; • 全…

07_GRU模型

GRU模型 双向GRU笔记:https://blog.csdn.net/weixin_44579176/article/details/146459952 概念 GRU&#xff08;Gated Recurrent Unit&#xff09;也称为门控循环单元&#xff0c;是一种改进版的RNN。与LSTM一样能够有效捕捉长序列之间的语义关联&#xff0c;通过引入两个&qu…

【大模型基础_毛玉仁】3.4 Prompt 技巧

目录 3.4 Prompt 技巧3.4.1 规范Prompt 编写1&#xff09;任务说明要明确2&#xff09;上下文丰富且清晰3&#xff09;输出格式要规范4&#xff09;排版要清晰 3.4.2 合理归纳提问1&#xff09;复杂问题拆解2&#xff09;追问 3.4.3 适时使用CoT1&#xff09;何时使用CoT2&…

探索PyMOL新插件NRGSuite-Qt:全面提升分子对接、结合位点预测与动力学模拟的研究效率

随着分子建模和计算生物学的快速发展&#xff0c;分子对接&#xff08;Molecular Docking&#xff09;、结合位点预测、相互作用分析以及动力学研究等领域的工具越来越重要。这些工具不仅帮助研究人员理解分子间的相互作用机制&#xff0c;还能加速药物设计和优化过程。NRGSuit…

wokwi arduino mega 2560 - 键盘与LCD显示

截图&#xff1a; 链接&#xff1a; https://wokwi.com/projects/414520193913760769 代码&#xff1a; //cslg lcd key #include <LiquidCrystal.h> // 引入LiquidCrystal库&#xff0c;用于LCD显示 #include <Keypad.h> // 引入Keypad库&#xff0c;用于键盘输…

Linux设置SSH免密码密钥登录

文章目录 设置SSH免密码密钥登录第一步&#xff1a; 生成SSH密钥对&#xff08;在客户端操作&#xff09;方式一&#xff1a;Windows 10/11 内置的 OpenSSH 客户端&#xff08;推荐&#xff09;常用选项&#xff1a;密钥算法选择建议生成秘钥 方式二&#xff1a;借用Xshell工具…

深度剖析HTTP协议—GET/PUT请求方法的使用-构造请求的方法

活动发起人小虚竹 想对你说&#xff1a; 这是一个以写作博客为目的的创作活动&#xff0c;旨在鼓励大学生博主们挖掘自己的创作潜能&#xff0c;展现自己的写作才华。如果你是一位热爱写作的、想要展现自己创作才华的小伙伴&#xff0c;那么&#xff0c;快来参加吧&#xff01…

GPU算力哪家好?GpuGeek推出高性能GPU云服务

在人工智能和深度学习领域&#xff0c;GPU算力租赁已成为推动技术创新的关键因素。随着越来越多的企业和个人开发者投身于AI研究和应用开发&#xff0c;如何高效、灵活地获取GPU算力成为了一个亟待解决的问题。GpuGeek作为一站式AI基础设施平台&#xff0c;凭借其独特的优势&am…

从零构建大语言模型全栈开发指南:第二部分:模型架构设计与实现-2.1.3前馈网络(FFN)与激活函数(GELU)优化

👉 点击关注不迷路 👉 点击关注不迷路 👉 点击关注不迷路 文章大纲 2.1.3 前馈网络(FFN)与激活函数(GELU)优化1. 前馈网络(FFN)的架构设计与数学原理1.1 FFN在Transformer中的核心作用2. GELU激活函数的数学特性与优化2.1 GELU的数学形式与近似计算3. 逐行代码实现…

组态软件之万维组态介绍(web组态、html组态、vue2/vue3组态、组态软件、组态编辑器)

一、什么是组态软件 组态软件是一种用于创建、配置和管理监控和控制系统的软件工具。组态是指不需要编写计算机程序、通过配置的方式完成工业应用开发的系统。它们通常用于工业自动化领域&#xff0c;用于实时监视和控制工业过程。组态软件提供了丰富的功能和工具&#xff0c;使…

《Linux运维实战:Ubuntu 22.04使用pam_faillock实现登录失败处理策略》

总结&#xff1a;整理不易&#xff0c;如果对你有帮助&#xff0c;可否点赞关注一下&#xff1f; 更多详细内容请参考&#xff1a;Linux运维实战总结 一、背景信息 在ubuntu 22.04中&#xff0c;pam_tally2模块已被弃用&#xff0c;取而代之的是pam_faillock模块。因此&#xf…

AI Agent开发大全第八课-Stable Diffusion 3的本地安装全步骤

前言 就像我们前面几课所述,本系列是一门体系化的教学,它不像网上很多个别存在的单篇博客走“吃快餐”模式,而是从扎实的基础来带领大家一步步迈向AI开发高手。所以我们的AI课程设置是相当全面的,除了有牢固的基础知识外还有外面互联网上也搜不到的生产级实战。 前面讲过…

【NLP 44、实践 ⑪ 用Bert模型结构实现自回归语言模型的训练】

目录 数据文件 一、模型定义 1.模型初始化 代码运行流程 2.前向传播&#xff0c;计算损失 ⭐ 代码运行流程 二、加载语料 代码运行流程 三、 随机生成样本 代码运行流程 四、建立模型 五、采样策略选择 代码运行流程 六、模型效果测试 代码运行流程 七、模型训练 代码运行流程 …