蓝桥杯单片机决赛(国赛)第十一届题目加代码

一、 前言

马上就要决赛了,总是感觉准备的不是很充足,听说拿到省一的小伙伴有的都保研了,可怜那,学校不好,都没有保研名额。
下面进入正题

二、题目

在这里插入图片描述

pdf版链接

链接:https://pan.baidu.com/s/11JVfZjdRJzbwwZZNCLPctg
提取码:yh3g
复制这段内容后打开百度网盘手机App,操作更方便哦

三、代码

main.c

#include "main.h"

uint temp;
uint light;

bit lb;
bit lb_flag;//亮暗标志位
bit light_flag = 1;
bit temp_flag = 1;
bit t_flag1;//时间标志位
bit t_flag2;

char h_num = 17;//参数界面默认数据
char temp_num = 25;
char led_num = 4;

sbit led1 = P0^0;
sbit led2 = P0^1;
sbit led3 = P0^2;
sbit led4 = P0^3;
sbit led5 = P0^4;
sbit led6 = P0^5;
sbit led7 = P0^6;
sbit led8 = P0^7;

void Timer0Init(void)		//2毫秒@11.0592MHz
{
	AUXR |= 0x80;		//定时器时钟1T模式
	TMOD &= 0xF0;		//设置定时器模式
	TL0 = 0x9A;		//设置定时初值
	TH0 = 0xA9;		//设置定时初值
	TF0 = 0;		//清除TF0标志
	TR0 = 1;		//定时器0开始计时
	EA = 1;
	ET0 = 1;
}


bit key_flag;
bit s4;
uchar s5;
uchar key_val;
uchar key_scanf();

void main()
{
	Y4; P0 = 0xff;
	Y5; P0 = 0x00;
	ds_write(16,59,50);
	Timer0Init();
	while(1)
	{
		
		if(key_flag == 1)
			{
				key_val = key_scanf();
				key_flag = 0;
			}
		if(light_flag==1)
			{
				light = ad_read(1);
				light_flag = 0;
				if(light<250){lb = 1;}
				else{lb = 0;}					
			}	
		if(temp_flag == 1)
			{
				temp_flag = 0;
				temp = rd_temperature();
			}
		if(s4 == 0)
			{
				if(s5==0)
				{				
					smg_display(h/10,h%10,24,m/10,m%10,24,s/10,s%10);
				}
				if(s5==1)
				{					
					smg_display(21,20,20,20,20,temp/100,temp%100/10+10,temp%10);
				}
				if(s5 == 2)
				{					
					smg_display(22,20,light/100+10,light%100/10,light%10,20,20,lb);			
				}
		}
		if(s4 == 1)
		{
			if(s5==0)
			{				
				smg_display(23,1,20,20,20,20,h_num/10,h_num%10);
			}
			if(s5==1)
			{					
				smg_display(23,2,20,20,20,20,temp_num/10,temp_num%10);
			}
			if(s5 == 2)
			{					
				smg_display(23,3,20,20,20,20,20,led_num);											
			}
		}
	}
}

void Timer0() interrupt 1
{
	uchar key_ms;
	uchar ms;
	uint lb_ms;
	smg();
	ds_read();
	key_ms++;
	if(key_ms == 5){key_ms = 0; key_flag = 1;light_flag = 1;}
	ms++;
	if(ms%50 == 0){light_flag = 1;}
	if(ms == 200){temp_flag = 1;ms = 0;}
	
	if(lb == 1)
	{
		lb_ms++;
		if(lb_ms == 1500)
		{
			lb_ms = 0;
			lb_flag = 1;
		}
	}
	else if(lb == 0)
	{
		 lb_ms++;
			if(lb_ms == 1500)
			{
				lb_ms = 0;
				lb_flag = 0;
			}
	}
	if(ms%20 == 0)
	{
		if(s4 == 0)
		{
			P2 = 0x80;
			if(h_num<8)
			{
				if(h<h_num)
				{t_flag1 = 1;}
			}
			if(t_flag1 == 1)
			{
				if(h != 8){led1 = 0;}
				else {t_flag1 = 0;led1 = 1;}
			}
			if(h_num>8)
			{
				if(h<h_num)
				{t_flag2 = 1;}
			}
			if(t_flag2 == 1)
			{
				if(h != 8){led1 = 0;}
				else {t_flag2 = 0;led1 = 1;}
			}
//			if(h<h_num){led1 = 0;}
//			else {led1 = 1;}
			
			if((temp/10)<temp_num){led2 = 0;}
			else {led2 = 1;}
		}
		if(lb_flag == 0)
			{led3 = 1;}
		else 
		{
			led3 = 0;
		}
		if(lb == 1)
		{
			if(s4 == 0)
			{
				if(led_num == 4){led4 = 0;led5 = 1;led6 = 1;led7 = 1; led8 = 1;}
				else if(led_num == 5){led4 = 1;led5 = 0;led6 = 1;led7 = 1; led8 = 1;}
				else if(led_num == 6){led4 = 1;led5 = 1;led6 = 0;led7 = 1; led8 = 1;}
				else if(led_num == 7){led4 = 1;led5 = 1;led6 = 1;led7 = 0; led8 = 1;}
				else if(led_num == 8){led4 = 1;led5 = 1;led6 = 1;led7 = 1; led8 = 0;}
			}
		}
			Y0;
	}
}


uchar key_return;
uchar key_scanf()//状态机按键
{
	static uchar key_state = key_state_0;
	uchar key_temp;
	uchar key1,key2;
	P3 = 0x0f;P42 = 0;P44 = 0;
	if(P30 == 0) key1 = 0x0e;
	if(P31 == 0) key1 = 0x0d;
	if(P32 == 0) key1 = 0x0b;
	if(P33 == 0) key1 = 0x07;
	if(P3 == 0x0f) key1 = 0x0f;
	P3 = 0xf0;P42 = 1;P44 = 1;
	if(P34 == 0) key2 = 0xe0;
	if(P35 == 0) key2 = 0xd0;
	if(P42 == 0) key2 = 0xb0;
	if(P44 == 0) key2 = 0x70;
	if((P34 == 1)&(P35 == 1)&(P42 == 1)&(P44 == 1))key2 = 0xf0;
	key_temp = key1|key2;
	switch(key_state)
	{
		case key_state_0:if(key_temp != no_key) key_state = key_state_1;break;
		case key_state_1:
			if(key_temp != no_key)
			{
				key_state = key_state_2;
				switch(key_temp)
				{
					case 0x7b: key_return = 5;
					{s5++; if(s5 == 3) s5 = 0;}
					break;
					case 0x77: key_return = 4;s4=~s4;s5 = 0;
					break;
					case 0xbb: key_return = 9;
					if(s4 == 1)
					{
						if(s5 == 0){h_num++;if(h_num == 24)h_num = 0;}
						if(s5 == 1){temp_num++;if(temp_num == 100)temp_num = 0;}
						if(s5 == 2){led_num++;if(led_num == 9) led_num = 4;}
					}
					break;
					case 0xb7: key_return = 8;
					if(s4 == 1)
					{
						if(s5 == 0){h_num--;if(h_num == -1)h_num = 23;}
						if(s5 == 1){temp_num--;if(temp_num == -1)temp_num = 99;}
						if(s5 == 2){led_num--;if(led_num == 3) led_num = 8;}
					}
					break;
				}
			}
			else {key_state = key_state_0;}
			break;
		case key_state_2:
			if(key_temp == no_key)
			{
				key_state = key_state_0;
			}
			break;
	}
	return key_return;
}

main.h

#ifndef _MAIN_H
#define _MAIN_H

#include "common.h"
#include "smg.h"
#include "ds1302.h"
#include "onewire.h"
#include "iic.h"

#define key_state_0 0
#define key_state_1 1
#define key_state_2 2

#define no_key 0xff

extern uchar h,m,s;

#endif

代码完整版
链接:https://pan.baidu.com/s/1mxq-nX5RLpP0hFpdxpSTZA
提取码:bjgd
复制这段内容后打开百度网盘手机App,操作更方便哦

小结

在按键处理时key1和key2我给搞混了,找了好久错误,十一届决赛不难,主要是是led处理麻烦,第一个led要求不知道实现没有因为时间关系。本程序是状态机按键写的可以看看哦,挺好用。

  • 4
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值