【蓝桥杯】第十一届单片机省赛第二场

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

题目

暂时没找到pdf

代码参考

#include "reg52.h"
#include "iic.h"
#include "onewire.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

sfr P4 = 0xc0;
sfr AUXR = 0x8e;

sbit R1 = P3^0;
sbit R2 = P3^1;
sbit R3 = P3^2;
sbit R4 = P3^3;

sbit C1 = P4^4;
sbit C2 = P4^2;
sbit C3 = P3^5;
sbit C4 = P3^4;

uint8 code TAB[18] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0xbf,0x7f};

uint8 code MTAB[3] = {0xc1,0x8c,0xc8};
void InitHC138(uint8 Channel);
void InitSystem(void);
void Delay(uint32 ms);
void Display_Bit(uint8 pos,uint8 date);
void Display_All(uint8 date);
void Display(uint8 node);
void Key_Scan(void);
uint8 ReadByte(uint8 addr);
void WriteByte(uint8 addr,uint8 date);
uint8 ADC(uint8 ch);
void Calculate_Vpcnt(void);
void LED_Control(void);
uint8 node = 0;
uint8 mode = 0;
uint8 value = 0;
uint32 Vain3 = 0;

uint32 Vp = 200;
uint32 cntN = 0;
uint8 cntflag = 1;
uint8 Exit_flag = 0;
uint8 flag1 = 0;
uint8 flag2 = 0;
uint8 cnt50ms = 0;
uint8 LED1_Flag = 0;
uint8 LED2_Flag = 0;
uint8 LED3_Flag = 0;
uint8 start_flag = 0;
uint8 cnt3 = 0;
void Timer0Init(void)		//50毫秒@12.000MHz
{
	AUXR &= 0x7F;		//定时器时钟12T模式
	TMOD &= 0xF0;		//设置定时器模式
	TL0 = 0xB0;		//设置定时初始值
	TH0 = 0x3C;		//设置定时初始值
	TF0 = 0;		//清除TF0标志
	TR0 = 1;		//定时器0开始计时
	ET0 = 1;
	EA = 1;
}

void Time0_Hander(void) interrupt 1
{
	cnt50ms++;
	if(cnt50ms>=100)
	{
		TR0 = 0;
		cnt50ms = 0;
		LED1_Flag = 1;
		start_flag = 1;
	}
}
void main(void)
{
	InitSystem();
	Timer0Init();
	WriteByte(0x00,30);
	Delay(10);
	Vp = ReadByte(0x00)*10;
	Delay(10);
	
	while(1)
	{
		value = ADC(0x03);
		Vain3 = (uint32)(value*500.0/255);//放大100倍
		Calculate_Vpcnt();
		Key_Scan();
		LED_Control();
		Display(node);
	}
}
void Calculate_Vpcnt(void)
{
	if(Vp==500)
	{
		if(Vain3<500)//未到达
		{
			flag1 = 1;//允许比较
		}
		else if(flag1==1&&Vain3<=Vp)
		{
			flag1 = 0;
			
			if(cntN<99)
				cntN++;
		}
	}
	else
	{
		if(Vain3>Vp)
		{
			flag2 = 1;
		}
		else if(flag2==1&&Vain3<=Vp)
		{
			flag2 = 0;
			if(cntN<99)
				cntN++;
		}
	}
}
void LED_Control(void)
{
	uint8 date = 0x07;
	if(Vain3<Vp)
		TR0 = 1;
	else 
	{
		LED1_Flag = 0;
		cnt50ms = 0;
		TR0 = 0;
	}

	if(cntN%2)
		LED2_Flag = 1;
	else
		LED2_Flag = 0;
	
	if(cnt3>=3)
		LED3_Flag = 1;
	else
		LED3_Flag = 0;
	
	date &= LED1_Flag|(LED2_Flag<<1)|(LED3_Flag<<2);
	
	InitHC138(LED_Channel);
	P0 = ~date;
	InitHC138(0);
	
}
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 &= 0x1f;
	}
}
void InitSystem(void)
{
	InitHC138(BEEP_RELAY_Channel);
	P0 = 0x00;
	InitHC138(LED_Channel);
	P0 = 0xff;
	InitHC138(0);
}
void Delay(uint32 ms)
{
	uint32 x,y;
	for(x=0;x<ms;x++)
		for(y=846;y>0;y--){}
}
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(uint8 node)
{
	switch(node)
	{
		case 0:
			Display_Bit(0,MTAB[0]),Delay(1);
			Display_Bit(1,0xff),Delay(1);
			Display_Bit(2,0xff),Delay(1);
			Display_Bit(3,0xff),Delay(1);
			Display_Bit(4,0xff),Delay(1);
			Display_Bit(5,TAB[Vain3/100]-0x80),Delay(1);
			Display_Bit(6,TAB[(Vain3%100)/10]),Delay(1);
			Display_Bit(7,TAB[Vain3%10]),Delay(1);
			Display_All(0xff);
			break;
		case 1:
			Display_Bit(0,MTAB[1]),Delay(1);
			Display_Bit(1,0xff),Delay(1);
			Display_Bit(2,0xff),Delay(1);
			Display_Bit(3,0xff),Delay(1);
			Display_Bit(4,0xff),Delay(1);
			Display_Bit(5,TAB[Vp/100]-0x80),Delay(1);
			Display_Bit(6,TAB[(Vp%100)/10]),Delay(1);
			Display_Bit(7,TAB[Vp%10]),Delay(1);
			Display_All(0xff);
			break;
		case 2:
			Display_Bit(0,MTAB[2]),Delay(1);
			Display_Bit(1,0xff),Delay(1);
			Display_Bit(2,0xff),Delay(1);
			Display_Bit(3,0xff),Delay(1);
			Display_Bit(4,0xff),Delay(1);
			Display_Bit(5,0xff),Delay(1);
			Display_Bit(6,TAB[cntN/10]),Delay(1);
			Display_Bit(7,TAB[cntN%10]),Delay(1);
			Display_All(0xff);
			break;
	}
	
}
void Key_Scan(void)
{
	R3 = 0, R4 = 1;
	C3 = 1, C4 = 1;
	
	if(C3==0)//S13
	{
		Delay(10);
		if(node==2)
		{
			cnt3 = 0;
			if(C3==0)
			{
				cntN = 0;
				while(C3==0)
				{
					Display(node);
				}
			}
		}
		else if(node==1)//无效按键
		{
			cnt3++;
			while(C3==0)
			{
				Display(node);
			}
		}
		
	}
	if(C4==0)//S17
	{
		Delay(10);
		if(node==1)
		{
			cnt3 = 0;
			if(C4==0)
			{
				if(Vp<=0)
					Vp = 500;
				else
					Vp-=50;
				while(C4==0)
				{
					Display(node);
				}
			}
		}
		else if(node==2)
		{
			cnt3++;
			while(C4==0)
			{
				Display(node);
			}
		}
		
	}
	
	
	
	R3 = 1, R4 = 0;
	C3 = 1, C4 = 1;
	
	if(C3==0)//S12
	{
		Delay(10);
		if(C3==0)
		{
			cnt3 = 0;//有效
			++node;
			if(node == 2)
			{
				//退出参数界面
				WriteByte(0x00,Vp/10);//10倍
				Delay(5);
			}
			if(node>=3)
			{
				node = 0;
				
			}
			while(C3==0)
			{
				Display(node);
			}
		}
	}
	if(C4==0&&node==1)//S16
	{
		Delay(10);
		if(node==1)
		{
			cnt3 = 0;
			if(C4==0)
			{
				if(Vp>=500)
					Vp = 0;
				else
					Vp+=50;
				
				while(C4==0)
				{
					Display(node);
				}
			}
		}
		else if(node==2)
		{
			cnt3++;
			while(C4==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;
}
uint8 ReadByte(uint8 addr)
{
	uint8 date;
	IIC_Start();
	IIC_SendByte(0xa0);
	IIC_WaitAck();
	IIC_SendByte(addr);
	IIC_WaitAck();
	IIC_Stop();
	
	IIC_Start();
	IIC_SendByte(0xa1);
	IIC_WaitAck();
	date = IIC_RecByte();
	IIC_SendAck(1);
	IIC_Stop();
	return date;
}
void WriteByte(uint8 addr,uint8 date)
{
	IIC_Start();
	IIC_SendByte(0xa0);
	IIC_WaitAck();
	IIC_SendByte(addr);
	IIC_WaitAck();
	IIC_SendByte(date);
	IIC_WaitAck();
	IIC_Stop();
}



总结

效果差不多,有些地方参考了别人的。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值