蓝桥杯单片机第五届国赛题目

前言:针对串口的练手,此处只作代码记录,不进行分析和展示

目录

  • 题目
  • 代码
    • 底层驱动
    • 主程序核心代码

题目

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

代码

注:EEPROM的五组后丢弃用一个记录次数的变量进行循环即可,我没有写这一部分代码。

底层驱动

IIC

unsigned char rb2(){
	unsigned char ret;
	
	I2CStart();
	I2CSendByte(0x90);
	I2CWaitAck();
	I2CSendByte(0x03);
	I2CWaitAck();
	I2CStop();
	
	I2CStart();
	I2CSendByte(0x91);
	I2CWaitAck();
	//Delay(1);
	ret = I2CReceiveByte();
	I2CSendAck(1);
	I2CStop();
	
	I2CStart();
	I2CSendByte(0x91);
	I2CWaitAck();
	ret = I2CReceiveByte();
	I2CSendAck(1);
	I2CStop();
	
	return ret;
}

unsigned char guangmin(){
	unsigned char ret;
	
	I2CStart();
	I2CSendByte(0x90);
	I2CWaitAck();
	I2CSendByte(0x01);
	I2CWaitAck();
	I2CStop();
	
	I2CStart();
	I2CSendByte(0x91);
	I2CWaitAck();
	//Delay(1);
	ret = I2CReceiveByte();
	I2CSendAck(1);
	I2CStop();
	
	I2CStart();
	I2CSendByte(0x91);
	I2CWaitAck();
	ret = I2CReceiveByte();
	I2CSendAck(1);
	I2CStop();
	
	return ret;
}

void eepromwrite(unsigned char addr,unsigned char dat){
	I2CStart();
	I2CSendByte(0xa0);
	I2CWaitAck();
	I2CSendByte(addr);
	I2CWaitAck();
	I2CSendByte(dat);
	I2CWaitAck();
	I2CStop();
}

这里有一点需要额外注意的是同时读取光敏和划变需要有额外的伪写操作。

主程序核心代码

#include <STC15F2K60S2.H>
#include "stdio.h"
#include "inithc138.h"
#include "delay.h"
#include "onewire.h"
#include "iic.h"
#include "ds1302.h"

#define de 5
code unsigned char Seg_Table[17] = 
{
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
0xbf
};
unsigned char show = 0;//显示功能切换

unsigned int temp = 0;//温度
bit ce = 1;
unsigned char voltage = 0;//读取rb2电压
unsigned int shidu = 0;//湿度
unsigned char ds1302writeaddr[3] = {0x80,0x82,0x84};
unsigned char ds1302readaddr[3] = {0x81,0x83,0x85};
unsigned char rtctime[3] = {0x55,0x59,0x23};
unsigned char light = 0;//光敏
unsigned char jiejin = 0;//接近为1,无事为0
bit workmode = 0;//0为自动传输模式,1为自动记录模式
unsigned long count = 0;//停留时间
unsigned char command[10];
unsigned char index = 0;
unsigned char uartcount = 0;
bit uartflag = 0;//1代表开始接受命令
bit uartflag2 = 0;//1代表开始识别命令
unsigned char ledstat = 0xff;
unsigned long tingliu = 0;
bit flag = 0;//停留时间记录以防清零
bit flag2 = 0;//防止重复记录时间
unsigned char jiejinshijian[3];
//************************************测温测湿度
void cewen(){
	unsigned char LSB,MSB;
	init_ds18b20();
	Write_DS18B20(0xcc);
	Write_DS18B20(0x44);
	if(ce){
		ce = 0;
		Delay(200);
		Delay(200);
		Delay(120);
	}
	init_ds18b20();
	Write_DS18B20(0xcc);
	Write_DS18B20(0xbe);
	LSB = Read_DS18B20();
	MSB = Read_DS18B20();
	init_ds18b20();
	
	temp = ((MSB << 8) | LSB) * 0.0625;
}

void ceshidu(){
	voltage = rb2();
	shidu = voltage * 99.00 / 255.00;
}
//************************************
//************************************DS1302实时时钟
void ds1302config(){
	unsigned char i;
	Write_Ds1302_Byte(0x8e,0x00);
	for(i = 0;i < 3;i++){
		Write_Ds1302_Byte(ds1302writeaddr[i],rtctime[i]);
	}
	Write_Ds1302_Byte(0x8e,0x80);
}

void ds1302read(){
	unsigned char i;
	for(i = 0;i < 3;i++){
		rtctime[i] = Read_Ds1302_Byte(ds1302readaddr[i]);
	}
}
//************************************
//************************************接近事件
void jieshijian(){
	if(light <= 10){
		jiejin = 1;
		if(flag2 == 0){
			flag2 = 1;
			jiejinshijian[0] = rtctime[0];
			jiejinshijian[1] = rtctime[1];
			jiejinshijian[2] = rtctime[2];
		}
	}else{
		flag2 = 0;
		jiejin = 0;
	}
}
//************************************
//************************************定时器0
void Timer0_Isr(void) interrupt 1
{
	if(jiejin){
		count++;//接近时间
	}
	if(uartflag){
		uartcount++;
	}
	if(uartcount == 50){
		uartflag = 0;
		uartflag2 = 1;
	}
}

void Timer0_Init(void)		//5毫秒@12.000MHz
{
	AUXR |= 0x80;			//定时器时钟1T模式
	TMOD &= 0xF0;			//设置定时器模式
	TL0 = 0xA0;				//设置定时初始值
	TH0 = 0x15;				//设置定时初始值
	TF0 = 0;				//清除TF0标志
	TR0 = 1;				//定时器0开始计时
	ET0 = 1;				//使能定时器0中断
	EA = 1;
}

//************************************
//************************************串口通讯
void Uart1_Isr(void) interrupt 4
{
	if (RI)				//检测串口1接收中断
	{
		command[index] = SBUF;
		index++;
		uartflag = 1;
		RI = 0;			//清除串口1接收中断请求位
	}
}

void Uart1_Init(void)	//1200bps@12.000MHz
{
	SCON = 0x50;		//8位数据,可变波特率
	AUXR |= 0x01;		//串口1选择定时器2为波特率发生器
	AUXR |= 0x04;		//定时器时钟1T模式
	T2L = 0x3C;			//设置定时初始值
	T2H = 0xF6;			//设置定时初始值
	AUXR |= 0x10;		//定时器2开始计时
	ES = 1;				//使能串口1中断
	EA = 1;
}

void sendbyte(unsigned char dat){
	SBUF = dat;
	while(TI == 0);
	TI = 0;
}

void minglingqingchu(){//命令清除
	unsigned char i;
	for(i = 0;i < 10;i++){
		command[i] = '\0';
		index = 0;
	}
}

void minglingshibie(){//命令识别
	if(uartflag2){
		if(workmode == 0){
			if((command[0] == 'A') && (command[1] == 'A') && (command[2] == 'A') && (command[3] == 'S') && (command[4] == 'S') && (command[5] == 'S')){
				printf("{%d-%d%}{%d-%d-%d}{%d}",(int)(temp),(int)(shidu),(int)((rtctime[2] / 16 * 10) + (rtctime[2] % 16)),(int)((rtctime[1] / 16 * 10) + (rtctime[1] % 16)),(int)((rtctime[0] / 16 * 10) + (rtctime[0] % 16)),(int)(jiejin));
			}
		}
		if(workmode == 1){
			if((command[0] == 'A') && (command[1] == 'A') && (command[2] == 'A') && (command[3] == 'S') && (command[4] == 'S') && (command[5] == 'S')){
				printf("{%d-%d%}{%d-%d-%d}{%d}",(int)(temp),(int)(shidu),(int)((jiejinshijian[2] / 16 * 10) + (jiejinshijian[2] % 16)),(int)((jiejinshijian[1] / 16 * 10) + (jiejinshijian[1] % 16)),(int)((jiejinshijian[0] / 16 * 10) + (jiejinshijian[0] % 16)),(int)(tingliu));
			}
		}
		uartflag2 = 0;
		uartcount = 0;
		minglingqingchu();
	}
}
//************************************
//************************************显示功能
void wendushidujiance(){//温度湿度检测
	showsmg(1,Seg_Table[temp / 10]);
	showsmg(2,Seg_Table[temp % 10]);
	showsmg(3,Seg_Table[12]);
	showsmg(6,Seg_Table[shidu / 10]);
	showsmg(7,Seg_Table[shidu % 10]);
	showsmg(8,0x89);
}

void shishishizhong(){//实时时钟
	showsmg(1,Seg_Table[rtctime[2] / 16]);
	showsmg(2,Seg_Table[rtctime[2] % 16]);
	showsmg(3,Seg_Table[16]);
	showsmg(4,Seg_Table[rtctime[1] / 16]);
	showsmg(5,Seg_Table[rtctime[1] % 16]);
	showsmg(6,Seg_Table[16]);
	showsmg(7,Seg_Table[rtctime[0] / 16]);
	showsmg(8,Seg_Table[rtctime[0] % 16]);
}

void tingliushijian(){
	showsmg(4,Seg_Table[16]);
	showsmg(8,Seg_Table[tingliu % 10]);
	showsmg(7,Seg_Table[tingliu / 10 % 10]);
	showsmg(6,Seg_Table[tingliu / 100 % 10]);
	showsmg(5,Seg_Table[tingliu / 1000 % 10]);
}
//************************************
//************************************
void showselect(){
	switch(show){
		case 0:wendushidujiance();break;
		case 1:shishishizhong();break;
		case 2:tingliushijian();break;
	}
}
//************************************
//************************************LED与EEPROM读写
void led(){
	if(jiejin){
		flag = 0;
		ledstat = ledstat & ~0x04;
	}else{
		ledstat = ledstat | 0x04;
		if(flag == 0){
			flag = 1;
			tingliu = count / 200;
		}
		count = 0;
	}
	
	if(workmode == 0){
		ledstat = ledstat & ~0x01;
	}else{
		ledstat = ledstat | 0x01;
	}
	if(workmode == 1){
		ledstat = ledstat & ~0x02;
	}else{
		ledstat = ledstat | 0x02;
	}
	outputp0(4,ledstat);
}
//************************************
//************************************
void scankey(){
	if(P33 == 0){//S4
		Delay(de);
		while(P33 == 0){
			showselect();
		}
		workmode = ~workmode;
	}
	
	if(P32 == 0){//S5
		Delay(de);
		while(P32 == 0){
			showselect();
		}
		show++;
		show %= 3;
	}
	
}
//************************************
void main(){
	ds1302config();
	initsys();
	Uart1_Init();
	Timer0_Init();
	while(1){
		cewen();
		light = guangmin();
		ceshidu();
		led();
		jieshijian();
		ds1302read();
		showselect();
		minglingshibie();
		scankey();
	}
}

char putchar(char ch){
	sendbyte(ch);
	return ch;
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Linux】Linux环境基础开发工具_3

文章目录 四、Linux环境基础开发工具2. vim3. gcc和g动静态库的理解 未完待续 四、Linux环境基础开发工具 2. vim vim 怎么批量化注释呢&#xff1f;最简单的方法就是在注释开头和结尾输入 /* 或 */ 。当然也可以使用快捷键&#xff1a; Ctrl v 按 hjkl 光标移动进行区域选择…

用HAL库改写江科大的stm32入门-6-3 PWM驱动LED呼吸灯

接线图&#xff1a; 2 :实验目的&#xff1a; 利用pwm实现呼吸灯。 关键PWM定时器设置&#xff1a; 代码部分&#xff1a; int main(void) {/* USER CODE BEGIN 1 *//* USER CODE END 1 *//* MCU Configuration--------------------------------------------------------*…

JVM 常见配置参数

JVM 配置常见参数 Java虚拟机的参数&#xff0c;在启动jar包的时候通过java 命令指定JVM参数 -options表示Java虚拟机的启动参数&#xff0c;class为带有main()函数的Java类&#xff0c;args表示传递给主函数main()的参数。 一、系统查看参数: -XX:PrintVMOptions可以在程序…

ADC数模转换器

一、ADC&#xff08;Analog-Digital Converter&#xff09;模拟-数字转换器 1、ADC可以将引脚上连续变化的模拟电压转换为内存中存储的数字变量&#xff0c;建立模拟电路到数字电路的桥梁 2、12位逐次逼近型ADC&#xff0c;1us转换时间 3、输入电压范围&#xff1a;0~3.3V&a…

Visual Studio 2022创建dll并调用

需求&#xff1a; 创建A项目&#xff0c;有函数和类&#xff0c;将A项目生成DLL动态链接库 创建B项目&#xff0c;使用A项目生成的dll和lib相关文件 正常项目开发.h用于函数声明&#xff0c;.cpp用于函数实现&#xff0c;但是项目开发往往不喜欢将.cpp函数实现的代码发给别人&…

只出现一次的数字II ---- 位运算

题目链接 题目: 分析: 对于只出现一次的数字, 他的任意一个bit位, 可能是0或1对于其余出现3次的数字, 假设有3n个数, 那么他们的任意一个bit相加的和可能是3n个0或3n个1那么对于数组中的全部数字的任意一个bit位之和共有三种情况: 3n个1 1 3n13n个0 1 13n个1 0 3n3n个0…

反VC情绪:加密市场需要新的分布式代币发行方式

GME事件 GME事件反应了社交媒体在金融决策中的影响力&#xff0c;散户投资者群体通过集体行动&#xff0c;改变了很多人对股市的看法和参与方式。 GME事件中&#xff0c;meme扮演了核心角色。散户投资者使用各种meme来沟通策略、激励持股行为&#xff0c;创造了一种反对华尔街…

2.5Bump Mapping 凹凸映射

一、Bump Mapping 介绍 我们想要在屏幕上绘制物体的细节&#xff0c;从尺度上讲&#xff0c;一个物体的细节分为&#xff1a;宏观、中观、微观宏观尺度中其特征会覆盖多个像素&#xff0c;中观尺度只覆盖几个像素&#xff0c;微观尺度的特征就会小于一个像素宏观尺度是由顶点或…

为何懂行的人都在选海信Mini LED?

今年的618大促比往年来得要更早一些。纵览各电商平台的电视产品&#xff0c;能发现Mini LED电视的出镜率很高&#xff0c;成了各大品牌的主推产品。 对于什么样的Mini LED更值得买&#xff0c;各品牌都有自己的说辞。因为缺乏科学系统的选购标准&#xff0c;消费者容易在各方说…

【VSCode】快捷方式log去掉分号

文章目录 一、引入二、解决办法 一、引入 我们使用 log 快速生成的 console.log() 都是带分号的 但是我们的编程习惯都是不带分号&#xff0c;每次自动生成后还需要手动删掉分号&#xff0c;太麻烦了&#xff01; 那有没有办法能够生成的时候就不带分号呢&#xff1f;自然是有…

国产身份域控在接管计算机登录时,要考虑哪些场景?

当客户提出需要宁盾来接管计算机做统一认证时&#xff0c;我们知道&#xff0c;他要的其实有辣么多&#xff1a; 一、多操作系统的统一登录 信创项目中&#xff0c;客户的计算机操作系统存在windows、Linux以及麒麟、统信等国产操作系统混合使用的情况&#xff0c;而员工想要的…

云动态摘要 2024-05-31

给您带来云厂商的最新动态&#xff0c;最新产品资讯和最新优惠更新。 最新优惠与活动 [1.5折起]年中盛惠--AI分会场 腾讯云 2024-05-30 人脸核身、语音识别、文字识别、数智人、腾讯混元等热门AI产品特惠&#xff0c;1.5折起 云服务器ECS试用产品续用 阿里云 2024-04-14 云…

Zynq学习笔记--AXI4-Stream 图像数据从仿真输出到图像文件

目录 1. 简介 2. 构建工程 2.1 Vivado 工程 2.2 TestBench 代码 2.3 关键代码分析 3. VPG Background Pattern ID (0x0020) Register 4. 总结 1. 简介 使用 SystemVerilog 将 AXI4-Stream 图像数据从仿真输出到图像文件 (PPM)。 用到的函数包括 $fopen、$fwrite 和 $f…

dmdts连接kingbase8报错

dmdts连接kingbase报错 环境介绍1 人大金仓jdbc配置2 dmdts 人大金仓jdbc默认配置3 dmdts 修改jdbc配置4 达梦产品学习使用列表 环境介绍 dts版本 使用dmdts连接kingbase金仓数据库报错 无效的URL 对比jdbc连接串,修改配置解决 1 人大金仓jdbc配置 配置URL模版信息等 类名…

LabVIEW中PID控制器系统的噪声与扰动抑制策略

在LabVIEW中处理PID控制器系统中的噪声和外部扰动&#xff0c;需要从信号处理、控制算法优化、硬件滤波和系统设计四个角度入手。采用滤波技术、调节PID参数、增加前馈控制和实施硬件滤波器等方法&#xff0c;可以有效减少噪声和扰动对系统性能的影响&#xff0c;提高控制系统的…

2020 6.s081——Lab2:system calls

左岸的一座白色环形阶梯 浪人正在用和弦练习忧郁 晨曦下的少女听着吉他旋律 在许愿池边巴洛克式的叹息 ——许愿池的希腊少女 完整代码见&#xff1a;SnowLegend-star/6.s081 at syscall (github.com) System call tracing (moderate) 这个实验要求我们跟踪系统调用。 感觉实…

高级Java开发者的自我修养:深入剖析JVM垃圾回收机制及面试要点

在探索Java虚拟机&#xff08;JVM&#xff09;的奥秘过程中&#xff0c;垃圾回收机制&#xff08;GC&#xff09;是一个不可或缺的话题&#xff0c;尤其在面对大型应用和系统优化时显得尤为重要。JVM的自动内存管理是Java编程语言中一项革命性的特性&#xff0c;它大大简化了程…

Python——Selenium快速上手+方法(一站式解决问题)

目录 前言 一、Selenium是什么 二、Python安装Selenium 1、安装Selenium第三方库 2、下载浏览器驱动 3、使用Python来打开浏览器 三、Selenium的初始化 四、Selenium获取网页元素 4.1、获取元素的实用方法 1、模糊匹配获取元素 & 联合多个样式 2、使用拉姆达表达式 3、加上…

5.30 学习总

刷题记录(Codeforces Round 947 &#xff08;Div. 1 Div. 2&#xff09;B,C题)和Codeforces Round 948 &#xff08;Div. 2&#xff09;B题 一.B. 378QAQ and Mochas Array B. 378QAQ and Mochas Array time limit per test 1 second memory limit per test 256 megabytes in…

AI盒子在智慧加油站的应用

方案背景 为规范加油站作业&#xff0c;保障人民生命财产安全&#xff0c;《加油站作业安全规范》&#xff08;AQ 3010-2007&#xff09;中第五条规定&#xff1a;卸油作业基本要求&#xff0c;明确防静电、防雷电、防火、人员值守、禁止其他车辆及非工作人员进入卸油区。 痛点…