2011年蓝桥杯第2届单片机省赛真题——“模拟智能传送装置”

 题目

2011年蓝桥杯第2届单片机省赛真题——“模拟智能传送装置”_第1张图片

2011年蓝桥杯第2届单片机省赛真题——“模拟智能传送装置”_第2张图片

2011年蓝桥杯第2届单片机省赛真题——“模拟智能传送装置”_第3张图片

程序

底层代码是直接运用官方提供的指导书配套的代码。

为了便于修改,此次编程运用了模块化编写。

主函数

void main(void)
{
	Banzi_Init();
	Time0_Init();
	while(1)
	{
		Seg_Work();
		Key_Work();
		Led_Work();
	}
}

按键扫描函数

void Key_Work(void)
{
	if(Key_Delay) return;
	Key_Delay=1;
	
	if(P33==0) //s4
	{
		delay(10);
		if(P33==0) jidianqi_Flag=1; while(!P33);
	}
	
	if(P30==0) //s7
	{
		delay(10);
		if(P30==0)
		{
			jidianqi_Flag=0;
			Led_S5_Flag=0;
			Led_S6_Flag=0;
			m=0;
			P0=0;
			P2 = (P2 & 0x1f) | 0xA0; //继电器
			P2 &= 0x1F;
			P0=0xff;
			P2 = (P2 & 0x1f) | 0x80; //灯
			P2 &= 0x1F;
		}
		while(!P30);
	}
	
	if(P32==0)  //s5
	{
		delay(10);
		if(P32==0 && jidianqi_Flag==1)
		{
			Led_S6_Flag=0;
			Led_S5_Flag=1;
		}
		while(!P32);
	}
	
	if(P31==0)  //s6
	{
		delay(10);
		if(P31==0 && jidianqi_Flag==1)
		{
			Led_S5_Flag=0;
			Led_S6_Flag=1;
			m=0;
		}
		while(!P31);
	}
}

数码管显示函数

void Seg_Work(void)
{
	if(Seg_Delay) return;
	Seg_Delay=1;
	
	Function();
	sprintf(Seg_Buf,"    %04d",(int)y);
	Seg_Tran(Seg_Buf,Seg_Code);
}

LED、蜂鸣器、继电器显示函数

void Led_Work(void)
{
	if(Led_Delay) return;
	Led_Delay=1;
	
	if(Led_S5_Flag==1 && Led_S6_Flag==0 && y_Flag==0)
	{
		P0=0xff;
		P2 = (P2 & 0x1F) | 0x80;  //S5
		P0=~(1<>m);
		P2 &= 0x1F;
		if(++m==8) m=0;
	}
	
	if(y>750 && jidianqi_Flag==0)  //继电器断开情况下
	{
		P0=0x40;
		P2 = (P2 & 0x1f) | 0xA0; //报警
		P2 &= 0x1F;
		if(z!=y)
		{
			z=y;
			IIC_Write(addr,y);
			addr++;
		}
		if(addr==0xff) addr=0x01;
	}
	else if(y<750 && jidianqi_Flag==0)
	{
		P0=0;
		P2 = (P2 & 0x1f) | 0xA0; 
		P2 &= 0x1F;
	}
	
	if(y>750 && jidianqi_Flag==1)  //继电器开通情况下
	{
		y_Flag=1;
		P0=0x40;
		P2 = (P2 & 0x1f) | 0xA0; //报警
		P2 &= 0x1F;
		P0=0xff;
		P2 = (P2 & 0x1f) | 0x80; 
		P2 &= 0x1F;
		if(z!=y)
		{
			z=y;
			IIC_Write(addr,y);
			addr++;
		}
		if(addr==0xff) addr=0x01;
	}
	else if(y<750 && jidianqi_Flag==1)
	{
		y_Flag=0;
		P0=0x10;
		P2 = (P2 & 0x1f) | 0xA0; 
		P2 &= 0x1F;
	}
}

中断函数

void Time0() interrupt 1
{
	TL0 = 0x18;		//1ms
	TH0 = 0xFC;	
	
	if(++Seg_Delay==500) Seg_Delay=0;
	if(++Key_Delay==10)  Key_Delay=0;
	if(++Led_Delay==200) Led_Delay=0;
	
	if(++Smgwei==8) Smgwei=0;
	Seg_Dis(Seg_Code,Smgwei);
}

运算处理函数

void Function(void)
{
	ADC_Num=Read_ADC();
	x=ADC_Num/51.0;
	y=200.0*x;
}

你可能感兴趣的:(蓝桥杯,单片机,c语言,蓝桥杯)