//NINTH//
dian zi ding shi qi
//main.c//
#include "stm32f10x.h"
#include "lcd.h"
#include "io.h"
#include "i2c.h"
#include "stdio.h"
u32 TimingDelay = 0;
u8 KEY_Flag = 0;
u8 Display_Flag = 0;
u8 string[20];
u8 system_mode = 0;
u8 Channel_num = 0;
u32 Timer[5] = {0}; // 定时储存区域
u8 hour; //显示分解:时
u8 min ; //显示分解:分
u8 sec ; //显示分解:秒
u32 DingShi;
u8 _1s_Flag = 0;
u8 LED_Flag = 0;
extern u8 Set_Select;
extern u16 LED_MODE;
extern u8 Run_Stop; //1:运行 0:停止
void Delay_Ms(u32 nTime);
//Main Body
int main(void)
{
STM3210B_LCD_Init();
LCD_Clear(Blue);
LCD_SetBackColor(Blue);
LCD_SetTextColor(White);
SysTick_Config(SystemCoreClock/1000);
i2c_init();
LED_Init();
KEY_Init();
TIM3_PWM_OUTPUT(1000,80,1,0);
Timer[0] = _24c02_Read(0x00) * 3600 + _24c02_Read(0x01) * 60 + _24c02_Read(0x02);
Delay_Ms(10);
Timer[1] = _24c02_Read(0x10) * 3600 + _24c02_Read(0x11) * 60 + _24c02_Read(0x12);
Delay_Ms(10);
Timer[2] = _24c02_Read(0x20) * 3600 + _24c02_Read(0x21) * 60 + _24c02_Read(0x22);
Delay_Ms(10);
Timer[3] = _24c02_Read(0x30) * 3600 + _24c02_Read(0x31) * 60 + _24c02_Read(0x32);
Delay_Ms(10);
Timer[4] = _24c02_Read(0x40) * 3600 + _24c02_Read(0x41) * 60 + _24c02_Read(0x42);
Delay_Ms(10);
while(1)
{
/ KEY /
if(KEY_Flag)
{
KEY_Flag = 0;
KEY_Read();
}
DISPLAY //
if(Display_Flag)
{
Display_Flag = 0;
if(system_mode == 0) // Stanby
{
sprintf((char*)string," NO:%d ",Channel_num + 1);
LCD_DisplayStringLine(Line1,string);
hour = Timer[Channel_num] / 3600;
min = Timer[Channel_num] % 3600 / 60;
sec = Timer[Channel_num] % 3600 % 60;
sprintf((char*)string," %.2d:%.2d:%.2d ",hour,min,sec);
LCD_DisplayStringLine(Line4,string);
LCD_DisplayStringLine(Line7,(u8*)" Standby ");
// LCD_DisplayChar(Line0,210, '1');
//LCD_DisplayChar(Line0,195, '2');
}
if(system_mode == 1) // Setting
{
sprintf((char*)string," NO:%d ",Channel_num + 1);
LCD_DisplayStringLine(Line1,string);
// sprintf((char*)string," %.2d:%.2d:%.2d ",hour,min,sec);
// LCD_DisplayStringLine(Line4,string);
if(Set_Select == 2)
{
LCD_SetTextColor(Red);
}else
{
LCD_SetTextColor(White);
}
LCD_DisplayChar(Line4,210, hour / 10 + 0x30);
LCD_DisplayChar(Line4,195, hour % 10 + 0x30);
LCD_SetTextColor(White);
LCD_DisplayChar(Line4,180, ':');
if(Set_Select == 1)
{
LCD_SetTextColor(Red);
}else
{
LCD_SetTextColor(White);
}
LCD_DisplayChar(Line4,165, min / 10 + 0x30);
LCD_DisplayChar(Line4,150, min % 10 + 0x30);
LCD_SetTextColor(White);
LCD_DisplayChar(Line4,135, ':');
if(Set_Select == 0)
{
LCD_SetTextColor(Red);
}else
{
LCD_SetTextColor(White);
}
LCD_DisplayChar(Line4,120, sec / 10 + 0x30);
LCD_DisplayChar(Line4,105, sec % 10 + 0x30);
LCD_SetTextColor(White);
LCD_DisplayStringLine(Line7,(u8*)" Setting ");
}
if(system_mode == 2) // running、pause
{
sprintf((char*)string," NO:%d ",Channel_num + 1);
LCD_DisplayStringLine(Line1,string);
hour = Timer[Channel_num] / 3600;
min = Timer[Channel_num] % 3600 / 60;
sec = Timer[Channel_num] % 3600 % 60;
sprintf((char*)string," %.2d:%.2d:%.2d ",hour,min,sec);
LCD_DisplayStringLine(Line4,string);
if(Run_Stop)
{
LCD_DisplayStringLine(Line7,(u8*)" Running ");
}else
{
LCD_DisplayStringLine(Line7,(u8*)" Pause ");
}
}
}
/ 定时 ///
if(_1s_Flag)
{
_1s_Flag = 0;
if(system_mode == 2)
{
if(Run_Stop)
{
if(DingShi)
{
DingShi--;
}
if(DingShi != 0)
{
TIM3_PWM_OUTPUT(1000,80,0,1);
}else
{
system_mode = 0;
Run_Stop = 0;
TIM3_PWM_OUTPUT(1000,80,0,0);
}
}else
{
TIM3_PWM_OUTPUT(1000,80,0,0);
}
}
}
// LED /
if(LED_Flag)
{
LED_Flag = 0;
if(system_mode == 2 && Run_Stop == 1)
{
LED_MODE ^= (1<<8);
}else
{
LED_MODE |= (1<<8);
}
GPIOC->ODR = LED_MODE;
GPIOD->ODR |= (1<<2);
GPIOD->ODR &=~(1<<2);
}
}
}
void Delay_Ms(u32 nTime)
{
TimingDelay = nTime;
while(TimingDelay != 0);
}
//IT.C//
extern u8 KEY_Flag;
extern u8 Display_Flag ;
extern u16 TIM3_CH1_Val;
extern u16 TIM3_CH1_Duty;
u8 TIM3_CH1_Flag;
extern u8 _1s_Flag;
extern u8 LED_Flag;
void SysTick_Handler(void)
{
static u8 key_sum = 0;
static u8 display_sum = 0;
static u16 _1s_sum = 0;
static u16 led_sum = 0;
TimingDelay--;
if(++led_sum == 500)
{
led_sum = 0;
LED_Flag = 1;
}
if(++_1s_sum == 1000)
{
_1s_sum = 0;
_1s_Flag = 1;
}
if(++key_sum == 50) // 50ms
{
key_sum = 0;
KEY_Flag = 1;
}
if(++display_sum == 100)
{
display_sum = 0;
Display_Flag = 1;
}
}
void TIM3_IRQHandler(void)
{
u16 capture;
if(TIM_GetITStatus(TIM3,TIM_IT_CC1) == 1)
{
TIM_ClearITPendingBit(TIM3,TIM_IT_CC1);
capture = TIM_GetCapture1(TIM3);
if(TIM3_CH1_Flag)
{
TIM_SetCompare1(TIM3,capture + TIM3_CH1_Duty);
}else
{
TIM_SetCompare1(TIM3,capture + TIM3_CH1_Val - TIM3_CH1_Duty);
}
TIM3_CH1_Flag ^= 1;
}
}
//IO.H//
#ifndef __IO_H
#define __IO_H
#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)
void LED_Init(void);
void KEY_Init(void);
void KEY_Read(void);
void TIM3_PWM_OUTPUT(u16 Frequency,u8 duty,u8 status,u8 enable);
void _24c02_Write(u8 address,u8 data);
u8 _24c02_Read(u8 address);
#endif
//IO.C//
#include "io.h"
#include "i2c.h"
#include "lcd.h"
extern void Delay_Ms(u32 nTime);
u16 LED_MODE = 0xffff;
u16 TIM3_CH1_Val;
u16 TIM3_CH1_Duty;
extern u8 system_mode; // 系统当前状态 0:Stanby 1:Setting 2:running、pause
extern u8 Channel_num; // 存储位置选择 0 ~ 4
u8 Set_Select = 0; // 选择设置的时间 时 分 秒
extern u32 Timer[5]; // 定时储存区域
u32 Timer_Buf; // 修改缓存区
extern u8 hour; //显示分解:时
extern u8 min ; //显示分解:分
extern u8 sec ; //显示分解:秒
u8 Run_Stop = 0; //1:运行 0:停止
extern u32 DingShi;
24C02 //
void _24c02_Write(u8 address,u8 data)
{
I2CStart();
I2CSendByte(0xa0);
I2CWaitAck();
I2CSendByte(address);
I2CWaitAck();
I2CSendByte(data);
I2CWaitAck();
I2CStop();
}
u8 _24c02_Read(u8 address)
{
u8 temp;
I2CStart();
I2CSendByte(0xa0);
I2CWaitAck();
I2CSendByte(address);
I2CWaitAck();
I2CStart();
I2CSendByte(0xa1);
I2CWaitAck();
temp = I2CReceiveByte();
I2CWaitAck();
I2CStop();
return temp;
}
LED ///
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_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOD, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = 0xff00;
GPIO_Init(GPIOC, &GPIO_InitStructure);
GPIOC->ODR = LED_MODE;
GPIOD->ODR |= (1<<2);
GPIOD->ODR &=~(1<<2);
}
PWM_OUTPUT ///
void TIM3_PWM_OUTPUT(u16 Frequency,u8 duty,u8 status,u8 enable)
{
GPIO_InitTypeDef GPIO_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
if(status)
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
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 = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
TIM_TimeBaseInitStructure.TIM_Period = 0xffff;
TIM_TimeBaseInitStructure.TIM_Prescaler = 71;
TIM_TimeBaseInitStructure.TIM_CounterMode = 0x0;
TIM_TimeBaseInitStructure.TIM_ClockDivision = 0x0;
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseInitStructure);
}
TIM3_CH1_Val = 1000000 / Frequency;
TIM3_CH1_Duty = TIM3_CH1_Val * duty / 100;
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_Toggle;
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;
if(enable)
{
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
}else
{
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Disable;
}
TIM_OCInitStructure.TIM_Pulse = TIM3_CH1_Val;
TIM_OC1Init(TIM3, &TIM_OCInitStructure);
//TIM_SetCounter(TIM3, 0x0);
//TIM_SetCompare1(TIM3,0x0);
if(status)
{
TIM_Cmd(TIM3, ENABLE);
TIM_ITConfig( TIM3, TIM_IT_CC1,ENABLE);
}
}
/// KEY
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_IPU;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_2;
GPIO_Init(GPIOB, &GPIO_InitStructure);
}
void KEY_Read(void)
{
static u16 key1_sum = 0,key2_sum = 0,key3_sum = 0,key4_sum = 0;
// KEY1
if(KEY1 == 0)
{
key1_sum++;
if(key1_sum == 1) // 单次触发
{
if(system_mode == 0 || system_mode == 1)
{
Channel_num++;
if(Channel_num > 4) Channel_num = 0;
}
}
}else
{
key1_sum = 0;
}
// KEY2
if(KEY2 == 0)
{
key2_sum++;
if(key2_sum == 1) // 短按
{
if(system_mode == 0)
{
system_mode = 1; // 进入 Setting
Timer_Buf = Timer[Channel_num];
LCD_ClearLine(Line0);
LCD_ClearLine(Line1);
LCD_ClearLine(Line2);
LCD_ClearLine(Line3);
LCD_ClearLine(Line4);
LCD_ClearLine(Line5);
LCD_ClearLine(Line6);
LCD_ClearLine(Line7);
LCD_ClearLine(Line8);
LCD_ClearLine(Line9);
}
if(system_mode == 1)
{
Set_Select++;
if(Set_Select > 2) Set_Select = 0;
}
}
if(key2_sum == 16) // 800ms
{
if(system_mode == 1)
{
system_mode = 0;
Timer[Channel_num] = Timer_Buf;
switch(Channel_num)
{
case 0: _24c02_Write(0x00,hour);
Delay_Ms(10);
_24c02_Write(0x01,min);
Delay_Ms(10);
_24c02_Write(0x02,sec);
break;
case 1: _24c02_Write(0x10,hour);
Delay_Ms(10);
_24c02_Write(0x11,min);
Delay_Ms(10);
_24c02_Write(0x12,sec);
break;
case 2: _24c02_Write(0x20,hour);
Delay_Ms(10);
_24c02_Write(0x21,min);
Delay_Ms(10);
_24c02_Write(0x22,sec);
break;
case 3: _24c02_Write(0x30,hour);
Delay_Ms(10);
_24c02_Write(0x31,min);
Delay_Ms(10);
_24c02_Write(0x32,sec);
break;
case 4: _24c02_Write(0x40,hour);
Delay_Ms(10);
_24c02_Write(0x41,min);
Delay_Ms(10);
_24c02_Write(0x42,sec);
break;
}
LCD_ClearLine(Line0);
LCD_ClearLine(Line1);
LCD_ClearLine(Line2);
LCD_ClearLine(Line3);
LCD_ClearLine(Line4);
LCD_ClearLine(Line5);
LCD_ClearLine(Line6);
LCD_ClearLine(Line7);
LCD_ClearLine(Line8);
LCD_ClearLine(Line9);
}
}
}else
{
key2_sum = 0;
}
// KEY3
if(KEY3 == 0)
{
key3_sum++;
if(key3_sum == 1) // 短按
{
if(system_mode == 1) // Setting 模式
{
switch(Set_Select)
{
case 0: sec++;
if(sec > 59) sec = 0;
break;
case 1: min++;
if(min > 59) min = 0;
break;
case 2: hour++;
if(hour > 23) hour = 0;
break;
}
Timer_Buf = hour * 3600 + min * 60 + sec;
}
}
if(key3_sum == 16) // 长按
{
if(system_mode == 1) // Setting 模式
{
switch(Set_Select)
{
case 0: sec++;
if(sec > 59) sec = 0;
break;
case 1: min++;
if(min > 59) min = 0;
break;
case 2: hour++;
if(hour > 23) hour = 0;
break;
}
Timer_Buf = hour * 3600 + min * 60 + sec;
key3_sum = 15;
}
}
}else
{
key3_sum = 0;
}
// KEY4
if(KEY4 == 0)
{
key4_sum++;
if(key4_sum == 1) // 短按
{
if(system_mode == 0)
{
DingShi = Timer[Channel_num];
}else
if(system_mode == 1)
{
DingShi = hour * 3600 + min * 60 + sec;
}
system_mode = 2; // Running,pause
if(system_mode == 2)
{
switch(Run_Stop)
{
case 0: Run_Stop = 1;break;
case 1: Run_Stop = 0;break;
}
}
}
if(key4_sum == 16) //长按触发
{
system_mode = 0;
DingShi = 0;
Run_Stop = 0;
}
}else
{
key4_sum = 0;
}
}
//EIGHTH//
wen shi du jian kong she bei
//MAIN.C//
#include "stm32f10x.h"
#include "lcd.h"
#include "i2c.h"
#include "IO.h"
#include "stdio.h"
u32 TimingDelay = 0;
u8 string[20];
u8 ADC_Flag = 0;
u8 RTC_Flag = 0;
u8 KEY_Flag = 0;
u8 Display_Flag = 0;
u32 TimeVal;
u8 LED_Flag = 0;
u8 hour,min,sec;
u32 RH;
u8 i;
u16 LED_MODE = 0XFFFF;
u8 Remember_Flag = 0;
u8 TH_Remember[60];
u8 RH_Remember[60];
u8 Remember_sum;
u8 Remember_number;
int Temperature;
extern u8 TIM3_Ch2_CAPTURE_MODE;
extern u32 TIM_Ch2_CAPTURE_HL;
extern u8 RXOVER ;
extern u8 RX_BUF[20];
extern u8 Set_Flag;
extern int TH_compare;
extern u8 Select_Flag;
extern u8 RH_cpmpare;
extern u16 Ceshi_Fre;
extern u8 Remember_Delay;
float ADC_Val;
void Delay_Ms(u32 nTime);
//Main Body
int main(void)
{
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
STM3210B_LCD_Init();
LCD_Clear(Blue);
LCD_SetBackColor(Blue);
LCD_SetTextColor(White);
SysTick_Config(SystemCoreClock/1000);
i2c_init();
TH_compare = _24c02_Read(0x11);
Delay_Ms(5);
RH_cpmpare = _24c02_Read(0x22);
Delay_Ms(5);
Remember_Delay = _24c02_Read(0x33);
Delay_Ms(5);
Ceshi_Fre = _24c02_Read(0x44) * 100;
Delay_Ms(5);
ADC1_Init();
TIM2_Ch2_PWM_Init(Ceshi_Fre,1);
TIM3_Ch2_CAPTURE_Init();
RTC_Init(23,59,55);
USART2_Init(9600);
LED_Init();
KEY_Init();
while(1)
{
Remember /
if(Remember_Flag)
{
LED_MODE ^= (1<<10);
TH_Remember[Remember_sum] = Temperature;
RH_Remember[Remember_sum] = RH;
Remember_sum++;
if(Remember_sum >= 60) Remember_sum = 0;
Remember_number++;
Remember_Flag = 0;
}
ADC
if(ADC_Flag)
{
ADC_Val = Get_Adc() * 3.3 / 4096;
Temperature = (80 * ADC_Val / 3.3) - 20;
ADC_Flag = 0;
}
// RTC
if(RTC_Flag)
{
TimeVal = RTC_GetCounter();
hour = TimeVal / 3600;
min = TimeVal % 3600 / 60;
sec = TimeVal % 3600 % 60;
RTC_Flag = 0;
}
/ CAPTURE
if(TIM3_Ch2_CAPTURE_MODE == 2)
{
RH = 1000000 / TIM_Ch2_CAPTURE_HL;
RH = 80 * (RH / 1000 - 1) / 9 + 10;
TIM_ITConfig(TIM3, TIM_IT_CC2, ENABLE);
TIM3_Ch2_CAPTURE_MODE = 0;
}
/ USART2
if(RXOVER)
{
for(i=0;i<20;i++)
{
string[i] = 0;
}
if(RX_BUF[0] == 'C')
{
sprintf((char*)string,"TH_C:%dC-Time:%.2d:%.2d:%.2d\r\n",TH_compare,hour,min,sec);
}
if(RX_BUF[0] == 'T')
{
sprintf((char*)string,"TH:%dC-RH:%d%%\r\n",Temperature,RH);
}
USART2_SendString(string);
for(i=0;i<20;i++)
{
RX_BUF[i] = 0;
}
USART_ITConfig( USART2, USART_IT_RXNE,ENABLE);
RXOVER = 0;
}
KEY //
if(KEY_Flag)
{
KEY_Read();
KEY_Flag = 0;
}
LED //
if(LED_Flag)
{
if(Temperature > TH_compare)
{
LED_MODE ^= (1<<8);
}else
{
LED_MODE |= (1<<8);
}
if(RH > RH_cpmpare)
{
LED_MODE ^= (1<<9);
}else
{
LED_MODE |= (1<<9);
}
GPIOC-> ODR = LED_MODE;
GPIOD-> ODR |= (1<<2);
GPIOD-> ODR &=~(1<<2);
LED_Flag = 0;
}
/// Display
if(Display_Flag)
{
if(!Set_Flag)
{
LCD_SetTextColor(White);
LCD_DisplayStringLine(Line1, (u8*)" Real Data ");
if(Temperature >= 0)
{
sprintf((char*)string," TH : %dC ",Temperature);
}else
{
sprintf((char*)string," TH :-%dC ",-Temperature);
}
LCD_DisplayStringLine(Line3, string);
sprintf((char*)string," RH : %d%% ",RH);
LCD_DisplayStringLine(Line5, string);
sprintf((char*)string," Time : %.2d:%.2d:%.2d ",hour,min,sec);
LCD_DisplayStringLine(Line7, string);
sprintf((char*)string," Remember:%d ",Remember_number);
LCD_DisplayStringLine(Line9, string);
}else
{
LCD_SetTextColor(White);
LCD_DisplayStringLine(Line1, (u8*)" Set ");
if(Select_Flag == 1)
{
LCD_SetTextColor(Green);
}else
{
LCD_SetTextColor(White);
}
if(TH_compare >= 0)
{
sprintf((char*)string," TH_compare: %dC ",TH_compare);
}else
{
sprintf((char*)string," TH_compare:-%dC ",-TH_compare);
}
LCD_DisplayStringLine(Line3, string);
if(Select_Flag == 2)
{
LCD_SetTextColor(Green);
}else
{
LCD_SetTextColor(White);
}
sprintf((char*)string," RH_compare: %d%% ",RH_cpmpare);
LCD_DisplayStringLine(Line5, string);
if(Select_Flag == 3)
{
LCD_SetTextColor(Green);
}else
{
LCD_SetTextColor(White);
}
sprintf((char*)string," Remember: %dS ",Remember_Delay);
LCD_DisplayStringLine(Line7, string);
if(Select_Flag == 4)
{
LCD_SetTextColor(Green);
}else
{
LCD_SetTextColor(White);
}
sprintf((char*)string," PWM_Fre: %.1fkHZ ",(double)Ceshi_Fre / 1000);
LCD_DisplayStringLine(Line9, string);
}
Display_Flag = 0;
}
}
}
void Delay_Ms(u32 nTime)
{
TimingDelay = nTime;
while(TimingDelay != 0);
}
//IT.C//
extern u8 ADC_Flag;
extern u8 RTC_Flag;
u8 TIM3_Ch2_CAPTURE_MODE = 0;
u32 TIM_Ch2_CAPTURE_HL = 0;
u8 RXCUNT = 0;
u8 RXOVER = 0;
u8 RX_BUF[20];
extern u8 LED_Flag;
extern u8 KEY_Flag;
extern u8 Display_Flag;
extern u8 Remember_Flag;
extern u8 Remember_Delay;
void SysTick_Handler(void)
{
static u8 key_sum = 0;
static u8 adc_sum = 0;
static u8 display_sum = 0;
static u16 remember_sum;
static u8 led_sum = 0;
TimingDelay--;
remember_sum++;
if(++led_sum == 200)
{
led_sum = 0;
LED_Flag = 1;
}
if(++adc_sum == 150)
{
adc_sum = 0;
ADC_Flag = 1;
}
if(++key_sum == 50)
{
key_sum = 0;
KEY_Flag = 1;
}
if(++display_sum == 100)
{
display_sum = 0;
Display_Flag = 1;
}
if(remember_sum / 1000 == Remember_Delay)
{
remember_sum = 0;
Remember_Flag = 1;
}
}
void RTC_IRQHandler(void)
{
if(RTC_GetITStatus(RTC_IT_SEC) == 1)
{
RTC_ClearITPendingBit(RTC_IT_SEC);
RTC_Flag = 1;
if(RTC_GetCounter() == (24 * 3600))
{
RTC_SetCounter(0x0);
RTC_WaitForLastTask();
}
}
}
void TIM3_IRQHandler(void)
{
if(TIM_GetITStatus(TIM3, TIM_IT_CC2) == 1 )
{
TIM_ClearITPendingBit(TIM3,TIM_IT_CC2);
switch(TIM3_Ch2_CAPTURE_MODE)
{
case 0: TIM_Ch2_CAPTURE_HL = 0;
TIM3_Ch2_CAPTURE_MODE = 1;
TIM_SetCounter(TIM3,0x0);
break;
case 1: TIM_Ch2_CAPTURE_HL = TIM_GetCounter(TIM3);
TIM3_Ch2_CAPTURE_MODE = 2;
TIM_ITConfig(TIM3, TIM_IT_CC2, DISABLE);
break;
}
}
}
void USART2_IRQHandler(void)
{
u16 temp;
if(USART_GetITStatus(USART2,USART_IT_RXNE) == 1)
{
USART_ClearITPendingBit( USART2, USART_IT_RXNE);
temp = USART_ReceiveData(USART2);
if(temp == '\n')
{
RXCUNT = 0;
RXOVER = 1;
USART_ITConfig( USART2, USART_IT_RXNE,DISABLE);
}else
{
RX_BUF[RXCUNT] = temp;
RXCUNT++;
}
}
}
//IO.H//
#ifndef __IO_H
#define __IO_H
#include "stm32f10x.h"
#include "i2c.h"
#include "lcd.h"
extern void Delay_Ms(u32 nTime);
#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)
void _24c02_Write(u8 address,u8 data);
u8 _24c02_Read(u8 address);
void ADC1_Init(void);
u16 Get_Adc(void);
void TIM2_Ch2_PWM_Init(u16 fre,u8 status);
void RTC_Init(u8 HH,u8 MM,u8 SS);
void TIM3_Ch2_CAPTURE_Init(void);
void USART2_Init(u32 bound);
void USART2_SendString(u8 *str);
void LED_Init(void);
void KEY_Init(void);
void KEY_Read(void);
#endif
//IO.C//
#include "IO.h"
extern u16 LED_MODE;
u8 Set_Flag = 0;
u8 Select_Flag = 1;
int TH_compare = 40;
u8 RH_cpmpare = 80;
u8 Remember_Delay = 1;
u16 Ceshi_Fre = 1000;
/// 24c02 //
//根据iic协议编写读写程序
void _24c02_Write(u8 address,u8 data)
{
I2CStart();
I2CSendByte(0xa0);
I2CWaitAck();
I2CSendByte(address);
I2CWaitAck();
I2CSendByte(data);
I2CWaitAck();
I2CStop();
}
u8 _24c02_Read(u8 address)
{
u8 temp;
I2CStart();
I2CSendByte(0xa0);
I2CWaitAck();
I2CSendByte(address);
I2CWaitAck();
I2CStart();
I2CSendByte(0xa1);
I2CWaitAck();
temp = I2CReceiveByte();
I2CWaitAck();
I2CStop();
return temp;
}
ADC //
void ADC1_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
ADC_InitTypeDef ADC_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_ADC1, ENABLE);
RCC_ADCCLKConfig(RCC_PCLK2_Div6);//对ADC时钟进行6分频
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;//ADC端口为PB0
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;//端口设置为模拟输入
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;//只用一个ADC,设置为独立模式
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;//转换通道为1
ADC_Init( ADC1, &ADC_InitStructure);
ADC_Cmd( ADC1, ENABLE);//打开ADC开始转换
ADC_ResetCalibration(ADC1);//初始化校表寄存器
while(ADC_GetResetCalibrationStatus(ADC1));//等待校表完成
ADC_StartCalibration(ADC1);//ADC开始校准
while(ADC_GetCalibrationStatus(ADC1));//等待校准完成
}
u16 Get_Adc(void)//ADC读取函数
{
u16 temp;//设置存储变量
ADC_RegularChannelConfig(ADC1,ADC_Channel_8, 1,ADC_SampleTime_239Cycles5);//配置ADC通道转换顺序1,第一个转换,通道为8,采样周期239.5个时钟周期
ADC_SoftwareStartConvCmd(ADC1, ENABLE);//使能软件触发
while(ADC_GetFlagStatus(ADC1,ADC_FLAG_EOC) == 0);//等待转换完成
temp = ADC_GetConversionValue(ADC1);//将数据存到变量中
ADC_SoftwareStartConvCmd(ADC1, DISABLE);//关闭软件触发
return temp;//返回数据
}
/ PA1_PWM_Out
void TIM2_Ch2_PWM_Init(u16 fre,u8 status)
{
u16 TIM2_Val;
GPIO_InitTypeDef GPIO_InitStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
if(status)
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);//使能TIM2时钟
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);
}
时基设置
TIM2_Val = 1000000 / fre;//计算频率对应的计数值
TIM_TimeBaseInitStructure.TIM_Period = TIM2_Val - 1;//定时器周期
TIM_TimeBaseInitStructure.TIM_Prescaler = 71;//设置72分频后1M,所以每个时钟周期为1us
TIM_TimeBaseInitStructure.TIM_ClockDivision = 0x0;//时钟分频因子,配置死区时间需要用,这里分频
TIM_TimeBaseInitStructure.TIM_CounterMode = 0x0;//计数器模式,向上计数
TIM_TimeBaseInit(TIM2,&TIM_TimeBaseInitStructure);
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2;//PWM2模式
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;//低极性输出
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;//输出使能
TIM_OCInitStructure.TIM_Pulse = (TIM2_Val - 2) * 0.5;//反转电平值
TIM_OC2Init(TIM2, &TIM_OCInitStructure);
if(status)
{
TIM_Cmd( TIM2, ENABLE);//使能TIM2
}
}
/// RTC ///
void RTC_Init(u8 HH,u8 MM,u8 SS)
{
NVIC_InitTypeDef NVIC_InitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_BKP | RCC_APB1Periph_PWR, ENABLE);
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);
PWR_BackupAccessCmd(ENABLE);
BKP_DeInit();
RCC_LSICmd(ENABLE);
while(RCC_GetFlagStatus(RCC_FLAG_LSIRDY) == 0);
RCC_RTCCLKConfig(RCC_RTCCLKSource_LSI);
RCC_RTCCLKCmd(ENABLE);
RTC_ITConfig(RTC_IT_SEC, ENABLE);
RTC_WaitForLastTask();
RTC_WaitForSynchro();
RTC_WaitForLastTask();
RTC_SetPrescaler(40000 - 1);
RTC_WaitForLastTask();
RTC_SetCounter(HH * 3600 + MM * 60 + SS);
RTC_WaitForLastTask();
}
CAPTURE 输入捕获
void TIM3_Ch2_CAPTURE_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
TIM_ICInitTypeDef TIM_ICInitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
//跟比较模式一样,我们把计数值设置到最大,同时71分频
TIM_TimeBaseInitStructure.TIM_Period = 0xffff;
TIM_TimeBaseInitStructure.TIM_Prescaler = 71;
TIM_TimeBaseInitStructure.TIM_ClockDivision = 0x0;
TIM_TimeBaseInitStructure.TIM_CounterMode = 0x0;
TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitStructure);
//输入捕获结构体
TIM_ICInitStructure.TIM_Channel = TIM_Channel_2;//配置捕获通道
TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI;//输入通道和捕获通道的映射关系,直连和非直连
TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;//输入需要被捕获的信号的分频系数
TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;//输入捕获信号的极性配置
TIM_ICInitStructure.TIM_ICFilter = 0x0;//输入捕获的滤波系数
TIM_ICInit(TIM3,&TIM_ICInitStructure);
TIM_Cmd(TIM3,ENABLE);//启动TIM3
TIM_ITConfig(TIM3, TIM_IT_CC2, ENABLE);//开启更新和捕获中断
}
/ USART2 ///
void USART2_Init(u32 bound)
{
GPIO_InitTypeDef GPIO_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
USART_InitTypeDef USART_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);//能位于APB1总线上的USART2时钟
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;//TX发射端为PA2
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;//配置为复用输出模式
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;//RX为接收端PA3
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//配置为浮空输入
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn;//开启串口2中断,在stm32f10x.h中查找
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;//抢占优先级
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;//子优先级
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
USART_InitStructure.USART_BaudRate = bound;//设置波特率为9600
USART_InitStructure.USART_WordLength = USART_WordLength_8b;//8位数据
USART_InitStructure.USART_StopBits = USART_StopBits_1;//1位停止位
USART_InitStructure.USART_Parity = USART_Parity_No;//无校验位
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;//使能发送和接收
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//不使能硬件流控制
USART_Init(USART2, &USART_InitStructure);
USART_Cmd(USART2,ENABLE);//开启USART2
USART_ITConfig( USART2, USART_IT_RXNE,ENABLE);//使能接收中断
}
void USART2_SendString(u8 *str)//发送字符串函数
{
u8 index = 0;
do
{
USART_SendData(USART2,str[index]);//一位一位发送
while(USART_GetFlagStatus(USART2, USART_FLAG_TXE) == 0);//发送是否完成
index++;
}while(str[index] != 0);
}
/// LED
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_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOD, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = 0XFF00;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOC, &GPIO_InitStructure);
GPIOC-> ODR = 0XFFFF;
GPIOD-> ODR |= (1<<2);
GPIOD-> ODR &=~(1<<2);
}
KEY /
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_IPU;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_2;
GPIO_Init(GPIOB, &GPIO_InitStructure);
}
void KEY_Read(void)
{
static u16 key1_sum,key2_sum,key3_sum,key4_sum;
//KEY1
if(KEY1 == 0)
{
key1_sum++;
if(key1_sum == 1)
{
Set_Flag ^= 1;
if(!Set_Flag)
{
_24c02_Write(0x11,TH_compare);
Delay_Ms(4);
_24c02_Write(0x22,RH_cpmpare);
Delay_Ms(4);
_24c02_Write(0x33,Remember_Delay);
Delay_Ms(4);
_24c02_Write(0x44,Ceshi_Fre / 100);
Delay_Ms(4);
}
LCD_ClearLine(Line0);
LCD_ClearLine(Line1);
LCD_ClearLine(Line2);
LCD_ClearLine(Line3);
LCD_ClearLine(Line4);
LCD_ClearLine(Line5);
LCD_ClearLine(Line6);
LCD_ClearLine(Line7);
LCD_ClearLine(Line8);
LCD_ClearLine(Line9);
}
}else
{
key1_sum = 0;
}
//KEY2
if((KEY2 == 0) && Set_Flag)
{
key2_sum++;
if(key2_sum == 1)
{
Select_Flag++;
if(Select_Flag > 4) Select_Flag = 1;
}
}else
{
key2_sum = 0;
}
//KEY3
if((KEY3 == 0) && Set_Flag)
{
key3_sum++;
if(key3_sum == 1)
{
switch(Select_Flag)
{
case 1: TH_compare++;
if(TH_compare > 60) TH_compare = 60;
break;
case 2: RH_cpmpare += 5;
if(RH_cpmpare > 90) RH_cpmpare = 90;
break;
case 3: Remember_Delay++;
if(Remember_Delay > 5) Remember_Delay = 5;
break;
case 4: Ceshi_Fre += 500;
if(Ceshi_Fre > 10000) Ceshi_Fre = 10000;
TIM2_Ch2_PWM_Init(Ceshi_Fre,0);
break;
}
}
}else
{
key3_sum = 0;
}
//KEY4
if((KEY4 == 0) && Set_Flag)
{
key4_sum++;
if(key4_sum == 1)
{
switch(Select_Flag)
{
case 1: TH_compare--;
if(TH_compare < -20) TH_compare = -20;
break;
case 2: RH_cpmpare -= 5;
if(RH_cpmpare < 10) RH_cpmpare = 10;
break;
case 3: Remember_Delay--;
if(Remember_Delay < 1) Remember_Delay = 1;
break;
case 4: Ceshi_Fre -= 500;
if(Ceshi_Fre < 1000) Ceshi_Fre = 1000;
TIM2_Ch2_PWM_Init(Ceshi_Fre,0);
break;
}
}
}else
{
key4_sum = 0;
}
}
//SEVENTH-ONE//
dian ya ce liang jian kong she bei
//MAIN.C//
#include "stm32f10x.h"
#include "lcd.h"
#include "IO.h"
#include "stdio.h"
#include "i2c.h"
u32 TimingDelay = 0;
u8 string[20];
u8 RXCUNT = 0;
u8 RXOVER = 0;
u8 RXBUF[20] = {0};
u8 RTC_flag = 0;
u32 TimeVal;
u8 key_read_flag = 0;
u8 _200ms_flag = 0;
float ADC_val;
float k;
u8 i;
extern u16 LED_MODE;
extern u8 B1_ALA_Flag;
extern u8 B2_Set_Flag;
extern u8 ALA_hour,ALA_min,ALA_sec;
void Delay_Ms(u32 nTime);
//Main Body
int main(void)
{
u8 hour,min,sec;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
STM3210B_LCD_Init();
LCD_Clear(Blue);
LCD_SetBackColor(Blue);
LCD_SetTextColor(White);
SysTick_Config(SystemCoreClock/1000);
i2c_init();
USART2_Init(9600);
RTC_Init(23,59,55);
ADC1_Init();
LED_Init();
KEY_Init();
k = _24c02_Read(0xaa) / 10.0;
while(1)
{
if(RXOVER == 1) //串口接收
{
RXOVER = 0;
// USART2_SendString(RXBUF);
if(((RXBUF[3] - 0x30) >= 1) && ((RXBUF[3] - 0x30) <= 9))
{
k = (RXBUF[3] - 0x30) / 10.0;
_24c02_Write(0xaa,RXBUF[3] - 0x30);
USART2_SendString((u8*)"OK\n");
}
for(i=0;i<20;i++)
{
RXBUF[i] = 0;
}
USART_ITConfig(USART2,USART_IT_RXNE,ENABLE);
}
if(RTC_flag == 1) //RTC
{
RTC_flag = 0;
TimeVal = RTC_GetCounter();
hour = TimeVal / 3600;
min = TimeVal % 3600 / 60;
sec = TimeVal % 3600 % 60;
if(TimeVal == (ALA_hour * 3600 + ALA_min * 60 + ALA_sec))
{
for(i=0;i<20;i++)
{
string[i] = 0;
}
sprintf((char*)string,"%.2f+%.1f+%.2d%.2d%.2d\n",ADC_val,k,ALA_hour,ALA_min,ALA_sec);
USART2_SendString(string);
}
}
if(key_read_flag == 1) // KEY
{
KEY_Read();
key_read_flag = 0;
}
if(!B2_Set_Flag)
{
sprintf((char*)string," V1 : %.2f ",ADC_val);
LCD_DisplayStringLine(Line3, string);
sprintf((char*)string," k : %.1f ",k);
LCD_DisplayStringLine(Line4, string);
if(B1_ALA_Flag)
{
LCD_DisplayStringLine(Line5,(u8*)" LED : ON ");
}else
{
LCD_DisplayStringLine(Line5,(u8*)" LED : OFF ");
}
sprintf((char*)string," T : %.2d-%.2d-%.2d ",hour,min,sec);
LCD_DisplayStringLine(Line6, string);
sprintf((char*)string," %d",1);
LCD_DisplayStringLine(Line9, string);
}else
{
LCD_DisplayStringLine(Line3,(u8*)" setting ");
sprintf((char*)string," %.2d-%.2d-%.2d ",ALA_hour,ALA_min,ALA_sec);
LCD_DisplayStringLine(Line6, string);
sprintf((char*)string," %d",2);
LCD_DisplayStringLine(Line9, string);
}
ADC_val = Get_Adc() * 3.3 / 4096;
if((ADC_val > (3.3 * k)) && (B1_ALA_Flag) && (_200ms_flag)) // LED alarm
{
_200ms_flag = 0;
LED_MODE ^= (1<<8);
GPIOC->ODR = LED_MODE;
GPIOD->ODR |= (1<<2);
GPIOD->ODR &=~(1<<2);
}else
{
LED_MODE |= (1<<8);
GPIOC->ODR = LED_MODE;
GPIOD->ODR |= (1<<2);
GPIOD->ODR &=~(1<<2);
}
}
}
//
void Delay_Ms(u32 nTime)
{
TimingDelay = nTime;
while(TimingDelay != 0);
}
//IT.C//
void USART2_IRQHandler(void)
{
u8 temp = 0;
if(USART_GetITStatus(USART2, USART_IT_RXNE) == 1)
{
USART_ClearITPendingBit(USART2,USART_IT_RXNE);
temp = USART_ReceiveData(USART2);
if(temp == '\n')
{
RXCUNT = 0;
RXOVER = 1;
USART_ITConfig(USART2, USART_IT_RXNE, DISABLE);
}else
{
RXBUF[RXCUNT] = temp;
RXCUNT++;
}
}
}
void RTC_IRQHandler(void)
{
u32 counter;
if(RTC_GetITStatus(RTC_IT_SEC) == 1)
{
RTC_ClearITPendingBit(RTC_IT_SEC);
RTC_flag = 1;
RTC_WaitForLastTask();
counter = RTC_GetCounter();
RTC_WaitForLastTask();
if(counter == (23 * 3600 + 59 * 60 + 59))
{
RTC_SetCounter(0x0);
RTC_WaitForLastTask();
}
}
}
void SysTick_Handler(void)
{
static u8 key_sum = 0;
static u8 _200ms_sum = 0;
TimingDelay--;
if(++key_sum == 50) //50ms
{
key_sum = 0;
key_read_flag = 1;
}
if(++_200ms_sum == 200) // 200ms
{
_200ms_sum = 0;
_200ms_flag = 1;
}
}
//IO.H//
#ifndef __IO_H
#define __IO_H
#include "stm32f10x.h"
#include "i2c.h"
#include "lcd.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)
void USART2_Init(u32 bound);
void USART2_SendString(u8 *str);
void RTC_Init(u8 HH,u8 MM,u8 SS);
void _24c02_Write(u8 address,u8 dat);
u8 _24c02_Read(u8 address);
void ADC1_Init(void);
u16 Get_Adc(void);
void LED_Init(void);
void KEY_Init(void);
void KEY_Read(void);
#endif
//IO.C//
#include "IO.h"
u16 LED_MODE = 0XFFFF;
u8 B1_ALA_Flag = 1; //复位默认打开
u8 B2_Set_Flag = 0; //默认界面1
u8 ALA_hour = 0,ALA_min = 0,ALA_sec = 0;
u8 B3_Select_Flag = 0;
// 串口部分 ///
void USART2_Init(u32 bound)
{
GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
USART_InitStructure.USART_BaudRate = bound;
USART_InitStructure.USART_WordLength = USART_WordLength_8b;
USART_InitStructure.USART_StopBits = USART_StopBits_1;
USART_InitStructure.USART_Parity = USART_Parity_No;
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
USART_Init(USART2, &USART_InitStructure);
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);
USART_Cmd(USART2, ENABLE);
USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);
}
void USART2_SendString(u8 *str)
{
u8 index = 0;
do
{
USART_SendData(USART2, str[index]);
while(USART_GetFlagStatus(USART2, USART_FLAG_TXE) == 0);
index++;
}while(str[index] != 0);
}
/ RTC部分 ///
void RTC_Init(u8 HH,u8 MM,u8 SS)
{
NVIC_InitTypeDef NVIC_InitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_BKP | RCC_APB1Periph_PWR,ENABLE);
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);
PWR_BackupAccessCmd(ENABLE);
BKP_DeInit();
RCC_LSICmd(ENABLE);
while(RCC_GetFlagStatus(RCC_FLAG_LSIRDY) == 0);
RCC_RTCCLKConfig(RCC_RTCCLKSource_LSI);
RCC_RTCCLKCmd(ENABLE);
RTC_WaitForSynchro();
RTC_WaitForLastTask();
RTC_ITConfig(RTC_IT_SEC,ENABLE);
RTC_WaitForLastTask();
RTC_SetPrescaler(40000 - 1);
RTC_WaitForLastTask();
RTC_SetCounter(HH * 3600 + MM * 60 + SS);
RTC_WaitForLastTask();
}
// ADC 部分
void ADC1_Init(void)
{
ADC_InitTypeDef ADC_InitStructure;
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_ADC1, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
RCC_ADCCLKConfig(RCC_PCLK2_Div6);
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);
ADC_ResetCalibration(ADC1);
while(ADC_GetResetCalibrationStatus(ADC1));
ADC_StartCalibration(ADC1);
while(ADC_GetCalibrationStatus(ADC1));
}
u16 Get_Adc(void)
{
ADC_RegularChannelConfig( ADC1, ADC_Channel_8, 1, ADC_SampleTime_239Cycles5);
ADC_SoftwareStartConvCmd(ADC1,ENABLE);
while(ADC_GetFlagStatus( ADC1, ADC_FLAG_EOC) == 0);
return ADC_GetConversionValue(ADC1);
}
// 24c02 部分//
void _24c02_Write(u8 address,u8 dat)
{
I2CStart();
I2CSendByte(0xa0);
I2CWaitAck();
I2CSendByte(address);
I2CWaitAck();
I2CSendByte(dat);
I2CWaitAck();
I2CStop();
}
u8 _24c02_Read(u8 address)
{
u8 dat;
I2CStart();
I2CSendByte(0xa0);
I2CWaitAck();
I2CSendByte(address);
I2CWaitAck();
I2CStart();
I2CSendByte(0xa1);
I2CWaitAck();
dat = I2CReceiveByte();
I2CWaitAck();
I2CStop();
return dat;
}
// LED 部分
void LED_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = 0xff00;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOC, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
GPIO_Init(GPIOD, &GPIO_InitStructure);
GPIOC->ODR = LED_MODE;
GPIOD->ODR |= (1<<2);
GPIOD->ODR &=~(1<<2);
}
// 按键部分 /
void KEY_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_8;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_2;
GPIO_Init(GPIOB, &GPIO_InitStructure);
}
void KEY_Read(void)
{
static u16 key1_sum = 0,key2_sum = 0,key3_sum = 0,key4_sum = 0;
if(KEY1 == 0)
{
key1_sum++;
if(key1_sum == 1)
{
B1_ALA_Flag ^= 1;
}
}else
{
key1_sum = 0;
}
if(KEY2 == 0)
{
key2_sum++;
if(key2_sum == 1)
{
B2_Set_Flag ^= 1;
LCD_ClearLine(Line0);
LCD_ClearLine(Line1);
LCD_ClearLine(Line2);
LCD_ClearLine(Line3);
LCD_ClearLine(Line4);
LCD_ClearLine(Line5);
LCD_ClearLine(Line6);
LCD_ClearLine(Line7);
LCD_ClearLine(Line8);
LCD_ClearLine(Line9);
}
}else
{
key2_sum = 0;
}
if(KEY3 == 0)
{
key3_sum++;
if((key3_sum == 1) && B2_Set_Flag)
{
B3_Select_Flag++;
if(B3_Select_Flag > 2)
{
B3_Select_Flag = 0;
}
}
}else
{
key3_sum = 0;
}
if(KEY4 == 0)
{
key4_sum++;
if((key4_sum == 1) && B2_Set_Flag)
{
if(B3_Select_Flag == 0)
{
ALA_hour++;
if(ALA_hour >= 24) ALA_hour = 0;
}else
if(B3_Select_Flag == 1)
{
ALA_min++;
if(ALA_min >= 60) ALA_min = 0;
}else
if(B3_Select_Flag == 2)
{
ALA_sec++;
if(ALA_sec >= 60) ALA_sec = 0;
}
}
}else
{
key4_sum = 0;
}
}
//SEVENTH-TWO//
mo ni ye wei jian ce jing gao xi tong
//MAIN.C//
#include "stm32f10x.h"
#include "lcd.h"
#include "i2c.h"
#include "IO.h"
#include "stdio.h"
u32 TimingDelay = 0;
u8 string[20];
u8 ADC_Flag = 0;
u8 KEY_Flag = 0;
u8 LED_Flag = 0;
u8 Display_Flag = 0;
u8 Level_Last = 0;
u8 Shan2_sum = 0;
u8 Shan3_sum = 0;
float ADC_Val;
u8 Height;
u8 Threshold1 = 30;
u8 Threshold2 = 50;
u8 Threshold3 = 70;
u8 Level = 0;
u16 LED_MODE = 0XFFFF;
extern u8 RXCUNT;
extern u8 RXOVER;
extern u8 RX_BUF[20];
extern u8 Set_Flag;
extern u8 Threshold_Flag;
void Delay_Ms(u32 nTime);
//Main Body
int main(void)
{
u8 i;
u8 LD1_Flag = 0;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
STM3210B_LCD_Init();
LCD_Clear(Blue);
LCD_SetBackColor(Blue);
LCD_SetTextColor(White);
SysTick_Config(SystemCoreClock/1000);
i2c_init();
ADC1_Init();
USART2_Init(9600);
LED_Init();
KEY_Init();
Threshold1 = _24c02_Read(0x00);
Delay_Ms(5);
Threshold2 = _24c02_Read(0x01);
Delay_Ms(5);
Threshold3 = _24c02_Read(0x02);
Delay_Ms(5);
while(1)
{
// sprintf(string," %.2f ",ADC_Val);
// LCD_DisplayStringLine(Line3, string);
/// ADC /
if(ADC_Flag)
{
ADC_Val = Get_Adc() * 3.3 / 4096.0;
Height = 100 * ADC_Val / 3.3;
if(Height <= Threshold1)
{
Level = 0;
}else
if((Height > Threshold1) && (Height <= Threshold2))
{
Level = 1;
}else
if((Height > Threshold2) && (Height <= Threshold3))
{
Level = 2;
}else
if(Height > Threshold3)
{
Level = 3;
}
ADC_Flag = 0;
}
/// USART2 //
if(RXOVER)
{
Shan3_sum = 10;
if(RX_BUF[0] == 'C')
{
for(i = 0;i < 20;i++)
{
string[i] = 0;
}
sprintf((char*)string,"C:H%d+L%d\r\n",Height,Level);
USART2_SendString(string);
}
if(RX_BUF[0] == 'S')
{
for(i = 0;i < 20;i++)
{
string[i] = 0;
}
sprintf((char*)string,"S:TL%d+TM%d+TH%d\r\n",Threshold1,Threshold2,Threshold3);
USART2_SendString(string);
}
for(i = 0;i < 20;i++)
{
RX_BUF[i] = 0;
}
USART_ITConfig(USART2,USART_IT_RXNE, ENABLE);
RXOVER = 0;
}
/// KEY /
if(KEY_Flag)
{
KEY_Read();
KEY_Flag = 0;
}
/// LED //
if(LED_Flag) // 100ms
{
LD1_Flag++;
if(LD1_Flag == 10)
{
LD1_Flag = 0;
LED_MODE ^= (1<<8);
}
if(Level_Last != Level)
{
Shan2_sum = 10;
if(Level > Level_Last)
{
for(i = 0;i < 20;i++)
{
string[i] = 0;
}
sprintf((char*)string,"A:H%d+L%d+U\r\n",Height,Level);
USART2_SendString(string);
}else
if(Level < Level_Last)
{
for(i = 0;i < 20;i++)
{
string[i] = 0;
}
sprintf((char*)string,"A:H%d+L%d+D\r\n",Height,Level);
USART2_SendString(string);
}
Level_Last = Level;
}
if(!(LD1_Flag % 2)) // 200ms
{
if(Shan2_sum)
{
LED_MODE ^= (1<<9);
Shan2_sum--;
}
if(Shan3_sum)
{
LED_MODE ^= (1<<10);
Shan3_sum--;
}
}
GPIOC-> ODR = LED_MODE;
GPIOD-> ODR |= (1<<2);
GPIOD-> ODR &=~(1<<2);
LED_Flag = 0;
}
/// Display //
if(Display_Flag)
{
if(!Set_Flag)
{
LCD_SetTextColor(White);
LCD_DisplayStringLine(Line1, (u8*)" Liquid Level ");
sprintf((char*)string," Height : %dcm ",Height);
LCD_DisplayStringLine(Line3, string);
sprintf((char*)string," ADC : %.2fV ",ADC_Val);
LCD_DisplayStringLine(Line5, string);
sprintf((char*)string," Level : %d ",Level);
LCD_DisplayStringLine(Line7, string);
}else
{
LCD_SetTextColor(White);
LCD_DisplayStringLine(Line1, (u8*)" Parameter Setup ");
if(Threshold_Flag == 1)
{
LCD_SetTextColor(Green);
}else
{
LCD_SetTextColor(White);
}
sprintf((char*)string," Threshold 1 : %dcm ",Threshold1);
LCD_DisplayStringLine(Line3, string);
if(Threshold_Flag == 2)
{
LCD_SetTextColor(Green);
}else
{
LCD_SetTextColor(White);
}
sprintf((char*)string," Threshold 2 : %dcm ",Threshold2);
LCD_DisplayStringLine(Line5, string);
if(Threshold_Flag == 3)
{
LCD_SetTextColor(Green);
}else
{
LCD_SetTextColor(White);
}
sprintf((char*)string," Threshold 3 : %dcm ",Threshold3);
LCD_DisplayStringLine(Line7, string);
}
Display_Flag = 0;
}
}
}
//
void Delay_Ms(u32 nTime)
{
TimingDelay = nTime;
while(TimingDelay != 0);
}
//IT.C//
extern u8 ADC_Flag;
u8 RXCUNT = 0;
u8 RXOVER = 0;
u8 RX_BUF[20];
extern u8 Display_Flag;
extern u8 KEY_Flag;
extern u8 LED_Flag;
void SysTick_Handler(void)
{
static u16 adc_sum = 0;
static u8 key_sum = 0;
static u8 display_sum = 0;
static u8 led_sum = 0;
TimingDelay--;
if(++adc_sum == 1000)
{
adc_sum = 0;
ADC_Flag = 1;
}
if(++key_sum == 50)
{
key_sum = 0;
KEY_Flag = 1;
}
if(++display_sum == 100)
{
display_sum = 0;
Display_Flag = 1;
}
if(++led_sum == 100)
{
led_sum = 0;
LED_Flag = 1;
}
}
void USART2_IRQHandler(void)
{
u16 temp;
if(USART_GetITStatus(USART2, USART_IT_RXNE) == 1)
{
USART_ClearITPendingBit( USART2, USART_IT_RXNE);
temp = USART_ReceiveData(USART2);
if(temp == '\n')
{
RXCUNT = 0;
RXOVER = 1;
USART_ITConfig(USART2,USART_IT_RXNE, DISABLE);
}else
{
RX_BUF[RXCUNT] = temp;
RXCUNT++;
}
}
}
//IO.H//
#ifndef __IO_H
#define __IO_H
#include "stm32f10x.h"
#include "i2c.h"
#include "lcd.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)
void _24c02_Write(u8 address,u8 data);
u8 _24c02_Read(u8 address);
void ADC1_Init(void);
u16 Get_Adc(void);
void USART2_Init(u32 bound);
void USART2_SendString(u8 *str);
void LED_Init(void);
void KEY_Init(void);
void KEY_Read(void);
extern void Delay_Ms(u32 nTime);
#endif
//IO.C//
#include "IO.h"
extern u16 LED_MODE;
u8 Set_Flag = 0;
u8 Threshold_Flag = 1;
extern u8 Threshold1;
extern u8 Threshold2;
extern u8 Threshold3;
/// 24c02 ///
void _24c02_Write(u8 address,u8 data)
{
I2CStart();
I2CSendByte(0xa0);
I2CWaitAck();
I2CSendByte(address);
I2CWaitAck();
I2CSendByte(data);
I2CWaitAck();
I2CStop();
}
u8 _24c02_Read(u8 address)
{
u8 temp;
I2CStart();
I2CSendByte(0xa0);
I2CWaitAck();
I2CSendByte(address);
I2CWaitAck();
I2CStart();
I2CSendByte(0xa1);
I2CWaitAck();
temp = I2CReceiveByte();
I2CWaitAck();
I2CStop();
return temp;
}
ADC ///
void ADC1_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
ADC_InitTypeDef ADC_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_ADC1, ENABLE);
RCC_ADCCLKConfig(RCC_PCLK2_Div6);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
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);
ADC_ResetCalibration( ADC1);
while(ADC_GetResetCalibrationStatus(ADC1));
ADC_StartCalibration(ADC1);
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;
}
/// USART2 ///
void USART2_Init(u32 bound)
{
GPIO_InitTypeDef GPIO_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
USART_InitTypeDef USART_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init( GPIOA, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init( GPIOA, &GPIO_InitStructure);
NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
USART_InitStructure.USART_BaudRate = bound;
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
USART_InitStructure.USART_Parity = USART_Parity_No;
USART_InitStructure.USART_StopBits = USART_StopBits_1;
USART_InitStructure.USART_WordLength = USART_WordLength_8b;
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
USART_Init(USART2, &USART_InitStructure);
USART_Cmd(USART2, ENABLE);
USART_ITConfig(USART2,USART_IT_RXNE, ENABLE);
}
void USART2_SendString(u8 *str)
{
u8 index = 0;
do
{
USART_SendData(USART2, str[index]);
while(USART_GetFlagStatus( USART2,USART_FLAG_TXE) == 0);
index++;
}while(str[index] != 0);
}
LED /
void LED_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD | RCC_APB2Periph_GPIOC, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init( GPIOD, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = 0XFF00;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init( GPIOC, &GPIO_InitStructure);
GPIOC-> ODR = 0XFFFF;
GPIOD-> ODR |= (1<<2);
GPIOD-> ODR &=~(1<<2);
}
// KEY //
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_IPU;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init( GPIOA, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_2;
GPIO_Init( GPIOB, &GPIO_InitStructure);
}
void KEY_Read(void)
{
static u16 key1_sum,key2_sum,key3_sum,key4_sum;
// KEY1
if(KEY1 == 0)
{
key1_sum++;
if(key1_sum == 1)
{
Set_Flag ^= 1;
LCD_ClearLine(Line0);
LCD_ClearLine(Line1);
LCD_ClearLine(Line2);
LCD_ClearLine(Line3);
LCD_ClearLine(Line4);
LCD_ClearLine(Line5);
LCD_ClearLine(Line6);
LCD_ClearLine(Line7);
LCD_ClearLine(Line8);
LCD_ClearLine(Line9);
}
}else
{
key1_sum = 0;
}
// KEY2
if((KEY2 == 0) && Set_Flag)
{
key2_sum++;
if(key2_sum == 1)
{
Threshold_Flag++;
if(Threshold_Flag >= 4) Threshold_Flag = 1;
}
}else
{
key2_sum = 0;
}
// KEY3
if((KEY3 == 0) && Set_Flag)
{
key3_sum++;
if(key3_sum == 1)
{
if(Threshold_Flag == 1)
{
Threshold1 += 5;
}
if(Threshold_Flag == 2)
{
Threshold2 += 5;
}
if(Threshold_Flag == 3)
{
Threshold3 += 5;
}
if(Threshold1 > 95) Threshold1 = 95;
if(Threshold2 > 95) Threshold2 = 95;
if(Threshold3 > 95) Threshold3 = 95;
_24c02_Write(0x00,Threshold1);
Delay_Ms(5);
_24c02_Write(0x01,Threshold2);
Delay_Ms(5);
_24c02_Write(0x02,Threshold3);
Delay_Ms(5);
}
}else
{
key3_sum = 0;
}
// KEY4
if((KEY4 == 0) && Set_Flag)
{
key4_sum++;
if(key4_sum == 1)
{
if(Threshold_Flag == 1)
{
Threshold1 -= 5;
}
if(Threshold_Flag == 2)
{
Threshold2 -= 5;
}
if(Threshold_Flag == 3)
{
Threshold3 -= 5;
}
if(Threshold1 < 5) Threshold1 = 5;
if(Threshold2 < 5) Threshold2 = 5;
if(Threshold3 < 5) Threshold3 = 5;
_24c02_Write(0x00,Threshold1);
Delay_Ms(5);
_24c02_Write(0x01,Threshold2);
Delay_Ms(5);
_24c02_Write(0x02,Threshold3);
Delay_Ms(5);
}
}else
{
key4_sum = 0;
}
}
//SIXTH//
shuang tong dao fang bo pin lv jian ce yu bei pin shu chu
//MAIN.C//
#include "stm32f10x.h"
#include "lcd.h"
#include "IO.h"
#include "stdio.h"
#include "i2c.h"
u32 TimingDelay = 0;
extern u16 TIM3_Ch1_Val;
extern u16 TIM3_Ch2_Val;
extern u16 LED_MODE;
extern u8 Channal_1_N;
extern u8 Channal_2_N;
extern u8 Channal_Flag;
extern u8 Set_Flag;
u16 capture;
u32 TIM2_CH2_CAPTURE_HL = 0;
u8 TIM2_CH2_CAPTURE_MODE = 0;
u32 TIM2_CH3_CAPTURE_HL = 0;
u8 TIM2_CH3_CAPTURE_MODE = 0;
u8 Channal_1_Enable = 1;
u8 Channal_2_Enable = 1;
u32 Channal_1_Frequency;
u32 Channal_2_Frequency;
u8 CAPTURE_Flag = 0;
u8 KEY_Flag = 0;
u8 OUTPUT_Flag = 0;
u8 Display_Flag = 0;
u8 string[20];
u8 LED_Flag = 0;
u8 RXCUNT = 0;
u8 RXOVER = 0;
u8 RX_BUF[20];
u8 i;
void Delay_Ms(u32 nTime);
//Main Body
int main(void)
{
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
STM3210B_LCD_Init();
LCD_Clear(Blue);
LCD_SetBackColor(Blue);
LCD_SetTextColor(White);
SysTick_Config(SystemCoreClock/1000);
i2c_init();
Channal_1_N = _24c02_Read(0x01);
Delay_Ms(10);
Channal_2_N = _24c02_Read(0x11);
TIM3_OUTPUT_Init(5000,10000,1,1,1);
TIM2_CAPTURE_Init();
KEY_Init();
LED_Init();
TIM1_PWM_Init();
USART2_Init(9600);
while(1)
{
/// 按键
if(KEY_Flag)
{
KEY_Read();
KEY_Flag = 0;
}
/// 捕获读取
if(TIM2_CH2_CAPTURE_MODE == 2)
{
Channal_1_Frequency = 1000000 / TIM2_CH2_CAPTURE_HL;
if((Channal_1_Frequency < 50) || (Channal_1_Frequency > 50000))
{
Channal_1_Enable = 0;
}else
{
Channal_1_Enable = 1;
}
TIM2_CH2_CAPTURE_MODE = 0;
}
if(TIM2_CH3_CAPTURE_MODE == 2)
{
Channal_2_Frequency = 1000000 / TIM2_CH3_CAPTURE_HL;
if((Channal_2_Frequency < 50) || (Channal_2_Frequency > 50000))
{
Channal_2_Enable = 0;
}else
{
Channal_2_Enable = 1;
}
TIM2_CH3_CAPTURE_MODE = 0;
}
/// 输出改变
if(OUTPUT_Flag)
{
TIM3_OUTPUT_Init(Channal_1_Frequency * Channal_1_N,Channal_2_Frequency * Channal_2_N,0,Channal_1_Enable,Channal_2_Enable);
OUTPUT_Flag = 0;
}
/// LCD显示
if(Display_Flag)
{
sprintf((char*)string," Channel(1):%dHZ ",Channal_1_Frequency);
LCD_DisplayStringLine(Line2, string);
sprintf((char*)string," N(1):%d ",Channal_1_N);
LCD_DisplayStringLine(Line3, string);
sprintf((char*)string," Channel(2):%dHZ ",Channal_2_Frequency);
LCD_DisplayStringLine(Line4, string);
sprintf((char*)string," N(2):%d ",Channal_2_N);
LCD_DisplayStringLine(Line5, string);
sprintf((char*)string," %d ",Channal_Flag + 1);
LCD_DisplayStringLine(Line8, string);
Display_Flag = 0;
}
/// LED 显示
if(LED_Flag)
{
if(Set_Flag)
{
LED_MODE &=~(1<<10);
}else
{
LED_MODE |= (1<<10);
}
if(Channal_1_Frequency)
{
LED_MODE &=~(1<<8);
}else
{
LED_MODE |= (1<<8);
}
if(Channal_2_Frequency)
{
LED_MODE &=~(1<<9);
}else
{
LED_MODE |= (1<<9);
}
GPIOC->ODR = LED_MODE;
GPIOD->ODR |= (1<<2);
GPIOD->ODR &=~(1<<2);
LED_Flag = 0;
}
/// USART2 RX
if(RXOVER)
{
// USART2_SendString(RX_BUF);
if(Set_Flag == 1)
{
if((RX_BUF[4] - 0X30) == 1)
{
Channal_1_N = (RX_BUF[6] - 0X30) * 10 + (RX_BUF[7] - 0X30);
}
if((RX_BUF[4] - 0X30) == 2)
{
Channal_2_N = (RX_BUF[6] - 0X30) * 10 + (RX_BUF[7] - 0X30);
}
}
for(i=0;i<20;i++)
{
RX_BUF[i] = 0;
}
USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);
RXOVER = 0;
}
}
}
//
void Delay_Ms(u32 nTime)
{
TimingDelay = nTime;
while(TimingDelay != 0);
}
//IT.C//
void TIM3_IRQHandler(void)
{
if(TIM_GetITStatus(TIM3, TIM_IT_CC1) == 1)
{
TIM_ClearITPendingBit(TIM3, TIM_IT_CC1);
capture = TIM_GetCapture1(TIM3);
TIM_SetCompare1(TIM3,capture + TIM3_Ch1_Val * 0.5);
}
if(TIM_GetITStatus(TIM3, TIM_IT_CC2) == 1)
{
TIM_ClearITPendingBit(TIM3, TIM_IT_CC2);
capture = TIM_GetCapture2(TIM3);
TIM_SetCompare2(TIM3,capture + TIM3_Ch2_Val * 0.5);
}
}
void TIM2_IRQHandler(void)
{
if(TIM_GetITStatus(TIM2, TIM_IT_CC2) == 1)
{
TIM_ClearITPendingBit(TIM2, TIM_IT_CC2);
if(!CAPTURE_Flag)
{
switch(TIM2_CH2_CAPTURE_MODE)
{
case 0: TIM2_CH2_CAPTURE_HL = 0;
TIM2_CH2_CAPTURE_MODE = 1;
TIM_SetCounter(TIM2,0x0);
break;
case 1: TIM2_CH2_CAPTURE_HL = TIM_GetCounter(TIM2);
TIM2_CH2_CAPTURE_MODE = 2;
break;
default:break;
}
}else
{
TIM2_CH2_CAPTURE_MODE = 0;
}
}
if(TIM_GetITStatus(TIM2, TIM_IT_CC3) != RESET)
{
TIM_ClearITPendingBit(TIM2, TIM_IT_CC3);
if(CAPTURE_Flag)
{
switch(TIM2_CH3_CAPTURE_MODE)
{
case 0: TIM2_CH3_CAPTURE_HL = 0;
TIM2_CH3_CAPTURE_MODE = 1;
TIM_SetCounter(TIM2,0x0);
break;
case 1: TIM2_CH3_CAPTURE_HL = TIM_GetCounter(TIM2);
TIM2_CH3_CAPTURE_MODE = 2;
break;
default:break;
}
}else
{
TIM2_CH3_CAPTURE_MODE = 0;
}
}
}
void USART2_IRQHandler(void)
{
u8 temp;
if(USART_GetITStatus(USART2,USART_IT_RXNE) == 1)
{
USART_ClearITPendingBit(USART2,USART_IT_RXNE);
temp = USART_ReceiveData(USART2);
if(temp == '\n')
{
RXCUNT = 0;
RXOVER = 1;
USART_ITConfig(USART2, USART_IT_RXNE, DISABLE);
}else
{
RX_BUF[RXCUNT] = temp;
RXCUNT++;
}
}
}
void SysTick_Handler(void)
{
static u8 CAPTURE_sum = 0;
static u8 KEY_sum = 0;
static u16 OUTPUT_sum = 0;
static u8 Display_sum = 0;
static u8 LED_sum = 0;
TimingDelay--;
if(++CAPTURE_sum == 200) // 200ms
{
CAPTURE_sum = 0;
CAPTURE_Flag ^= 1;
}
if(++KEY_sum == 50) //50ms
{
KEY_sum = 0;
KEY_Flag = 1;
}
if(++OUTPUT_sum == 1000)// 1s
{
OUTPUT_sum = 0;
OUTPUT_Flag = 1;
}
if(++Display_sum == 100) // 100ms
{
Display_sum = 0;
Display_Flag = 1;
}
if(++LED_sum == 50) //50ms
{
LED_sum = 0;
LED_Flag = 1;
}
}
//IO.H//
#ifndef __IO_H
#define __IO_H
#include "stm32f10x.h"
#include "i2c.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)
u8 _24c02_Read(u8 address);
void _24c02_Write(u8 address,u8 data);
void TIM3_OUTPUT_Init(u16 ch2_fre,u16 ch3_fre,u8 status,u8 Ch1_Enable,u8 Ch2_Enable);
void TIM2_CAPTURE_Init(void);
void KEY_Init(void);
void KEY_Read(void);
void LED_Init(void);
void TIM1_PWM_Init(void);
void USART2_Init(u32 bound);
void USART2_SendString(u8 *str);
extern void Delay_Ms(u32 nTime);
#endif
//IO.C//
#include "IO.h"
u16 TIM3_Ch1_Val;
u16 TIM3_Ch2_Val;
u16 LED_MODE = 0XFFFF;
u8 Set_Flag = 0;
u8 Channal_Flag = 0;
u8 Channal_1_N = 1;
u8 Channal_2_N = 1;
24c02 /
u8 _24c02_Read(u8 address)
{
u8 data;
I2CStart();
I2CSendByte(0xa0);
I2CWaitAck();
I2CSendByte(address);
I2CWaitAck();
I2CStart();
I2CSendByte(0xa1);
I2CWaitAck();
data = I2CReceiveByte();
I2CWaitAck();
I2CStop();
return data;
}
void _24c02_Write(u8 address,u8 data)
{
I2CStart();
I2CSendByte(0xa0);
I2CWaitAck();
I2CSendByte(address);
I2CWaitAck();
I2CSendByte(data);
I2CWaitAck();
I2CStop();
}
TIM3 倍频输出部分 /
void TIM3_OUTPUT_Init(u16 ch2_fre,u16 ch3_fre,u8 status,u8 Ch1_Enable,u8 Ch2_Enable)
{
GPIO_InitTypeDef GPIO_InitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
if(status)
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA , ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
TIM_TimeBaseInitStructure.TIM_Period = 0xffff;
TIM_TimeBaseInitStructure.TIM_Prescaler = 71;
TIM_TimeBaseInitStructure.TIM_ClockDivision = 0x0;
TIM_TimeBaseInitStructure.TIM_CounterMode = 0x0;
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseInitStructure);
NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
TIM3_Ch1_Val = 1000000 / ch2_fre;
TIM3_Ch2_Val = 1000000 / ch3_fre;
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_Toggle;
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;
if(Ch1_Enable)
{
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
}else
{
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Disable;
}
TIM_OCInitStructure.TIM_Pulse = TIM3_Ch2_Val;
TIM_OC1Init(TIM3,&TIM_OCInitStructure);
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_Toggle;
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;
if(Ch2_Enable)
{
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
}else
{
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Disable;
}
TIM_OCInitStructure.TIM_Pulse = TIM3_Ch2_Val;
TIM_OC2Init(TIM3,&TIM_OCInitStructure);
TIM_SetCompare1(TIM3, 0x0);
TIM_SetCompare2(TIM3, 0x0);
TIM_Cmd(TIM3, ENABLE);
TIM_ITConfig(TIM3, TIM_IT_CC1 | TIM_IT_CC2, ENABLE);
}
/ 测试方波
void TIM1_PWM_Init(void)
{
u16 fre;
GPIO_InitTypeDef GPIO_InitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_TIM1, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9 ;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
fre = 1000000 / 2000;
TIM_TimeBaseInitStructure.TIM_Period = fre - 1;
TIM_TimeBaseInitStructure.TIM_Prescaler = 71;
TIM_TimeBaseInitStructure.TIM_ClockDivision = 0x0;
TIM_TimeBaseInitStructure.TIM_CounterMode = 0x0;
TIM_TimeBaseInit(TIM1, &TIM_TimeBaseInitStructure);
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2;
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_Pulse = (fre - 2) * 0.5;
TIM_OC2Init(TIM1,&TIM_OCInitStructure);
TIM_CtrlPWMOutputs( TIM1,ENABLE);
TIM_Cmd(TIM1, ENABLE);
}
// TIM2 捕获部分
void TIM2_CAPTURE_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
TIM_ICInitTypeDef TIM_ICInitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA , ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_2;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
TIM_TimeBaseInitStructure.TIM_Period = 0xffff;
TIM_TimeBaseInitStructure.TIM_Prescaler = 71;
TIM_TimeBaseInitStructure.TIM_ClockDivision = 0x0;
TIM_TimeBaseInitStructure.TIM_CounterMode = 0x0;
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseInitStructure);
NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
TIM_ICInitStructure.TIM_Channel = TIM_Channel_2;
TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;
TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;
TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI;
TIM_ICInitStructure.TIM_ICFilter = 0x0;
TIM_ICInit(TIM2, &TIM_ICInitStructure);
TIM_ICInitStructure.TIM_Channel = TIM_Channel_3;
TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;
TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;
TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI;
TIM_ICInitStructure.TIM_ICFilter = 0x0;
TIM_ICInit(TIM2, &TIM_ICInitStructure);
TIM_Cmd(TIM2, ENABLE);
TIM_ITConfig(TIM2, TIM_IT_CC3 | TIM_IT_CC2, ENABLE);
}
/ 按键部分 ///
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_IPU;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_2;
GPIO_Init(GPIOB, &GPIO_InitStructure);
}
void KEY_Read(void)
{
static u16 key1_sum,key2_sum,key3_sum,key4_sum;
//KEY1
if(KEY1 == 0)
{
key1_sum++;
if(key1_sum == 1)
{
Set_Flag ^= 1;
}
}else
{
key1_sum = 0;
}
//KEY2
if(KEY2 == 0)
{
key2_sum++;
if((key2_sum == 1) && (Set_Flag == 0))
{
Channal_Flag ^= 1;
}
}else
{
key2_sum = 0;
}
//KEY3
if(KEY3 == 0)
{
key3_sum++;
if((key3_sum == 1) && (Set_Flag == 0))
{
if(!Channal_Flag)
{
Channal_1_N++;
}else
{
Channal_2_N++;
}
_24c02_Write(0x01,Channal_1_N);
Delay_Ms(10);
_24c02_Write(0x11,Channal_2_N);
}
}else
{
key3_sum = 0;
}
//KEY4
if(KEY4 == 0)
{
key4_sum++;
if((key4_sum == 1) && (Set_Flag == 0))
{
if(!Channal_Flag)
{
Channal_1_N--;
}else
{
Channal_2_N--;
}
if(Channal_1_N < 1) Channal_1_N = 1;
if(Channal_2_N < 1) Channal_2_N = 1;
_24c02_Write(0x01,Channal_1_N);
Delay_Ms(10);
_24c02_Write(0x11,Channal_2_N);
}
}else
{
key4_sum = 0;
}
}
// LED 部分 ///
void LED_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC | RCC_APB2Periph_GPIOD, ENABLE);
GPIO_InitStructure.GPIO_Pin = 0XFF00;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOC, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOD, &GPIO_InitStructure);
GPIOC-> ODR = 0XFFFF;
GPIOD-> ODR |= (1<<2);
GPIOD-> ODR &=~(1<<2);
}
// 串口部分 /
void USART2_Init(u32 bound)
{
GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);
// GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
// GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
// GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
// GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
USART_InitStructure.USART_BaudRate = bound;
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
USART_InitStructure.USART_Mode = USART_Mode_Rx ;
USART_InitStructure.USART_Parity = USART_Parity_No;
USART_InitStructure.USART_StopBits = USART_StopBits_1;
USART_InitStructure.USART_WordLength = USART_WordLength_8b;
USART_Init(USART2, &USART_InitStructure);
NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
USART_Cmd(USART2, ENABLE);
USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);
}
void USART2_SendString(u8 *str)
{
u8 index = 0;
do
{
USART_SendData(USART2, str[index]);
while(USART_GetFlagStatus(USART2,USART_FLAG_TXE) == 0);
index++;
}while(str[index] != 0);
}
//SIXTH-LATE//
(jue sai) dian ya ce liang yu hu pu PWM xin hao shu chu
/main.c//
#include "stm32f10x.h"
#include "lcd.h"
#include "IO.h"
#include "i2c.h"
#include "stdio.h"
u32 TimingDelay = 0;
u8 string[20];
float ADCVal;
u8 KEY_Flag = 0;
u8 ADC_Flag = 0;
u8 Display_Flag = 0;
u8 PWM_Enable = 1;
u16 PWM_Frequency = 1000;
float P;
float ADC_Val;
extern u8 Set_Flag;
void Delay_Ms(u32 nTime);
extern u16 LED_MODE;
//Main Body
int main(void)
{
STM3210B_LCD_Init();
LCD_Clear(Blue);
LCD_SetBackColor(Blue);
LCD_SetTextColor(White);
SysTick_Config(SystemCoreClock/1000);
i2c_init();
LED_Init();
KEY_Init();
ADC1_Init();
PWM_Frequency = _24c02_Read(0xaa) * 1000;
TIM1_PWM_Init(PWM_Frequency,P,1,PWM_Enable);
while(1)
{
// ADCVal = Get_Adc() * 3.3 / 4096;
// sprintf(string,"%.2f ",ADCVal);
// LCD_DisplayStringLine(Line3, string);
KEY //
if(KEY_Flag)
{
KEY_Read();
KEY_Flag = 0;
}
/// ADC /
if(ADC_Flag)
{
ADC_Flag = 0;
ADC_Val = Get_Adc() * 3.3 / 4096;
P = ADC_Val * 100 / 3.3;
TIM1_PWM_Init(PWM_Frequency,P,0,PWM_Enable);
}
// Display //
if(Display_Flag)
{
Display_Flag = 0;
if(!Set_Flag)
{
LCD_DisplayStringLine(Line1, (u8*)" totle ");
sprintf((char*)string,"ADC_Val:%.2fV ",ADC_Val);
LCD_DisplayStringLine(Line3, string);
if(PWM_Enable)
{
LCD_DisplayStringLine(Line4, (u8*)"OutPut:Open ");
}else
{
LCD_DisplayStringLine(Line4, (u8*)"OutPut:Off ");
}
sprintf((char*)string,"Signal_Val:PA9: %d ",(u8)P);
LCD_DisplayStringLine(Line5, string);
sprintf((char*)string," PB14:%d ",(u8)(100-P));
LCD_DisplayStringLine(Line6, string);
sprintf((char*)string," %dkHZ ",PWM_Frequency / 1000);
LCD_DisplayStringLine(Line7, string);
LCD_DisplayStringLine(Line9, (u8*)" 1");
}else
{
LCD_DisplayStringLine(Line1, (u8*)" Set_Mode ");
sprintf((char*)string," Signal_Fre:%dkHZ ",PWM_Frequency / 1000);
LCD_DisplayStringLine(Line5, string);
LCD_DisplayStringLine(Line9, (u8*)" 2");
}
}
}
}
//
void Delay_Ms(u32 nTime)
{
TimingDelay = nTime;
while(TimingDelay != 0);
}
//IT.C//
extern u8 KEY_Flag;
extern u8 ADC_Flag;
extern u8 Display_Flag;
void SysTick_Handler(void)
{
static u8 key_sum = 0;
static u8 adc_sum = 0;
static u8 display_sum = 0;
TimingDelay--;
if(++key_sum == 50) // 50ms
{
key_sum = 0;
KEY_Flag = 1;
}
if(++adc_sum == 250)
{
adc_sum = 0;
ADC_Flag = 1;
}
if(++display_sum == 200)
{
display_sum = 0;
Display_Flag = 1;
}
}
//IO.H//
#ifndef __IO_H
#define __IO_H
#include "stm32f10x.h"
#include "i2c.h"
#include "lcd.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)
void _24c02_Write(u8 address,u8 data);
u8 _24c02_Read(u8 address);
void ADC1_Init(void);
u16 Get_Adc(void);
void TIM1_PWM_Init(u16 fre,u8 duty,u8 status,u8 enable);
void LED_Init(void);
void KEY_Init(void);
void KEY_Read(void);
#endif
//IO.C//
#include "IO.h"
u16 LED_MODE = 0XFFFF;
extern u8 PWM_Enable;
extern u16 PWM_Frequency;
u8 Set_Flag = 0;
extern float P;
/ 24c02 ///
void _24c02_Write(u8 address,u8 data)
{
I2CStart();
I2CSendByte(0xa0);
I2CWaitAck();
I2CSendByte(address);
I2CWaitAck();
I2CSendByte(data);
I2CWaitAck();
I2CStop();
}
u8 _24c02_Read(u8 address)
{
u8 data;
I2CStart();
I2CSendByte(0xa0);
I2CWaitAck();
I2CSendByte(address);
I2CWaitAck();
I2CStart();
I2CSendByte(0xa1);
I2CWaitAck();
data = I2CReceiveByte();
I2CWaitAck();
I2CStop();
return data;
}
/ ADC ///
void ADC1_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
ADC_InitTypeDef ADC_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_ADC1, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
RCC_ADCCLKConfig(RCC_PCLK2_Div6);
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);
ADC_ResetCalibration(ADC1);
while(ADC_GetResetCalibrationStatus( ADC1));
ADC_StartCalibration(ADC1);
while(ADC_GetCalibrationStatus(ADC1));
}
u16 Get_Adc(void)
{
u16 temp;
ADC_RegularChannelConfig(ADC1,ADC_Channel_8, 1, ADC_SampleTime_239Cycles5);
ADC_SoftwareStartConvCmd(ADC1,ENABLE);
temp = ADC_GetConversionValue(ADC1);
ADC_SoftwareStartConvCmd(ADC1,DISABLE);
return temp;
}
TIM1_PWM
void TIM1_PWM_Init(u16 fre,u8 duty,u8 status,u8 enable)
{
u16 frequency;
GPIO_InitTypeDef GPIO_InitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
if(status)
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOA, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_14;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
}
frequency = 1000000 / fre;
TIM_TimeBaseInitStructure.TIM_Period = frequency - 1;
TIM_TimeBaseInitStructure.TIM_Prescaler = 71;
TIM_TimeBaseInitStructure.TIM_ClockDivision = 0x0;
TIM_TimeBaseInitStructure.TIM_CounterMode = 0x0;
TIM_TimeBaseInit(TIM1, &TIM_TimeBaseInitStructure);
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2;
if(enable)
{
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Enable;
}else
{
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Disable;
TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Disable;
}
TIM_OCInitStructure.TIM_Pulse = (frequency - 1) * duty / 100;
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;
TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_Low;
TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Set;
TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCNIdleState_Reset;
TIM_OC2Init(TIM1,&TIM_OCInitStructure);
TIM_CtrlPWMOutputs(TIM1, ENABLE);
TIM_Cmd(TIM1, ENABLE);
}
/// LED ///
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_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOD, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = 0XFF00;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOC, &GPIO_InitStructure);
GPIOC->ODR = 0XFFFF;
GPIOD->ODR |= (1<<2);
GPIOD->ODR &=~(1<<2);
}
/// KEY //
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_IPU;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_2;
GPIO_Init(GPIOB, &GPIO_InitStructure);
}
void KEY_Read(void)
{
static u16 key1_sum = 0,key2_sum = 0,key3_sum = 0,key4_sum = 0;
//KEY1
if(KEY1 == 0)
{
key1_sum++;
if(key1_sum == 1)
{
PWM_Enable ^= 1;
TIM1_PWM_Init(PWM_Frequency,P,0,PWM_Enable);
}
}else
{
key1_sum = 0;
}
//KEY2
if(KEY2 == 0)
{
key2_sum++;
if(key2_sum == 1)
{
Set_Flag ^= 1;
LCD_ClearLine(Line0);
LCD_ClearLine(Line1);
LCD_ClearLine(Line2);
LCD_ClearLine(Line3);
LCD_ClearLine(Line4);
LCD_ClearLine(Line5);
LCD_ClearLine(Line6);
LCD_ClearLine(Line7);
LCD_ClearLine(Line8);
LCD_ClearLine(Line9);
if(!Set_Flag)
{
_24c02_Write(0xaa,PWM_Frequency / 1000);
}
}
}else
{
key2_sum = 0;
}
//KEY3
if((KEY3 == 0) && Set_Flag)
{
key3_sum++;
if(key3_sum == 1)
{
PWM_Frequency += 1000;
if(PWM_Frequency > 10000) PWM_Frequency = 10000;
TIM1_PWM_Init(PWM_Frequency,P,0,PWM_Enable);
}
}else
{
key3_sum = 0;
}
//KEY4
if((KEY4 == 0) && Set_Flag)
{
key4_sum++;
if(key4_sum == 1)
{
PWM_Frequency -= 1000;
if(PWM_Frequency < 1000) PWM_Frequency = 1000;
TIM1_PWM_Init(PWM_Frequency,P,0,PWM_Enable);
}
}else
{
key4_sum = 0;
}
}
赛题
最新推荐文章于 2024-08-02 20:11:31 发布