首页 > 其他分享 >蓝桥杯单片机第十三届省赛

蓝桥杯单片机第十三届省赛

时间:2024-04-03 10:01:55浏览次数:18  
标签:Disp Seg Led Relay 蓝桥 单片机 Flag Key 省赛

一、题目

这次的省赛我感觉还是比较基础的,掌握几个模块就可以完全写出

题目是在在网上找的


二、代码 

main.c
#include <STC15F2K60S2.H>
#include <ds1302.h>
#include <onewire.h>
#include <intrins.h>
#include <Init.h>
#include <Key.h>
#include <Seg.h>
#include <Led.h>

//按键
unsigned char Key_Slow_Down;//10ms
unsigned char Key_Val,Key_Down,Key_Up,Key_Old;
//数码管
unsigned int Seg_Slow_Down;//500ms
unsigned char Seg_Pos;
unsigned char Seg_Buf[8]={10,10,10,10,10,10,10,10};
unsigned char Seg_Point[8]={0,0,0,0,0,0,0,0};
//Led
unsigned char ucLed[8]={0,0,0,0,0,0,0,0};

unsigned char Seg_Disp_Mode;//0-温度显示界面 1-时间显示界面 2-参数设置界面
//温度显示界面
float Temperature;
//参数设置界面(Rtc)
unsigned char ucRtc[3]={0x23,0x59,0x49};
//参数设置界面
unsigned char Temperature_Set=23;//参数设置:初始值为23
unsigned char Temperature_Disp;//参数加和减用:初始值为23
//模式按键
bit Mode_Flag;//0-温度控制 1-时间控制
//继电器吸合
bit Relay_Flag;//1-开始计时 0-停止计时
unsigned int Relay_Timer_5000ms;//5s
//Led灯
bit Led_Flag;//1-开始计时 0-停止计时
unsigned int Led_Timer_5000ms;//5s
//L3
bit Relay_Led_Flag;//继电器是否吸合
bit Led_Star_Flag=1;//L3闪烁
unsigned char Timer_100ms;

//按键处理函数
void Key_Proc()
{
	if(Key_Slow_Down) return;
	Key_Slow_Down=1;
	
	Key_Val = Key_Read();
	Key_Down = Key_Val & (Key_Old ^ Key_Val);
	Key_Up = ~ Key_Val & (Key_Old ^ Key_Val);
	Key_Old = Key_Val;
	
	//切换按键
	if(Key_Down==12)
	{
		if(++Seg_Disp_Mode==3) 
			Seg_Disp_Mode=0;
		if(Seg_Disp_Mode==0)
			Temperature_Set=Temperature_Disp;
		if(Seg_Disp_Mode==2)
			Temperature_Disp=Temperature_Set;
	}
	//模式按键
	if(Key_Down==13)
	{
		Mode_Flag=!Mode_Flag;
		Relay(0);//切换为下一次模式做准备
		Relay_Led_Flag=0;//停止闪烁
	}

	//”加“按键
	if(Key_Down==16)
	{
		if(Seg_Disp_Mode==2)
		{
			Temperature_Disp++;
			if(Temperature_Disp>=99)
				Temperature_Disp=99;
		}	
	}
	
	//”减按键”
	if(Key_Down==17)
	{
		//参数界面按下
		if(Seg_Disp_Mode==2)
		{
			Temperature_Disp--;
			if(Temperature_Disp<=10)
				Temperature_Disp=10;
		}
	}
	
	//时间显示界面
	if(Seg_Disp_Mode==1)
	{
		//S17按下,直接按下就显示(没有计时)不需要使用Key_Down来判断
		if(Key_Old==17)
		{
			Seg_Buf[3]=ucRtc[1]/16;
			Seg_Buf[4]=ucRtc[1]%16;
			Seg_Buf[6]=ucRtc[2]/16;
			Seg_Buf[7]=ucRtc[2]%16;
		}
		//S17抬起
		if(Key_Up==17)
		{
			Seg_Buf[3]=ucRtc[0]/16;
			Seg_Buf[4]=ucRtc[0]%16;
			Seg_Buf[6]=ucRtc[1]/16;
			Seg_Buf[7]=ucRtc[1]%16;
		}
	}
}

//数码管清除函数
void Clear_Seg(void)
{
	unsigned char i;
	for(i=0;i<8;i++)
	{
		Seg_Buf[i]=10;
		Seg_Point[i]=0;
	}
}

//信息处理函数
void Seg_Proc()
{
	if(Seg_Slow_Down) return;
	Seg_Slow_Down=1;
	
	//实时读取温度
	Temperature=Read_temperature();
	//实时读取时间
	Read_Rtc(ucRtc);
	
	switch(Seg_Disp_Mode)
	{
		//温度显示界面
		case 0:
			Clear_Seg();
			Seg_Buf[0]=12;//U
			Seg_Buf[1]=Seg_Disp_Mode+1;
			Seg_Buf[5]=(unsigned char)Temperature/10%10;
			Seg_Buf[6]=(unsigned char)Temperature%10;
			Seg_Buf[7]=(unsigned int)(Temperature*10)%10;
			Seg_Point[6]=1;
		break;
		//时间显示界面
		case 1:
			Clear_Seg();
			Seg_Buf[0]=12;//U
			Seg_Buf[1]=Seg_Disp_Mode+1;
			Seg_Buf[3]=ucRtc[0]/16;
			Seg_Buf[4]=ucRtc[0]%16;
			Seg_Buf[5]=11;//-
			Seg_Buf[6]=ucRtc[1]/16;
			Seg_Buf[7]=ucRtc[1]%16;
		break;
		//参数设置界面
		case 2:
			Clear_Seg();
			Seg_Buf[0]=12;//U
			Seg_Buf[1]=Seg_Disp_Mode+1;
			Seg_Buf[6]=Temperature_Disp/10;
			Seg_Buf[7]=Temperature_Disp%10;
			break;
	}
	
}

//其他处理函数
void Led_Proc()
{
	if(Mode_Flag==0)
	{
		if(Temperature>Temperature_Set)
		{
			Relay(1);
			Relay_Led_Flag=1;
			
		}
		else
		{
			Relay(0);
			Relay_Led_Flag=0;
		}
	}
	else
	{
		if(ucRtc[1]==0x00&&ucRtc[2]==0x00)
		{
			Relay(1);
			Relay_Led_Flag=1;
			Relay_Flag=1;	
		}
		//这个5s以后,不能放在上面判断,不然会不执行
		if(Relay_Flag==0&&Relay_Timer_5000ms==5000)
		{
			Relay(0);
			Relay_Led_Flag=0;
			Relay_Timer_5000ms=0;
		}
	}
	//L1
	if(ucRtc[1]==0x00&&ucRtc[2]==0x00)
	{
		ucLed[0]=1;
		Led_Flag=1;
	}
	if(Led_Flag==0&&Led_Timer_5000ms==5000)
	{
		ucLed[0]=0;
		Led_Timer_5000ms=0;
	}
	//L2
	ucLed[1]=!Mode_Flag;//0亮 1灭
	//
	ucLed[2]=Relay_Led_Flag?Led_Star_Flag:0;
}

//定时器0初始化
void Timer0Init(void)		//1毫秒@12.000MHz
{
	AUXR &= 0x7F;		//定时器时钟12T模式
	TMOD &= 0xF0;		//设置定时器模式
	TL0 = 0x18;		//设置定时初始值
	TH0 = 0xFC;		//设置定时初始值
	TF0 = 0;		//清除TF0标志
	TR0 = 1;		//定时器0开始计时
	
	ET0=1;
	EA=1;
}

void Timer0Sever(void)interrupt 1
{
	if(++Key_Slow_Down==10) Key_Slow_Down=0;
	//改变延时,使按下S17后数码管无重影
	if(++Seg_Slow_Down==100) Seg_Slow_Down=0;
	
	if(++Seg_Pos==8) Seg_Pos=0;
	
	if(Relay_Flag==1)
	{
		if(++Relay_Timer_5000ms==5000)
		{
			Relay_Timer_5000ms=5000;
			Relay_Flag=0;//停止计时
		}
	}
	
	if(Led_Flag==1)
	{
		if(++Led_Timer_5000ms==5000)
		{
			Led_Timer_5000ms=5000;
			Led_Flag=0;//停止计时
		}
	}
	
	if(Relay_Led_Flag==1)
	{
		if(++Timer_100ms==100)
		{
			Timer_100ms=0;
			Led_Star_Flag=!Led_Star_Flag;
		}
	}
	
	Seg_Disp(Seg_Pos,Seg_Buf[Seg_Pos],Seg_Point[Seg_Pos]);
	Led_Disp(Seg_Pos,ucLed[Seg_Pos]);
	
}

//延时750ms
void Delay750ms()		//@12.000MHz
{
	unsigned char i, j, k;

	_nop_();
	_nop_();
	i = 35;
	j = 51;
	k = 182;
	do
	{
		do
		{
			while (--k);
		} while (--j);
	} while (--i);
}

//main()函数
void main()
{
	Read_temperature();
	Delay750ms();
	Set_Rtc(ucRtc);
	Timer0Init();
	System_Init();
	while(1)
	{
		Key_Proc();
		Seg_Proc();
		Led_Proc();
	}
}

模块代码可以看我以前发的代码


三、后话 

这个代码是我今天早上写的,可能会有bug,希望大家可以指正

标签:Disp,Seg,Led,Relay,蓝桥,单片机,Flag,Key,省赛
From: https://blog.csdn.net/weixin_62267326/article/details/137330547

相关文章

  • 蓝桥杯算法集训 - Week 5:树状数组、各类DP算法
    蓝桥杯算法集训-Week5本系列随笔用于整理AcWing题单——《蓝桥杯集训·每日一题2024》的系列题型及其对应的算法模板。一、树状数组树状数组是一种数据结构,可以快速地完成以下两个操作:将第i个数加上c快速求前缀和,即任意区间[i,j]的和Ⅰ、代码模板//树状数组长度......
  • 【毕业设计】基于单片机的汽车尾灯电路设计与实现(附原理图与源码)
    1引言在日新月异的21世纪里,电子产品得到了迅速发展。许多电器设备都趋于人性化、智能化,这些电器设备大部分都含有CPU控制器或者是单片机。单片机以其高可靠性、高性价比、低电压、低功耗等一系列优点,近几年得到迅猛发展和大范围推广,广泛应用于工业控制系统、通讯设备、日常消......
  • 基于51单片机的锅炉控制【热电偶,数码管,PID】(仿真)
    1、使用N型热电偶测量锅炉内部温度2、设置温度值,温度低于设定值则启动加热3、加热过程使用PID控制,PID参数固定4、数码管显示温度5、温度过限报警#include"lcd1602.h"voiddelay_uint(uinti){ while(i--);}/**************************************************......
  • 基于51单片机的波形发生器【矩形波,三角波,锯齿波,固定频率,】(仿真)
    #include"lcd1602.h"voiddelay_uint(uinti){ while(i--);}/*********************************************************************名称:write_com(ucharcom)*功能:1602命令函数*输入:输入的命令值*输出:无*********************************......
  • 蓝桥杯javaB组备赛
    15届蓝桥杯备赛java语法基础IO框架importjava.util.*;importjava.IO.IOException;importjava.IO.BufferedReader;publicclassMain{publicstaticvoidmain(String[]args)throwsIOException{BufferedReaderreader=newBufferedReader(newInputStre......
  • 【蓝桥杯】小明发明了一种给由全大写字母组成的字符串编码的方法。对于每一个大写字母
    【问题描述】小明发明了一种给由全大写字母组成的字符串编码的方法。对于每一个大写字母,小明将它转换成它在26个英文字母中序号,即A→1,B→2,...Z→26。这样一个字符串就能被转化成一个数字序列:比如ABCXYZ→123242526。现在给定一个转换后的数字序列,小明想还原出原本的......
  • 蓝桥杯备考随手记: 字符串转换
    在Java中,字符串转换是指将一个数据类型的变量转换成字符串类型的操作。字符串转换可以通过以下几种方式实现:使用String类的valueOf()方法:该方法可以将任意数据类型转换成字符串类型。例如:intnum=10;Stringstr=String.valueOf(num);该方法还可以用于将字符数组转换......
  • smu2024蓝桥杯训练1
    A[语言月赛202401]装满葡萄汁的酒杯查看代码voidsolve(){intn;cin>>n;if(n<=100)cout<<100;elseif(n<=150)cout<<150;elseif(n<=300)cout<<300;elseif(n<=400)cout<<400;e......
  • 蓝桥杯练习笔记(十六)
    蓝桥杯练习笔记(十六)一、输入示例:312111347453这是用到了m叉树的结论:对于某个m叉树的一个节点n,假如其有完整子树,则其左子节点l为l=(n-1)m+2,右子节点r为r=mn+1。基于此我们可以快速判断这个数在某些节点处的具体情况。比如是否是满叶子等等。蓝桥官网题解:......
  • 酷得单片机方案 2.4G儿童遥控漂移车
    电子方案开发定制,我们是专业的东莞酷得智能单片机方案之2.4G遥控玩具童车具有以下比较有特色的特点:1、内置充电电池:这款小车配备了可充电的电池,无需频繁更换电池,既环保又方便。充电方式可能为USB充电或者专用的充电器充电,具体需要查看产品说明。2、50米遥控距离:这款小车......