蓝桥杯单片机----省赛十二届第二次代码分享

一、题目分析

        这套题考了NE555和PCF8591,属于比较常规的题目,唯一需要注意的就是ADC在进行双通道读取时,数据篡位的问题,这里出解决办法。

	if(adc_count == 100){
		PCF8591_ADC(1);
	}else if(adc_count == 105){
		ADC_AIN1 = (unsigned int)(PCF8591_ADC(1) * 500.0 / 255);
	}else if(adc_count == 120){
		PCF8591_ADC(3);
	}else if(adc_count >= 125){
		adc_count = 0;
		ADC_AIN3 = (unsigned int)(PCF8591_ADC(3) * 500.0 / 255);
	}

在读取前加一次读取即可。

二、代码

#include "task.h"
unsigned int key_count=0;
unsigned int dsp_count=0;
unsigned int led_count=0;
unsigned int adc_count=0;
unsigned int fre_count=0;
unsigned int cp=0;

unsigned char ui=1;
unsigned int fre=0;
unsigned int cycle=0;
unsigned int ADC_AIN1=0;
unsigned int ADC_AIN3=0;
unsigned int f_volt=0;
unsigned int f_fre=0;
unsigned char led_state=0xff;
bit led=0;
void Timer2_Init(void)		//1毫秒@12.000MHz
{
	AUXR |= 0x04;			//定时器时钟1T模式
	T2L = 0x20;				//设置定时初始值
	T2H = 0xD1;				//设置定时初始值
	AUXR |= 0x10;			//定时器2开始计时
	IE2 |= 0x04;			//使能定时器2中断
}

void Timer0_Init()
{
	TMOD = 0x05;
	TH0 = 0;
	TL0 = 0;
	//ET0 = 1;
	TR0 = 1;
}
void Init_Sys()
{
	LED(0xff);
	BUZ(0x00);
	Init_DSP();
	Init_Key();
	Timer0_Init();
	EA = 1;
}
void Timer2_Isr(void) interrupt 12
{
	GetDisplayStruct()->SegDisplay();
	if(GetKeyStruct()->state)cp++;
	if(key_count < 10)key_count++;
	if(dsp_count < 50)dsp_count++;
	if(led_count < 75)led_count++;
	if(adc_count < 125)adc_count++;
	if(fre_count < 1000)fre_count++;
}
void Task_Collect()
{
	if(fre_count >= 1000)
	{
		fre_count = 0;
		fre = (TH0 << 8) | TL0;
		cycle = (unsigned int)((1.0 / fre) * 1000000);
		TH0 = TL0 = 0;
	}
	if(adc_count == 100){
		PCF8591_ADC(1);
	}else if(adc_count == 105){
		ADC_AIN1 = (unsigned int)(PCF8591_ADC(1) * 500.0 / 255);
	}else if(adc_count == 120){
		PCF8591_ADC(3);
	}else if(adc_count >= 125){
		adc_count = 0;
		ADC_AIN3 = (unsigned int)(PCF8591_ADC(3) * 500.0 / 255);
	}
}

void Task_LED()
{
	if(led_count >= 75)
	{
		led_count = 0;
		if(led == 0)
		{
			if(ADC_AIN3 > f_volt){
				led_state &= ~0x01;
			}else led_state |= 0x01;
			if(fre > f_fre){
				led_state &= ~0x02;
			}else led_state |= 0x02;
			if(ui == 1)
			{
				led_state &= ~0x04;
				led_state |= 0x08;
				led_state |= 0x10;
			}
			if(ui == 2)
			{
				led_state &= ~0x08;
				led_state |= 0x04;
				led_state |= 0x10;
			}
			if((ui == 3) || (ui == 4))
			{
				led_state &= ~0x10;
				led_state |= 0x08;
				led_state |= 0x04;
			}
		}
		else led_state = 0xff;
		LED(led_state);
	}
}
void Task_key()
{
	if(key_count >= 10)
	{
		key_count = 0;
		GetKeyStruct()->pFun();
	}
	switch(GetKeyStruct()->value)
	{
		case 4:
			if(ui == 1)ui = 2;
			else if(ui == 2)ui = 3;
		    else if((ui == 3) || (ui ==4))ui = 1;
			GetKeyStruct()->value = 0;
		break;
		case 5:
			if(ui == 3)ui = 4;
			else if(ui == 4)ui = 3;
			GetKeyStruct()->value = 0;
		break;
		case 6:
			f_volt = ADC_AIN3;
			GetKeyStruct()->value = 0;
		break;
		case 7:
			if(cp >= 1000)led = ~led;
			else f_fre = fre;
			cp=0;
			GetKeyStruct()->value = 0;
		break;
	}
}
void Task_Seg()
{
	DisplayStruct* seg = GetDisplayStruct();
	if(dsp_count < 50)
		return;
	dsp_count = 0;
	if(ui == 1)
	{
		seg->dot = 10;
		seg->buf[0] = 11;
		seg->buf[1] = (fre > 999999)?(fre / 1000000 % 10):(10);
		seg->buf[2] = (fre > 99999)?(fre / 100000 % 10):(10);
		seg->buf[3] = (fre > 9999)?(fre / 10000 % 10):(10);
		seg->buf[4] = (fre > 999)?(fre / 1000 % 10):(10);
		seg->buf[5] = (fre > 99)?(fre / 100 % 10):(10);
		seg->buf[6] = (fre > 9)?(fre / 10 % 10):(10);
		seg->buf[7] = fre % 10;	
	}
	if(ui == 2)
	{
		seg->dot = 10;
		seg->buf[0] = 12;
		seg->buf[1] = (cycle > 999999)?(cycle / 1000000 % 10):(10);
		seg->buf[2] = (cycle > 99999)?(cycle / 100000 % 10):(10);
		seg->buf[3] = (cycle > 9999)?(cycle / 10000 % 10):(10);
		seg->buf[4] = (cycle > 999)?(cycle / 1000 % 10):(10);
		seg->buf[5] = (cycle > 99)?(cycle / 100 % 10):(10);
		seg->buf[6] = (cycle > 9)?(cycle / 10 % 10):(10);
		seg->buf[7] = cycle % 10;	
	}
	if(ui == 3)
	{
		seg->dot = 5;
		seg->buf[0] = 13;
		seg->buf[1] = 14;
		seg->buf[2] = 1;
		seg->buf[3] = 10;
		seg->buf[4] = 10;
		seg->buf[5] = ADC_AIN1 / 100 % 10;
		seg->buf[6] = ADC_AIN1 / 10 % 10;
		seg->buf[7] = ADC_AIN1 % 10;	
	}
	if(ui == 4)
	{
		seg->dot = 5;
		seg->buf[0] = 13;
		seg->buf[1] = 14;
		seg->buf[2] = 3;
		seg->buf[3] = 10;
		seg->buf[4] = 10;
		seg->buf[5] = ADC_AIN3 / 100 % 10;
		seg->buf[6] = ADC_AIN3 / 10 % 10;
		seg->buf[7] = ADC_AIN3 % 10;		
	}
}

附上所有代码链接,大家可以参考学习。 

蓝桥杯单片机省赛十二届第二次https://gitcode.com/fsm_csdn/lanqiao122

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值