<acronym id="xonnx"></acronym>
      <td id="xonnx"></td>
    1. <pre id="xonnx"></pre>

      1. 專注電子技術學習與研究
        當前位置:單片機教程網 >> STM32 >> 瀏覽文章

        STM8單片機ADC、Timer、USART實用例程

        作者:佚名   來源:來自唐宗之氣   點擊數:  更新時間:2014年09月17日   【字體:

               這是一個我花了較長時間摸索出來的STM8L-051的例程,它控制LED燈,Timer2定時100us進入中斷,軟件啟動ADC,采樣10 次后取平均,將結果通過UASART發送至PC機,在超級終端上顯示的實用程序,因其內存極小,不能用printf等函數,因此對于想用這款資源極少的MCU的開發者來說,讀這篇文章會大大節約你的研發時間。有不會的問題請發郵件

         
         
         
        #include
         
        #include "stm8l15x.h"
         
        #include "iostm8l051f3.h"
         
         
         
        #define LED_GPIO_PORT  GPIOA
         
        #define LED_GPIO_PINS  GPIO_Pin_2 | GPIO_Pin_3
         
         
         
        #define ADC1_DR_ADDRESS        ((uint16_t)0x5344)
         
        #define BUFFER_SIZE            ((uint8_t) 0x02)
         
        #define BUFFER_ADDRESS         ((uint16_t)(&Buffer))
         
        #define ASCII_NUM_0            ((uint8_t)   48)
         
        #define ADC_RATIO              ((uint16_t) 806)
         
        #define SampleADC              ((uint8_t) 0x0A)   
         
        uint8_t Buffer[4]  = {0, 0, 0, 0};
         
        uint16_t ADCdata = 0;
         
        uint16_t ADCvalue = 0;
         
        unsigned char LED =1;
         
        unsigned char c = 8;
         
        uint16_t   acode = 1234; //43 "+" 0x2B;
         
         
         
        void Delay(__IO uint16_t nCount)
         
        {
         
         
         
          while (nCount != 0)
         
          {
         
            nCount--;
         
          }
         
        }
         
         
         
        //int putchar(int c) 
         
        //{ 
         
        //  while ((USART1_SR&0x80)==0x00);
         
        //  UART2_sendchar((u8)c);
         
        //  return (c); 
         
        //}
         
         
         
        static void CLK_Config(void)
         
        {
         
         
         
          CLK_SYSCLKSourceSwitchCmd(ENABLE);
         
          CLK_SYSCLKSourceConfig(CLK_SYSCLKSource_HSI);
         
         
         
         
         
          CLK_SYSCLKDivConfig(CLK_SYSCLKDiv_1);
         
         
         
          while (CLK_GetSYSCLKSource() != CLK_SYSCLKSource_HSI)
         
          {}
         
         
         
         
         
          CLK_PeripheralClockConfig(CLK_Peripheral_ADC1, ENABLE);
         
         
         
         
         
         // CLK_PeripheralClockConfig(CLK_Peripheral_DMA1, ENABLE);
         
         
         
         
         
          CLK_PeripheralClockConfig(CLK_Peripheral_TIM2, ENABLE);
         
         
         
          CLK_PeripheralClockConfig(CLK_Peripheral_USART1, ENABLE);
         
        }
         
         
         
        static void GPIO_Config(void)
         
        {
         
          PC_DDR = 0X20;
         
          PC_CR1 = 0X20;
         
          PA_DDR = 0X0C;
         
          PA_CR1 = 0X0C;
         
         }
         
         
         
        static void USART1_Config(void)
         
        {
         
         // ADCvalue = USART1_DR;
         
          USART1_BRR2 = 0x03;
         
          USART1_BRR1 = 0x68;  //16M/9600=683
         
          USART1_CR2 = 0x0C;  //Transmitter & receiver enable
         
         }
         
         
         
        static void ADC_Config(void)
         
        {
         
          ADC1_CR2 = 0x27; //risign edge, trigger 3, sampling time 384
         
          ADC1_CR3 = 0x10; //16channel
         
          //  ADC_ChannelCmd(ADC1, ADC_Channel_17, ENABLE);
         
        }
         
         
         
        void TIM2_Config(void)
         
        {
         
          TIM2_PSCR = 0x07;  // 應是16,但只能置三位,所以是111  fCK_PSC / 2(PSC[2:0]).
         
          // TIM2_PSCRL = 0x3F;  // PSCR=0x1F3F,f=8M/(0x1F3F+1)=1000Hz,每個計數周期1ms
         
          TIM2_ARRH = 0x00;  // 自動重載寄存器ARR=0x01F4=500
         
          TIM2_ARRL = 0x18;  // 24X4us=96us   每記數500次產生一次中斷,即500ms
         
          TIM2_IER = 0x01;   // 允許更新中斷
         
          TIM2_CR1 = 0x05;   // 計數器使能,開始計數,只允許更新中斷請求
         
        }
         
         
         
        void Delay (uint16_t nCount);
         
         
         
        //#pragma   vector = ADC1_EOC_vector
         
        //__interrupt  void  ADC1_EOC(void)
         
        //{
         
        //     ADCdata = ADC_GetConversionValue(ADC1);
         
        // }
         
         
         
        #pragma vector =TIM2_OVR_UIF_vector
         
        __interrupt void TIM2_OVR_UIF(void)
         
        {
         
            asm("sim");
         
            static uint8_t measurements = SampleADC;
         
            static uint32_t accumulator = 0;
         
            uint32_t average = 0;
         
            uint16_t factor10 = 1000;
         
            int8_t i ;
         
            ADCdata = 0;
         
            TIM2_SR1 = 0x00; //Clear UIF
         
            ADC1_SR = 0x00;  //Clear EOC
         
            ADC1_CR1 = 0x03; // EOC interrupt unable, software set start, ADC enable
         
          //  while (!(ADC1_SR & 0x01));
         
         
         
         
         
            Delay(0x000F);
         
            ADCdata = (uint16_t)(ADC1_DRH);
         
            ADCdata = (uint16_t)((uint16_t)((uint16_t)ADCdata << 8) | ADC1_DRL);
         
            accumulator += ADCdata;
         
            if(measurements == 0)
         
            {
         
                LED= !LED;
         
                measurements = SampleADC;
         
                average = accumulator/SampleADC;
         
                ADCvalue = (uint16_t)((uint32_t)((uint32_t)average * (uint32_t)ADC_RATIO) / (uint32_t)1000);
         
                accumulator = 0;
         
                while(!USART1_SR_TXE);
         
                for (i = 3; i >= 0; i--)
         
                {
         
                   Buffer[i] = (ADCvalue/factor10) % 10 + 48; //提取十進制每一位,并轉換成ASCII碼
         
                   factor10 = factor10 / 10;
         
                   while(!USART1_SR_TXE);
         
                   USART1_DR = Buffer[i];  //發送每一位,先發高位
         
                 }
         
                while(!USART1_SR_TXE);
         
                USART1_DR = 32;  //發送空格
         
             }
         
            measurements--;
         
            asm("rim");
         
        }
         
         
         
        void main(void)
         
        {
         
           asm("sim");
         
           
         
           GPIO_Config();
         
         
         
           GPIO_Init(LED_GPIO_PORT, LED_GPIO_PINS, GPIO_Mode_Out_PP_Low_Fast);
         
         
         
           CLK_Config();
         
         
         
           ADC_Config();
         
         
         
           TIM2_Config();
         
         
         
           USART1_Config();
         
           
         
           //DMA_Config();
         
         
         
           asm("rim");
         
         
         
           while (1) {  
         
             PA_ODR_ODR2 = LED;
         
             PA_ODR_ODR3 = LED; }
         
         
         
        }
        關閉窗口

        相關文章

        欧美性色欧美精品视频,99热这里只有精品mp4,日韩高清亚洲日韩精品一区二区,2020国自产拍精品高潮