#include "tx.h"
void LED_Init(void){
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC|RCC_APB2Periph_GPIOD, ENABLE);
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);
GPIO_InitStructure.GPIO_Pin = 0xff00;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOC, &GPIO_InitStructure);
GPIOD->ODR|=(1<<2);
GPIOC->ODR|=0xff00;
GPIOD->ODR&=~(1<<2);
}
void KEY_Init(void){
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_8;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1|GPIO_Pin_2;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOB, &GPIO_InitStructure);
}
u8 key_status[4]={
1,1,1,1};
void KEY_Driver(void){
u8 i;
static u8 backup[4]={
1,1,1,1};
for(i=0;i<4;i++){
if(backup[i]!=key_status[i]){
if(backup[i]!=0){
Key_action(i+1);
}
backup[i]=key_status[i];
}
}
}
void KEY_Scan(void){
u8 i;
static u8 Key_buf[4]={
0xff,0xff,0xff,0xff};
Key_buf[0]=(Key_buf[0]<<1)|KEY1;
Key_buf[1]=(Key_buf[1]<<1)|KEY2;
Key_buf[2]=(Key_buf[2]<<1)|KEY3;
Key_buf[3]=(Key_buf[3]<<1)|KEY4;
for(i=0;i<4;i++){
if(Key_buf[i]==0x00)
key_status[i]=0;
else if(Key_buf[i]==0xff)
key_status[i]=1;
}
}
void Tim4_Init(u16 arr,u16 psc){
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);
NVIC_InitStructure.NVIC_IRQChannel = TIM4_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
TIM_TimeBaseStructure.TIM_Period = arr-1;
TIM_TimeBaseStructure.TIM_Prescaler = psc-1;
TIM_TimeBaseStructure.TIM_ClockDivision = 0;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure);
TIM_ITConfig(TIM4, TIM_IT_Update, ENABLE);
TIM_Cmd(TIM4, ENABLE);
}
void Adc1_Init(void){
ADC_InitTypeDef ADC_InitStructure;
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1 | RCC_APB2Periph_GPIOB, ENABLE);
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 = DISABLE;
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_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));
}
u16 Get_adc(void){
u16 temp;
ADC_RegularChannelConfig(ADC1, ADC_Channel_8, 1, ADC_SampleTime_239Cycles5);
ADC_SoftwareStartConvCmd(ADC1, ENABLE);
while(ADC_GetFlagStatus(ADC1,ADC_FLAG_EOC)==0);
temp=ADC_GetConversionValue(ADC1);
ADC_SoftwareStartConvCmd(ADC1, DISABLE);
return temp;
}
void RTC_Init(u8 HH,u8 MM,u8 SS){
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
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);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE);
/* Allow access to BKP Domain */
PWR_BackupAccessCmd(ENABLE);
/* Reset Backup Domain */
BKP_DeInit();
/* Enable the LSI OSC */
RCC_LSICmd(ENABLE);
/* Wait till LSI is ready */
while (RCC_GetFlagStatus(RCC_FLAG_LSIRDY) == RESET)
{
}
/* Select the RTC Clock Source */
RCC_RTCCLKConfig(RCC_RTCCLKSource_LSI);
/* Enable RTC Clock */
RCC_RTCCLKCmd(ENABLE);
/* Wait for RTC registers synchronization */
RTC_WaitForSynchro();
/* Wait until last write operation on RTC registers has finished */
RTC_WaitForLastTask();
/* Enable the RTC Second */
RTC_ITConfig(RTC_IT_SEC, ENABLE);
/* Wait until last write operation on RTC registers has finished */
RTC_WaitForLastTask();
/* Set RTC prescaler: set RTC period to 1sec */
RTC_SetPrescaler(40000-1);
/* Wait until last write operation on RTC registers has finished */
RTC_WaitForLastTask();
RTC_SetCounter(3600*HH+60*MM+SS);
RTC_WaitForLastTask();
}
//输出
void Tim2_Init(u32 fre,u8 duty){
u32 arr;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
arr=1000000/fre;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
TIM_TimeBaseStructure.TIM_Period = arr-1;
TIM_TimeBaseStructure.TIM_Prescaler = 71;
TIM_TimeBaseStructure.TIM_ClockDivision = 0;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_Pulse = (arr-1)*duty/100;
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
TIM_OC2Init(TIM2, &TIM_OCInitStructure);
TIM_ITConfig(TIM2, TIM_IT_CC2, ENABLE);
/* TIM2 enable counter */
TIM_Cmd(TIM2, ENABLE);
}
//输入
void Tim3_Init(void){
TIM_ICInitTypeDef TIM_ICInitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
GPIO_InitTypeDef GPIO_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
/* GPIOA and GPIOB clock enable */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
TIM_TimeBaseStructure.TIM_Period = 0xffff;
TIM_TimeBaseStructure.TIM_Prescaler = 71;
TIM_TimeBaseStructure.TIM_ClockDivision = 0;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
TIM_ICInitStructure.TIM_Channel = TIM_Channel_2;
TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;
TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI;
TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;
TIM_ICInitStructure.TIM_ICFilter = 0x0;
TIM_ICInit(TIM3, &TIM_ICInitStructure);
/* TIM enable counter */
TIM_Cmd(TIM3, ENABLE);
/* Enable the CC2 Interrupt Request */
TIM_ITConfig(TIM3, TIM_IT_CC2, ENABLE);
}
void Usart2_Init(void){
USART_InitTypeDef USART_InitStructure;
GPIO_InitTypeDef GPIO_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_Init(GPIOA, &GPIO_InitStructure);
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);
NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
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);
}
void Send_string(u8 *str){
u8 i=0;
while(str[i]!=0){
USART_SendData(USART2,str[i]);
while(USART_GetFlagStatus(USART2,USART_FLAG_TXE)==0);
i++;
}
}
tx.h
/*
程序说明: CT117E嵌入式竞赛板LCD驱动程序
软件环境: Keil uVision 4.10
硬件环境: CT117E嵌入式竞赛板
日 期: 2011-8-9
*/
/* Define to prevent recursive inclusion -------------------------------------*/
#ifndef __TX_H
#define __TX_H
/* Includes ------------------------------------------------------------------*/
#include "stm32f10x.h"
#define KEY1 GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0)
#define KEY2 GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_8)
#define KEY3 GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_1)
#define KEY4 GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_2)
extern void Key_action(int code);
void LED_Init(void);
void KEY_Init(void);
void KEY_Driver(void);
void KEY_Scan(void);
void Tim4_Init(u16 arr,u16 psc);
void Adc1_Init(void);
u16 Get_adc(void);
void RTC_Init(u8 HH,u8 MM,u8 SS);
void Tim2_Init(u32 fre,u8 duty);
void Tim3_Init(void);
void Usart2_Init(void);
void Send_string(u8 *str);
#endif /* __TX_H */
/******************* (C) COPYRIGHT 2008 STMicroelectronics *****END OF FILE****/
2.中断函数
stm32f10x_it.h
void SysTick_Handler(void)
{
TimingDelay--;
}
extern u8 ms200_flag;
extern u8 record_flag;
extern u16 record_time;
void TIM4_IRQHandler(void)
{
static u16 ms200_count=0;
static u16 s1_count=0;
static u16 record_count=0;
if (TIM_GetITStatus(TIM4, TIM_IT_Update) != RESET)
{
TIM_ClearITPendingBit(TIM4, TIM_IT_Update);
KEY_Scan();
ms200_count++;
s1_count++;
if(ms200_count>=100){
ms200_count=0;
ms200_flag=1;
}
if(s1_count>=500){
s1_count=0;
record_count++;
if(record_count>=record_time){
record_flag=1;
record_count=0;
}
}
}
}
extern u16 time;
extern u8 hour,min,sec;
void RTC_IRQHandler(void)
{
if (RTC_GetITStatus(RTC_IT_SEC) != RESET)
{
RTC_ClearITPendingBit(RTC_FLAG_SEC);
time=RTC_GetCounter();
if(time==23*3600+59*60+59)
RTC_SetCounter(0);
hour=time/3600;
min=time%3600/60;
sec=time%3600%60;
}
}
__IO uint16_t IC3ReadValue1 = 0, IC3ReadValue2 = 0;
__IO uint16_t CaptureNumber = 0;
__IO uint32_t Capture = 0;
__IO uint32_t TIM3Freq = 0;
void TIM3_IRQHandler(void)
{
if(TIM_GetITStatus(TIM3, TIM_IT_CC2) == SET)
{
/* Clear TIM3 Capture compare interrupt pending bit */
TIM_ClearITPendingBit(TIM3, TIM_IT_CC2);
if(CaptureNumber == 0)
{
/* Get the Input Capture value */
IC3ReadValue1 = TIM_GetCapture2(TIM3);
CaptureNumber = 1;
}
else if(CaptureNumber == 1)
{
/* Get the Input Capture value */
IC3ReadValue2 = TIM_GetCapture2(TIM3);
/* Capture computation */
if (IC3ReadValue2 > IC3ReadValue1)
{
Capture = (IC3ReadValue2 - IC3ReadValue1);
}
else
{
Capture = ((0xFFFF - IC3ReadValue1) + IC3ReadValue2);
}
/* Frequency computation */
TIM3Freq = 1000000 / Capture;
CaptureNumber = 0;
}
}
}
extern u8 RXD_flag;
extern u8 RXD_buf[20];
u16 RXD_count=0;
void USART2_IRQHandler(void)
{
u16 temp;
if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET)
{
USART_ClearITPendingBit(USART2, USART_IT_RXNE) ;
temp=USART_ReceiveData(USART2);
if(temp=='\n'){
RXD_flag=1;
RXD_count=0;
USART_ITConfig(USART2, USART_IT_RXNE, DISABLE);
}
else
RXD_buf[RXD_count++]=temp;
}
}
3.主函数
main.c
#include "stm32f10x.h"
#include "lcd.h"
#include "tx.h"
#include "stdio.h"
#include "i2c.h"
u32 TimingDelay = 0;
extern __IO uint32_t TIM3Freq;
u8 time; //时间
u8 hour,min,sec;
float adc_value; //电压值
u8 ms200_flag=1;
u8 record_flag=0; //采集数据标志
u16 record_time=1; //采集间隔
u16 get_time=0; //采集次数
u16 get_t=0; //缓存数据条数
u8 RXD_flag;
u8 RXD_buf[20];
u8 str[20];
u8 i;
u8 SET_flag=0;//0-实时数据,1-设置界面
u8 Index_flag=0;//0-温度上限...参数设置
float temp=0; //温度
u16 humi=0; //湿度
float temp_door=40; //阈值
u16 humi_door=80;
float test_fre; //测试信号
int record[70][6]={
0}; //记录多次温湿度数据
u16 LED_MODE=0xffff;
u8 LED1_flag=0;
u8 LED2_flag=0;
u8 LED3_flag=0;
void Refresh(void);
void Show_realdata(void);
void Show_setdata(void);
void Led_actin(void);
void Record_action(void);
void Usart2_action(void);
void Key_action(int code);
void In_data(void);
void De_data(void);
void Delay_Ms(u32 nTime);
//Main Body
int main(void)
{
SysTick_Config(SystemCoreClock/1000);
Delay_Ms(200);
STM3210B_LCD_Init();
LCD_Clear(Blue);
LCD_SetBackColor(Blue);
LCD_SetTextColor(White);
i2c_init();
LED_Init();
KEY_Init();
Tim4_Init(2000,72);
Adc1_Init();
RTC_Init(12,50,50);
Tim3_Init();
Usart2_Init();
if(i2c_read(0x00)) {
temp_door=-i2c_read(0x01);Delay_Ms(5);
}
else{
temp_door=i2c_read(0x01);Delay_Ms(5);
}
humi_door=i2c_read(0x02);Delay_Ms(5);
record_time=i2c_read(0x03);Delay_Ms(5);
test_fre=i2c_read(0x04)/10;Delay_Ms(5);
while(1){
KEY_Driver();
if(ms200_flag){
ms200_flag=0;
Refresh();
Led_actin();
if(SET_flag==0)
Show_realdata();
else
Show_setdata();
}
if(record_flag){
record_flag=0;
Record_action();
}
if(RXD_flag){
RXD_flag=0;
Usart2_action();
}
}
}
void Refresh(void){
adc_value=Get_adc()*3.3/4096;
temp=adc_value*80/3.3-20;
humi=(80*TIM3Freq/1000+10)/9;
if(temp>=temp_door)
LED1_flag=1;
if(humi>=humi_door)
LED2_flag=1;
}
void Show_realdata(void){
sprintf((char*)str," Real Data ");
LCD_DisplayStringLine(Line1, str);
if(temp<0){
sprintf((char*)str," Temp: %.0fC ",-temp);
LCD_DisplayStringLine(Line3, str);
}
else {
sprintf((char*)str," Temp: %.0fC ",temp);
LCD_DisplayStringLine(Line3, str);
}
sprintf((char*)str," Humi: %d%% ",humi);
LCD_DisplayStringLine(Line5, str);
sprintf((char*)str," Time: %.2d-%.2d-%.2d ",hour,min,sec);
LCD_DisplayStringLine(Line7, str);
sprintf((char*)str," Record: %d ",get_time);
LCD_DisplayStringLine(Line9, str);
}
void Show_setdata(void){
sprintf((char*)str," Para Setting ");
LCD_DisplayStringLine(Line1, str);
if(Index_flag==0)
LCD_SetTextColor(Green);
else
LCD_SetTextColor(White);
if(temp_door<0){
sprintf((char*)str," Temp_thr: %.0fC ",temp_door);
LCD_DisplayStringLine(Line3, str);
}
else {
sprintf((char*)str," Temp_thr: %.0fC ",temp_door);
LCD_DisplayStringLine(Line3, str);
}
if(Index_flag==1)
LCD_SetTextColor(Green);
else
LCD_SetTextColor(White);
sprintf((char*)str," Humi_thr: %d%% ",humi_door);
LCD_DisplayStringLine(Line5, str);
if(Index_flag==2)
LCD_SetTextColor(Green);
else
LCD_SetTextColor(White);
sprintf((char*)str," Re_time: %ds ",record_time);
LCD_DisplayStringLine(Line7, str);
if(Index_flag==3)
LCD_SetTextColor(Green);
else
LCD_SetTextColor(White);
sprintf((char*)str," Signal: %.1fkHz ",test_fre);
LCD_DisplayStringLine(Line9, str);
LCD_SetTextColor(White);
}
void Led_actin(void){
if(LED1_flag){
LED1_flag=0;
LED_MODE^=(1<<8);
GPIOC->ODR=LED_MODE;
GPIOD->ODR|=(1<<2);
GPIOD->ODR&=~(1<<2);
}
else if(LED1_flag==0){
LED1_flag=0;
LED_MODE|=(1<<8);
GPIOC->ODR=LED_MODE;
GPIOD->ODR|=(1<<2);
GPIOD->ODR&=~(1<<2);
}
if(LED2_flag){
LED2_flag=0;
LED_MODE^=(1<<9);
GPIOC->ODR=LED_MODE;
GPIOD->ODR|=(1<<2);
GPIOD->ODR&=~(1<<2);
}
if(LED2_flag){
LED2_flag=0;
LED_MODE|=(1<<9);
GPIOC->ODR=LED_MODE;
GPIOD->ODR|=(1<<2);
GPIOD->ODR&=~(1<<2);
}
}
void Record_action(void){
get_time++;
record[get_time][0]=temp;
record[get_time][1]=humi;
record[get_time][2]=hour;
record[get_time][3]=min;
record[get_time][4]=sec;
if(get_time>=65)
get_time=0;
LED_MODE^=(1<<10);
GPIOC->ODR=LED_MODE;
GPIOD->ODR|=(1<<2);
GPIOD->ODR&=~(1<<2);
}
void Usart2_action(void){
u8 j;
if(RXD_buf[0]=='C'){
sprintf((char*)str,"Temp_thr:%.0fC Humi_thr:%d%% %.2d-%.2d-%.2d\r\n",temp_door,humi_door,hour,min,sec);
Send_string(str);
}
else if(RXD_buf[0]=='T'){
get_t=get_time;
Delay_Ms(200);
for(j=0;j<get_t;j++){
sprintf((char*)str,"%d Temp:%dC Humi:%d%% %.2d-%.2d-%.2d\r\n",j,record[j][0],record[j][1],record[j][2],record[j][3],record[j][4]);
Send_string(str);
}
}
for(i=0;i<20;i++)
RXD_buf[i]=0;
USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);
}
void Key_action(int code){
if(code==1){
SET_flag^=1;
if(SET_flag==0){
if(temp_door<0){
i2c_write(0x00,1);Delay_Ms(5);
i2c_write(0x01,-temp_door); Delay_Ms(5);
}
else{
i2c_write(0x00,0);Delay_Ms(5);
i2c_write(0x01,temp_door); Delay_Ms(5);
}
i2c_write(0x02,humi_door); Delay_Ms(5);
i2c_write(0x03,record_time); Delay_Ms(5);
i2c_write(0x04,test_fre*10); Delay_Ms(5);
Tim2_Init(test_fre*1000,50);
}
}
else if(code==2){
if(SET_flag==1){
Index_flag++;
if(Index_flag>3)
Index_flag=0;
}
}
else if(code==3){
if(SET_flag==1)
In_data();
}
else if(code==4){
if(SET_flag==1)
De_data();
}
}
void In_data(void){
if(Index_flag==0){
temp_door++;
if(temp_door>=60)
temp_door=60;
}
else if(Index_flag==1){
humi_door++;
if(humi_door>90)
humi_door=90;
}
else if(Index_flag==2){
record_time++;
if(record_time>5)
record_time=1;
}
else if(Index_flag==3){
test_fre+=0.5;
if(test_fre>10)
test_fre=10;
}
}
void De_data(void){
if(Index_flag==0){
temp_door--;
if(temp_door<-20)
temp_door=-20;
}
else if(Index_flag==1){
humi_door--;
if(humi_door<10)
humi_door=10;
}
else if(Index_flag==2){
record_time--;
if(record_time<=0)
record_time=5;
}
else if(Index_flag==3){
test_fre-=0.5;
if(test_fre<1)
test_fre=1;
}
}
void Delay_Ms(u32 nTime)
{
TimingDelay = nTime;
while(TimingDelay != 0);
}
有一点需要注意的是,温度为负数的时候,存储与处理都要考虑符号。