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

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

题目

在这里插入图片描述

代码参考

#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};

sfr P4 = 0xc0;
sfr AUXR = 0x8e;
sbit S7 = P3^0;
sbit S6 = P3^1;
sbit S5 = P3^2;
sbit S4 = P3^3;
uint8 L1 = 0;
uint8 L2 = 0;
uint8 L3 = 0;
uint8 L4 = 0;
uint8 L5 = 0;
uint8 node = 0;
uint8 mode = 0;
uint32 Frequence = 0;
uint32 Voltage = 0;
uint32 Temp_Voltage = 0;
uint32 cnt_f = 0;
uint32 cnt50ms = 0;
uint8 DAC_Flag = 0;
uint8 LED_Flag = 1;
uint8 SMG_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 DAC(uint8 date,uint8 flag);
void LED_Control(void);
void Key_Scan(void);

void Timer01Init(void)		
{
	TMOD = 0x06;
	
	TL0 = 0xff;		//设置定时初始值
	TH0 = 0xff;		//设置定时初始值
	
	TL1 = (65536-50000)%255;		//设置定时初始值
	TH1 = (65536-50000)/255;		//设置定时初始值
	
	TF0 = 0;		
	TR0 = 1;		
	
	TF1 = 0;		
	TR1 = 1;	
	
	ET0 = 1;
	ET1 = 1;
	
	EA = 1;
	
}
void Time0_Hander(void) interrupt 1
{
	cnt_f++;
}
void Time1_Hander(void) interrupt 3
{
	cnt50ms++;
	if(cnt50ms>=20)
	{
		cnt50ms = 0;
		Frequence = cnt_f;
		cnt_f = 0;
	}
}
void main(void)
{
	Init_System();
	Timer01Init();
	while(1)
	{
		Temp_Voltage = ADC(0x03);
		Voltage = Temp_Voltage*100/51.0;
		DAC(Temp_Voltage,DAC_Flag);
		Key_Scan();
		Display(node);
		LED_Control();
	}
}
void LED_Control(void)
{
	P0 = 0xff;
	if(node==0)
	{
		L1 = 1;
		L2 = 0;
	}
	else
	{
		L1 = 0;
		L2 = 1;
	}
	if(Voltage<150)
		L3 = 0;
	else if(Voltage<250)
		L3 = 1;
	else if(Voltage<350)
		L3 = 0;
	else
		L3 = 1;
	if(Frequence<1000)
		L4 = 0;
	else if(Frequence<5000)
		L4 = 1;
	else if(Frequence<10000)
		L4 = 0;
	else
		L4 = 1;
	if(DAC_Flag==0)
		L5 = 0;
	else
		L5 = 1;
	
	InitHC138(LED_Channel);
	P0 &= ~(L1|(L2<<1)|(L3<<2)|(L4<<3)|(L5<<4));
	InitHC138(0);
		
}
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;
}
void Display_All(uint8 date)
{
	InitHC138(COM_Channel);
	P0 = 0xff;
	InitHC138(SMG_Channel);
	P0 = date;
	InitHC138(0);
}
void Display(node)
{
	uint32 date1,date2;
	if(SMG_Flag)
	{
		switch(node)
		{
			case 0:
				Display_Bit(0,TAB[11]),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[(Voltage/100)%10]-0x80),Delay(1);
				Display_Bit(6,TAB[(Voltage%100)/10]),Delay(1);
				Display_Bit(7,TAB[Voltage%10]),Delay(1);
				Display_All(0xff);
				break;
			case 1:
				
				Display_Bit(0,TAB[10]),Delay(1);
				Display_Bit(1,0xff),Delay(1);
				date1 = Frequence/100000;
				if(date1)
					Display_Bit(2,TAB[date1]),Delay(1);
				else
					Display_Bit(2,0xff),Delay(1);
				date2 = (Frequence%100000)/10000;
				if(date2)
					Display_Bit(3,TAB[date2]),Delay(1);
				else
					Display_Bit(3,0xff),Delay(1);
				Display_Bit(4,TAB[(Frequence/1000)%10]),Delay(1);
				Display_Bit(5,TAB[(Frequence%1000)/100]),Delay(1);
				Display_Bit(6,TAB[(Frequence%100)/10]),Delay(1);
				Display_Bit(7,TAB[Frequence%10]),Delay(1);
				Display_All(0xff);
				break;
		}
	}
	else
		Display_All(0xff);
}
void Key_Scan(void)
{
	if(S4==0)
	{
		Delay(10);
		if(S4==0)
		{
			node = !node;
			while(S4==0)
			{
				Display(node);
			}
		}
	}
	if(S5==0)
	{
		Delay(10);
		if(S5==0)
		{
			DAC_Flag=!DAC_Flag;
			while(S5==0)
			{
				Display(node);
			}
		}
	}
	if(S6==0)
	{
		Delay(10);
		if(S6==0)
		{
			LED_Flag = !LED_Flag;
			while(S6==0)
			{
				Display(node);
			}
		}
	}
	if(S7==0)
	{
		Delay(10);
		if(S7==0)
		{
			SMG_Flag = !SMG_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;
	
}
void DAC(uint8 date,uint8 flag)
{
	IIC_Start();
	IIC_SendByte(0x90);
	IIC_WaitAck();
	IIC_SendByte(0x40);
	IIC_WaitAck();
	if(flag)
		IIC_SendByte(date);
	else
		IIC_SendByte(51*2);
	IIC_WaitAck();
	IIC_Stop();
}
*/

总结

还没细看,感觉挺简单。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值