久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

專注電子技術學習與研究
當前位置:單片機教程網 >> 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; }
 
 
 
}
關閉窗口

相關文章

主站蜘蛛池模板: 国产精品无码专区在线观看 | 九九九视频在线观看 | 久久久999国产精品 中文字幕在线精品 | 国产精品a久久久久 | 久久99精品久久久久久青青日本 | 久久一区二区三区四区 | 91九色视频在线 | 久久久久国产精品一区 | 欧美日韩国产精品一区 | 最新av片| 亚洲一区 中文字幕 | 特级丰满少妇一级aaaa爱毛片 | 一级毛片在线播放 | 欧美专区在线 | 国产精品久久久久一区二区三区 | 国产精品区二区三区日本 | 97视频久久 | 日韩α片 | 黄色成人免费看 | 中文字幕 国产 | 婷婷在线网站 | 欧美a级成人淫片免费看 | 黄色片在线 | 一区二区视屏 | 亚洲欧美日韩在线 | 伊人色综合久久久天天蜜桃 | 少妇黄色 | 91色视频在线观看 | 最新中文字幕久久 | 欧美一级在线 | 91视频大全 | 91看片视频 | 欧美精品一区在线观看 | 国产精品一区二区视频 | 欧洲视频一区二区 | 中文字幕av色 | 日韩精品视频在线 | 国产在线视频在线观看 | 超碰av免费| 男女视频在线免费观看 | 伊人久久综合 |