找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 6886|回復: 0
收起左側(cè)

stm32_adc轉(zhuǎn)換,模擬輸入端為PB0

[復制鏈接]
ID:267195 發(fā)表于 2017-12-26 16:26 | 顯示全部樓層 |閱讀模式
stm32_adc轉(zhuǎn)換,模擬輸入端為PB0
單片機源程序如下:
  1. #include "stm32f10x.h"
  2. #include "public.h"                                

  3. u16 Value;
  4. u16 voltage;
  5. u16 ge;
  6. u16 shi;
  7. u16 bai;
  8. u16 qian;
  9. u16 wan;
  10. void delay(u32 i)         
  11. {
  12.         while(i--);
  13. }

  14. void RCC_Configuration()
  15. {
  16.         SystemInit();                                                                                 //系統(tǒng)時鐘初始化
  17.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//打開端口A的時鐘
  18.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);//打開端口B的時鐘
  19.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);//打開端口C的時鐘
  20.         RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);//打開TIM2的時鐘
  21.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);//打開ADC1的時鐘
  22. }

  23. void GPIO_Configuration()                                                         
  24. {
  25.         GPIO_InitTypeDef GPIO_InitStructure;                                  //聲明一個結(jié)構(gòu)體
  26.         GPIO_InitStructure.GPIO_Pin=GPIO_Pin_All;                          //選擇你要設置的IO口
  27.         GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;                //設置推挽輸出模式
  28.         GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;                 //設置傳輸速率
  29.         GPIO_Init(GPIOB,&GPIO_InitStructure);                                     // 初始化GPIOB
  30.         GPIO_Init(GPIOC,&GPIO_InitStructure);                                     // 初始化GPIOC
  31.         GPIO_SetBits(GPIOB,GPIO_Pin_All);                                         //為LCD各引腳拉高電平
  32.         GPIO_SetBits(GPIOC,GPIO_Pin_All);
  33.         GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0;
  34.         GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AIN;                        //PB0設為模擬輸入腳
  35.         GPIO_Init(GPIOB,&GPIO_InitStructure);               
  36.         
  37. }

  38. void LcdWriteCom(u8 com)                                 //向LCD寫入命令        //LCD_E =PC15;LCD_RW=PC14;LCD_RS=PC13;LCD_DATA=PA0~PA7
  39. {        
  40.         u16 zhi;
  41.         zhi=com;
  42.         zhi=zhi<<8;                                                                        
  43.         GPIO_ResetBits(GPIOC,GPIO_Pin_15);        //LCD_E =0;                //使能清零
  44.         GPIO_ResetBits(GPIOC,GPIO_Pin_13);        //LCD_RS=0;                 //選擇寫入命令
  45.         GPIO_ResetBits(GPIOC,GPIO_Pin_14);        //LCD_RW=0;                 //選擇寫入
  46.         GPIO_Write(GPIOB,zhi);                                 //LCD_DATA        
  47.         delay(10000);                                                 //Delay1ms(1);        //6000000約為1S
  48.         GPIO_SetBits(GPIOC,GPIO_Pin_15);          //LCD_E =1;                 //寫入時序
  49.         delay(50000);                                                 //Delay1ms(5);        //5mS以上
  50.         GPIO_ResetBits(GPIOC,GPIO_Pin_15);        //LCD_E =0;
  51.         zhi=zhi<<4;
  52.         GPIO_Write(GPIOB,zhi);                                //發(fā)送com的低四位
  53.         delay(10000);                                                 //Delay1ms(1);        //6000000約為1S
  54.         GPIO_SetBits(GPIOC,GPIO_Pin_15);          //LCD_E =1;                 //寫入時序
  55.         delay(50000);                                                 //Delay1ms(5);        //5mS以上
  56.         GPIO_ResetBits(GPIOC,GPIO_Pin_15);        //LCD_E =0;
  57. }

  58. void LcdWriteData(u8 dat)                                 //向LCD寫入數(shù)據(jù)
  59. {
  60.         u16 zhi;
  61.         zhi=dat;
  62.         zhi=zhi<<8;
  63.         GPIO_ResetBits(GPIOC,GPIO_Pin_15);        //LCD_E =0;                  //使能清零
  64.         GPIO_SetBits(GPIOC,GPIO_Pin_13);          //LCD_RS=1;                  //選擇寫入數(shù)據(jù)
  65.         GPIO_ResetBits(GPIOC,GPIO_Pin_14);        //LCD_RW=0;                  //選擇寫入
  66.         GPIO_Write(GPIOB,zhi);                                //LCD_DATA
  67.         delay(10000);                                                 //Delay1ms(1);        
  68.         GPIO_SetBits(GPIOC,GPIO_Pin_15);          //LCD_E =1;                  //寫入時序
  69.         delay(50000);                                                 //Delay1ms(5);        //5mS以上
  70.         GPIO_ResetBits(GPIOC,GPIO_Pin_15);        //LCD_E =0;
  71.         zhi=zhi<<4;
  72.         GPIO_Write(GPIOB,zhi);                                //發(fā)送dat的低四位
  73.         delay(10000);                                                 //Delay1ms(1);
  74.         GPIO_SetBits(GPIOC,GPIO_Pin_15);          //LCD_E =1;                  //寫入時序
  75.         delay(50000);                                                 //Delay1ms(5);
  76.         GPIO_ResetBits(GPIOC,GPIO_Pin_15);        //LCD_E =0;
  77. }

  78. void SendString_LCD(u8 *s)
  79. {
  80.         while(*s!='\0')               
  81.           {
  82.                   LcdWriteData(*s);
  83.                   s++;
  84.           }
  85. }

  86. void LCD_Configuration()                                                
  87. {
  88.         LcdWriteCom(0x32);                //將8位總線轉(zhuǎn)為4位總線
  89.         LcdWriteCom(0x28);                //在四位線下的初始化
  90.         LcdWriteCom(0x0c);            //開顯示,設光標
  91.         LcdWriteCom(0x06);          //寫一個指針加1
  92.         LcdWriteCom(0x01);          //清屏
  93.         LcdWriteCom(0x80);          //設置數(shù)據(jù)指針起點
  94. }

  95. void LCD_NewChar()
  96. {
  97.         u8 i;
  98.         u8 table0[]={0x1E,0x02,0x12,0x1F,0x01,0x1F,0x01,0x03};
  99.         u8 table1[]={0x0A,0x1F,0x04,0x1F,0x04,0x0F,0x15,0x07};
  100.         u8 table2[]={0x1C,0x05,0x06,0x05,0x04,0x05,0x03,0x00};

  101.         LcdWriteCom(0x40);
  102.         for(i=0;i<8;i++)
  103.                 LcdWriteData(table0[i]);        //將代碼寫入CGRAM中
  104.         for(i=0;i<8;i++)
  105.                 LcdWriteData(table1[i]);        //將代碼寫入CGRAM中
  106.         for(i=0;i<8;i++)
  107.                 LcdWriteData(table2[i]);        //將代碼寫入CGRAM中
  108. }

  109. void ADC_Configuration()
  110. {
  111.         ADC_InitTypeDef   ADC_InitStructure;                                              //聲明一個結(jié)構(gòu)體
  112.         RCC_ADCCLKConfig(RCC_PCLK2_Div4);                                                        //配置ADC時鐘分頻
  113.         ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;                        //獨立工作模式
  114.           ADC_InitStructure.ADC_ScanConvMode = ENABLE;                                 //使能多通道掃描模式
  115.           ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;                        //連續(xù)轉(zhuǎn)換模式
  116.          ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;        //軟件啟動轉(zhuǎn)換
  117.          ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;                //ADC數(shù)據(jù)右對齊
  118.          ADC_InitStructure.ADC_NbrOfChannel = 1;                                                //指定將轉(zhuǎn)換的ADC通道的數(shù)量
  119.          ADC_Init(ADC1, &ADC_InitStructure);                                                 //初始化ADC
  120.          ADC_RegularChannelConfig(ADC1, ADC_Channel_8, 1, ADC_SampleTime_55Cycles5); //ADC1選擇信道8,轉(zhuǎn)換順序1,采樣時間55.5周期         
  121.     ADC_Cmd(ADC1, ENABLE);                                                                                //使能ADC1
  122.     ADC_ResetCalibration(ADC1);                                                                 //重置ADC1校準寄存器
  123.     while(ADC_GetResetCalibrationStatus(ADC1));                                        //等待ADC1校準重置完成
  124.     ADC_StartCalibration(ADC1);                                                                        //開始ADC1校準
  125.     while(ADC_GetCalibrationStatus(ADC1));                                                //等待ADC1校準完成
  126.     ADC_SoftwareStartConvCmd(ADC1, ENABLE);                                         //使能ADC1軟件開始轉(zhuǎn)換
  127. }

  128. int main()
  129. {        
  130.         RCC_Configuration();
  131.         GPIO_Configuration();
  132.         LCD_Configuration();                                                        
  133.         SendString_LCD("1428401034");
  134.         LcdWriteCom(0xC0);                                                                //設置數(shù)據(jù)指針起點
  135.         ADC_Configuration();
  136.         while(1)
  137.         {
  138.                 delay(10000000);
  139.                 Value=ADC_GetConversionValue(ADC1);
  140.                 voltage=Value*323/4095;
  141.                 ge=voltage%10;
  142.                 shi=voltage/10%10;        
  143.                 bai=voltage/100%10;
  144.                 qian=voltage/1000%10;
  145.                 wan=voltage/1000%10;
  146.                 LcdWriteCom(0xC0);                                                        //設置數(shù)據(jù)指針起點
  147.                 LcdWriteData(bai+'0');
  148.                 LcdWriteData('.');        
  149.                 LcdWriteData(shi+'0');        
  150.                 LcdWriteData(ge+'0');
  151.                 LcdWriteData('V');               
  152.         }        
  153. }
復制代碼

所有資料51hei提供下載:
STM32_ADC.rar (359.65 KB, 下載次數(shù): 47)


回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復 返回頂部 返回列表