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);
}
完整工程和试卷:完整试卷和工程