栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

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

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

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<=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)&&((Distanceju_can+5))){cishu=0;}
//	if((cishu==2)&&(Distance>=ju_can-5)&&(Distance<=ju_can+5)){cishu=3;}
//	else if((cishu==2)&&((Distanceju_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;i0;j--);
}
void Delay14us()		//@12.000MHz
{
	unsigned char i;

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

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/980391.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号