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

專注電子技術(shù)學(xué)習(xí)與研究
當(dāng)前位置:單片機(jī)教程網(wǎng) >> STM32 >> 瀏覽文章

STM8單片機(jī)ADC、Timer、USART實(shí)用例程

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

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

 
 
 
#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;  // 應(yīng)是16,但只能置三位,所以是111  fCK_PSC / 2(PSC[2:0]).
 
  // TIM2_PSCRL = 0x3F;  // PSCR=0x1F3F,f=8M/(0x1F3F+1)=1000Hz,每個計(jì)數(shù)周期1ms
 
  TIM2_ARRH = 0x00;  // 自動重載寄存器ARR=0x01F4=500
 
  TIM2_ARRL = 0x18;  // 24X4us=96us   每記數(shù)500次產(chǎn)生一次中斷,即500ms
 
  TIM2_IER = 0x01;   // 允許更新中斷
 
  TIM2_CR1 = 0x05;   // 計(jì)數(shù)器使能,開始計(jì)數(shù),只允許更新中斷請求
 
}
 
 
 
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; //提取十進(jìn)制每一位,并轉(zhuǎn)換成ASCII碼
 
           factor10 = factor10 / 10;
 
           while(!USART1_SR_TXE);
 
           USART1_DR = Buffer[i];  //發(fā)送每一位,先發(fā)高位
 
         }
 
        while(!USART1_SR_TXE);
 
        USART1_DR = 32;  //發(fā)送空格
 
     }
 
    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; }
 
 
 
}
關(guān)閉窗口

相關(guān)文章

主站蜘蛛池模板: 免费在线观看一区二区三区 | 超碰在线97国产 | 欧美一级小视频 | 久久国产婷婷国产香蕉 | 成人精品一区 | 日韩欧美在线播放 | 国产精品久久精品 | 精品久久久久久久久久久久久久 | 国产情侣一区 | 美女国内精品自产拍在线播放 | 久久久精品一区二区三区 | 美女艹b | 亚洲欧洲视频 | 成人国产精品久久久 | 二区视频 | av在线一区二区三区 | 亚洲精品一区二区三区四区高清 | 不卡av电影在线播放 | 欧美高清视频一区 | 天堂久久天堂综合色 | 日韩精品在线播放 | 成人国产午夜在线观看 | 三级视频在线观看电影 | 久草视频在线播放 | 蜜桃视频在线观看免费视频网站www | 中文字幕成人 | 久久婷婷香蕉热狠狠综合 | 老外几下就让我高潮了 | 99国内精品久久久久久久 | 日韩欧美在线一区 | 欧美 日本 国产 | 久久久国产一区二区三区四区小说 | 欧美精品久久久久 | 国产精品成人品 | 欧美专区在线 | 中文字幕一区二区三区精彩视频 | 成人精品一区二区三区中文字幕 | 日韩中文字幕2019 | 极品电影院 | 久草免费在线视频 | 久久人体视频 |