蓝桥杯第六届嵌入式程序

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

①、库文件

②、中断服务函数

void RTC_IRQHandler(void)
{
  if (RTC_GetITStatus(RTC_IT_SEC) != RESET)
  {
    /* Clear the RTC Second interrupt */
    RTC_ClearITPendingBit(RTC_IT_SEC);

    

    /* Enable time update */
    TimeDisplay = 1;

    /* Wait until last write operation on RTC registers has finished */
    RTC_WaitForLastTask();

    /* Reset RTC Counter when Time is 23:59:59 本程序中  需将该句从主函数中移过来,否则rtc无
   法显示00:00:00,至今尚未知道原因何在*/
  if (RTC_GetCounter() == 0x0001517F)  
  {
     RTC_SetCounter(0x0);
     /* Wait until last write operation on RTC registers has finished */
     RTC_WaitForLastTask();
  }
  
    
  }
}



u8 key=0,count=0; 
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 == 'k'||temp == 'K')
    {
	count++;
	key=1;

      
    }
	else if(key==1)
	{
	count++;
	if(count==4)
	{
	Receive=1;
	Receive_Buff=temp;
	key=0;
	count=0;
	}

	}
  }
  
  
}

③、主函数

#include "stm32f10x.h"
#include "lcd.h"
#include <stdio.h>
#include "init.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)


u32 TimingDelay = 0;
u8 TimeDisplay=0;
u8 string[20];
u8 k;
extern u8 Receive,Receive_Buff;
uint32_t BHH = 0, BMM = 0, BSS = 0;
float ADC_Value;
u8 TX_Buff[20];
u8 LED1_Flag=1;
u8 shezhi=0;
u8 baojing=0;
u8 qie=0;

void Delay_Ms(u32 nTime);
void LCD_Init(void);
void GPIO_Int(void);
void KEY_Scan(void);
void Time_Display(uint32_t TimeVar);
void AD_Read(void);
unsigned char IIC_Read(unsigned char address);
void IIC_Write(unsigned add,unsigned char dat);
void USART_Send(u8 *str);
void LED1_Run(void);



int main(void)
{


 LCD_Init();
 GPIO_Int();
 i2c_init();

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

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

 }
  Delay_Ms(5);
  k=IIC_Read(0x00);
  sprintf((char*)string,"  k : 0.%1d",k);
  LCD_DisplayStringLine(Line3,string);


  while (1)
  {
  KEY_Scan();
  if(shezhi==0)
  {
	  	if(TimeDisplay==1)
	  {
	  	TimeDisplay=0;
	  	Time_Display(RTC_GetCounter());
		AD_Read();
	  }
	
	  if(Receive==1)
	  {
	   Receive=0;
	   k=Receive_Buff-48;
	   sprintf((char*)string,"  k : 0.%1d",k);
	   LCD_DisplayStringLine(Line3,string);
	   Delay_Ms(5);
	   IIC_Write(0x00,k);
	   USART_Send("ok\n");
	  
	  }
	  
	   LCD_DisplayStringLine(Line9,"                   1");
  
  }
   if(baojing==1)
   {
	  if(LED1_Flag==1)
	   {
	   	LED1_Run();
	   }
	   else 
	   {
	    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);
	   }
  

   }
   else if(baojing==0)
   {
   	  	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);
   }
  
  }
}
void LED1_Run(void)
{
  	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);

	Delay_Ms(200);

	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_SetBits(GPIOD,GPIO_Pin_2);
	GPIO_ResetBits(GPIOD,GPIO_Pin_2);

	Delay_Ms(200);

}

void USART_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 KEY_Scan(void)
{

if(RB1==0)
{
Delay_Ms(10);
if(RB1==0)
{
	
if(shezhi==0)
 {	
	  if(LED1_Flag==1)
	  {
	   LED1_Flag=0;
	   LCD_DisplayStringLine(Line5,"  LED: OFF          ");
	  }
	  else if(LED1_Flag==0)
	  {
	   LED1_Flag=1;
	   LCD_DisplayStringLine(Line5,"  LED: ON           ");
	  }

 }

 

}
while(!RB1);

}

else if(RB2==0)
{
Delay_Ms(10);
if(RB2==0)
{

if(shezhi==0)
{
	shezhi=1;
	LCD_DisplayStringLine(Line1,(unsigned char *)"                    ");	
	LCD_DisplayStringLine(Line6,(unsigned char *)"                    ");
	LCD_DisplayStringLine(Line7,(unsigned char *)"                    ");

	

	
	
	LCD_DisplayStringLine(Line3,"    Setting         ");
	sprintf((char*)string,"   %.2d-%.2d-%.2d",BHH,BMM,BSS);
	LCD_DisplayStringLine(Line5,string);
	LCD_DisplayStringLine(Line9,"                   2");

}
else if(shezhi==1)
{
	
  shezhi=0;

  LCD_DisplayStringLine(Line6,(unsigned char *)"                    ");
  
 
  sprintf((char*)string,"  k : 0.%1d",k);
  LCD_DisplayStringLine(Line3,string);

  if(LED1_Flag==1)
  {
   LCD_DisplayStringLine(Line5,"  LED: ON           ");
  }
  else if(LED1_Flag==0)
  {
   LCD_DisplayStringLine(Line5,"  LED: OFF          ");
  }

  

}


}
while(!RB2);

}

else if(R3==0)
{
Delay_Ms(10);
if(RB3==0)
{
	if(shezhi==1)
	{
		if(qie==0|qie==3)
		{
		qie=1;
		LCD_DisplayStringLine(Line6,"   ~~               ");
	
		}
		else if(qie==1)
		{
		qie=2;
		LCD_DisplayStringLine(Line6,"      ~~            ");
	
		}
		else if(qie==2)
		{
		qie=3;
		LCD_DisplayStringLine(Line6,"         ~~         ");
	
		}

	 }

}
while(!RB3);

}

else if(RB4==0)
{
Delay_Ms(10);
if(RB4==0)
{
if(shezhi==1)
	{
		if(qie==1)
		{
		BHH+=1;
		if(BHH==24)		//注意时间的特殊格式
		BHH=0;
	
		}
		else if(qie==2)
		{
		BMM+=1;
		if(BMM==60)
		BMM=0;
	
		}
		else if(qie==3)
		{
		BSS+=1;
		if(BSS==60)
		BSS=0;
	
	
		}

		sprintf((char*)string,"   %.2d-%.2d-%.2d",BHH,BMM,BSS);
		LCD_DisplayStringLine(Line5,string);

	 }


}
while(!RB4);

}


}

 void Time_Display(uint32_t TimeVar)
{
  uint32_t THH = 0, TMM = 0, TSS = 0;
  
  
  
  /* Compute  hours */
  THH = TimeVar / 3600;
  /* Compute minutes */
  TMM = (TimeVar % 3600) / 60;
  /* Compute seconds */
  TSS = (TimeVar % 3600) % 60;	 

 

  	if(THH==BHH)
	{
		if(TMM==BMM)
		{
			if(TSS==BSS)
			{
				sprintf((char*)TX_Buff,"%s%.2f+0.%0.1d+%0.2d%0.2d%0.2d\n","",ADC_Value,k,THH, TMM, TSS);//2.21+0.1+123030\n
				USART_Send(TX_Buff);				
			}
		}
	}
	

    sprintf((char*)string," T: %0.2d-%0.2d-%0.2d", THH, TMM, TSS);
	LCD_DisplayStringLine(Line7,string);	
}

void AD_Read(void)
{
  ADC_SoftwareStartConvCmd(ADC1, ENABLE);
  ADC_Value=ADC_GetConversionValue(ADC1)*3.3/0xfff;
  sprintf((char*)string,"  V1: %.2fV",ADC_Value);
  LCD_DisplayStringLine(Line1,string);

  if(ADC_Value>k*3.3*0.1)
  {
  	 baojing=1 ;
  }
  else	 if(ADC_Value<k*3.3*0.1)
  {
  	 baojing=0 ;
  }
}


unsigned char IIC_Read(unsigned char address)
{
  unsigned char temp;
  I2CStart();
  I2CSendByte(0xa0);
  I2CSendAck();

  I2CSendByte(address);
  I2CSendAck();

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

  return temp;


}

void IIC_Write(unsigned add,unsigned char dat)
{
  I2CStart();
  I2CSendByte(0xa0);
  I2CSendAck();

  I2CSendByte(add);
  I2CSendAck();

  
  I2CSendByte(dat);
  I2CSendAck();
  I2CStop();

}


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

 ④、初始化函数

通常一个试题写下来往往会有700左右,为了回头修改函数的方便,提高效率,故特地兴建init.c与init.h函数从而使代码简洁

init.c

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



 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_PWR | RCC_APB1Periph_BKP, ENABLE);
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, 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);

	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);

	//RTC
  PWR_BackupAccessCmd(ENABLE);
  BKP_DeInit();
  RCC_LSICmd(ENABLE);  //注意
  while (RCC_GetFlagStatus(RCC_FLAG_LSIRDY) == RESET);
  RCC_RTCCLKConfig(RCC_RTCCLKSource_LSI);
  RCC_RTCCLKCmd(ENABLE);
  RTC_WaitForSynchro();
  RTC_WaitForLastTask();
  RTC_ITConfig(RTC_IT_SEC, ENABLE);
  RTC_WaitForLastTask();
  RTC_SetPrescaler(39999);
  RTC_WaitForLastTask();

  RTC_SetCounter(3600*HH+60*MM+SS);
  /* Wait until last write operation on RTC registers has finished */
  RTC_WaitForLastTask();

  NVIC_Configuration();

  //ADC
  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);

  /* ADC1 regular channel14 configuration */ 
  ADC_RegularChannelConfig(ADC1, ADC_Channel_8, 1, ADC_SampleTime_13Cycles5); //对应PB0

  /* Enable AWD interrupt */
  ADC_ITConfig(ADC1, ADC_IT_AWD, ENABLE);

  /* Enable ADC1 */
  ADC_Cmd(ADC1, ENABLE);

  /* Enable ADC1 reset calibration register */   
  ADC_ResetCalibration(ADC1);
  /* Check the end of ADC1 reset calibration register */
  while(ADC_GetResetCalibrationStatus(ADC1));

  /* Start ADC1 calibration */
  ADC_StartCalibration(ADC1);
  /* Check the end of ADC1 calibration */
  while(ADC_GetCalibrationStatus(ADC1));

  /* Start ADC1 Software Conversion */ 
  ADC_SoftwareStartConvCmd(ADC1, ENABLE);

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

  //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_Pin = USARTz_RxPin;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  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); 
 


}

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


	LCD_DisplayStringLine(Line0,"                    ");	
	LCD_DisplayStringLine(Line1,"  V1: 1.84V         ");	
	LCD_DisplayStringLine(Line2,"                    ");
    LCD_DisplayStringLine(Line3,"  k : 0.1           ");
	LCD_DisplayStringLine(Line4,"                    ");	
	LCD_DisplayStringLine(Line5,"  LED: ON          ");
	LCD_DisplayStringLine(Line6,"                    ");
	LCD_DisplayStringLine(Line7,"  T:23-59-55       ");	
	LCD_DisplayStringLine(Line8,"                    ");
	LCD_DisplayStringLine(Line9,"                    ");	
	


}


void NVIC_Configuration(void)
{
  NVIC_InitTypeDef NVIC_InitStructure;

  /* Configure one bit for preemption priority */
  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);

  /* Enable the RTC Interrupt */
  NVIC_InitStructure.NVIC_IRQChannel = RTC_IRQn;
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&NVIC_InitStructure);

  /* Enable the USART2 Interrupt */
  NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn;
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&NVIC_InitStructure);
}

init.h

#ifndef __INIT_H
#define __INIT_H

#define HH 23
#define MM 59
#define SS 55

#define USARTz_RxPin             GPIO_Pin_3
#define USARTz_TxPin             GPIO_Pin_2



void GPIO_Int(void);
void LCD_Init(void);
void NVIC_Configuration(void);

#endif 

完整工程https://download.csdn.net/download/qqghj/10972543 

猜你喜欢

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