蓝桥杯单片机第十二届国赛

main.c

#include "stc15f2k60s2.h"
#include "intrins.h"
#include "stdio.h"
#include "ds1302.h"  	
#include "iic.h"

#define uchar unsigned char
#define uint unsigned int
//超声波定义
sbit TX=P1^0;
sbit RX=P1^1;

extern uchar shizhong[7];

uchar code tab[]={0XC0,0XF9,0XA4,0XB0,0X99,0X92,0X82,0XF8,0X80,0X90,\
									0X40,0X79,0X24,0X30,0X19,0X12,0X02,0X78,0X00,0X10,\
									0XBF,0XFF,0xc7,0x8e,0xc6,0x89,0xfe,0xf7,0x8c};// - 灭 L F C H 上— _ P
uchar Digbuf[8]={0,1,2,3,4,5,6,7};
uchar Digcom=0;
//LED 开关设置
uchar led_bit=0xff;
#define led_on(n){led_bit&=_crol_(0xfe,n-1);P0=led_bit;P2|=0x80;P2&=0x9f;P2&=0x1f;}
#define led_off(n){led_bit|=_crol_(0x01,n-1);P0=led_bit;P2|=0x80;P2&=0x9f;P2&=0x1f;}

uchar caiji[5]={2,3,5,7,9};//采集时间设置  k

void Allinit();
void delayms(uint ms);
void Timer2Init(void);
void DIG_Show();
void keyscan16();
void DAC_Show();
//void Measure_mode();
void LED_Show();

//超声波
void Delay14us();	
void Wave_Send();
void Wave_Measure();
void Timer0Init(void);

bit wave_flag=0;
uchar trie=0;
uint Distance=0;
uint Distance_max=0;
uint Distance_min=0;
uint Distance_av=0;
uchar inter_face1=0;//数据,参数
uchar inter_face2=0;//数据子界面
uchar inter_face3=0;//参数子界面
uchar inter_face4=0;//数据子界面距离检测模式选择
uchar inter_face5=0;//数据子界面记录数据界面子界面
uchar k=0;  //采集数据时间设置选择 0--->2S  1--->3S  2--->5S  3--->7S  4--->9S  
uchar ju_can=10;
uint voltage=0;  //0-500
bit flag=0;//光敏电阻亮暗标志位
bit mode=0; //触发模式
uchar Distance_last=0;
long Distance_num=0;
uint time=0;
bit cishu=0;
uint Distance1,Distance2,Distance3;

void main(void)
{
	Allinit();
	Timer2Init();
	Timer0Init();
	DS_init();
	
	while(1)
	{
		DS_Get();
		voltage=AD_Read(0x01);
		//Measure_mode();
		
		DAC_Show();
		LED_Show();
		keyscan16();
		DIG_Show();
	}
}

//5) L5: 在定时模式下,“连续”测量到的 3 次距离数据在距离参数“附近”(±
//5cm), L5 点亮, 否则熄灭。
void LED_Show()
{
	if((inter_face1==0)&&(inter_face2==0)){led_on(1);led_off(2);led_off(3);led_off(4);}
	else if((inter_face1==0)&&(inter_face2==1)&&(inter_face4==0)){led_off(1);led_on(2);led_off(3);led_on(4);}
//	else if((inter_face1==0)&&(inter_face2==1)&&(inter_face4==1)){led_off(1);led_on(2);led_off(3);led_off(4);led_on(5);}  //定时三次测量在参数范围内
	else if((inter_face1==0)&&(inter_face2==1)&&(inter_face4==1)){led_off(1);led_on(2);led_off(3);led_off(4);}
	else if((inter_face1==0)&&(inter_face2==2)){led_off(1);led_off(2);led_on(3);led_off(4);}
	
	if(voltage>=50){led_on(6);}
	else {led_off(6);}
}
//void Measure_mode()
//{
//	if(inter_face4==1) //定时模式   秒 值可以整除采集时间参数,触发一次距离数据采集和刷新
//	{
//		if(shizhong[0]/caiji[k]==0){Wave_Measure();}
//	}
//	else if(inter_face4==0)//触发模式   光敏电阻 “亮”----->“暗”(遮挡光敏电阻),触发一次距离数据采集和刷新。
//	{
//		if(voltage>=50) {flag=1;}//亮
//		else{flag=0;}
//		
//		if((flag==1)&&(voltage<50))//“亮”----->“暗”
//		{
//			Wave_Measure();
//		}
//	}
//}
void DAC_Show()
{
	if(Distance>=80){AD_Write(255);}
	else if((Distance>10)&&(Distance<80)) {AD_Write(2.914*Distance+21.857);}
	else if(Distance<=10){AD_Write(51);}
}
void DIG_Show()
{
	if(inter_face1==0)//数据显示界面
	{
		if(inter_face2==0)//时间数据显示界面
		{
			Digbuf[0]=shizhong[2]/10;Digbuf[1]=shizhong[2]%10;Digbuf[2]=20;
			Digbuf[3]=shizhong[1]/10;Digbuf[4]=shizhong[1]%10;Digbuf[5]=20;
			Digbuf[6]=shizhong[0]/10;Digbuf[7]=shizhong[0]%10;
		}
		else if(inter_face2==1)//距离数据显示界面
		{
			if(inter_face4==0)//触发模式  满足触发条件后,测量,刷新数据一次
			{
				mode=0;
				Digbuf[0]=22;Digbuf[1]=24;Digbuf[2]=21;Digbuf[3]=21;Digbuf[4]=21;
				if(Distance>=100){Digbuf[5]=Distance/100;Digbuf[6]=Distance%100/10;Digbuf[7]=Distance%10;}
				else if(Distance>=10){Digbuf[5]=21;Digbuf[6]=Distance/10;Digbuf[7]=Distance%10;}
				else if(Distance>=0){Digbuf[5]=21;Digbuf[6]=21;Digbuf[7]=Distance;}
			}
			else if(inter_face4==1)//定时模式  满足定时条件后,测量,刷新数据一次
			{
				mode=1;
				Digbuf[0]=22;Digbuf[1]=23;Digbuf[2]=21;Digbuf[3]=21;Digbuf[4]=21;
				if(Distance>=100){Digbuf[5]=Distance/100;Digbuf[6]=Distance%100/10;Digbuf[7]=Distance%10;}
				else if(Distance>=10){Digbuf[5]=21;Digbuf[6]=Distance/10;Digbuf[7]=Distance%10;}
				else if(Distance>=0){Digbuf[5]=21;Digbuf[6]=21;Digbuf[7]=Distance;}
			}
		}
		else if(inter_face2==2)//数据记录显示界面 
		{
			if(inter_face5==0)//H  数据最大值  包含上电后  触发,定时模式所有的采集结果
			{
				Digbuf[0]=25;Digbuf[1]=26;Digbuf[2]=21;Digbuf[3]=21;Digbuf[4]=21;
				if(Distance_max>=100){Digbuf[5]=Distance_max/100;Digbuf[6]=Distance_max%100/10;Digbuf[7]=Distance_max%10;}
				else if(Distance_max>=10){Digbuf[5]=21;Digbuf[6]=Distance_max/10;Digbuf[7]=Distance_max%10;}
				else if(Distance_max>=0){Digbuf[5]=21;Digbuf[6]=21;Digbuf[7]=Distance_max;}
			}
			else if(inter_face5==1) //数据平均值	保留一位小数(扩大10倍)   包含上电后  触发,定时模式所有的采集结果
			{
				Digbuf[0]=25;Digbuf[1]=20;Digbuf[2]=21;Digbuf[3]=21;
				if(Distance_av>=1000){Digbuf[4]=Distance_av/1000;Digbuf[5]=Distance_av%1000/100;Digbuf[6]=Distance_av%100/10+10;Digbuf[7]=Distance_av%10;}
				else if(Distance_av>=100){Digbuf[4]=21;Digbuf[5]=Distance_av/100;Digbuf[6]=Distance_av%100/10+10;Digbuf[7]=Distance_av%10;}
				else if(Distance_av>=10){Digbuf[4]=21;Digbuf[5]=21;Digbuf[6]=Distance_av/10+10;Digbuf[7]=Distance_av%10;}
				else if(Distance_av>=0){Digbuf[4]=21;Digbuf[5]=21;Digbuf[6]=10;Digbuf[7]=Distance_av;}
			}
			else if(inter_face5==2) //数据最小值 包含上电后  触发,定时模式所有的采集结果
			{
				Digbuf[0]=25;Digbuf[1]=27;Digbuf[2]=21;Digbuf[3]=21;Digbuf[4]=21;
				if(Distance_min>=100){Digbuf[5]=Distance_min/100;Digbuf[6]=Distance_min%100/10;Digbuf[7]=Distance_min%10;}
				else if(Distance_min>=10){Digbuf[5]=21;Digbuf[6]=Distance_min/10;Digbuf[7]=Distance_min%10;}
				else if(Distance_min>=0){Digbuf[5]=21;Digbuf[6]=21;Digbuf[7]=Distance_min;}
			}
		}
	}
  else if(inter_face1==1)//参数设置界面
	{
		if(inter_face3==0)//采集时间设置界面
		{
			Digbuf[0]=28;Digbuf[1]=1;Digbuf[2]=21;Digbuf[3]=21;Digbuf[4]=21;Digbuf[5]=21;
			Digbuf[6]=caiji[k]/10;Digbuf[7]=caiji[k]%10;   
		}
		else if(inter_face3==1)//距离参数设置界面  10-80  在定时模式下,“连续” 测量到的 3 次距离数据在距离参数“附近”(±5cm),则触发报警效果。
		{
			Digbuf[0]=28;Digbuf[1]=2;Digbuf[2]=21;Digbuf[3]=21;Digbuf[4]=21;Digbuf[5]=21;
			Digbuf[6]=ju_can/10;Digbuf[7]=ju_can%10; 
		}
	}
}
void keyscan16()
{
	P44=0;P42=1;
	if(P32==0)//s5  子界面切换
	{
		delayms(5);
		if(P32==0)
		{
			if(inter_face1==0) //数据界面下
			{
				if(inter_face2==0){inter_face2=1;}
				else if(inter_face2==1){inter_face2=2;inter_face5=0;}
				else if(inter_face2==2){inter_face2=0;}
			}
			else if(inter_face1==1) //参数界面下
			{
				if(inter_face3==0){inter_face3=1;}
				else if(inter_face3==1){inter_face3=0;}
			}
		}
		while(!P32);
	}
	else if(P33==0)//s4   数据,参数切换界面
	{
		delayms(5);
		if(P33==0)
		{
			if(inter_face1==0){inter_face1=1;inter_face3=0;}
			else if(inter_face1==1){inter_face1=0;inter_face2=0;}
		}
		while(!P33);
	}
	P44=1;P42=0;
	if(P32==0)//s9  参数“调整”
	{
		delayms(5);
		if(P32==0)
		{
			if((inter_face1==1)&&(inter_face3==0))//采集时间设置界面
			{
				if(k==0){k=1;}
				else if(k==1){k=2;}
				else if(k==2){k=3;}
				else if(k==3){k=4;}
				else if(k==4){k=0;}
			}
			else if((inter_face1==1)&&(inter_face3==1))//距离参数设置界面  10-80
			{
				ju_can=ju_can+10;
				if(ju_can>=90)ju_can=10;
			}
		}
		while(!P32);
	}
	else if(P33==0)//s8  在测距数据显示界面下,切换触发和定时模式。在数据记录显示界面下,最大值0、最小值2、平均值1切换
	{
		delayms(5);
		if(P33==0)
		{
			if((inter_face1==0)&&(inter_face2==1))//距离数据显示界面
			{
				if(inter_face4==0){inter_face4=1;}
				else if(inter_face4==1){inter_face4=0;}
			}
			else if((inter_face1==0)&&(inter_face2==2))//数据记录显示界面 
			{
				if(inter_face5==0){inter_face5=2;}
				else if(inter_face5==2){inter_face5=1;}
				else if(inter_face5==1){inter_face5=0;}
			}
		}
		while(!P33);
	}
}
void Wave_Send()
{
	uchar i;
	for(i=0;i<8;i++)
	{
		TX=1;
		Delay14us();
		TX=0;
		Delay14us();
	}
}
void Wave_Measure()
{
	if(wave_flag==1)
	{
		wave_flag=0;
		TR0=1;
		Wave_Send();
		while((RX==1)&&(TF0==0));
		TR0=0;
		if(TF0==1)
		{
			TF0=0;
			Distance=999;
		}
		else 
		{
			Distance=((TH0<<8)|TL0)*0.017;
			Distance=Distance/12;
		}
		TH0=TL0=0;
	}
}
void Timer0Init(void)		//1毫秒@12.000MHz
{
	AUXR |= 0x80;		//定时器时钟1T模式
	TMOD &= 0xF0;		//设置定时器模式
}
void Timer2Init(void)		//1毫秒@12.000MHz
{
	AUXR |= 0x04;		//定时器时钟1T模式
	T2L = 0x20;		//设置定时初值
	T2H = 0xD1;		//设置定时初值
	AUXR |= 0x10;		//定时器2开始计时
	IE2|=0X04;
	EA=1;
}
void timer2() interrupt 12
{
	P0=0XFF;
	P2|=0XC0;P2&=0XDF;P2&=0X1F;
	P0=0XFF;
	P2|=0XE0;P2&=0XFF;P2&=0X1F;
	P0=(1<<Digcom);
	P2|=0XC0;P2&=0XDF;P2&=0X1F;
	P0=tab[Digbuf[Digcom]];
	P2|=0XE0;P2&=0XFF;P2&=0X1F;
	
	if(++Digcom==8)Digcom=0;
	
	trie++;       //超声波定时
	if(trie==200)
	{
		trie=0;
		wave_flag=1;
	}
	
	if(inter_face4==1) //定时模式   秒 值可以整除采集时间参数,触发一次距离数据采集和刷新
	{
		if((shizhong[0]%caiji[k])==0)  //求余
		{
			if(time==0)
			{
				Wave_Measure();time=1;
				Distance_max=Distance;
				Distance_min=Distance;
				Distance_av=Distance*10;
				Distance_num=Distance;
				Distance3=Distance2;
				Distance2=Distance1;
				Distance1=Distance;
			}
			else 
			{
				Distance_last=Distance; //上一次数据
				Wave_Measure();
				Distance_num=Distance_num+Distance;//求和
				time++;
				Distance3=Distance2;
				Distance2=Distance1;
				Distance1=Distance;
				//求max.min,average
				if(Distance>=Distance_max){Distance_max=Distance;}//Distance_min=Distance_last;Distance_av=((Distance_num/time)*10+Distance_num%time);}
				if(Distance<=Distance_min){Distance_min=Distance;}
				Distance_av=((Distance_num/time)*10+Distance_num%time);
				
			}
		}
	}
	else if(inter_face4==0)//触发模式   光敏电阻 “亮”----->“暗”(遮挡光敏电阻),触发一次距离数据采集和刷新。
	{
		if(voltage>=50) {flag=1;}//亮
		
		if((flag==1)&&(voltage<50))//“亮”----->“暗”
		{
			flag=0;
			if(time==0)
			{
				Wave_Measure();time=1;
				Distance_max=Distance;
				Distance_min=Distance;
				Distance_av=Distance*10;
				Distance_num=Distance;
				Distance3=Distance2;
				Distance2=Distance1;
				Distance1=Distance;
			}
			else 
			{
				Distance_last=Distance; //上一次数据
				Wave_Measure();
				Distance_num=Distance_num+Distance;//求和
				time++;
				Distance3=Distance2;
				Distance2=Distance1;
				Distance1=Distance;
				//求max.min,average
				if(Distance>=Distance_max){Distance_max=Distance;}//Distance_min=Distance_last;Distance_av=((Distance_num/time)*10+Distance_num%time);}
				if(Distance<=Distance_min){Distance_min=Distance;}
				Distance_av=((Distance_num/time)*10+Distance_num%time);
				
			}
		}
	}
	
	
	
	if(((Distance1>=ju_can-5)&&(Distance1<=ju_can+5))&&((Distance2>=ju_can-5)&&(Distance2<=ju_can+5))&&((Distance3>=ju_can-5)&&(Distance3<=ju_can+5)))
   {led_on(5);}
   else led_off(5);
		//	 if((cishu==1)&&(Distance>=ju_can-5)&&(Distance<=ju_can+5)){cishu=2;}
//	 else if((cishu==1)&&((Distance<ju_can-5)||(Distance>ju_can+5))){cishu=0;}
//	if((cishu==2)&&(Distance>=ju_can-5)&&(Distance<=ju_can+5)){cishu=3;}
//	else if((cishu==2)&&((Distance<ju_can-5)||(Distance>ju_can+5))){cishu=0;}
}

void Allinit()
{
	P0=0x00;P2|=0XA0;P2&=0XBF;P2&=0X1F;
	P0=0XFF;P2|=0X80;P2&=0X9F;P2&=0X1F;
	P0=0XFF;P2|=0XC0;P2&=0XDF;P2&=0X1F;
	P0=0XFF;P2|=0XE0;P2&=0XFF;P2&=0X1F;
}
void delayms(uint ms)
{
	uint i,j;
	for(i=0;i<ms;i++)
	for(j=845;j>0;j--);
}
void Delay14us()		//@12.000MHz
{
	unsigned char i;

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

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值