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

2024-06-01 04:44

本文主要是介绍蓝桥杯单片机第五届国赛题目,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

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

目录

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

题目

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

代码

注: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){//S4Delay(de);while(P33 == 0){showselect();}workmode = ~workmode;}if(P32 == 0){//S5Delay(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;
}

这篇关于蓝桥杯单片机第五届国赛题目的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1020017

相关文章

基于51单片机的自动转向修复系统的设计与实现

文章目录 前言资料获取设计介绍功能介绍设计清单具体实现截图参考文献设计获取 前言 💗博主介绍:✌全网粉丝10W+,CSDN特邀作者、博客专家、CSDN新星计划导师,一名热衷于单片机技术探索与分享的博主、专注于 精通51/STM32/MSP430/AVR等单片机设计 主要对象是咱们电子相关专业的大学生,希望您们都共创辉煌!✌💗 👇🏻 精彩专栏 推荐订阅👇🏻 单片机

题目1254:N皇后问题

题目1254:N皇后问题 时间限制:1 秒 内存限制:128 兆 特殊判题:否 题目描述: N皇后问题,即在N*N的方格棋盘内放置了N个皇后,使得它们不相互攻击(即任意2个皇后不允许处在同一排,同一列,也不允许处在同一斜线上。因为皇后可以直走,横走和斜走如下图)。 你的任务是,对于给定的N,求出有多少种合法的放置方法。输出N皇后问题所有不同的摆放情况个数。 输入

题目1380:lucky number

题目1380:lucky number 时间限制:3 秒 内存限制:3 兆 特殊判题:否 提交:2839 解决:300 题目描述: 每个人有自己的lucky number,小A也一样。不过他的lucky number定义不一样。他认为一个序列中某些数出现的次数为n的话,都是他的lucky number。但是,现在这个序列很大,他无法快速找到所有lucky number。既然

单片机毕业设计基于单片机的智能门禁系统的设计与实现

文章目录 前言资料获取设计介绍功能介绍程序代码部分参考 设计清单具体实现截图参考文献设计获取 前言 💗博主介绍:✌全网粉丝10W+,CSDN特邀作者、博客专家、CSDN新星计划导师,一名热衷于单片机技术探索与分享的博主、专注于 精通51/STM32/MSP430/AVR等单片机设计 主要对象是咱们电子相关专业的大学生,希望您们都共创辉煌!✌💗 👇🏻 精彩专栏 推荐订

【408数据结构】散列 (哈希)知识点集合复习考点题目

苏泽  “弃工从研”的路上很孤独,于是我记下了些许笔记相伴,希望能够帮助到大家    知识点 1. 散列查找 散列查找是一种高效的查找方法,它通过散列函数将关键字映射到数组的一个位置,从而实现快速查找。这种方法的时间复杂度平均为(

C语言蓝桥杯

一、语言基础 竞赛常用库函数 最值查询 min_element和max_element在vector(迭代器的使用) nth_element函数的使用 例题lanqiao OJ 497成绩分析 第一种用min_element和max_element函数的写法 第二种用min和max的写法 二分查找 二分查找只能对数组操作 binary_s

码蹄集部分题目(2024OJ赛9.4-9.8;线段树+树状数组)

1🐋🐋配对最小值(王者;树状数组) 时间限制:1秒 占用内存:64M 🐟题目思路 MT3065 配对最小值_哔哩哔哩_bilibili 🐟代码 #include<bits/stdc++.h> using namespace std;const int N=1e5+7;int a[N],b[N],c[N],n,q;struct QUERY{int l,r,id;}que

2024年高教社杯数学建模国赛最后一步——结果检验-事关最终奖项

2024年国赛已经来到了最后一天,有必要去给大家讲解一下,我们不需要过多的去关注模型的结果,因为模型的结果的分值设定项最多不到20分。但是如果大家真的非常关注的话,那有必要给大家讲解一下论文结果相关的问题。很多的论文,上至国赛优秀论文下至不获奖的论文并不是所有的论文都可以进行完整的复现求解,大部分数模论文都为存在一个灰色地带。         白色地带即认为所有的代码均可运行、公开

基于stm32的河流检测系统-单片机毕业设计

文章目录 前言资料获取设计介绍功能介绍具体实现截图参考文献设计获取 前言 💗博主介绍:✌全网粉丝10W+,CSDN特邀作者、博客专家、CSDN新星计划导师,一名热衷于单片机技术探索与分享的博主、专注于 精通51/STM32/MSP430/AVR等单片机设计 主要对象是咱们电子相关专业的大学生,希望您们都共创辉煌!✌💗 👇🏻 精彩专栏 推荐订阅👇🏻 单片机设计精品

2024 年高教社杯全国大学生数学建模竞赛题目——2024 年高教社杯全国大学生数学建模竞赛题目的求解

2024 年高教社杯全国大学生数学建模竞赛题目 (请先阅读“ 全国大学生数学建模竞赛论文格式规范 ”) 2024 年高教社杯全国大学生数学建模竞赛题目 随着城市化进程的加快、机动车的快速普及, 以及人们活动范围的不断扩大,城市道 路交通拥堵问题日渐严重,即使在一些非中心城市,道路交通拥堵问题也成为影响地方经 济发展和百姓幸福感的一个“痛点”,是相关部门的棘手难题之一。 考虑一个拥有知名景区