题目如下
主要代码如下
//main.c
#include "includeall.h"
vu32 TimingDelay = 0;
void Init(void)
{
Usart2_Init(9600);
SysTick_Config(SystemCoreClock/1000);//初始化滴答定时器时钟
Delay_Ms(200);
LED_Init();
STM3210B_LCD_Init();//初始化LCD显示屏
Beep_Init();
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
i2c_init();
Key_Init();
//EXTI0_Init();
//EXTI8_Init();
TIM2_Init(1999, 7199);//200ms
TIM3_Init(79, 7199);//8ms
ADC8_Init();
RTC_Init();
}
//Main Body
int main(void)
{
Init();
LCD_Clear(White);//清屏
LCD_SetBackColor(White);//改背景
LCD_SetTextColor(Black);//改字色
while(1)
{
LCD_Show();
KeyMonitor();
LED_Shine();
usartDataJudge();
}
}
//
void Delay_Ms(u32 nTime)
{
TimingDelay = nTime;
while(TimingDelay != 0);
}
//usart.c
#include "includeall.h"
#include "../Driver/USART/usart.h"
void Usart2_Init(u32 baud)
{
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_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//
GPIO_Init(GPIOA, &GPIO_InitStructure);
USART_InitStructure.USART_BaudRate = baud;
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
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_Init(USART2, &USART_InitStructure);
NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
NVIC_Init(&NVIC_InitStructure);
USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);//
USART_Cmd(USART2, ENABLE);
}
void USART2_SendByte(u8 data)
{
USART_ClearFlag(USART2, USART_FLAG_TC);
USART_SendData(USART2, data);
while(USART_GetFlagStatus(USART2, USART_FLAG_TC) == 0);//
}
void USART2_SendString(u8 *str)
{
u8 i=0, num = 0;
while(str[i]!=0)
i++;
num = i;
for(i=0; i<num; i++)
{
USART2_SendByte(str[i]);
}
}
void USART2_IRQHandler(void)
{
u8 res = 0;
if( USART_GetITStatus(USART2, USART_IT_RXNE) )
{
TIM_SetCounter(TIM3, 0);
res = USART_ReceiveData(USART2);
if(g_stopreceive == 0)
{
g_usartrec[g_usartnum] = res;
g_usartnum++;
}
else
{
TIM_Cmd(TIM3, ENABLE);
g_usartnum = 0;
g_stopreceive = 0;
memset((void *)g_usartrec, 0, 50);
g_usartrec[g_usartnum] = res;
g_usartnum++;
}
}
}
int fputc(int ch, FILE *f){
/* Place your implementation of fputc here */
/* e.g. write a character to the USART */
USART_SendData(USART2, (uint8_t) ch);
/* Loop until the end of transmission */
while (USART_GetFlagStatus(USART2, USART_FLAG_TC) == RESET)
{}
return ch;
}
//includeall.c
#include "includeall.h"
volatile double g_V = 0;
volatile u8 g_K = 1;
volatile u8 g_LS = 1;
volatile u8 g_LK = 1;
vu8 g_TimeDisplay = 0;
volatile Tim_str g_timtemp = {23, 59, 55};
volatile Tim_str g_settime = {0, 0, 0};
volatile u8 g_page = MAIN;
volatile u8 g_underline = 0;
volatile u8 g_usartrec[50];
volatile u8 g_stopreceive = 1;
volatile u8 g_usartnum = 0;
volatile u8 g_iicsr = 0;
void LCD_DisplayADC(void)
{
u8 strtem[10];
u8 i = 0, num = 0;
//USART2_SendString("LCD_DisplayADC1");
sprintf((char *)strtem, "%5.2lfV", ADC_Measure() );
//USART2_SendString("LCD_DisplayADC2");
while(strtem[i]!=0)i++;
num = i;
//USART2_SendString("LCD_DisplayADC");
for(i=0; i<num; i++)
LCD_DisplayChar(Line5, 319-16*(4+i), strtem[i]);
//LCD_DisplayStringLine(Line6 ,(unsigned char *)strtem);
}
void My_LCD_DisplayChar(u8 Line, u16 Add, u8 Ascii)
{
LCD_DisplayChar(Line, 319-16*Add, Ascii);
}
void My_LCD_DisplayStringLine(u8 Line, u16 Add, u8 *ptr)
{
u32 i = 0;
while ((*ptr != 0) && (i < 20)) // 20
{
My_LCD_DisplayChar(Line, Add+i, *ptr);
ptr++;
i++;
}
}
double ADC_Measure(void)
{
g_V = ADC_Get_Ave(8,5)/4096.0*3.3;
return g_V;
}
void LED_Shine(void)
{
if (g_LK == 1)
{
if(g_V > 0.33*g_K)
{
g_LS = 1;
}
else
{
g_LS = 0;
}
}
else
{
LEDOff(LED1);
g_LS = 0;
}
}
void LCD_Show(void)
{
u8 strtemp[20];
if(g_page == MAIN)
{
sprintf( (char *)strtemp, " V1:%4.2lfV", ADC_Measure());
LCD_DisplayStringLine(Line2, strtemp);
sprintf( (char *)strtemp, " k:0.%d", g_K);
LCD_DisplayStringLine(Line3, strtemp);
if(g_LK)
LCD_DisplayStringLine(Line4, (u8 *)" LED:ON ");
else
LCD_DisplayStringLine(Line4, (u8 *)" LED:OFF ");
Time_Show();
sprintf( (char *)strtemp, " T:%2d-%2d-%2d", g_timtemp.hh, g_timtemp.mm, g_timtemp.ss);
LCD_DisplayStringLine(Line5, strtemp);
}
else if(g_page == SETT)
{
LCD_DisplayStringLine(Line3, (u8 *)" Setting ");
sprintf( (char *)strtemp, " %2d-%2d-%2d", g_settime.hh, g_settime.mm, g_settime.ss);
LCD_DisplayStringLine(Line5, strtemp);
if(g_underline%3 == 2)
LCD_DisplayStringLine(Line6, (u8 *)" __ ");
else if(g_underline%3 == 1)
LCD_DisplayStringLine(Line6, (u8 *)" __ ");
else if(g_underline%3 == 0)
LCD_DisplayStringLine(Line6, (u8 *)" __ ");
}
}
void ReportVoltage(void)
{
u8 data[25];
sprintf((char*)data, "%.2lf+0.%d+%2d%2d%2d\n", g_V, g_K, g_timtemp.hh, g_timtemp.mm, g_timtemp.ss);
USART2_SendString(data);
}
void KeyMonitor(void)
{
if(g_page == MAIN)
{
switch(Key_Scan(0) ){
case K1_PRES:
{
//printf("K1_PRES\r\n");
g_LK = !g_LK;
}
break;
case K2_PRES:
{
//printf("K2_PRES\r\n");
//USART2_SendString("K22_PRES\r\n");
LCD_Clear(White);
g_page = SETT;
}
}
}
else if(g_page == SETT)
{
switch(Key_Scan(0) ){
case K1_PRES:
{
g_LK = !g_LK;
}
break;
case K2_PRES:
{
RTC_SetAlarm(Time_Regulate(g_settime.hh, g_settime.mm, g_settime.ss) );
RTC_WaitForLastTask();
LCD_Clear(White);
g_page = MAIN;
}
break;
case K3_PRES:
{
g_underline++;
}
break;
case K4_PRES:
{
k4settime();
}
}
}
}
void k4settime(void)
{
if(g_underline%3 == SUL)
{
if(g_settime.ss != 59 )
{
g_settime.ss++;
}
else
{
g_settime.ss=0;
if(g_settime.mm != 59)
g_settime.mm++;
else
{
g_settime.mm = 0;
g_settime.hh++;
}
}
}
else if(g_underline%3 == MUL)
{
if(g_settime.mm != 59 )
{
g_settime.mm++;
}
else
{
g_settime.mm=0;
if(g_settime.hh!=23)
g_settime.hh++;
else
{
g_settime.mm=0;
g_settime.hh=0;
}
}
}
else if(g_underline%3 == HUL)
{
if(g_settime.hh != 23 )
{
g_settime.hh++;
}
else
{
g_settime.hh=0;
}
}
}
void usartDataJudge(void)
{
//static u8 i = 1;
if(g_stopreceive && g_iicsr)
{
g_iicsr = 0;
if( (g_usartrec[0] == 'k') && (g_usartrec[1] == '0') && (g_usartrec[2] == '.')
&& (g_usartrec[3] >='1' && (g_usartrec[3] <='9') ))
{
//
USART2_SendString("ok\n");
IIC24_SendOneData(0, g_usartrec[3]-48);
Delay_Ms(10);
g_K = IIC24_RecOneData(0);
//USART2_SendByte(g_K);
}
}
}
//adc.c
#include "includeall.h"
#include "../Driver/ADC/adc.h"
void ADC8_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
ADC_InitTypeDef ADC_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1 | RCC_APB2Periph_GPIOB, ENABLE);
RCC_ADCCLKConfig(RCC_PCLK2_Div6);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
GPIO_Init(GPIOB, &GPIO_InitStructure);
ADC_DeInit(ADC1);
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 ADC_Get(u8 ch)
{
ADC_RegularChannelConfig(ADC1, ch, 1, ADC_SampleTime_55Cycles5);
ADC_SoftwareStartConvCmd(ADC1, ENABLE);
while(ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC) == 0);
return ADC_GetConversionValue(ADC1);
}
u16 ADC_Get_Ave(u8 ch, u8 times)
{
u8 i = 0;
u16 value = 0;
for(i=0; i<times; i++)
{
value = value + ADC_Get(ch);
Delay_Ms(5);
}
return value/times;
}
//rtc.c
#include "includeall.h"
#include "../Driver/RTC/rtc.h"
void RTC_Init(void)
{
NVIC_InitTypeDef NVIC_InitStructure;
/* Enable PWR and BKP clocks */
RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE);
/* Allow access to BKP Domain */
PWR_BackupAccessCmd(ENABLE);
/* Enable the LSI OSC */
RCC_LSICmd(ENABLE);
//USART2_SendString("Wait LSI\r\n");
/* 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();
NVIC_InitStructure.NVIC_IRQChannel = RTC_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
if (BKP_ReadBackupRegister(BKP_DR1) != 0xA5A4)
{
/* Backup data register value is not correct or not yet programmed (when
the first time the program is executed) */
//USART2_SendString("RTC not yet configured....\r\n");
/* RTC Configuration */
/* Reset Backup Domain */
//BKP_DeInit();
/* Enable the RTC Second */
RTC_ITConfig(RTC_IT_SEC|RTC_IT_ALR, ENABLE);
/* Wait until last write operation on RTC registers has finished */
RTC_WaitForLastTask();
/* Set RTC prescaler: set RTC period to 1sec */
RTC_SetPrescaler(39999);
/* Wait until last write operation on RTC registers has finished */
RTC_WaitForLastTask();
//USART2_SendString("RTC configured....\r\n");
/* Adjust time by values entered by the user on the hyperterminal */
Time_Adjust(23, 59, 55);
BKP_WriteBackupRegister(BKP_DR1, 0xA5A5);
}
else
{
RCC_APB1PeriphClockCmd(RCC_APB1Periph_BKP|RCC_APB1Periph_PWR,ENABLE); //RTC是存在后备区域中的,所以是要开启后备区域和电源时钟的
PWR_BackupAccessCmd(ENABLE); //电源控制寄存器(PWR_CR)的BPB位使能对后备区域和RTC的访问
RCC_RTCCLKCmd(ENABLE);
//USART2_SendString("No need to configure RTC....\r\n");
/* Wait for RTC registers synchronization */
RTC_WaitForSynchro();
RTC_SetAlarm(Time_Regulate(0, 0, 0));
/* Enable the RTC Second */
RTC_ITConfig(RTC_IT_SEC|RTC_IT_ALR, ENABLE);
/* Wait until last write operation on RTC registers has finished */
RTC_WaitForLastTask();
}
//Time_Show();
//USART2_SendString("RTC end \r\n");
}
uint32_t Time_Regulate(u8 hh, u8 mm, u8 ss)
{
uint32_t Tmp_HH = 0xFF, Tmp_MM = 0xFF, Tmp_SS = 0xFF;
Tmp_HH = hh;
Tmp_MM = mm;
Tmp_SS = ss;
/* Return the value to store in RTC counter register */
return((Tmp_HH*3600 + Tmp_MM*60 + Tmp_SS));
}
void Time_Adjust(u8 hh, u8 mm, u8 ss)
{
/* Wait until last write operation on RTC registers has finished */
RTC_WaitForLastTask();
/* Change the current time */
RTC_SetCounter(Time_Regulate(hh, mm, ss));
/* Wait until last write operation on RTC registers has finished */
RTC_WaitForLastTask();
}
void Time_Display(uint32_t TimeVar)
{
//uint32_t THH = 0, TMM = 0, TSS = 0;
u8 Time[30];
/* Reset RTC Counter when Time is 23:59:59 */
if (RTC_GetCounter() == 0x00015180)//7f变80
{
RTC_SetCounter(0x0);
/* Wait until last write operation on RTC registers has finished */
RTC_WaitForLastTask();
}
/* Compute hours */
g_timtemp.hh = (TimeVar / 3600)<24?(TimeVar / 3600):0;
/* Compute minutes */
g_timtemp.mm = (TimeVar % 3600) / 60;
/* Compute seconds */
g_timtemp.ss = (TimeVar % 3600) % 60;
sprintf((char*)Time, "Time: %2d:%2d:%2d\r\n", g_timtemp.hh, g_timtemp.mm, g_timtemp.ss);
}
/**
* @brief Shows the current time (HH:MM:SS) on the Hyperterminal.
* @param None
* @retval None
*/
void Time_Show(void)
{
/* If 1s has been elapsed */
if (g_TimeDisplay == 1)
{
/* Display current time */
//USART2_SendString("Time_Display\r\n");
Time_Display(RTC_GetCounter());
g_TimeDisplay = 0;
}
}
void RTC_IRQHandler(void)
{
if (RTC_GetITStatus(RTC_IT_SEC) != RESET)
{
//USART2_SendString("RTCirq\r\n");
/* Clear the RTC Second interrupt */
RTC_ClearITPendingBit(RTC_IT_SEC);
/* Toggle LED2 */
//LEDInvert(LED5|LED6);
/* Enable time update */
g_TimeDisplay = 1;
/* Wait until last write operation on RTC registers has finished */
RTC_WaitForLastTask();
}
else if(RTC_GetITStatus(RTC_IT_ALR) )
{
ReportVoltage();
RTC_ClearITPendingBit(RTC_IT_ALR);
}
}
// A code block