第十一届蓝桥杯单片机组省赛赛题

2023-11-29 22:50

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

题目在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

程序

官方已给出的底层驱动代码就不再陈列,其中iic.c文件的IIC_Delay函数以及iic.h文件需要做一些更改,已经给出。

iic.h

这里由于工程用不到IIC_SendAck函数,就将其注释掉,这样编译器就不会报warning。

#ifndef __IIC_H_
#define __IIC_H_void IIC_Start(void); 
void IIC_Stop(void);  
bit IIC_WaitAck(void);  
//void IIC_SendAck(bit ackbit); 
void IIC_SendByte(unsigned char byt); 
unsigned char IIC_RecByte(void); unsigned char adc_pcf(void);
void eeprom_wr(unsigned char adr,unsigned char date);
unsigned char eeprom_re(unsigned char adr);#endif

iic.c

#include "intrins.h"void IIC_Delay(unsigned char i)
{do{_nop_();}while(i--);        
}unsigned char adc_pcf(void)
{unsigned char date;IIC_Start();IIC_SendByte(0x90);IIC_WaitAck();IIC_SendByte(0x43);IIC_WaitAck();IIC_Start();IIC_SendByte(0x91);IIC_WaitAck();date = IIC_RecByte();IIC_WaitAck();IIC_Stop();return date;
}void eeprom_wr(unsigned char adr,unsigned char date) 
{EA = 0;IIC_Start();IIC_SendByte(0xa0);IIC_WaitAck();IIC_SendByte(adr);IIC_WaitAck();IIC_SendByte(date);IIC_WaitAck();IIC_Stop();EA = 1;
}unsigned char eeprom_re(unsigned char adr)
{unsigned char date;EA = 0;IIC_Start();IIC_SendByte(0xa0);IIC_WaitAck();IIC_SendByte(adr);IIC_WaitAck();IIC_Start();IIC_SendByte(0xa1);IIC_WaitAck();date = IIC_RecByte();IIC_WaitAck();IIC_Stop();EA = 1;return date;
}

other.h

主要存放了关闭外设,数码管驱动,定时器初始化,按键扫描,延时函数。

#ifndef __OTHER_H_
#define __OTHER_H_#include <stc15f2k60s2.h>void Delay2ms(void);
unsigned char seg_tran(int number);
void seg_disp(int adr,int number);
void seg_disp_f(int adr,int number);
int key_scan(void);
void close_perl(void);
void Timer0Init(void);#endif

other.c

#include <other.h>void Delay2ms(void)		//@11.0592MHz
{unsigned char i, j;i = 22;j = 128;do{while (--j);} while (--i);
}unsigned char seg_tran(int number)
{unsigned char date;switch(number){case	0	:	date = 	0xc0	;	break;case	1	:	date = 	0xf9	;	break;case	2	:	date = 	0xa4	;	break;case	3	:	date = 	0xb0	;	break;case	4	:	date = 	0x99	;	break;case	5	:	date = 	0x92	;	break;case	6	:	date = 	0x82	;	break;case	7	:	date = 	0xf8	;	break;case	8	:	date = 	0x80	;	break;case	9	:	date = 	0x90	;	break;case	10	:	date = 	0xbf	;	break;//-case	11	:	date = 	0xc6	;	break;//ccase	12	:	date = 	0x8c	;	break;//pcase	13	:	date = 	0x86	;	break;//ecase	14	:	date = 	0xc7	;	break;//Lcase 	15	:	date = 	0xc8	;	break;//acase 	16	:	date = 	0xc1	;	break;//U}return date;
}void seg_disp(int adr,int number)
{unsigned char seg_adr[8] = {0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};P2 = P2&0x1f|0xe0;P2 = P2&0x1f;P0 = seg_adr[adr];P2 = P2&0x1f|0xc0;P2 = P2&0x1f;P0 = seg_tran(number);P2 = P2&0x1f|0xe0;P2 = P2&0x1f;
}void seg_disp_f(int adr,int number)
{unsigned char seg_adr[8] = {0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};P2 = P2&0x1f|0xe0;P2 = P2&0x1f;P0 = seg_adr[adr];P2 = P2&0x1f|0xc0;P2 = P2&0x1f;P0 = seg_tran(number)&0x7f;P2 = P2&0x1f|0xe0;P2 = P2&0x1f;
}	int key_scan(void)
{int key,key_mark;P3 = 0x0f;P44 = 0;P42 = 1;P35 = 1;P34 = 1;key = P3;P44 = 1;P42 = 0;key = (key<<4)|(P3&0x0f);P42 = 1;P35 = 0;key = (key<<4)|(P3&0x0f);P35 = 1;P34 = 0;key = (key<<4)|(P3&0x0f);switch(~key){case 0x8000: key_mark = 4;break; case 0x4000: key_mark = 5;break; case 0x2000: key_mark = 6;break; case 0x1000: key_mark = 7;break; case 0x0800: key_mark = 8;break; case 0x0400: key_mark = 9;break; case 0x0200: key_mark = 10;break; case 0x0100: key_mark = 11;break; case 0x0080: key_mark = 12;break; case 0x0040: key_mark = 13;break; case 0x0020: key_mark = 14;break; case 0x0010: key_mark = 15;break; case 0x0008: key_mark = 16;break; case 0x0004: key_mark = 17;break; case 0x0002: key_mark = 18;break; case 0x0001: key_mark = 19;break; default    : key_mark = 0 ;break;//这句很重要,必须有!}return key_mark;
}void close_perl(void)
{P0 = 0xff;P2 = P2&0x1f|0x80;P2 = P2&0x1f;P0 = 0x00;P2 = P2&0x1f|0xa0;P2 = P2&0x1f;
}void Timer0Init(void)		//10毫秒@11.0592MHz
{AUXR &= 0x7F;		//定时器时钟12T模式TMOD &= 0xF0;		//设置定时器模式TL0 = 0x00;		//设置定时初值TH0 = 0xDC;		//设置定时初值TF0 = 0;		//清除TF0标志TR0 = 1;		//定时器0开始计时ET0 = 1;EA = 1;
}

main.c

#include <other.h>
#include <iic.h>#define Led1 0x01
#define Led2 0x02
#define Led3 0x04unsigned int key_nosymbol = 0;
unsigned int count;
unsigned int p_bigger_times;unsigned char key_old;unsigned char show_mode;int c_vol_100 = 0;
int c_vol_10;
int vol_100;
float vol_f;
unsigned char adc;
bit count_on;
bit led1_ok;void key_pro(void)
{unsigned char key_down,key_vol;key_vol = key_scan();key_down = key_vol&(key_vol^key_old);key_old = key_vol;switch(key_down){case 12:show_mode ++;if(show_mode == 3)	{show_mode = 0;eeprom_wr(0x00,c_vol_10);}key_nosymbol = 0;break;case 13:if(show_mode == 2)	{count = 0;key_nosymbol = 0;}else key_nosymbol ++;break;case 16:if(show_mode == 1)	{c_vol_100 = c_vol_100 + 50;if(c_vol_100 == 550)	c_vol_100 = 0;key_nosymbol = 0;}elsekey_nosymbol ++;break;case 17:if(show_mode == 1)	{c_vol_100 = c_vol_100 - 50;if(c_vol_100 < 0)	c_vol_100 = 500;key_nosymbol = 0;}elsekey_nosymbol ++;break;}
}void seg_pro(void)
{adc = adc_pcf();vol_f = (float)adc/255*5.00;vol_100 = vol_f*100;c_vol_10 = c_vol_100/10;if((count_on == 1)&&(vol_100 <= c_vol_100)){count = count + 1;count_on = 0;}else count_on = 0;if(vol_100 > c_vol_100){count_on = 1;}seg_disp(1,count_on);Delay2ms();switch(show_mode){case 0:seg_disp(0,16);	Delay2ms();seg_disp_f(5,vol_100/100);	Delay2ms();seg_disp(6,vol_100%100/10);	Delay2ms();seg_disp(7,vol_100%10);	Delay2ms();break;case 1:seg_disp(0,12);	Delay2ms();seg_disp_f(5,c_vol_100/100);	Delay2ms();seg_disp(6,c_vol_100%100/10);	Delay2ms();seg_disp(7,c_vol_100%10);	Delay2ms();break;case 2:seg_disp(0,15);	Delay2ms();if(count > 1000)	seg_disp(4,count/1000);	Delay2ms();if(count > 100)	seg_disp(5,count%1000/100);	Delay2ms();if(count > 10)	seg_disp(6,count%100/10);	Delay2ms();seg_disp(7,count%10);	Delay2ms();break;}
}void led_pro(void)
{P0 = 0xff;if(count%2 != 0)	//计数值为奇数时,L2亮{P0 = P0&(~Led2);P2 = P2&0x1f|0x80;P2 = P2&0x1f;}else{P0 = P0|(Led2);P2 = P2&0x1f|0x80;P2 = P2&0x1f;}if(led1_ok == 1)	//p > can 超过5s led1亮{P0 = P0&(~Led1);P2 = P2&0x1f|0x80;P2 = P2&0x1f;p_bigger_times = 0; }else{P0 = P0|(Led1);P2 = P2&0x1f|0x80;P2 = P2&0x1f;}if(key_nosymbol == 3){P0 = P0&(~Led3);P2 = P2&0x1f|0x80;P2 = P2&0x1f;}else{P0 = P0|(Led3);P2 = P2&0x1f|0x80;P2 = P2&0x1f;}
}void main(void)
{Timer0Init();close_perl();c_vol_100 = eeprom_re(0x00)*10;while(1){key_pro();seg_pro();led_pro();}
}void timer0(void) interrupt 1
{if(vol_100 > c_vol_100){p_bigger_times ++;if(p_bigger_times >= 500){led1_ok = 1;}}else	{led1_ok = 0;p_bigger_times = 0;}
}

由于图快,就没有写注释,有问题或者觉得哪里写的不完美可以在评论区直接提出或私信,本小白csdn常在线。

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



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

相关文章

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

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

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

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

C语言蓝桥杯

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

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

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

VB和51单片机串口通信讲解(只针对VB部分)

标记:该篇文章全部搬自如下网址:http://www.crystalradio.cn/thread-321839-1-1.html,谢谢啦            里面关于中文接收的部分,大家可以好好学习下,题主也在研究中................... Commport;设置或返回串口号。 SettingS:以字符串的形式设置或返回串口通信参数。 Portopen:设置或返回串口

MCU5.51单片机的最小系统

1.最小系统的组成部分 晶振电路(时钟),复位电路,电源电路(控制电压,保持稳定),下载电路(外加的,用于烧录程序) 烧录: 通过下载电路,把程序下载到单片机中用于运行 2.晶振电路 电路图: 是晶振 是电容 为了防止晶振起振时产生影响,因此加电容 3.复位电路 电路图: 按按钮RSTK1(保持一段时间的高电平)即可实现STC芯片的复位 4.电源电路 电路图:

单片机XTAL引脚引出的晶振分析

51单片机的18,19脚XTAL1,XTAL2用来提供外部振荡源给片内的时钟电路。 XTAL1和XTAL2引脚,该单片机可以使用外部时钟也可以使用内部时钟。 当使用内部时钟时,此二引线端用于外接石英晶体和微调电容; 当使用外部时钟时,用于接外部时钟信号,NMOS接XTAL2,CMOS接XTAL1。 原理: XTAL1和XTAL2分别是一个反相器的输入和输出。NMOS的反相器是

找不同-第15届蓝桥省赛Scratch初级组真题第4题

[导读]:超平老师的《Scratch蓝桥杯真题解析100讲》已经全部完成,后续会不定期解读蓝桥杯真题,这是Scratch蓝桥杯真题解析第183讲。 如果想持续关注Scratch蓝桥真题解读,可以点击《Scratch蓝桥杯历年真题》并订阅合集,查阅教程更方便。 第15届蓝桥杯省赛已于2024年8月24日落下帷幕,编程题一共有5题,分别如下: 猪八戒落地 游乐场 画西瓜 找不同 消

【蓝桥杯嵌入式(一)程序框架和调度器】

蓝桥杯嵌入式(一)程序框架和调度器 序、代码命名规则零、STM32和8051⼀、软件及环境安装⼆、⼯程框架搭建1.时钟配置2、SYS配置3、⼯程配置4、NVIC配置5.、Keil配置 三、系统初始化四、任务调度器 链接: 视频出处 序、代码命名规则 以下是一些常见的举例 零、STM32和8051 链接: 8位和32位单片机最本质区别 ⼀、软件及环境安装

飞凌单片机开发IDE环境

飞凌单片机 资料下载选择芯片类型:MCU->GPIO选择芯片型号:FM8PE53B IDE工具安装: 资料下载 飞凌官网 选择芯片类型:MCU->GPIO 选择芯片型号:FM8PE53B IDE工具安装: 运行Generic ICE 0.02-250.03 setup,一直点击“下一步”即可。 双击运行:Generic ICE