蓝桥杯单片机第十四届模拟题1示例程序

题目:

 

 

 

 

 

 示例程序:(reg52.h)

main.c

#include <REG52.H>
#include "intrins.h"
#include "stdio.h"

sfr AUXR=0x8e;
sfr T2H=0xd6;
sfr T2L=0xd7;
sbit TX=P1^0;
sbit RX=P1^1;
sfr P4=0xc0;
sbit L1=P3^0;
sbit L2=P3^1;
sbit L3=P3^2;
sbit L4=P3^3;

sbit R1=P4^4;
sbit R2=P4^2;
sbit R3=P3^5;
sbit R4=P3^4;
sbit LED3=P0^2;

void HC573(unsigned char channel,unsigned char value);
void Nixie(unsigned char column,unsigned char value);
void Delay(unsigned int x);
void System_init();
void Delay12us();

unsigned char code Array[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,
0x80,0x90,0x88,0x80,0xc6,0xc0,0x86,0x8e,
0xbf,0x7f};
unsigned int Distance=0;//距离
unsigned int Distance_para=100;//距离参数
unsigned char Mode=0;//模式
unsigned char LEDstat=0xff;//灯光控制
unsigned int Count=0;//定时器0.2s计数
unsigned char Flag=0;//距离超过标志位
unsigned char LED3_Flag=1;//标志位
//超声波
void Send_wave()
{
	unsigned char i;
	for(i=0;i<8;i++)
	{
		TX=1;
		Delay12us();
		TX=0;
		Delay12us();
	}
}

void Time()
{
	unsigned int temp;
	TMOD=0x01;
	TH1=0x00;
	TL1=0x00;
	TF1=0;
	Send_wave();
	TR1=1;
	while((RX==1)&&(TF1==0));
	TR1=0;
	if(TF1==0)
	{
		temp=(TH1<<8)|TL1;
		Distance=(temp/10)*17/100;
	}
	else 
	{
		TF1=0;
		Distance=999;
	}
	TH1=0;
	TL1=0;
}
//参数页面
void Distance_para_D()
{
	Nixie(1,0xc1);
	Nixie(2,Array[2]);
	Nixie(3,0xff);
	Nixie(4,0xff);
	Nixie(5,0xff);
	Nixie(6,Array[Distance_para/100%10]);
	Nixie(7,Array[Distance_para/10%10]);
	Nixie(8,Array[Distance_para%10]);
}

void UartInit(void)		//9600bps@12.000MHz
{
	SCON = 0x50;		
	AUXR |= 0x01;		
	AUXR &= 0xFB;		
	T2L = 0xE6;			
	T2H = 0xFF;			
	AUXR |= 0x10;	
	EA=1;
	ES=1;
}


//超声波显示
void Display_Dis()
{
	Nixie(1,0xc1);
	Nixie(2,Array[1]);
	Nixie(3,0xff);
	Nixie(4,0xff);
	Nixie(5,0xff);
	Nixie(6,Array[Distance/100%10]);
	Nixie(7,Array[Distance/10%10]);
	Nixie(8,Array[Distance%10]);
}
//延时显示
void Delay_Display(unsigned int x)
{
	while(x--)
	{
		Display_Dis();
	}
}
//串口
void Send_Byte(unsigned char Dat)
{
	SBUF=Dat;
	while(TI==0);
	TI=0;
}

//按键扫描
void Key_Scan()
{
	L4=0;
	L1=L2=L3=1;
	R1=R2=R3=R4=1;
	if(R1==0)
	{
		if(Mode==0)Mode=1;
		else if(Mode==1)Mode=0;
		while(R1==0);
	}
	else if(R2==0)
	{
		if(Mode==0)
		{
			Distance_para=Distance;
		}
		while(R2==0);
	}
	else if(R3==0)
	{
		if(Mode==1)
		{
			Distance_para+=10;
		}
		while(R3==0){Distance_para_D();}
	}
	else if(R4==0)
	{
		if(Mode==1)
		{
			if(Distance_para<=10)Distance_para=10;
			Distance_para-=10;
		}
		while(R4==0){Distance_para_D();}
	}
	L3=0;
	L1=L2=L4=1;
	R1=R2=R3=R4=1;
	if(R2==0)
	{
		printf("Distance(距离):%dcm\r\n",Distance);
		while(R2==0);
	}
}

void LED_RUn()
{
	if(Mode==0)
	{
		LEDstat=P0&0xfe;
		HC573(4,LEDstat);
	}
	else if(Mode==1)
	{
		LEDstat=P0&0xfd;
		HC573(4,LEDstat);
	}
	if(Distance>=Distance_para)
	{
		Flag=1;
	}
	else 
	{
		Flag=0;
	}
	if(Flag==1)
	{
		LED3=LED3_Flag;
		P2=(0x1f&P2)|0x80;
		P2=(0x1f&P2)|0x00;
	}
	else if(Flag==0)
	{
		LED3=1;
		P2=(0x1f&P2)|0x80;
		P2=(0x1f&P2)|0x00;
	}
}

void Time_init()
{
	TMOD=0x01;
	TH0=(65535-10000)/256;
	TL0=(65535-10000)%256;
	TF0=0;
	ET0=1;
	TR0=1;
	EA=1;
}

void main()
{
	System_init();
	while(1)
	{
		Time();
		if(Mode==0)
		{
			Delay_Display(15);
		}
		else if(Mode==1)
		{
			Distance_para_D();
		}
		LED_RUn();
		Key_Scan();
	}
}

void Time0() interrupt 1
{
	TH0=(65535-10000)/256;
	TL0=(65535-10000)%256;
	if(Flag==1)
	{
		Count++;
		if(Count>=20)
		{
			LED3_Flag++;
			LED3_Flag%=2;
			Count=0;
		}
	}
}

void System_init()
{
	HC573(5,0x00);
	HC573(4,0xff);
	UartInit();
	Time_init();
}

void HC573(unsigned char channel,unsigned char value)
{
	P2=(0x1f&P2)|0x00;
	P0=value;
	switch(channel)
	{
		case 4:P2=(0x1f&P2)|0x80;break;
		case 5:P2=(0x1f&P2)|0xa0;break;
		case 6:P2=(0x1f&P2)|0xc0;break;
		case 7:P2=(0x1f&P2)|0xe0;break;
		case 0:P2=(0x1f&P2)|0x00;break;
	}
	P2=(0x1f&P2)|0x00;
}
void Delay(unsigned int x)
{
	unsigned char i,j;
	while(x--)
	{
		i=11;
		j=190;
		do
		{
			while(--j);
		}while(--i);
	}
}
void Nixie(unsigned char column,unsigned char value)
{
	HC573(6,0x01<<(column-1));
	HC573(7,value);
	Delay(1);
	HC573(6,0x01<<(column-1));
	HC573(7,0xff);
}

void Delay12us()		//@12.000MHz
{
	unsigned char i;

	_nop_();
	_nop_();
	i = 33;
	while (--i);
}

char putchar(char ch)
{
	Send_Byte(ch);
	return ch;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

brepot

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值