蓝桥杯单片机——第十二届蓝桥杯单片机第一场省赛
蓝桥杯单片机——第十二届蓝桥杯单片机第一场省赛
目录
- 蓝桥杯单片机——第十二届蓝桥杯单片机第一场省赛
- 一、赛题分析
- 二、问题总结
- 三、代码
一、赛题分析
前两天实验室的学妹把开发板还给我了,刚好今天没什么事做,就来做做今天的省赛题目。 在下是参加的去年的蓝桥杯单片机组,今年也刚参加的嵌入式组的省赛,已经好几个月没有摸单片机的板子了,以为会很生疏,看了一下之前的代码,然后做了一下今年的赛题,发现很快就找回感觉了。发现单片机组相对于嵌入式组确实要简单得多。 真的不难呀,大家一定要上手把几个基础模块过一遍,然后做两三套赛题,进决赛都挺容易的,相信我。
这一届的赛题也就中规中矩吧,已经完了前几届赛题的难度,总之这一届的还是偏简单。除了基础的数码管显示,矩阵键盘,LED之外,要是临近比赛,连这些都没有熟悉的画,自己去面壁思过吧。除此之外还考察了PCF8591的DAC功能和DS18B20。要说稍微有点难度的就是矩阵键盘和DS18B20的小数显示了吧,因为可能有些人偷懒根本就没有看过这两个部分。至于PCF8591的DAC相较于ADC简单得多,没有看过的,看一下程序应该就懂了,完整的程序可以参考第三部分。
二、问题总结
发现没有什么问题可以总结的,都不难…
三、代码
#include "STC15F2K60S2.h"
#include "onewire.h"
#include "iic.h"#define u8 unsigned char
#define u16 unsigned int#define TEMP_INTERFACE 0
#define DAC_INTERFACE 1
#define SETTING_INTERFACE 2#define get() (P3 & 0X3F) | ((P4 & 0X10) << 3) | ((P4 & 0X04) << 4)u8 code TAB[] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf,0xff,0xc6,0x8c,0x88};
u8 disbuf[] = {0,1,2,3,4,5,6,7,8};u8 smg_cnt = 0;u8 key_buf = 0;u16 sec_tick = 0;
u8 sec_cnt = 0;u8 interface = 0;u8 temperature_para = 25;
u8 temperature_para_temp = 25;bit mode = 0;float volt = 3.25;float temperature = 0.0;void write_pcf8591(unsigned char dat)
{IIC_Start();IIC_SendByte(0x90);IIC_WaitAck();IIC_SendByte(0x40);IIC_WaitAck();IIC_SendByte(dat);IIC_WaitAck();IIC_Stop();
}float read_temperature(void)
{unsigned char high,low;unsigned int temp;init_ds18b20();Write_DS18B20(0xcc);Write_DS18B20(0x44);init_ds18b20();Write_DS18B20(0xcc);Write_DS18B20(0xbe);low = Read_DS18B20();high = Read_DS18B20();temp = high;temp <<= 8;temp |= low;return temp * 0.0625;
}void Delay5ms() //@12.000MHz
{unsigned char i, j;i = 59;j = 90;do{while (--j);} while (--i);
}void set_port(u8 p2,u8 p0)
{P2 = (P2 & 0x1F) | p2; // 使能74HC573,与上0x1F是为了不影响其他的端口P0 = p0;P2 &= 0x1F; // 将数据锁存
}void allinit(void)
{set_port(0x80,0xFF); // 关闭所有LEDset_port(0xA0,0x00); // 关闭继电器,蜂鸣器等外设set_port(0xC0,0x00); // 关闭数码管位选set_port(0xE0,0x00); // 关闭数码管段选
}void display(void)
{if(interface == TEMP_INTERFACE){disbuf[1] = 12;disbuf[2] = 11;disbuf[3] = 11;disbuf[4] = 11;disbuf[5] = (u16)(temperature * 100) / 1000;disbuf[6] = (u16)(temperature * 100) / 100 % 10;disbuf[7] = (u16)(temperature * 100) / 10 % 10;disbuf[8] = (u16)(temperature * 100) / 1000 % 10;}else if(interface == SETTING_INTERFACE){disbuf[1] = 13;disbuf[2] = 11;disbuf[3] = 11;disbuf[4] = 11;disbuf[5] = 11;disbuf[6] = 11;disbuf[7] = temperature_para_temp / 10;disbuf[8] = temperature_para_temp % 10;}else if(interface == DAC_INTERFACE){disbuf[1] = 14;disbuf[2] = 11;disbuf[3] = 11;disbuf[4] = 11;disbuf[5] = 11;disbuf[6] = (u16)(volt * 100) / 100;disbuf[7] = (u16)(volt * 100) / 10 % 10;disbuf[8] = (u16)(volt * 100) % 10;}}void Timer2Init(void) //1毫秒@12.000MHz
{AUXR |= 0x04; //定时器时钟1T模式T2L = 0x20; //设置定时初值T2H = 0xD1; //设置定时初值AUXR |= 0x10; //定时器2开始计时
}void KBD(void)
{u8 key_temp ;P3 = 0X0F; P44 = 0; P42 = 0;key_temp = get();P3 = 0XF0; P44 = 1; P42 = 1;key_temp |= get();if(key_temp != 0xff && !key_buf){Delay5ms();P3 = 0X0F; P44 = 0; P42 = 0;key_temp = get();P3 = 0XF0; P44 = 1; P42 = 1;key_temp |= get();if(key_temp != 0xff && !key_buf){ key_buf = key_temp;}}else if(key_temp == 0xff && key_buf){Delay5ms();P3 = 0X0F; P44 = 0; P42 = 0;key_temp = get();P3 = 0XF0; P44 = 1; P42 = 1;key_temp |= get();if(key_temp == 0xff && key_buf){ switch(key_buf) // 这里要特别注意是key_buf,不要粗心写成了key_temp{// case 0x7e: disbuf[1] = 7; disbuf[2] = 10; disbuf[3] = 10; break;
// case 0x7d: disbuf[1] = 6; disbuf[2] = 10; disbuf[3] = 10; break;case 0x7b: // s5mode = !mode;break;case 0x77: // s6switch(interface){case TEMP_INTERFACE: temperature_para_temp = temperature_para;interface = SETTING_INTERFACE; break;case SETTING_INTERFACE:temperature_para = temperature_para_temp;interface = DAC_INTERFACE; break;case DAC_INTERFACE: interface = TEMP_INTERFACE; break;}break;// case 0xbe: disbuf[1] = 1; disbuf[2] = 1; disbuf[3] = 10; break;
// case 0xbd: disbuf[1] = 1; disbuf[2] = 0; disbuf[3] = 10; break;case 0xbb: // s9temperature_para_temp++;break;case 0xb7: // s8temperature_para_temp--;break;// case 0xde: disbuf[1] = 1; disbuf[2] = 5; disbuf[3] = 10; break;
// case 0xdd: disbuf[1] = 1; disbuf[2] = 4; disbuf[3] = 10; break;
// case 0xdb: disbuf[1] = 1; disbuf[2] = 3; disbuf[3] = 10; break;
// case 0xd7: disbuf[1] = 1; disbuf[2] = 2; disbuf[3] = 10; break;
//
// case 0xee: disbuf[1] = 1; disbuf[2] = 9; disbuf[3] = 10; break;
// case 0xed: disbuf[1] = 1; disbuf[2] = 8; disbuf[3] = 10; break;
// case 0xeb: disbuf[1] = 1; disbuf[2] = 7; disbuf[3] = 10; break;
// case 0xe7: disbuf[1] = 1; disbuf[2] = 6; disbuf[3] = 10; break; }key_buf = 0;}}}void smg_proc(void)
{set_port(0xc0, 0x01 << smg_cnt);if((interface == TEMP_INTERFACE && smg_cnt == 5) || (interface == DAC_INTERFACE && smg_cnt == 5))set_port(0xe0, TAB[disbuf[smg_cnt + 1]] & 0x7F);elseset_port(0xe0, TAB[disbuf[smg_cnt + 1]]);if(++smg_cnt >= 8) smg_cnt = 0;if(++sec_tick == 1000){sec_tick = 0;(sec_cnt != 59)?(sec_cnt++):(sec_cnt = 0);}
}void dac_proc(void)
{if(mode == 0){if(temperature < temperature_para)write_pcf8591(0);elsewrite_pcf8591(255);}else{if(temperature < 20)write_pcf8591(0);else if(temperature > 40)write_pcf8591(255);elsewrite_pcf8591((6.0 / 40 * temperature - 2) / 5.0 * 255);}
}void led_proc(void)
{u8 led_state = 0xff;if(mode == 0)led_state &= 0xFE;if(interface == TEMP_INTERFACE)led_state &= 0xFD;else if(interface == SETTING_INTERFACE)led_state &= 0xFB;else if(interface == DAC_INTERFACE)led_state &= 0xF7;set_port(0x80,led_state);
}/********************* Timer2中断函数************************/
void timer2_int (void) interrupt 12
{smg_proc();led_proc();
}void main(void)
{allinit(); // 上电初始化Timer2Init(); // 定时器2初始化IE2 |= 0x04; // 开定时器2中断EA = 1; // 开启总中断while(1){temperature = read_temperature();dac_proc();display();KBD();}
}
完整工程下载点我
蓝桥杯单片机——第十二届蓝桥杯单片机第一场省赛相关推荐
- 蓝桥杯嵌入式——第十二届蓝桥杯嵌入式国赛
蓝桥杯嵌入式--第十二届蓝桥杯嵌入式国赛 之前准备省赛的时候用的是旧版的STM32F103,从准备国赛开始就用新版STM32G431平台了,主要是想经过新版的准备学习一下HAL库以及CubeMX的使用 ...
- 最新 2021年 第十二届 蓝桥杯 单片机设计与开发 省赛 客观试题 个人答案
第十二届蓝桥杯单片机设计与开发项目省赛 第一部分客观试题(30分) 不定项选择(3分/题) (1)MCS-51单片机外部中断1的中断请求标志是( B ). A.ET1 B.IE1 ...
- 【蓝桥杯单片机第十二届国赛真题】
[蓝桥杯单片机第十二届国赛真题] 文章目录 [蓝桥杯单片机第十二届国赛真题] 前言 一.真题 二.源码 前言 有幸进入国赛,为自己大学最后一个比赛画上完满的句号^@^ 下面为蓝桥杯单片机第十二届国赛程 ...
- 蓝桥杯单片机第十二届第一场省赛--张三填坑
Less interests.More interest. 蓝桥杯单片机第十二届第一场省赛--张三填坑 坑0 坑1 坑2 坑3 坑4 坑5 坑6 坑7 坑8 仅记录试题中可能存在的坑. 源码和PDF题 ...
- 第十二届蓝桥杯电子类嵌入式设计与开发省、国赛经验分享
文章目录 前言 一.嵌入式省赛 二.嵌入式国赛 1.前期准备 2.国赛考试 总结 前言 已经考完差不多两周时间了,自己也一直想找个时间写一篇关于蓝桥杯的总结,所以今天就来啦,希望可以帮到后面想参加蓝桥 ...
- 报!!第十二届蓝桥杯大赛报名启动!!
蓝桥杯全国软件和信息技术专业人才大赛是由工业和信息化部人才交流中心举办的全国性IT学科赛事.共有北京大学.清华大学.上海交通大学等全国1200余所高校参赛,累计参赛人数超过40万人. 2020年,蓝桥 ...
- 十二届蓝桥杯省赛B组C++解析(填空题部分)
十二届蓝桥杯省赛B组C++解析(填空题部分) 目录 十二届蓝桥杯省赛B组C++解析(填空题部分) A:空间 B:卡片 C:直线 D:货物摆放 E:路径 A:空间 该题是一道计算机基础原理题,这里需要了 ...
- 2021年第十二届蓝桥杯 - 省赛 - C/C++大学A组 - D.路径
2021年第十二届蓝桥杯 - 省赛 - C/C++大学A组 - D.路径 Ideas 算法:最短路径 数据结构:图 思路:根据规则构图,单源最短路径Dijkstra算法. 首先构图其实很简单,就是按照 ...
- 2021年第十二届蓝桥杯 - 省赛 - C/C++大学B组 - I.双向排序
2021年第十二届蓝桥杯 - 省赛 - C/C++大学B组 - I.双向排序 Ideas 题目中给出了两种操作: 当 pi = 0 时,表示将 a1, a2, · · · , aqi 降序排列: 当 ...
最新文章
- 【OpenCV 4开发详解】图像直方图绘制
- WPF 4 Ribbon 开发 之 应用程序菜单(Application Menu)
- The MIT License (MIT)
- 一件代发系统php网站源码_靠谱礼品代发平台网站一件代发(0.5元)
- 一步一步了解Promise原理
- Qwt--散点图/函数图
- 买房申请房贷被拒,首付款要打水漂了吗?
- 程序员总结的:最没有学习效率的 5 种方法!你在用其中哪一种?
- NB-IoT适用于电子门锁通信吗?
- mysql数据库什么情况下会锁表_mysql数据库锁的产生原因及解决办法
- IOS开发笔记 - 关于导航标题栏的颜色问题
- 在计算机中 ascii码是几位二进制编码,ASCII码采用多少位二进制编码
- javassist官方文档翻译
- 宗宁:企业微博品牌榜的新时代意义
- 小米手机解BL锁、线刷详细教程,适用于小米全系列手机
- 不需要数据库的php迷你博客程序,GitHub - Smilefish0/miniblog: 一个不需要数据库、轻量级、微型、开源的博客程序!...
- android intent scheme,android Scheme使用 打开指定的Activity
- 页面数据能够正常渲染,但控制台报错属性underfined
- defaults(default是什么职位)
- 机电一体化仿真--手爪
热门文章
- es6利用Reflect实现观察者模式,并详解Reflect对象
- ags infoWindow 应用
- 【Android】高德地图在Debug模式下运行正常但是打Release包时则闪退解决办法
- c语言上交源代码怎么交啊,C语言问题在线等啊作业提交上交的的内容必须由以下两个部分组成,缺 爱问知识人...
- 软件实训-用例图2.0 + 简单用例描述
- UI-Bootstrap 模态对话框示例
- 【Android初级】什么是ANR?如何防止?如何修复?
- 冷战背景下的计算机,袁岚峰:鼓吹科技冷战,格调太低
- 实现人脸磨皮算法---OpenCV-Python开发指南(58)
- css3 烟 蚊香_css3+js实现烟花绽放的动画效果(代码示例)