蓝桥杯单片机第八届国赛题目-超声波测距机的功能设计与实现

Posted WILLPOWER-

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了蓝桥杯单片机第八届国赛题目-超声波测距机的功能设计与实现相关的知识,希望对你有一定的参考价值。

题目

在这里插入图片描述

文件树

在这里插入图片描述

代码

init.c

#include "init.h"
void Timer1Init(void)		//2毫秒@12.000MHz
{
AUXR |= 0x40;		//定时器时钟1T模式
TMOD &= 0x0F;		//设置定时器模式
TL1 = 0x40;		//设置定时初值
TH1 = 0xA2;		//设置定时初值
TF1 = 0;		//清除TF1标志
TR1 = 1;		//定时器1开始计时
 ET1 = 1;
 EA = 1;
}


void SL(uchar _dev, uchar _data)
{
  P0 = _data; SEL(_dev);
}

uchar FR(float _data, uchar _dig)
{
  uint i = 1;
  while(_dig--)
  {
   i = i * 10;   
  }
  return((uint)_data/i%10);
}
void BF(uchar _0, uchar _1, uchar _2, uchar _3,
         uchar _4, uchar _5, uchar _6, uchar _7)
{
  buf[0] = _0; buf[1] = _1; buf[2] = _2; buf[3] = _3;
  buf[4] = _4; buf[5] = _5; buf[6] = _6; buf[7] = _7;
}

void Run(t_delay* time)
{
 if(time->cnt++ < time->max);
 else
 {
  time->cnt = 0;
  time->ok  = 1;
 }
}
void Delay14us()		//@12.000MHz
{
	unsigned char i;

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

void Sonic_T()
{
 uchar i = 10;
 while(i--)
 {
  P10 = 1;
  Delay14us();
  P10 = 0;
  Delay14us();
 }
}
void Sonic_R()
{
 CH = 0; CL = 0;
 Sonic_T();CR = 1;
 while(!CF && P11);
 CR = 0;
 if(CF)
 {
  CF = 0;
  preDistance = distance;
  distance = maxDistance;
  Adc_Read(0x43, 0);
 }
 else
 {
  uint tmpVal;
  tmpVal = ((uint)CH << 8) | CL;
  preDistance = distance;
 if(tmpVal*0.017/12 > maxDistance)
 {
  Adc_Read(0x43, 0);
  distance = maxDistance;
 }
 else
 {
  uchar tmpVal;
  distance = tmpVal*0.017/12;
  tmpVal = (maxDistance - distance)*0.02*51;
  if(tmpVal > 5)
   Adc_Read(0x43, 0);
  else
   Adc_Read(0x43, tmpVal);
  }
 }
}

uchar LedChange(uchar _data, uchar _dig, uchar _en)
{
 if(_en == 0)
 {
  _data |= (1 << _dig);
 }
 else if(_en == 1)
 {
  _data &= ~(1 << _dig);
 }
 else 
 {
  _data ^= (1 << _dig);
 }
 SL(4, _data);
 return(_data);
}
uchar GetKey()
{
 if(K1 == 0) return 7;
 if(K2 == 0) return 6;
 if(K3 == 0) return 5;
 if(K4 == 0) return 4; 
 return 0;
}

//void UartInit(void)		//9600bps@12.000MHz
//{
//	SCON = 0x50;		//8位数据,可变波特率
//	AUXR |= 0x01;		//串口1选择定时器2为波特率发生器
//	AUXR |= 0x04;		//定时器2时钟为Fosc,即1T
//	T2L = 0xC7;		//设定定时初值
//	T2H = 0xFE;		//设定定时初值
//	AUXR |= 0x10;		//启动定时器2
// ES = 1;
//}

void Print(uchar *string)
{
  ES = 0;TI = 1;
  printf("%s", string);
  TI = 0; ES = 1;
}
//void Delay8ms()		//@12.000MHz
//{
//	unsigned char i, j;

//	i = 94;
//	j = 95;
//	do
//	{
//		while (--j);
//	} while (--i);
//}
uchar Check(uchar _data, uchar _dig)
{
 return(!((_data >> _dig) & 1));
}

main.c

#include "init.h"

uchar ledData = 0xff;
enum{LED=4, EXT, SEL, CODE};

//dis
uchar buf[8];
uchar code CA[] = {0xc0, 0xf9, 0xa4, 0xb0, 0x99,
                   0x92, 0x82, 0xf8, 0x80, 0x90,
                   0xff, 0x8e};
uchar curDig = 0;
                   
enum{D_DIS, D_BACK, D_SET}gloSta = D_DIS;

//key
uchar key = 0, tmpKey = 0, keyCnt = 0;
enum{KS_GT, KS_AS, KS_WA}keyState = KS_GT;                   
                   
//var
t_delay delay_200 = {200, 0, 0};
t_delay delay_300 = {300, 0, 0};
t_delay delay_100 = {100, 0, 0};
float distance;
float preDistance;
float adcVal;
uchar caoZuo = 0;
uchar maxDistance = 20;
uchar pageCnt = 0;
uchar saveData[10];
uchar index = 0;
uchar revBuf[20];
uchar sonicok = 0;
uchar soniccnt = 0;
void Timer1Handle() interrupt 3
{
 SL(CODE, 0xff); SL(SEL, 1 << curDig); SL(CODE, CA[buf[curDig]]);
 curDig = (1 + curDig)%8;
 //按键
 switch(keyState)
 {
  case KS_GT:
       keyCnt = 0; tmpKey = GetKey(); keyState = KS_AS;
  break;
  
  case KS_AS:
       if(keyCnt++ < 10);
       else if(tmpKey == GetKey())
       {
         if(key != tmpKey)
         {
          key = tmpKey;
          keyState = KS_WA;
         }
         else
          keyState = KS_GT;
       }
       else
        keyState = KS_GT;
  break;
 }
 //timerun
 Run(&delay_200);
 if(delay_300.ok == 2)
 {
  Run(&delay_300);
 }
 Run(&delay_100);
}

void SensorProcess()
{
 if(delay_200.ok == 1)
 {
  delay_200.ok = 0;
  adcVal = Adc_Read(0x43, 250);
//  BF(F_C, F_C, F_C, F_C,
//     FR(distance, 3), FR(distance, 2),FR(distance, 1),FR(distance, 0));
  BF(F_C, F_C, F_C, F_C,
     FR(adcVal, 3), FR(adcVal, 2),FR(adcVal, 1),FR(adcVal, 0));
 }
}

void DisProcess()
{
 switch(gloSta)
 {
  case D_DIS:
  if(caoZuo == 1)
  {
   BF(1, F_C, F_C, FR(preDistance, 1),FR(preDistance, 0),
      FR(distance, 2),FR(distance, 1),FR(distance, 0));
  }
  else
  {
   float sum;
   sum = preDistance + distance;
   BF(1, F_C, F_C, FR(sum, 1),FR(sum, 0),
      FR(distance, 2),FR(distance, 1),FR(distance, 0));
  }
  break;
  
  case D_BACK:
   BF(FR(pageCnt+1, 1), FR(pageCnt+1, 0), F_C,F_C,F_C,
      FR(saveData[pageCnt], 2),FR(saveData[pageCnt], 1),FR(saveData[pageCnt], 0));
  break;
  
  case D_SET:
   BF(F_F, F_C, F_C,F_C,F_C,
      F_C,FR(maxDistance, 1),FR(maxDistance, 0));
  break;
 }
}
void KD_dis()
{
 if(key == 7)
 {
  caoZuo = (caoZuo + 1)%2;
 }
}
void KD_back()
{
 if(key == 7)
 {
  pageCnt = (pageCnt + 1)%10;
 }
}
void KD_SET()
{
 if(key == 7)
 {
  if(maxDistance < 90)
  {
   maxDistance = maxDistance + 10;
  }
  else
   maxDistance = 0;
 } 
}
void keyProcess()
{
 if(key == 4)
 {
  Sonic_R();
  sonicok = 1;soniccnt  = 0;
  Rotate_Save((uchar)distance);
  Code_Write(0, saveData, 8);
  Code_Write(1, &saveData[8], 2);
  Code_Write(0, saveData, 8);
  Code_Write(1, &saveData[8], 2);
 }
 if(key == 5)
 {
  gloSta = (gloSta != D_BACK)? D_BACK:D_DIS;
  if(gloSta == D_BACK)
  {
    pageCnt = 0;
  }
 }
 if(key == 6)
 {
  gloSta = (gloSta != D_SET)? D_SET:D_DIS;
 }
 switch(gloSta)
 {
  case D_DIS:
       KD_dis();
  break;
  case D_BACK:
       KD_back();
  break;
  case D_SET:
       KD_SET();
  break;
 }
}
void Rotate_Save(uchar _dat)
{
 uchar i;
 for(i = 0; i < 9; i++)
 {
  saveData[i] = saveData[i+1];
 }  
 saveData[i] = _dat; 
}

void UartHandle() interrupt 4
{
 if(TI) TI = 0;
 if(RI)
 {
  RI = 0;
  if(delay_300.ok == 0)
   delay_300.ok = 2;
  if(index < 20)
  {
   revBuf[index++] = SBUF;
  }
 }
}
void UartProcess()
{
 if(delay_300.ok == 1)
 {
  delay_300.ok = 0;
  if(index == 3)
  {
   SL(LED, 0x0);
   if(strncmp(revBuf, "hel", 3) == 0)
   {
    uchar tmpVal[50];
    sprintf(tmpVal, "%bd-%bd-%bd-%bd-%bd-%bd-%bd-%bd-%bd-%bd",
            saveData[0],saveData[1],saveData[2],saveData[3],saveData[4],saveData[5],saveData[6],saveData[7],saveData[8],saveData[9]);
    Print(tmpVal);
   }
  }
  index = 0;
 }
}
void LedProcess()
{
 if(sonicok == 1)
 {
   if(delay_100.ok == 1)
   {
    delay_100.ok = 0;
    if(soniccnt++ < 10)
    {
     ledData = LedChange(ledData, 0, 2);
    }
    else
    {
     ledData = LedChange(ledData, 0, 0);
     sonicok = 0; 
    }
   }
 }
 switch(gloSta)
 {
  case D_SET:
   if(!Check(ledData, 6))
   {
    ledData = LedChange(ledData, 7, 0);
    ledData = LedChange(ledData, 6, 1);   
   }
  break;
  case D_BACK:
   if(!Check(ledData, 7))
   {
    ledData = LedChange(ledData, 6, 0);
    ledData = LedChange(ledData, 7, 1);
   }
  break;
 }
}
void main()
{
  BPOFF; RLOFF;
  SL(LED, ledData);
  Timer1Init();
  memset(buf, F_C, 8);
  //UartInit();
  //超声波初始化
  CMOD |= 0x08;
  蓝桥杯单片机第九届国赛程序设计题--多功能测量仪表国赛

蓝桥杯单片机第九届国赛题目-多功能测量仪表

蓝桥杯单片机第九届国赛题目-多功能测量仪表

蓝桥杯单片机第九届国赛程序设计题--多功能测量仪表国赛

蓝桥杯单片机第九届国赛程序设计题--多功能测量仪表国赛

蓝桥杯单片机第七届国赛笔记