【蓝桥杯】第九届单片机省赛

【蓝桥杯】第九届单片机省赛

题目

在这里插入图片描述

代码参考

#include "reg52.h"
#include "iic.h"

typedef unsigned char uint8;
typedef unsigned int uint32;

#define LED_Channel 		4
#define BEEP_RELAY_Channel  5
#define COM_Channel 		6
#define SMG_Channel 		7

uint8 code TAB[12] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x8e,0xc1};
uint8 LED_Flow[3][8] = {~0x01,~0x02,~0x04,~0x08,~0x10,~0x20,~0x40,~0x80,
						~0x80,~0x40,~0x20,~0x10,~0x08,~0x04,~0x02,~0x01,
						0x7e,0xbd,0xdb,0xe7,0xe7,0xdb,0xbd,0x7e};
uint32 LED_Time[4] = {1200,800,600,400};
sfr P4 = 0xc0;
sfr AUXR = 0x8e;
sbit S7 = P3^0;
sbit S6 = P3^1;
sbit S5 = P3^2;
sbit S4 = P3^3;

uint8 LED_Date = ~0x01;
uint32 cnt_flow = 0;
uint8 pwm;
uint8 cnt_smg = 0;
uint8 node = 0;//0 1 2 
uint8 mode = 0;//0 1 2 3
uint8 LED_Count = 0;
uint8 cnt800ms_flag = 1;
uint8 rank = 0;
uint8 start_flag = 0;
uint8 Voltage = 0;
uint8 flag = 1;
void Init_System(void);
void InitHC138(uint8 Channel);
void Delay(uint32 ms);
void Display_Bit(uint8 pos,uint8 date);
void Display_All(uint8 date);
void Display(node);
uint8 ADC(uint8 ch);
void Key_Scan(void);

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 Timer1Init(void)		//40毫秒@12.000MHz
{
	AUXR &= 0xBF;		//定时器时钟12T模式
	TMOD &= 0x0F;		//设置定时器模式
	TL1 = 0xC0;		//设置定时初始值
	TH1 = 0x63;		//设置定时初始值
	TF1 = 0;		//清除TF1标志
	TR1 = 1;		//定时器1开始计时
	
	ET1 = 1;
	EA = 1;
}

void Time0_Hander(void) interrupt 1
{
	if(start_flag==1)
	{
		pwm++;
		if(pwm<=(LED_Time[LED_Count/8+LED_Count/20]/4.0)*rank/100.0)
		{
			if(flag)
			{
				flag = 0;
				InitHC138(LED_Channel);
				P0 = LED_Date;
				InitHC138(0);
			}
		}
		else 
		{
			if(flag==0)
			{
				flag = 1;
				InitHC138(LED_Channel);
				P0 = 0xff;
				InitHC138(0);
			}
		}
		if(pwm>=LED_Time[LED_Count/8+LED_Count/20]/100.0)
		{
			pwm = 0;
			flag=1;
		}
		cnt_flow++;
		if(cnt_flow>=LED_Time[LED_Count/8+LED_Count/20])
		{
			cnt_flow = 0;
			++LED_Count;
			if(LED_Count>=24)
				LED_Count = 0;
			LED_Date = LED_Flow[LED_Count/8][LED_Count%8];
			flag = 1;
		}
		
	}
	
}
void Time1_Hander(void) interrupt 3
{
	cnt_smg++;
	if(cnt_smg>=20)
	{
		cnt_smg = 0;
		if(node!=0)
			cnt800ms_flag=!cnt800ms_flag;
		else
			cnt800ms_flag = 1;
	}
	
}

	
void main(void)
{
	Init_System();
	Timer0Init();
	Timer1Init();
	
	while(1)
	{
		Voltage = ADC(0x03);
		if(Voltage<=(255.0/4))
			rank = 1;
		else if(Voltage<=(255.0*2/4))
			rank = 2;
		else if(Voltage<=(255.0*3/4))
			rank = 3;
		else 
			rank = 4;
		Key_Scan();
		Display(node);
		
	}
}

void Delay(uint32 ms)
{
	uint32 x,y;
	for(x=0;x<ms;x++)
		for(y=846;y>0;y--){}
}
void InitHC138(uint8 Channel)
{
	switch(Channel)
	{
		case 4:P2 = (P2 & 0x1f) | 0x80;break;
		case 5:P2 = (P2 & 0x1f) | 0xa0;break;
		case 6:P2 = (P2 & 0x1f) | 0xc0;break;
		case 7:P2 = (P2 & 0x1f) | 0xe0;break;
		default:P2 = (P2 & 0x1f);
	}
}
void Init_System(void)
{
	InitHC138(BEEP_RELAY_Channel);
	P0 = 0x00;
	InitHC138(LED_Channel);
	P0 = 0xff;
	InitHC138(0);
	
}
void Display_Bit(uint8 pos,uint8 date)
{
	InitHC138(COM_Channel);
	P0 = 0x01<<pos;
	InitHC138(SMG_Channel);
	P0 = date;
	InitHC138(0);
}
void Display_All(uint8 date)
{
	InitHC138(COM_Channel);
	P0 = 0xff;
	InitHC138(SMG_Channel);
	P0 = date;
	InitHC138(0);
}
void Display(node)
{
	switch(node)
	{
		case 0:
			Display_All(0xff);
			break;
		case 1:
			if(cnt800ms_flag)
			{
				Display_Bit(0,TAB[0]),Delay(2);
				Display_Bit(1,TAB[mode+1]),Delay(2);
				Display_Bit(2,TAB[0]),Delay(2);
			}
			else
			{
				Display_Bit(0,0xff),Delay(2);
				Display_Bit(1,0xff),Delay(2);
				Display_Bit(0,0xff),Delay(2);
			}
			Display_Bit(3,0xff),Delay(2);
			if(LED_Time[mode]/1000)
				Display_Bit(4,TAB[LED_Time[mode]/1000]),Delay(2);
			else
				Display_Bit(4,0xff),Delay(2);
			Display_Bit(5,TAB[(LED_Time[mode]%1000)/100]),Delay(2);
			Display_Bit(6,TAB[(LED_Time[mode]%100)/10]),Delay(2);
			Display_Bit(7,TAB[LED_Time[mode]%10]),Delay(2);
			Display_All(0xff);
			break;
		case 2:
			Display_Bit(0,TAB[0]),Delay(2);
			Display_Bit(1,TAB[mode+1]),Delay(2);
			Display_Bit(2,TAB[0]),Delay(2);
			Display_Bit(3,0xff),Delay(2);
			if(cnt800ms_flag)
			{
				if(LED_Time[mode]/1000)
					Display_Bit(4,TAB[LED_Time[mode]/1000]),Delay(2);
				else
					Display_Bit(4,0xff),Delay(2);
				Display_Bit(5,TAB[(LED_Time[mode]%1000)/100]),Delay(2);
				Display_Bit(6,TAB[(LED_Time[mode]%100)/10]),Delay(2);
				Display_Bit(7,TAB[LED_Time[mode]%10]),Delay(2);
			}
			else
			{
				Display_Bit(4,0xff),Delay(2);
				Display_Bit(5,0xff),Delay(2);
				Display_Bit(6,0xff),Delay(2);
				Display_Bit(7,0xff),Delay(2);
			}
			Display_All(0xff);
			break;
		case 3:
			Display_Bit(0,0xff),Delay(2);
			Display_Bit(1,0xff),Delay(2);
			Display_Bit(2,0xff),Delay(2);
			Display_Bit(3,0xff),Delay(2);
			Display_Bit(4,0xff),Delay(2);
			Display_Bit(5,0xff),Delay(2);
			Display_Bit(6,TAB[0]),Delay(2);
			Display_Bit(7,TAB[rank]),Delay(2);
			Display_All(0xff);
			break;
	}
}
void Key_Scan(void)
{
	if(S4==0)
	{
		Delay(10);
		if(S4==0)
		{
			if(node==1)
			{
				if(mode<=0)
					mode = 3;
				else
					--mode;
			}
			else if(node==2)
			{
				if(LED_Time[mode]<=500)
					LED_Time[mode] = 400;
				else
					LED_Time[mode] = LED_Time[mode] - 100;
				
			}
			if(node!=0)
			{
				while(S4==0)
				{
					Display(node);
				}
			}
			else
			{
				while(S4==0)
				{
					Display(3);
				}
			}
			
		}
	}
	if(S5==0)
	{
		Delay(10);
		if(S5==0)
		{
			if(node==1)
			{
				if(mode>=3)
					mode = 0;
				else
					++mode;
			}
			else if(node==2)
			{
				if(LED_Time[mode]>=1100)
					LED_Time[mode] = 1200;
				else
					LED_Time[mode] = LED_Time[mode] + 100;
			}
			while(S5==0)
			{
				Display(node);
			}
		}
	}
	if(S6==0)
	{
		Delay(10);
		if(S6==0)
		{
			++node;
			if(node>=3)
			{
				node = 0;
				mode = 0;
			}
			cnt_smg = 0;
			cnt800ms_flag = 1;
			while(S6==0)
			{
				Display(node);
			}
		}
	}
	if(S7==0)
	{
		Delay(10);
		if(S7==0)
		{
			start_flag = !start_flag;
			while(S7==0)
			{
				Display(node);
			}
		}
	}
}
uint8 ADC(uint8 ch)
{
	uint8 date;
	IIC_Start();
	IIC_SendByte(0x90);
	IIC_WaitAck();
	IIC_SendByte(ch);
	IIC_WaitAck();
	//IIC_Stop();
	
	IIC_Start();
	IIC_SendByte(0x91);
	IIC_WaitAck();
	date = IIC_RecByte();
	IIC_SendAck(1);
	IIC_Stop();
	
	return date;
	
}

总结

还没细看,感觉挺简单。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值