蓝桥杯单片机省赛——第九届“彩灯控制器”程序部分

本文回顾了历届蓝桥杯单片机省赛的编程要点,包括基础代码(如蜂鸣器、继电器、LED和定时器)、按键处理、驱动编写、数码管显示以及I2C通信。作者强调了今年比赛的挑战性在于理论少但实际应用复杂。
摘要由CSDN通过智能技术生成

往期回顾

第三届蓝桥杯单片机省赛
第四届蓝桥杯单片机省赛
第五届蓝桥杯单片机省赛
第六届蓝桥杯单片机省赛
第七届蓝桥杯单片机省赛
第八届蓝桥杯单片机省赛


在这里插入图片描述

在这里插入图片描述

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

个人感觉这一届相对于以前应该是最难的一届,虽然用的东西少,但是如果是考场上想到就比较难了,对于那些只会八股文的来说

一、前期准备

1:本文使用的头文件是由stc生成
在这里插入图片描述
点击保存文件之后,保存至自己文件目录下方即可
在这里插入图片描述
2:本文使用的都是官方提供的底层驱动代码
在这里插入图片描述

二、代码详情

1.基础代码

蜂鸣器/继电器/led/定时器之类的代码

参考之前写的文章
第四届蓝桥杯代码讲解

2.按键详解

按键写法讲解

直接跳转以前的文章即可
多种蓝桥杯/51按键写法详解

3.驱动的处理

驱动写法讲解

直接跳转以前的文章即可
蓝桥杯驱动处理

4.数码管部分处理

直接跳转以前的文章即可
蓝桥杯数码管部分处理

4.总代码

#include<stc15f2k.h>
#include<iic.h>
sbit s7=P3^0;
sbit s6=P3^1;
sbit s5=P3^2;
sbit s4=P3^3;
char dula[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf,0xff};
char disdula[]={0,0,0,0,0,0,0,0};

int diswela=9,key,ms,wei=9,sign,run=9;
int date=1,clock_1=400,clock_2=400,clock_3=400,clock_4=400;
int rb,pwm,a,aa;
bit flag,stop,flag_1;
void zhuanhuan();
void buzz()
{
	P2=((P2&0x1f)|0xa0);
	P0=0x00;
	P2&=0x1f;
}

void led(int x)
{
	P2=((P2&0x1f)|0x80);
	P0=x;
	P2&=0x1f;
}

void delay(int x)
{
	int i;
	while(x--)
		for(i=0;i<5*123;i++);
}

void din()
{
	TMOD=0X10;
	TH1=(65536-11059/12)/256;
	TL1=(65536-11059/12)%256;
	EA=1;
	ET1=1;
	TR1=1;
}

void display()
{
	if(diswela==wei&ms>800)
	{
		if(wei==1)
		diswela=diswela+1;
		if(wei==4)
		diswela=diswela+4;
	}
	
	P2=((P2&0x1f)|0xe0);
	P0=0xff;
	P2&=0x1f;
	
	P2=((P2&0x1f)|0xc0);
	P0=1<<diswela;
	P2&=0x1f;
	
	P2=((P2&0x1f)|0xe0);
	P0=dula[disdula[diswela]];
	P2&=0x1f;
	
	
	if(++diswela>=10)diswela=0;
}

void display_1(int date)
{
	disdula[0]=0;
	disdula[1]=date;
	disdula[2]=0;
	disdula[3]=11;
	if(date==1)
	{
	disdula[4]=clock_1/1000%10;
	disdula[5]=clock_1/100%10;
	disdula[6]=clock_1/10%10;
	disdula[7]=clock_1/1%10;
	}
	if(date==2)
	{
	disdula[4]=clock_2/1000%10;
	disdula[5]=clock_2/100%10;
	disdula[6]=clock_2/10%10;
	disdula[7]=clock_2/1%10;
	}
	if(date==3)
	{
	disdula[4]=clock_3/1000%10;
	disdula[5]=clock_3/100%10;
	disdula[6]=clock_3/10%10;
	disdula[7]=clock_3/1%10;
	}
	if(date==4)
	{
	disdula[4]=clock_4/1000%10;
	disdula[5]=clock_4/100%10;
	disdula[6]=clock_4/10%10;
	disdula[7]=clock_4/1%10;
	}
}

char anjian()
{
	int keyscan=0;
	if(s4==0||s5==0||s6==0||s7==0)
	{
		delay(10);
		if(s4==0)keyscan=4;
		else if(s5==0)keyscan=5;
		else if(s6==0)keyscan=6;
		else if(s7==0)keyscan=7;
	}while(s5==0||s6==0){display();display_1(date);}
	return keyscan;
}

void at2402_write(int add,int date)
{
	IIC_Start();
	IIC_SendByte(0xa0);
	IIC_WaitAck();
	IIC_SendByte(add);
	IIC_WaitAck();
	IIC_SendByte(date);
	IIC_WaitAck();
	IIC_Stop();
}
	
char at2402_read(int add)
{
	int date;
	IIC_Start();
	IIC_SendByte(0xa0);
	IIC_WaitAck();
	IIC_SendByte(add);
	IIC_WaitAck();
	
	IIC_Start();
	IIC_SendByte(0xa1);
	IIC_WaitAck();
	date=IIC_RecByte();
	IIC_WaitAck();
	IIC_SendByte(0);
	IIC_Stop();
	return date;
}

void ad()
{
	IIC_Start();
	IIC_SendByte(0x90);
	IIC_WaitAck();
	IIC_SendByte(0x03);
	IIC_WaitAck();
	IIC_Stop();
	
	IIC_Start();
	IIC_SendByte(0x91);
	IIC_WaitAck();
	rb=IIC_RecByte();
	IIC_WaitAck();
	IIC_Stop();
	
	zhuanhuan();
}
	
void display_2()
{ 
	delay(1);            //???????????
	disdula[0]=11;
	disdula[1]=11;
	disdula[2]=11;
	disdula[3]=11;
	disdula[4]=11;	
	disdula[5]=11;		
	disdula[6]=0;
	disdula[7]=rb%10;
}


void zhuanhuan()
{
	if(rb>=0&rb<60)rb=1;
	if(rb>=60&rb<120)rb=2;
	if(rb>=120&rb<180)rb=3;
	if(rb>=180&rb<=255)rb=4;
}

void led_mode()
{
	int x;
	static int i=0,mode=0;
	if(stop==1)
	{
	switch(mode)
	{
		case 0:
			x=~(0x01<<i);
		aa=x;
			led(x);
			delay(clock_1);
		if(++i>=8)
		{
			i=0;
			mode=1;
		}
		break;
		
		case 1:
			x=~(0x80>>i);
		aa=x;
			led(x);
			delay(clock_2);
		if(++i>=8)
		{
			i=0;
			mode=2;
		}
			break;
		
			case 2:
			x=~((0x01<<i)|(0x80>>i));
			aa=x;
			led(x);
			delay(clock_3);
		if(++i>=4)
		{
			i=0;
			mode=3;
		}
			break;
		
		case 3:
			x=~((0x10<<i)|(0x08>>i));
		aa=x;
			led(x);
			delay(clock_4);
		if(++i>=4)
		{
			i=0;
			mode=0;
		}
			break;
		}
	}
	if(stop==0)led(0xff);
	
}
	

void renwu_1()
{
	++sign;
	if(sign<=1){wei=1;run=1;}
	if(sign==2)wei=4;
  if(sign>=3){wei=9;sign=0;run=9;}
}

void renwu_2()
{
	if(wei==1)
	{
		date++;
		if(date>=5)date=1;
	}
	
	if(wei==4)
	{
		if(date==1)
		{
			clock_1=clock_1+100;
			if(clock_1>=1300)clock_1=400;
		}
		if(date==2)
		{
			clock_2=clock_2+100;
			if(clock_2>=1300)clock_2=400;
		}
		if(date==3)
		{
			clock_3=clock_3+100;
			if(clock_3>=1300)clock_3=400;
		}
		if(date==4)
		{
			clock_4=clock_4+100;
			if(clock_4>=1300)clock_4=400;
		}
	}
}

void renwu_3()
{
	if(wei==1)
	{
		date--;
		if(date<=0)date=4;
	}
	
	if(wei==4)
	{
		if(date==1)
		{
			clock_1=clock_1-100;
			if(clock_1<=300)clock_1=1200;
		}
		if(date==2)
		{
			clock_2=clock_2-100;
			if(clock_2<=300)clock_2=1200;
		}
		if(date==3)
		{
			clock_3=clock_3-100;
			if(clock_3<=300)clock_3=1200;
		}
		if(date==4)
		{
			clock_4=clock_4-100;
			if(clock_4<=300)clock_4=1200;
		}
	}
}

void duqu()
{
	clock_1=at2402_read(0x01)*100;
	delay(10);
	clock_2=at2402_read(0x02)*100;
	delay(10);
	clock_3=at2402_read(0x03)*100;
	delay(10);
	clock_4=at2402_read(0x04)*100;
	delay(10);
}


void xieru()
{
	if(date==1)
	{		
	at2402_write(0x01,clock_1/100);
	delay(10);
	}
	else if(date==2)
	{	
	at2402_write(0x02,clock_2/100);
	delay(10);
	}
	else if(date==3)
	{
	at2402_write(0x03,clock_3/100);
	delay(10);
	}
	else if(date==4)
	{
	at2402_write(0x04,clock_4/100);
	delay(10);
	}
}
	
void take_on()
{
	int i;
	if(clock_1==0||clock_2==0||clock_3==0||clock_4==0)
	{
		for(i=0;i<4;i++)
		{
		if(clock_1==0)clock_1=400;
		else if(clock_2==0)clock_2=400;
		else if(clock_3==0)clock_3=400;
		else if(clock_4==0)clock_4=400;
	}
}
}

void renwu_6()
{
	run=4;
	while(1)
	{
		display_2();
		display();
	if(s4==1)
	{
		run=9;
		break;
	}
	}
}

void pwm_1()
{
	switch(rb)
	{
		case 1:pwm=1;break;
		case 2:pwm=2;break;
    case 3:pwm=3;break;
		case 4:pwm=5;break;
	}
}

void main()
{
	duqu();
	buzz();
	led(0xff);
	take_on();
	din();
	while(1)
	{
		if(flag_1==1){flag_1=0;led_mode();}
		if(run==1)display_1(date);
		if(wei==4)xieru();
		ad();
		pwm_1();
	}
}

void qa() interrupt 3
{
	TH1=(65536-11059/12)/256;
	TL1=(65536-11059/12)%256;
	ms++;;a++;
	if(!(ms%100)){flag=1;flag_1=1;}
	if(ms==1000)ms=0;
	display();
	if(run==9)diswela=9;
		if(flag==1)
		{
			flag=0;
			key=anjian();
			switch(key)
			{
				case 4:
				{
				if(wei==1||wei==4)
				{
					renwu_3();
					while(!s4)
				{
					if(wei==1||wei==4)
					{
					display_1(date);
					display();
					}
				}
				}
				if(wei==9)
				
					renwu_6();
					
			
				break;
				}				
				case 5:renwu_2(); break;				
				case 6:renwu_1(); break;
				case 7: 
				if(stop==0)stop=1;
					else stop=0;
				while(!s7)
				{
					if(wei==1||wei==4)
					{
					display_1(date);
					display();
					}
					else
					{
						diswela=8;
						display();
						display_1(date);
					}
				}
				break;
			}
		}
	if(stop==1)
	{
	if(a==pwm)led(0xff);
	if(a>=5){led(aa);a=0;}
	}		
}



  • 6
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值