嵌入式第五屆省賽-雙通道方波頻率檢測與倍頻輸出HGS20180328
“藍橋杯” 第六屆全國軟件和信息技術專業人才大賽
嵌入式設計與開發項目模擬試題
功能簡述
“雙通道方波頻率檢測與倍頻輸出”設計要求測量輸入方波信號的頻率,并根據設定的
倍頻數,輸出經過倍頻的方波信號。倍頻數可以通過按鍵設定,也可以通過串行口設定;LCD
顯示2個通道的頻率測量值和倍頻數。系統框圖如圖 1所示:
0.png (19.55 KB, 下載次數: 38)
下載附件
2018-5-24 03:37 上傳
CT117E考試板電路原理圖、LCD 驅動程序、及本題涉及到的芯片資料可參考計算機上的電子文檔。電路原理圖、程序流程圖及相關工程文件請以考生準考證命名,并保存在指定文件夾中(文件夾名為考生準考證號,文件夾位于Windows桌面上) 。
0.png (120.13 KB, 下載次數: 35)
下載附件
2018-5-24 03:37 上傳
單片機源程序如下:
- //上電為本地模式
- //無PWM輸入顯示0Hz
- //TIM2_PWMin和串口發有沖突 但題目未用TX,不初始化TX即可(因為PWM為輸入模式),這樣無論是否在串口模式都能保證PWM輸出
- //TIM3_PWMout使用 GPIO_Mode_Out_PP
- #include "stm32f10x.h"
- #include <stdio.h>
- #include "user.h"
- #include "lcd.h"
- #include "i2c.h"
- u32 TimingDelay = 0;
- u8 USART_Test=0;
- u8 string[20];
- u8 PA6_Mul=0,PA7_Mul=0;
- u8 PA6_Out=0,PA7_Out=0;
- __IO uint16_t ICReadValue1_now = 0,ICReadValue1_last = 0, ICReadValue2_now = 0,ICReadValue2_last = 0;
- __IO uint32_t Freq1_now = 0,Freq1_last = 0,Freq2_now = 0,Freq2_last = 0;
- __IO uint8_t Freq1_Display=0,Freq2_Display=0;
- uint16_t CCR1_Val = 500; // 72000 000/(71+2)=1/1000 000
- uint16_t CCR2_Val = 1000; // T=CCR*2*(1/1000 000) , f=1/T ==>CCR=5000000/f
- u8 count=0;
- u8 RX_buf[20];
- u8 Data_right=0;
- u8 RXcomplitFlag=0;
- u8 Local_mode=1;
- u8 Set_channel=1;
- u16 LED=0XFFFF;
- void Delay_Ms(u32 nTime);
- void LED_Config(void);
- void LCD_Config(void);
- void KEY_Config(void);
- void IIC_Config(void);
- void USART_Config(void);
- void TIM2_PWMin_Config(void);
- void TIM3_PWMout_Config(void);
- void ALL_Init(void);
- void KEY_Scan(void);
- u8 IIC_Read(u8 add);
- void IIC_Write(u8 add,u8 dat);
- void NVIC_Configuration(void);
- void USART_SendStr(u8 *str);
- void LED_Run(void);
- int main(void)
- {
- SysTick_Config(SystemCoreClock/1000);
- LED_Config();
- LCD_Config();
- KEY_Config();
- IIC_Config();
- USART_Config();
- TIM2_PWMin_Config();
- TIM3_PWMout_Config();
- ALL_Init();
-
- Delay_Ms(5);IIC_Write(0x01,2);
- Delay_Ms(5);IIC_Write(0x02,2);
- Delay_Ms(5);PA6_Mul=IIC_Read(0x01);
- Delay_Ms(5);PA7_Mul=IIC_Read(0x02);
- sprintf((char*)string," N(1):%d ",PA6_Mul);
- LCD_DisplayStringLine(Line2,string);
- sprintf((char*)string," N(2):%d ",PA7_Mul);
- LCD_DisplayStringLine(Line6,string);
- LED_Run();
-
- while (1)
- {
- KEY_Scan();
- LED_Run();
- if(Freq1_Display==1)
- {
- Freq1_Display=0;
- sprintf((char*)string," Channel(1):%dHz ",Freq1_now);
- LCD_DisplayStringLine(Line1,string);
- if((Freq1_now>=50)&&(Freq1_now<=50000))
- {
- CCR1_Val = 500000/Freq1_now/PA6_Mul;
- PA6_Out=1;LED&=~LED1;
- }
- else {PA6_Out=0;LED|=LED1;LCD_DisplayStringLine(Line1,(unsigned char *)" Channel(1):0Hz ");}
- }
- else {PA6_Out=0;LED|=LED1;LCD_DisplayStringLine(Line1,(unsigned char *)" Channel(1):0Hz ");}
-
- if(Freq2_Display==1)
- {
- Freq2_Display=0;
- sprintf((char*)string," Channel(1):%dHz ",Freq2_now);
- LCD_DisplayStringLine(Line5,string);
- if((Freq2_now>=50)&&(Freq2_now<=50000))
- {
- CCR2_Val = 500000/Freq2_now/PA7_Mul;
- PA7_Out=1;LED&=~LED2;
- }
- else {PA7_Out=0;LED|=LED2;LCD_DisplayStringLine(Line5,(unsigned char *)" Channel(2):0Hz ");}
- }
- else {PA7_Out=0;LED|=LED2;LCD_DisplayStringLine(Line5,(unsigned char *)" Channel(2):0Hz ");}
-
- if(RXcomplitFlag==1)
- {
- RXcomplitFlag=0;
- if((RX_buf[4]-48)==1)
- {
- PA6_Mul=(RX_buf[6]-48)*10+(RX_buf[7]-48);
- sprintf((char*)string," N(1):%d ",PA6_Mul);
- LCD_DisplayStringLine(Line2,string);
- }
- else if((RX_buf[4]-48)==2)
- {
- PA7_Mul=(RX_buf[6]-48)*10+(RX_buf[7]-48);
- sprintf((char*)string," N(2):%d ",PA7_Mul);
- LCD_DisplayStringLine(Line6,string);
- }
- }
- }
- }
- void KEY_Scan(void)
- {
- if(RB1==0)
- {
- Delay_Ms(5);
- if(RB1==0)
- {
- if(Local_mode==0)
- {
- Local_mode=1;
- USART_Cmd(USARTz, DISABLE);
- USART_ITConfig(USARTz, USART_IT_RXNE, DISABLE);
- // TIM2_PWMin_Config();
- RCC_APB1PeriphClockCmd(USARTz_CLK, DISABLE);
- LCD_DisplayStringLine(Line9,(unsigned char *)" 1 ");
- LED|=LED3;
- }
- else if(Local_mode==1)
- {
- Local_mode=0;Set_channel=1;
- USART_Config();
- LCD_DisplayStringLine(Line9,(unsigned char *)" ");
- LED&=~LED3;
- }
- }
- while(!RB1);
- }
- else if(RB2==0)
- {
- Delay_Ms(5);
- if(RB2==0)
- {
- if(Local_mode==1)
- {
- if(Set_channel==1)
- {
- Set_channel=2;
- LCD_DisplayStringLine(Line9,(unsigned char *)" 2 ");
- }
- else if(Set_channel==2)
- {
- Set_channel=1;
- LCD_DisplayStringLine(Line9,(unsigned char *)" 1 ");
- }
- }
- }
- while(!RB2);
- }
- else if(RB3==0)
- {
- Delay_Ms(5);
- if(RB3==0)
- {
- if(Local_mode==1)
- {
- if(Set_channel==1)
- {
- PA6_Mul--;
- if(PA6_Mul<=1)PA6_Mul=1;
- sprintf((char*)string," N(1):%d ",PA6_Mul);
- LCD_DisplayStringLine(Line2,string);
- Delay_Ms(5);IIC_Write(0x01,PA6_Mul);
- }
- else if(Set_channel==2)
- {
- PA7_Mul--;
- if(PA7_Mul<=1)PA7_Mul=1;
- sprintf((char*)string," N(2):%d ",PA7_Mul);
- LCD_DisplayStringLine(Line6,string);
- Delay_Ms(5);IIC_Write(0x02,PA7_Mul);
- }
- }
- }
- while(!RB3);
- }
- else if(RB4==0)
- {
- Delay_Ms(5);
- if(RB4==0)
- {
- if(Local_mode==1)
- {
- if(Set_channel==1)
- {
- PA6_Mul++;
- if(PA6_Mul>=10)PA6_Mul=10;
- sprintf((char*)string," N(1):%d ",PA6_Mul);
- LCD_DisplayStringLine(Line2,string);
- Delay_Ms(5);IIC_Write(0x01,PA6_Mul);
- }
- else if(Set_channel==2)
- {
- PA7_Mul++;
- if(PA7_Mul>=10)PA7_Mul=10;
- sprintf((char*)string," N(2):%d ",PA7_Mul);
- LCD_DisplayStringLine(Line6,string);
- Delay_Ms(5);IIC_Write(0x02,PA7_Mul);
- }
- }
- }
- while(!RB4);
- }
- }
- void LCD_Config(void)
- {
- STM3210B_LCD_Init();
- LCD_Clear(White);
- LCD_SetBackColor(White);
- LCD_SetTextColor(Blue);
- LCD_DisplayStringLine(Line0,(unsigned char *)" ");
- LCD_DisplayStringLine(Line1,(unsigned char *)" Channel(1):1000Hz ");
- LCD_DisplayStringLine(Line2,(unsigned char *)" N(1):2 ");
- LCD_DisplayStringLine(Line3,(unsigned char *)" ");
- LCD_DisplayStringLine(Line4,(unsigned char *)" ");
- LCD_DisplayStringLine(Line5,(unsigned char *)" Channel(2):1000Hz ");
- LCD_DisplayStringLine(Line6,(unsigned char *)" N(2):2 ");
- LCD_DisplayStringLine(Line7,(unsigned char *)" ");
- LCD_DisplayStringLine(Line8,(unsigned char *)" ");
- LCD_DisplayStringLine(Line9,(unsigned char *)" 1 ");
- }
- void USART_SendStr(u8 *str)
- {
- u8 i=0;
- do
- {
- USART_SendData(USART2, *(str+i));
- while(USART_GetFlagStatus(USART2,USART_FLAG_TXE)==RESET);
- i++;
- }while(*(str+i)!='\0');
- while(USART_GetFlagStatus(USART2,USART_FLAG_TC)==RESET);
- }
- void TIM2_PWMin_Config(void)
- {
- GPIO_InitTypeDef GPIO_InitStructure;
- TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
- TIM_ICInitTypeDef TIM_ICInitStructure;
- RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
-
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1|GPIO_Pin_2;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
- GPIO_Init(GPIOA, &GPIO_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(TIM2, &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(TIM2, &TIM_ICInitStructure);
-
- TIM_ICInitStructure.TIM_Channel = TIM_Channel_3;
- 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(TIM2, &TIM_ICInitStructure);
-
- TIM_Cmd(TIM2, ENABLE);
- TIM_ITConfig(TIM2, TIM_IT_CC2|TIM_IT_CC3, ENABLE);
- }
- void TIM2_IRQHandler(void)
- {
- if(TIM_GetITStatus(TIM2, TIM_IT_CC2) == SET)
- {
- TIM_ClearITPendingBit(TIM2, TIM_IT_CC2);
- ICReadValue1_now=TIM_GetCapture2(TIM2);
- if(ICReadValue1_now!=ICReadValue1_last)
- {
- Freq1_now=1000000/(ICReadValue1_now-ICReadValue1_last);
- }
- if(Freq1_now==0)
- {
- Freq1_now=Freq1_last;
- }
- ICReadValue1_last=ICReadValue1_now;
- Freq1_last=Freq1_now;
- Freq1_Display=1;
- }
- if(TIM_GetITStatus(TIM2, TIM_IT_CC3) == SET)
- {
- TIM_ClearITPendingBit(TIM2, TIM_IT_CC3);
- ICReadValue2_now=TIM_GetCapture3(TIM2);
- if(ICReadValue2_now!=ICReadValue2_last)
- {
- Freq2_now=1000000/(ICReadValue2_now-ICReadValue2_last);
- }
- if(Freq2_now==0)
- {
- Freq2_now=Freq2_last;
- }
- ICReadValue2_last=ICReadValue2_now;
- Freq2_last=Freq2_now;
- Freq2_Display=1;
- }
- }
- void TIM3_PWMout_Config(void)
- {
- GPIO_InitTypeDef GPIO_InitStructure;
- TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
- TIM_OCInitTypeDef TIM_OCInitStructure;
- RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
-
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
- GPIO_Init(GPIOA, &GPIO_InitStructure);
-
- TIM_TimeBaseStructure.TIM_Period = 65535;
- TIM_TimeBaseStructure.TIM_Prescaler = 71;
- TIM_TimeBaseStructure.TIM_ClockDivision = 0;
- TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
- TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
-
- TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_Toggle;
- TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
- TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;
- TIM_OC1Init(TIM3, &TIM_OCInitStructure);
- TIM_OC1PreloadConfig(TIM3, TIM_OCPreload_Disable);
- TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
- TIM_OC2Init(TIM3, &TIM_OCInitStructure);
- TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Disable);
- TIM_ITConfig(TIM3, TIM_IT_CC1|TIM_IT_CC2, ENABLE);
- TIM_Cmd(TIM3, ENABLE);
- }
- uint16_t capture = 0;
- void TIM3_IRQHandler(void)
- {
- if (TIM_GetITStatus(TIM3, TIM_IT_CC1) != RESET)
- {
- TIM_ClearITPendingBit(TIM3, TIM_IT_CC1 );
- capture = TIM_GetCapture1(TIM3);
- TIM_SetCompare1(TIM3, capture + CCR1_Val );
- if(PA6_Out==1)
- {
- GPIO_WriteBit(GPIOA, GPIO_Pin_6, (BitAction)(1-GPIO_ReadOutputDataBit(GPIOA,GPIO_Pin_6)));
- }
- else
- {
- CCR1_Val=0;GPIO_WriteBit(GPIOA, GPIO_Pin_6, (BitAction)0);
- }
- }
- if (TIM_GetITStatus(TIM3, TIM_IT_CC2) != RESET)
- {
- TIM_ClearITPendingBit(TIM3, TIM_IT_CC2);
- capture = TIM_GetCapture2(TIM3);
- TIM_SetCompare2(TIM3, capture + CCR2_Val);
- if(PA7_Out==1)
- {
- GPIO_WriteBit(GPIOA, GPIO_Pin_7, (BitAction)(1-GPIO_ReadOutputDataBit(GPIOA,GPIO_Pin_7)));
- }
- else
- {
- GPIO_WriteBit(GPIOA, GPIO_Pin_7, (BitAction)0);
- }
- }
- }
- void ALL_Init(void)
- {
- NVIC_Configuration();
- GPIO_SetBits(GPIOD, GPIO_Pin_2);
- GPIO_SetBits(GPIOC, LED1|LED2|LED3|LED4|LED5|LED6|LED7|LED8);
- GPIO_ResetBits(GPIOD, GPIO_Pin_2);
- }
-
- void NVIC_Configuration(void)
- {
- NVIC_InitTypeDef NVIC_InitStructure;
- NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);
- NVIC_InitStructure.NVIC_IRQChannel = USARTz_IRQn;
- NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
- NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
- NVIC_Init(&NVIC_InitStructure);
-
- NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;
- NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
- NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
- NVIC_Init(&NVIC_InitStructure);
-
- NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;
- NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
- NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
- NVIC_Init(&NVIC_InitStructure);
- }
- void SysTick_Handler(void)
- {
- TimingDelay--;
- }
- void USART2_IRQHandler(void)
- {
- u8 temp;
- if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET)
- {
- temp = USART_ReceiveData(USART2);
- if(temp == 'S')
- {
- RX_buf[count]=temp;Data_right=1;count++;
- }
- else if(Data_right==1)
- {
- RX_buf[count]=temp;
- count++;
- if(count==8)
- {
- count=0;Data_right=0;RXcomplitFlag=1;
- }
- }
- USART_ClearITPendingBit(USART2, USART_IT_RXNE);
- }
- }
- void LED_Run(void)
- {
- GPIO_Write(GPIOC,LED);
- GPIO_SetBits(GPIOD, GPIO_Pin_2);
- GPIO_ResetBits(GPIOD, GPIO_Pin_2);
- }
- void KEY_Config(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_Init(GPIOA, &GPIO_InitStructure);
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1|GPIO_Pin_2;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
- GPIO_Init(GPIOB, &GPIO_InitStructure);
- }
- void IIC_Config(void)
- {
- i2c_init();
- }
- u8 IIC_Read(u8 add)
- {
- u8 data;
- I2CStart();
- I2CSendByte(0xa0);
- I2CSendAck();
- I2CSendByte(add);
- I2CSendAck();
-
- I2CStart();
- I2CSendByte(0xa1);
- ……………………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
0.png (45.45 KB, 下載次數: 43)
下載附件
2018-5-24 03:38 上傳
所有資料51hei提供下載:
嵌入式第五屆省賽-雙通道方波頻率檢測與倍頻輸出HGS20180328.rar
(449.17 KB, 下載次數: 68)
2018-5-24 03:44 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|