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

 题目

程序

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

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

主函数

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;
	}
	else if(Led_S5_Flag==0 && Led_S6_Flag==1 && y_Flag==0)
	{
		P0=0xff;
		P2 = (P2 & 0x1F) | 0x80;  //S6
		P0=~(0x80>>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;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值