蓝桥杯嵌入式第七届省赛程序

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/qqGHJ/article/details/87734304

1、库文件

建议按照需求添加,毕竟比赛的电脑运行速度堪忧;

2、中断服务函数;

void SysTick_Handler(void)
{
 TimingDelay --;
 if(miao++==999)
 {
  miao=0;
  miao_flag=1;
 }
}


 void USART2_IRQHandler(void)
{
	u8 temp;
  if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET)
  {
   USART_ClearITPendingBit(USART2, USART_IT_RXNE);
   temp = USART_ReceiveData(USART2);

    if(temp =='C')
    {
      yiwei=1;
    }
	else if(temp =='S')
    {
      fazhi=1;
    }
  }
  

}

其中,miao_flag是秒的标志位,adc每一秒采集一次;而usart的中断服务函数,涉及usart2的接收中断;

3、主函数 

#include "stm32f10x.h"
#include "lcd.h"
#include <stdio.h>
#include "i2c.h"

#define RB1 GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0)
#define RB2 GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_8)
#define RB3 GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_1)
#define RB4 GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_2)

#define USARTz_RxPin             GPIO_Pin_3
#define USARTz_TxPin             GPIO_Pin_2


u32 TimingDelay = 0;
u8 string[20];
extern u16 miao;
u8 miao_flag=0;
u8 low,mid,high;
u8 yiwei=0,fazhi=0;
u8 shezhi=0,qie=0;
u8 Tx_Buff[20];
u8 level;
float adc_va;


void Delay_Ms(u32 nTime);
void LCD_Init(void);
void GPIO_Int(void);
void KEY_Scan(void);
void ADC_Read(void);
unsigned char IIC_Read(unsigned char add);
void  IIC_Write(unsigned char add,unsigned char data);
void NVIC_Configuration(void);
void USART2_Send(u8 *str);
void LED1_Run(void);
void LED2_Run(void);
void LED3_Run(void);





int main(void)
{


 LCD_Init();
 GPIO_Int();
 i2c_init();
 Delay_Ms(5);

 if(IIC_Read(0x20)!=20)
 {
 Delay_Ms(5);
 IIC_Write(0x00,30);

 Delay_Ms(5);
 IIC_Write(0x01,50);

 Delay_Ms(5);
 IIC_Write(0x02,70);

 Delay_Ms(5);
 IIC_Write(0x20,20);
 
 }
 
 Delay_Ms(5);
 low=IIC_Read(0x00);

 Delay_Ms(5);
 mid=IIC_Read(0x01);

 Delay_Ms(5);
 high=IIC_Read(0x02);




  while (1)
 {
  KEY_Scan();
  LED1_Run();
  if(shezhi==0)
  {
	  if(miao_flag==1)
	  {
	  miao_flag=0;
	  ADC_Read();
	  }

	  if(fazhi==1)
	  {
	  fazhi=0;
	  sprintf((char*)Tx_Buff,"S:TL%2d+TM%2d+TH%2d\r\n",low,mid,high);
	  USART2_Send(Tx_Buff);
	  LED3_Run();
	
	  }
	
	  else if(yiwei==1)
	  {
	  yiwei=0;
	  sprintf((char*)Tx_Buff,"C:H%.0f+L%1d\r\n",adc_va,level);
	  USART2_Send(Tx_Buff);
	  LED3_Run();
	  }
  }
 }
}


void USART2_Send(u8 *str)
{
 u8 index=0;
  do{
  	USART_SendData(USART2, str[index++]);
  	 while(USART_GetFlagStatus(USART2, USART_FLAG_TXE) == RESET);
  }	while(str[index]!=0) ;

}
void LED1_Run(void)
{
  
  GPIO_SetBits(GPIOD,GPIO_Pin_2);
  GPIO_SetBits(GPIOC,GPIO_Pin_9 | GPIO_Pin_10| GPIO_Pin_11 | GPIO_Pin_12| GPIO_Pin_13 | GPIO_Pin_14|GPIO_Pin_15);
  GPIO_ResetBits(GPIOC,GPIO_Pin_8);
  GPIO_ResetBits(GPIOD,GPIO_Pin_2);

  Delay_Ms(1000);

  GPIO_SetBits(GPIOD,GPIO_Pin_2);
  GPIO_SetBits(GPIOC,GPIO_Pin_9 | GPIO_Pin_10| GPIO_Pin_11 | GPIO_Pin_12| GPIO_Pin_13 | GPIO_Pin_14|GPIO_Pin_15);
  GPIO_SetBits(GPIOC,GPIO_Pin_8);
  GPIO_ResetBits(GPIOD,GPIO_Pin_2);

  Delay_Ms(1000);



}

void LED2_Run(void)
{
  int i;
  for(i=0;i<5;i++)
  {
  GPIO_SetBits(GPIOD,GPIO_Pin_2);
  GPIO_SetBits(GPIOC,GPIO_Pin_8 | GPIO_Pin_10| GPIO_Pin_11 | GPIO_Pin_12| GPIO_Pin_13 | GPIO_Pin_14|GPIO_Pin_15);
  GPIO_ResetBits(GPIOC,GPIO_Pin_9);
  GPIO_ResetBits(GPIOD,GPIO_Pin_2);

  Delay_Ms(200);

  GPIO_SetBits(GPIOD,GPIO_Pin_2);
  GPIO_SetBits(GPIOC,GPIO_Pin_8| GPIO_Pin_10| GPIO_Pin_11 | GPIO_Pin_12| GPIO_Pin_13 | GPIO_Pin_14|GPIO_Pin_15);
  GPIO_SetBits(GPIOC,GPIO_Pin_9);
  GPIO_ResetBits(GPIOD,GPIO_Pin_2);

  Delay_Ms(200);

   }

}

void LED3_Run(void)
{
  int i;
  for(i=0;i<5;i++)
  {
  GPIO_SetBits(GPIOD,GPIO_Pin_2);
  GPIO_SetBits(GPIOC,GPIO_Pin_8 | GPIO_Pin_9| GPIO_Pin_11 | GPIO_Pin_12| GPIO_Pin_13 | GPIO_Pin_14|GPIO_Pin_15);
  GPIO_ResetBits(GPIOC,GPIO_Pin_10);
  GPIO_ResetBits(GPIOD,GPIO_Pin_2);

  Delay_Ms(200);

  GPIO_SetBits(GPIOD,GPIO_Pin_2);
  GPIO_SetBits(GPIOC,GPIO_Pin_8| GPIO_Pin_9| GPIO_Pin_11 | GPIO_Pin_12| GPIO_Pin_13 | GPIO_Pin_14|GPIO_Pin_15);
  GPIO_SetBits(GPIOC,GPIO_Pin_10);
  GPIO_ResetBits(GPIOD,GPIO_Pin_2);

  Delay_Ms(200);

   }

}

void KEY_Scan(void)
{

if(RB1==0)
{
Delay_Ms(5);
if(RB1==0)
{
if(shezhi==0)
{
    shezhi=1;


	LCD_DisplayStringLine(Line1,"   Parameter Setup  ");
	sprintf((char*)string,"Threshold 1: %2dcm",low);	
    LCD_DisplayStringLine(Line3,string);
	sprintf((char*)string,"Threshold 2: %2dcm",mid);	
    LCD_DisplayStringLine(Line5,string);
	sprintf((char*)string,"Threshold 3: %2dcm",high);	
    LCD_DisplayStringLine(Line7,string);
	
}
else if(shezhi==1)
{
	shezhi=0;
 	LCD_DisplayStringLine(Line1,"    Liquid Level    ");	
	

	Delay_Ms(5);
    IIC_Write(0x00,low);

	Delay_Ms(5);
	IIC_Write(0x01,high);

	Delay_Ms(5);
	IIC_Write(0x02,mid);
	
	Delay_Ms(5);
	IIC_Write(0x20,20);

}
}
 while(!RB1);

}

else if(RB2==0)
{
Delay_Ms(5);
if(RB2==0)
{
 if(shezhi==1)
 {
 if(qie==0|qie==3)
 {
  qie=1;
  
  LCD_SetTextColor(Green);
  sprintf((char*)string,"Threshold 1: %2dcm",low);
  LCD_DisplayStringLine(Line3,string);	
  LCD_SetTextColor(Black);

  sprintf((char*)string,"Threshold 2: %2dcm",mid);	
  LCD_DisplayStringLine(Line5,string);
  sprintf((char*)string,"Threshold 3: %2dcm",high);	
  LCD_DisplayStringLine(Line7,string);
  
 }
 else if(qie==1)
 {
  qie=2;
 
  LCD_SetTextColor(Green);
  sprintf((char*)string,"Threshold 2: %2dcm",mid);
  LCD_DisplayStringLine(Line5,string);	
  LCD_SetTextColor(Black);

  sprintf((char*)string,"Threshold 1: %2dcm",low);	
  LCD_DisplayStringLine(Line3,string);
  sprintf((char*)string,"Threshold 3: %2dcm",high);	
  LCD_DisplayStringLine(Line7,string);
 }
 else if(qie==2)
 {
  qie=3;
 
  LCD_SetTextColor(Green);
  sprintf((char*)string,"Threshold 3: %2dcm",high);
  LCD_DisplayStringLine(Line7,string);	
  LCD_SetTextColor(Black);

  sprintf((char*)string,"Threshold 1: %2dcm",low);	
  LCD_DisplayStringLine(Line3,string);
  sprintf((char*)string,"Threshold 2: %2dcm",mid);	
  LCD_DisplayStringLine(Line5,string);
 }
 }
}
while(!RB2);

}

else if(R3==0)
{
Delay_Ms(5);
if(RB3==0)
{
  if(qie==1)
  {
   low+=5;
   if(low>95)low=95;
    
   LCD_SetTextColor(Green);
   sprintf((char*)string,"Threshold 1: %2dcm",low);
   LCD_DisplayStringLine(Line3,string);	
   LCD_SetTextColor(Black);
  }

  else if(qie==2)
  {
   mid+=5;
   if(mid>95)low=95;

   LCD_SetTextColor(Green);
   sprintf((char*)string,"Threshold 2: %2dcm",mid);
   LCD_DisplayStringLine(Line5,string);	
   LCD_SetTextColor(Black);

  }

 else if(qie==3)
 {
 high+=5;
 if(high>95)high=95;

  LCD_SetTextColor(Green);
  sprintf((char*)string,"Threshold 3: %2dcm",high);
  LCD_DisplayStringLine(Line7,string);	
  LCD_SetTextColor(Black);

 
 }

}

while(!RB3);

}

else if(RB4==0)
{
	Delay_Ms(5);
	if(RB4==0)
	{
	  if(qie==1)
  {
   low-=5;
   if(low<5)low=5;
    
   LCD_SetTextColor(Green);
   sprintf((char*)string,"Threshold 1: %2dcm",low);
   LCD_DisplayStringLine(Line3,string);	
   LCD_SetTextColor(Black);
  }

  else if(qie==2)
  {
   mid-=5;
   if(mid<5)mid=5;

   LCD_SetTextColor(Green);
   sprintf((char*)string,"Threshold 2: %2dcm",mid);
   LCD_DisplayStringLine(Line5,string);	
   LCD_SetTextColor(Black);

  }

 else if(qie==3)
	 {
	 high-=5;
	 if(high<5)high=5;
	
	  LCD_SetTextColor(Green);
	  sprintf((char*)string,"Threshold 3: %2dcm",high);
	  LCD_DisplayStringLine(Line7,string);	
	  LCD_SetTextColor(Black);
	
	 
	 }
	}
	
	while(!RB4);
	
}


}


unsigned char IIC_Read(unsigned char add)
{
unsigned char val;

I2CStart();
I2CSendByte(0xa0);
I2CSendAck();

I2CSendByte(add);
I2CSendAck();

I2CStart();
I2CSendByte(0xa1);
I2CSendAck();
val=I2CReceiveByte();
I2CSendAck();
I2CStop();

return val;

}

void  IIC_Write(unsigned char add,unsigned char data)
{

I2CStart();
I2CSendByte(0xa0);
I2CSendAck();

I2CSendByte(add);
I2CSendAck();

I2CSendByte(data);
I2CSendAck();
I2CStop();

}

 void ADC_Read(void)
 {
 
  float adc_val;

  LCD_ClearLine(Line3);
  LCD_ClearLine(Line5);
  LCD_ClearLine(Line7);


  ADC_SoftwareStartConvCmd(ADC1, ENABLE);
  adc_val=ADC_GetConversionValue(ADC1);
  adc_val=adc_val*3.3/0xfff;
  sprintf((char*)string," ADC: %.2fV",adc_val);
  LCD_DisplayStringLine(Line5,string);
  adc_val=adc_val*30.303;
  sprintf((char*)string," Height: %.0fcm",adc_val);
  LCD_DisplayStringLine(Line3,string);

  adc_va=adc_val;

  if(adc_val>high)
  {
  LCD_DisplayStringLine(Line7," Leval: 3            ");
  if(level==2)
  {
   sprintf((char*)Tx_Buff,"A:H%.0f+L3+U\r\n",adc_va);
   USART2_Send(Tx_Buff);
   LED2_Run();
  }
  level=3;
  


  }
  else if(adc_val>mid)
  {
  LCD_DisplayStringLine(Line7," Leval: 2");
  if(level==3)
  {
   sprintf((char*)Tx_Buff,"A:H%.0f+L2+D\r\n",adc_va);
   USART2_Send(Tx_Buff);
   LED2_Run();

  }

  else if(level==1)
  {
   sprintf((char*)Tx_Buff,"A:H%.0f+L2+U\r\n",adc_va);
   USART2_Send(Tx_Buff);
   LED2_Run();
  }

  level=2;



  }
  else if(adc_val>low)
  {
  LCD_DisplayStringLine(Line7," Leval: 1");
  if(level==2)
  {
   sprintf((char*)Tx_Buff,"A:H%.0f+L1+D\r\n",adc_va);
   USART2_Send(Tx_Buff);
   LED2_Run();
  }
  
  else if(level==0)
  {
   sprintf((char*)Tx_Buff,"A:H%.0f+L1+U\r\n",adc_va);
   USART2_Send(Tx_Buff);
   LED2_Run();
  }  


  level=1;


  }

  else //if(adc_val<low)
  {
    LCD_DisplayStringLine(Line7," Leval: 0");
	if(level==1)
  {
   sprintf((char*)Tx_Buff,"A:H%.0f+L0+D\r\n",adc_va);
   USART2_Send(Tx_Buff);
   LED2_Run();
  }

	level=0;
  }



 
 }

void GPIO_Int(void)
{

	GPIO_InitTypeDef GPIO_InitStructure;
	ADC_InitTypeDef  ADC_InitStructure;
	USART_InitTypeDef USART_InitStructure;

	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC | RCC_APB2Periph_GPIOD , ENABLE);
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB , ENABLE);
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);

	RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);

  //LED
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10| GPIO_Pin_11 | GPIO_Pin_12| GPIO_Pin_13 | GPIO_Pin_14|GPIO_Pin_15;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_Init(GPIOC, &GPIO_InitStructure);

	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_Init(GPIOD, &GPIO_InitStructure);

	

	//KEY

	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_8;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
    GPIO_Init(GPIOA, &GPIO_InitStructure);

	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_2;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
    GPIO_Init(GPIOB, &GPIO_InitStructure);

	//led
	GPIO_SetBits(GPIOC,GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10| GPIO_Pin_11 | GPIO_Pin_12| GPIO_Pin_13 | GPIO_Pin_14|GPIO_Pin_15);
	GPIO_SetBits(GPIOD,GPIO_Pin_2);
	GPIO_ResetBits(GPIOD,GPIO_Pin_2);
	//adc

	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
    GPIO_Init(GPIOB, &GPIO_InitStructure);



	ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;
    ADC_InitStructure.ADC_ScanConvMode = DISABLE;
    ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;
    ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
    ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
    ADC_InitStructure.ADC_NbrOfChannel = 1;
    ADC_Init(ADC1, &ADC_InitStructure);

	ADC_RegularChannelConfig(ADC1, ADC_Channel_8, 1, ADC_SampleTime_13Cycles5);
    ADC_ITConfig(ADC1, ADC_IT_AWD, ENABLE);
    ADC_Cmd(ADC1, ENABLE);
    ADC_ResetCalibration(ADC1);
    while(ADC_GetResetCalibrationStatus(ADC1));
    ADC_StartCalibration(ADC1);
    while(ADC_GetCalibrationStatus(ADC1));
    ADC_SoftwareStartConvCmd(ADC1, ENABLE);

	//usart

  USART_InitStructure.USART_BaudRate = 9600;
  USART_InitStructure.USART_WordLength = USART_WordLength_8b;
  USART_InitStructure.USART_StopBits = USART_StopBits_1;
  USART_InitStructure.USART_Parity = USART_Parity_No;
  USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
  USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;

  USART_Init(USART2, &USART_InitStructure);

  USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);

  USART_Cmd(USART2, ENABLE);

  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  GPIO_InitStructure.GPIO_Pin = USARTz_RxPin;
  GPIO_Init(GPIOA, &GPIO_InitStructure);  
  
  GPIO_InitStructure.GPIO_Pin = USARTz_TxPin;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  GPIO_Init(GPIOA, &GPIO_InitStructure);  
 
  NVIC_Configuration();


}


void NVIC_Configuration(void)
{
  NVIC_InitTypeDef NVIC_InitStructure;

  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);
  

  NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn;
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&NVIC_InitStructure);
}


void LCD_Init(void)
{
    STM3210B_LCD_Init();
	LCD_Clear(White);
	LCD_SetBackColor(White);
	LCD_SetTextColor(Black);
	
	SysTick_Config(SystemCoreClock/1000);


	LCD_DisplayStringLine(Line0,"                    ");	
	LCD_DisplayStringLine(Line1,"    Liquid Level    ");	
	LCD_DisplayStringLine(Line2,"                    ");
    LCD_DisplayStringLine(Line3,"  Height:           ");
	LCD_DisplayStringLine(Line4,"                    ");	
	LCD_DisplayStringLine(Line5,"  ADC:              ");
	LCD_DisplayStringLine(Line6,"                    ");
	LCD_DisplayStringLine(Line7,"  Level:            ");	
	LCD_DisplayStringLine(Line8,"                    ");
	LCD_DisplayStringLine(Line9,"                    ");	
	


}
void Delay_Ms(u32 nTime)
{
	TimingDelay = nTime;
	while(TimingDelay != 0);	
}

完整工程和试卷:完整试卷和工程

猜你喜欢

转载自blog.csdn.net/qqGHJ/article/details/87734304