基于stm8 光电门测速系统 能够与labview 和串口助手通信
单片机源程序如下:
- #include "stm8s.h"
- void GPIO_init_Config()
- {
- GPIO_DeInit(GPIOB);
- GPIO_DeInit(GPIOA);
- GPIO_DeInit(GPIOC);
- GPIO_Init(GPIOB,GPIO_PIN_ALL,GPIO_MODE_OUT_PP_HIGH_FAST);
- GPIO_Init(GPIOA,GPIO_PIN_HNIB,GPIO_MODE_IN_PU_IT);
- }
- //延时函数,单位毫秒
- void delay_ms(u16 i)
- {
- TIM2_DeInit();
- TIM2_TimeBaseInit(TIM2_PRESCALER_2,999);
- while(i--)
- {
- TIM2_Cmd(ENABLE);
- while(TIM2_GetFlagStatus(TIM2_FLAG_UPDATE)!=1);
- TIM2_ClearFlag(TIM2_FLAG_UPDATE);
- TIM2_Cmd(DISABLE);
- }
- }
- //TIM2初始化函数
- void TIM3_Cap_Init()
- {
- TIM3_DeInit();
- TIM3_TimeBaseInit(TIM3_PRESCALER_2,65535);
- TIM3_ICInit(TIM3_CHANNEL_1,TIM3_ICPOLARITY_FALLING ,TIM3_ICSELECTION_DIRECTTI,TIM3_ICPSC_DIV1,0x00);
- TIM3_ITConfig(TIM3_IT_CC1|TIM3_IT_UPDATE,ENABLE);
- TIM3_CCxCmd(TIM3_CHANNEL_1,ENABLE);
- enableInterrupts();
- TIM3_Cmd(ENABLE);
- }
- //串口配置函数
- void USART_Init()
- {
- UART2_DeInit();
- UART2_Init((u32)9600,
- UART2_WORDLENGTH_8D,
- UART2_STOPBITS_1,
- UART2_PARITY_NO,
- UART2_SYNCMODE_CLOCK_DISABLE,
- UART2_MODE_TXRX_ENABLE);
- UART2_Cmd(ENABLE);
- }
- void USART_SendByte(u8 TxDate)
- {
- UART2_SendData8(TxDate);
- while(!UART2_GetFlagStatus(UART2_FLAG_TXE));
- }
- void USART_Write(u8* TxDate,u16 len)
- {
- u16 i;
- for(i=0;i<len;i++)
- {
- USART_SendByte(TxDate[i]);
- }
- }
- u16 Cap_Val=0;
- u8 Cap_Sta=0;
- #pragma vector=18
- __interrupt void TIMER_IRQHander(void)
- {
- if((Cap_Sta&0X80)==0)
- {
- #pragma vector=17
- if (TIM3_GetITStatus(TIM3_IT_UPDATE)==SET)
- {
- if(Cap_Sta&0X40)
- {
- if((Cap_Sta&0X3F)==0X3F)
- {
- Cap_Sta|=0X80;
- Cap_Val=0XFFFF;
- }
- else
- {
- Cap_Sta++;
- }
- }
- TIM3_ClearITPendingBit(TIM3_IT_UPDATE);
- }
- if(TIM3_GetITStatus(TIM3_IT_CC1)==SET)
- {
- if(Cap_Sta&0X40)//捕获到一个上升沿
- {
- Cap_Sta|=0X80;//标记成功捕获到一次低电平脉宽
- Cap_Val=TIM3_GetCapture1();
- TIM3_OC1PolarityConfig(TIM3_ICPOLARITY_FALLING);//设置为下降沿触发
- }
- else//还未开始,第一次捕获下降沿
- {
- Cap_Sta=0;
- Cap_Val=0;
- TIM3_SetCounter(0);
- Cap_Sta|=0X40;//标记捕获到了下降沿
- TIM3_OC1PolarityConfig(TIM3_ICPOLARITY_RISING);//设置为上升沿触发
- }
- }
- }
- TIM3_ClearITPendingBit(TIM3_IT_CC1);
- }
- //主函数
- int main(void)
- {
- u32 temp=0;
- u8 s[10];
- GPIO_init_Config();
- TIM3_Cap_Init();
- USART_Init();
- GPIO_WriteHigh(GPIOB,GPIO_PIN_LNIB);
- while(1)
- {
- if(Cap_Sta&0X80)
- {
- temp=Cap_Sta&0X3F;
- temp*=65536;
- temp+=Cap_Val;
- Cap_Sta=0;
- Cap_Val=0;
- }
- if(temp!=0)
- {
- GPIO_WriteReverse(GPIOB,GPIO_PIN_4);
- //temp=0;
- delay_ms(temp);
- //GPIO_WriteReverse(GPIOB,GPIO_PIN_LNIB);
- //delay_ms(temp/100000);
- }
-
- }
- }
复制代码
所有资料51hei提供下载:
定时器捕获按键时长控制灯闪烁间隔.7z
(425.53 KB, 下载次数: 15)
|