资源描述
单片机及模数综合系统设计
课题名称:
基于STC12系列单片机的串联型开关电源设计与实现
--单片机控制部分
学
院
专
业
班
级
学
号
姓
名
实验目的:通过编程显示开关电源的输入输出电压。
实验内容:
程序功能主要包括如下几个部分:
1、键盘输入数据部分;
2、数码管数据显示部分;
3、控制PWM输出部分;
4、AD转换部分(完成万用表的功能,即测量开关电源输出电 压);
5、难点:闭环控制算法。即通过AD采集数据控制PWM输出, PWM控制开关电源输出,以达到稳定。即让开关电源输出电压 稳定在用户键盘设定的电压
设计思路:
程序主要包括:A/D转换部分,PWM部分,键盘输入设置电压部分,数码管显示部 分。
(1) 主程序 先进行数码管初始显示,然后通过比较获取电压与预设电压之间的误差,调节占 空比,减小误差,得到更准确的数值。
#include "Include.h"
void Main_System_Init(void)
{
〃相关资源初始化
PWM_Drv_Init();
}
void main(void)
{
unsigned int i = 0x;
extern unsigned int ADC_Result[8];
uchar c=128;
//char xdata DigitBit[8] = {0x31,0x38,'.',0x35,0x35,0x};
//char xdata DispCharBuf[12] = {0x};
extern float setkey;
extern float b;
for(i = 0x;i < 30;i++); //开机延时
Main_System_Init();//系统相关资源初始
while(1)
{
PWM0_Drv_SetDuty(c);//设置初始占空比
keysetV();//调用键盘模块程序,
if(b<setkey)
{
for(;b<setkey;c--)
{PWM0_Drv_SetDuty(c);//设置占空比
ADC_Drv_Service();//ADC中断函数调用,处理ADC结果 b=ADC_Result[ADC_channel]*5.0/1024;
ADC_Drv_Demo();//显示获取的电压值
keysetV();
}
}
else if(b>setkey)
{ for(;b>setkey;c++)
{ PWM0_Drv_SetDuty(c);
ADC_Drv_Service();
b=ADC_Result[ADC_channel]*5.0/1024;
ADC_Drv_Demo();
keysetV();
}
}
else if(b==setkey)
{ PWM0_Drv_SetDuty(c);
ADC_Drv_Service();
b=ADC_Result[ADC_channel]*5.0/1024;
ADC_Drv_Demo();
keysetV();
}
}
}
头文件如下:
#ifndef __INCLUDE_H__
#define __INCLUDE_H__
#define TRUE1
#define FALSE0
#include "stc12c5a60s2.h"
#include "math.h"
#include "stdio.h"
#include "intrins.h"
#include "KeyBoard_Drv.h"
#include 叩 WM_Drv.h"
#include "ADC_Drv.h"
#include "SMG.h"
#include "stdlib.h"
#define uchar unsigned char #endif
(2) 键盘设置输入电压部分
预置初始输入电压为3V。K1按下之后电压减少0.1V;K2按下之后电压增加0.1V;
程序当中引用了郭老师的按键消抖程序。电压最大为4.1V最小为1.1V。
键盘部分程序如下:
include "Include.h"
/************************ 公有变量定义区 ****************************/ sbit k1 = P2人4;
sbit k2 = P2A5;
sbit k3 = P2A6;
sbit k4 = P2A7;
float setkey;
*函数名: key
*函数功能:k1控制电压加0.1; k2控制电压减0.1
*函数参数:无
*返回类型:无
void keysetv()
{
static float a=3.0;
if(k1==0)
{
delay(2);
if(k1==0)
a=a+0.1;
while(!k1);
delay(2);
while(!k1);
}
if(k2==0)
{
delay(2);
if(k2==0)
a=a-0.1;
while(!k2);
delay(2);
while(!k2);
}
if(a>4.1) a=1.1;
if(a<1.1) a=4.1;
setkey=a;
show1(a函数名:delay
10);
}
键盘头文件如下:
#ifndef __KEYBOARD_DRV_H__
#define __KEYBOARD_DRV_H__
extern void keysetv();
#endif
(3)数码管显示部分
实验采用的是4个共阳级数码管。前两位显示获取的电压,后两位显示的是设置 的电压。数码管部分给获取与预置的电压都预先放大了 10倍,然后分别除以10 进行取整取余运算,如何分别显示;由于小数点一直存在,所以我选择了小数点 常亮语句。
程序如下:
#include "include.h
sbit SMG_q = P3A0;//定义数码管阳级控制脚(千位)
sbit SMG_b = P3A1;//定义数码管阳级控制脚(百位)
sbit SMG_s = P3A2;//定义数码管阳级控制脚(十位)
sbit SMG_g = P3A3;//定义数码管阳级控制脚(个位)
unsignedcharcode
Tab[10] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
unsigned int k;
unsigned int j;
unsigned int n;
快速动态扫描
无
无
*函数功能
*函数参数
*返回类型
*说明:
void delay(unsigned int n)
{
unsigned int a,b;
unsigned int m;
for(m=0;m<n;m++)
{
{for(b=12;b>0;b--)// 一毫秒
for(a=29;a>0;a--);
后2位数的数码显示器显示设置电压 k
无
*函数名:showl
*函数功能
*函数参数
*返回类型
*说明:
void show1(unsigned int k) //后两位数码管显示数字k即设定的电压值 {
SMG_s=0; //P1.2引脚输出低电平,数码管十位接通
P0=Tab[k/10];〃显示k十位上的数
delay(5);
SMG_s=1;
SMG_g=0; //P1.3引脚输出低电平,数码管个位接通
P0=Tab[k%10];//显示k个位上的数
delay(5);
SMG_g=1;
SMG_s=0;
P0=0x7f;
delay(5);
SMG_s=1;
}
*函数名:show2
*函数功能:前2位数的数码显示器显示获取电压(只用于ADC_Drv_Demo函
数)
*函数参数:j
*返回类型:无
*说明:
void show2(unsigned int j) //前两位数码管显示数字j即获取的电压值
{ SMG_q=0; //P1. 0引脚输出低电平,数码管千位接通
P0=Tab[j/10]; 〃显示j十位上的数
delay(5);
SMG_q=1;
SMG_b=0; //P1.1引脚输出低电平,数码管百位接通
P0=Tab[j%10];//显示j个位上的数
delay(5);
SMG_b=1; 〃关闭所有显示器
SMG_q=0;
P0=0x7f;
delay(5);
SMG_q=1;
}
数码管头文件如下:
#ifndef __SMG_H__
#define __SMG_H__
extern unsigned char i;
extern unsigned int x;
extern void delay(unsigned int n);
extern void show1(unsigned int k);
extern void show2(unsigned int j);
#endif
(4) A/D转换 与A/D转换相关的寄存器
* 1. P1ASF: P1 模拟功能控制寄存器(只能写,不能读;不可位寻址)
* B7B6 B5 B4 B3 B2 B1 B0
* P17ASFP16ASFP15ASFP14ASFP13ASFP12ASFP11ASFP10ASF
* P1nASF: =1时,P1.n作为模拟功能A/D使用;=0时,P1.n作为普通I/O
*
* 2. ADC_CONTR: ADC控制寄存器(不可位寻址)
* !!建议使用MOV赋值语句,不要用’与’和’或’语句
* B7 B6 B5 B4 B3 B2 B1 B0
* ADC_POWER SPEED1 SPEED0 ADC_FLAG ADC_START CHS2 CHS1 CHS0
* ADC_POWER: ADC电源控制位。0关闭;1开启
* SPEED1,SPEED0: ADC转换速度控制位
* SPEED1 SPEED0 A/D转换所需时间
* 1190个时钟转换一次,SYSClk = 21MHz,AD速度可达250KHz
* 10180个时钟转换一次
* 01360个时钟转换一次
* 540个时钟转换一次
* ADC_FLAG: ADC转换结束标志位。完成时置1,由软件清0!!
* ADC_START: ADC转换启动控制位,置1时开始转换,转换结束后为0
* CHS2/CHS1/CHS0:模拟输入通道选择
* CHS
>2 CHS1
CHS0
Analog Channel Select
* 0
0
0
选择P1.0作为A/D输入来用
* 0
0
1
选择P1.1作为A/D输入来用
* 0
1
0
选择P1.2作为A/D输入来用
* 0
1
1
选择P1.3作为A/D输入来用
* 1
0
0
选择P1.4作为A/D输入来用
* 1
0
1
选择P1.5作为A/D输入来用
* 1
1
0
选择P1.6作为A/D输入来用
* 1
业
1
1
选择作为A/D输入来用
*
* !!
作
注意:
由于是2
套时钟,所以设置ADC_CONTR控制寄存器后,要加4个空操
*
*
*
*
*
*
*
*
取 8 位:ADC'Result = 256 * Vin / Vcc
4. 中断寄存器:IE——EA,EADC( 1允许ADC中断,0禁止)
5. 中断优先级寄存器IP、IP2和IPH、IP2H
IP、IP2中的中断优先控制位分别对应IE各中断允许位
IPH、IPH2中的中断优先控制位分别对应IE2各中断允许位
IPH:中断优先级控制寄存器高(不可位寻址)
*
B7
B6
B5B4B3
B2
B1
B0
*
PX0H
* IP:
*
*
PX0
PPCAH PLVDH PADCH PSHPT1H
中断优先级控制寄存器低(可位寻址)
B7B6B5B4B3
PPCAPLVDPADCPSPT1
PX1H
B2B1
PX1
PT0H
B0 PT0
*
*
*
*
*
*
*
*
*
*
*
*
IP2H:中断优先级控制寄存器2高(不可位寻址)
B7B6B5B4B3
-
IP2:中断优先级控制寄存器2低(不可位寻址)
B7B6B5B4B3
-
PADCH PADC优先级
最低优先级(优先级0)
01较低优先级(优先级1)
10较高优先级(优先级2)
11最高优先级(优先级3)
B2
B2
B1 PSPIH
B1 PSPI
B0
PS2H
B0
PS2
A/D实验程序:
#include "Include.h"
/ unsigned char ADC_channel = 7;
unsigned int ADC_Result[8] = 0; bit ADC_Finish_Flag = FALSE; float b;
************************ 公有变量定义区 ****************************/
//选中哪一个通道的变量(范围0 -- 7)
//保存ADC转换结果
//ADC完成标志
*函数名:ADC_Drv_StartCh
*函数功能:
*函数参数:ChNo,P1.N作为转换通道来用,范围为0~7
*返回类型:void
*说明:
void ADC_Drv_StartCh(unsigned char ChNo)
{
unsigned int Delay = 0x;
P1ASF = P1ASF | (0x01 << ChNo); //初始化相应通道工作在AD模式下
ADC_RES = 0;//Clear previous result
ADC_CONTR = ADC_POWER | ADC_SPEEDLL | ADC_START | ChNo;//
for(Delay = 0x;Delay < 5;Delay++); //ADC power-on and delay
IE = 0xA0 | IE;
EA = 1;
}
*函数名:ADC_Drv_Service
*函数功能:ADC中断函数调用,处理ADC结果
*函数参数:无
*返回类型:void
*说明:
void ADC_Drv_Service(void)
{
ADC_Result[ADC_channel] = ADC_RES;
ADC_Result[ADC_channel] = (ADC_Result[ADC_channel] << 2) | ADC_RESL;
ADC_Finish_Flag = TRUE;
}
*函数名:ADC Drv_Demo
*函数功能:显示获取的电压值
*函数参数:无
*返回类型:void
*说明:
void ADC_Drv_Demo(void)
{
if(ADC_Finish_Flag == TRUE)
{
ADC_Finish_Flag = FALSE;
ADC_Drv_StartCh(ADC_channel);
show2((ADC_Result[ADC_channel]*5.0/1024)*10);
b=ADC_Result[ADC_channel]*5.0/1024;
}
}
A/D头文件如下:
#ifndef __ADC_DRV_H__ #define __ADC_DRV_H__
extern unsigned char ADC_channel; //选中哪一个通道的变量
extern bit ADC_Finish_Flag;//ADC 完成标志
extern void ADC_Drv_InitCh(unsigned char ChNo);
extern void ADC_Drv_StartCh(unsigned char ChNo);
extern void ADC_Drv_Service(void);
extern void ADC_Drv_Demo(void);
#endif
(5)PWM部分
* 1. PCA工作模式寄存器:CMOD
* CMOD:(不可位寻址)
* B7B6B5B4
B3
B2
B1B0
* CIDL--
ECF
-
CPS2
CPS1
CPS0
* CIDL:空闲模式下是否停止PCA计数的控制位。
*当CIDL = 1时,空闲模式下PCA计数器继续工作;
* 当 CIDL = 0 时,
空闲模式下PCA计数器停止工作。
* CPS2、 CPS1、 CPS0:
PCA计数脉冲源选择控制位。如下表:
* CPS2 CPS1 CPS0
选择PCA/PWM时钟源输入
* 0
0, SYSclk/12
* 1
1, SYSclk/2
* 010
2,定时器0的溢出脉冲。通过改变定时器0的溢出率,
*
可以实现可调频率的PWM输出
*
0
1
1
3,
ECI/P1.2(P1.4)脚输入的外部时钟(Vmax=SYSclk/2)
*
1
0
0
4,
SYSclk
*
1
0
1
5,
SYSclk/4
*
1
1
0
6,
SYSclk/6
*
1
1
1
7,
SYSclk/8
* ECF: PCA计数溢出中断使能位。
* 当ECF = 0时,禁止寄存器CCON中CF位的中断;
* 当ECF = 1时,允许寄存器CCON中CF位的中断.
*
* 2. PCA控制寄存器:CCON
* CCON:(可位寻址)
* B7 B6 B5 B4 B3 B2 B1 B0
* CF CR ---- CCF1 CCF0
* CF: PCA计数器阵列溢出标志位。当PCA计数器溢出时,CF由硬件置位。如果
* CMOD寄存器的ECF位置位,测CF标志可用来产生中断。CF位可通过硬件或软 件
*置位,但必须通过软件清零。
* CR: PCA计数器阵列运行控制位。该位通过软件置位,用来启动PCA计数器阵 列
*计数。该位通过软件清零,用来关闭PCA计数器。
* CCF1: PCA模块1中断标志位。当出现匹配或捕获的时该位由硬件置位。该位 *须由软件清零。
* CCF0: PCA模块0中断标志位。当出现匹配或捕获的时该位由硬件置位。该位 必
*须由软件清零。
*
* 3. PCA比较/捕获寄存器CCAPM0和CCAPM1
* PCA模块0的比较/捕获寄存器的格式如下:
* CCAPM0: PCA模块0的比较/捕获寄存器(不可位寻址)
* B7 B6 B5 B4 B3 B2 B1 B0
* - ECOM0 CAPP0 CAPN0 MAT0 TOG0 PWM0 ECCF0
* ECOM0:允许比较器控制位。=1时允许比较;=0时禁止
* CAPP0:正捕获控制位。=1时允许上升沿捕获;=0时禁止
* CAPN0:负捕获控制位。=1时允许下降沿捕获;=0时禁止
* MAT0:匹配控制位。
* =1时,PCA计数值与模块的比较/捕获寄存器的值匹配将置位CCON寄存器的 中
*断标志位CCF0;= 0时无论匹配与否都不置位。
* TOG0:翻转控制位。
* =1时,工作在PCA高数输出模式,PCA计数器的值与模块的比较/捕获寄存器
* 的值匹配将使 CCP0 脚翻转;(CCP0/PCA0/PWM0/P1.3 或 CCP0/PCA0/PWM0/P4.2)
* =0时,不动作。
* PWM0:脉宽调节模式。=1时,允许CEX0脚用作脉宽调节输出。=0时,不动作
* (CCP0/PCA0/PWM0/P1.3 或 CCP0/PCA0/PWM0/P4.2)
* ECCF0:使能CCF0中断。
* =1时,使能寄存器CCON的比较/波或标志CCF0,用来产生中断;=0时,禁能
*
* CCAPM1: PCA模块1的比较/捕获寄存器(不可位寻址)
* B7 B6 B5 B4 B3 B2 B1 B0
* - ECOM1 CAPP1 CAPN1 MAT1 TOG1 PWM1 ECCF1
* ECOM1:允许比较器控制位。=1时允许比较;=0时禁止
* CAPP1 :正捕获控制位。=1时允许上升沿捕获;=0时禁止
* CAPN1 :负捕获控制位。=1时允许下降沿捕获;=0时禁止
* MAT1:匹配控制位。
* =1时,PCA计数值与模块的比较/捕获寄存器的值匹配将置位CCON寄存器的 中
*断标志位CCF1;= 0时无论匹配与否都不置位。
* TOG1:翻转控制位。
* =1时,工作在PCA高数输出模式,PCA计数器的值与模块的比较/捕获寄存器
* 的值匹配将使 CCP1 脚翻转;(CCP1/PCA1/PWM1/P1.4 或 CCP1/PCA1/PWM1/P4.3)
* =0时,不动作。
* PWM1:脉宽调节模式。=1时,允许CEX1脚用作脉宽调节输出。=0时,不动作
* (CCP1/PCA1/PWM1/P1.4 或 CCP1/PCA1/PWM1/P4.3)
* ECCF1 :使能CCF1中断。
* =1时,使能寄存器CCON的比较/波或标志CCF1,用来产生中断;=0时,禁能
*
PCA模块工作模式设定(CCAPMn寄存器,n = 0,1)
*
ECOMn
CAPPn CAPNn
MATn
TOGn
PWMn
ECCFn模块功能
*
0
0
0
0
0
0
0
无
*
1
0
0
0
0
1
0
8位PWM,无中断
*
1
1
0
0
0
1
1
8位PWM,由低变高可产生中断
*
1
0
1
0
0
1
1
8位PWM,由高变低可产生中断
*
1
1
1
0
0
1
1
8位PWM,高->低/低-> 高均中断
*
X
1
0
0
0
0
X
16位捕获,由CCPn/PCAn上升沿触发
*
X
0
1
0
0
0
X
16位捕获,由CCPn/PCAn下升沿触发
*
X
1
1
0
0
0
X
16位捕获,由CCPn/PCAn跳变触发
*
1
0
0
1
0
0
X
16位软件定时器
*
1
0
0
1
1
0
X
16位高速输出
* 4. PCA的16位计数器:CL和CH
* CL和CH复位值均为H,用于保存PCA的装载值
*
* 5.PCA捕获/比较寄存器:CCAPnL(低位字节)和CCAPnH(高位字节)
*当PCA模块用于捕获或比较时,它们用于保存各个模块的16位捕捉计数值;
*当PCA模块用于PWM模块时,它们用来控制输出的占空比。其中n为0或1
*
* 6.PCA 模块 PWM 寄存器 PCA_PWM0 和 PCA_PWM1
* PCA_PWM0: PCA模块0的PWM寄存器
* B7 B6 B5 B4 B3 B2 B1 B0
* - EPC0H EPC0L
* EPC0H:在PWM模式下,与CCAP0H组成9位数
* EPC0L:在PWM模式下,与CCAP0L组成9位数
*
* PCA_PWM1: PCA模块0的PWM寄存器
* B7 B6 B5 B4 B3 B2 B1 B0
* - EPC1H EPC1L
* EPC1H:在PWM模式下,与CCAP1H组成9位数
* EPC1L:在PWM模式下,与CCAP1L组成9位数
*
* 7.将单片机的PCA/PWM功能从P1 是设置到P4 的寄存器AUXR1
* AUXR1寄存器:
* B7 B6 B5 B4 B3 B2 B1 B0
* - PCA_P4 SPI_P4 S2_P4 GF2 ADRJ - DPS
* PCA_P4; 0,缺省 PCA 在 P1 ;(DIDP40 的封装无此 )
* 1,PCA/PWM 从 P1 切换到 P4 :
* ECI 从 P1.2->P4.1;
* PCA0/PWM0 从 P1.3->P4.2;
* PCA1/PWM1 从 P1.4->P4.3;
*
* SPI_P4: 0,缺省 SPI 在 P1 ;
* 1,SPI 从 P1 切换到 P4 :
* SPICLK 从 P1.7->P4.3;
* MISO 从 P1.6->P4.2;
* MOSI 从 P1.5->P4.1;
* SS 从 P1.4->P4.0;
*
* S2_P4: 0,缺省 UART2 在 P1
* 1,UART2 从 P1 切换到 P4 :
* TxD2 从 P1.3->P4.3;
* RxD2 从 P1.2->P4.2; *
* GF2 :通用标志位
*
* ADRJ: 0,10位A/D转换结果的高8位放在ADC_RES寄存器,低2放在ADC_RESL 的
*低2位
* 1,10位A/D转换结果的最高2位放在ADC_RES寄存器的低2位,低8位 放在
* ADC_RESL寄存器
*
* DPS: 0,使用缺省数据指针DPTR0
* 1,使用另一个数据指针DPTR1
PWM实验程序:
#include "Include.h"
sbit PWM0 = P1A3; 〃定义 PWM0 的输出端
sbit PWM1 = P1A4; 〃定义 PWM1 的输出端
/*Define
*/
*函数名:PWM_Drv_Init
*函数功能:P1.3输出PWM0
*函数参数:
*返回类型:
*说明:
void PWM_Drv_Init(void)
{
CCON = 0; //初始化PCA控制寄存器
CL = 0;〃初始化PCA计数器
CH = 0;
//注:为预留定时器T0,此PWM只使用系统时钟作为时钟源。
//以下根据输出频率,选择相应设置
CMOD = 0x08; //SYSclk 作为PWM频率时钟源,则PWM输出频率为
/ 256 = 864 HZ
SYSclk/256 = (FOSC 221184L)
PWM输出频率为
PWM输出频率为
PWM输出频率为
PWM输出频率为
//CMOD = 0x02; //SYSclk/2 作为 PWM 频率时钟源,则 SYSclk/2/256 = (FOSC 221184L)/2 / 256 = 432 HZ //CMOD = 0x0A; //SYSclk/4 作为 PWM 频率时钟源,则 SYSclk/4/256 = (FOSC 221184L)/4 / 256 = 216 HZ //CMOD = 0x0C; //SYSclk/6 作为 PWM 频率时钟源,则 SYSclk/6/256 = (FOSC 221184L)/6 / 256 = 144 HZ //CMOD = 0x0E; //SYSclk/8 作为 PWM 频率时钟源,则 SYSclk/8/256 = (FOSC 221184L)/8 / 256 = 108 HZ //CMOD = 0x; //SYSclk/12作为PWM频率时钟源,则PWM输出频率为
SYSclk/12/256= (FOSC 221184L)/12/ 256 = 72 HZ
CR = 1;
}
*函数名:PWM0_Drv_SetDuty
*函数功能:P1. 3输出PWM0
*函数参数:DutyValue
*返回类型:
*说明:
void PWM0_Drv_SetDuty(unsigned char DutyValue)
{
CCAP0H = CCAP0L = DutyValue// 设置看空比
CCAPM0 = 0x42;
CR = 1;
}
*函数名:PWM1_Drv_SetDuty
*函数功能:P1. 4输出PWM1
*函数参数:
*返回类型:
*说明:
void PWM1_Drv_SetDuty(unsigned char DutyValue)
{
CCAP1H= CCAP1L = DutyValue; //设置看空比
CCAPM1= 0x42;
CR = 1;
}
PWM头文件如下:
#ifndef __PWM_DRV_H__
#define __PWM_DRV_H__
sbit PWM0 = P1A3; 〃定义 PWM0 的输出端
sbit PWM1 = P1A4; 〃定义 PWM1 的输出端
extern void PWM_Drv_Init(void);
extern void PWM0_Drv_SetDuty(unsigned char DutyValue);
extern void PWM1_Drv_SetDuty(unsigned char DutyValue); #endif
心得体会:本次实验虽然最后能完成实验目的,但是在编写程序中还是发现了自 己存在的一些问题,单片机的A/D和PWM模块的具体使用方法掌握的不好,在经 过重新学习之后,终于能够使用他们编写程序。自己对函数命名法不熟悉,有些 还是采用了和其他组一样的命名。在检测的时候,老师提出的问题还不是很清楚, 但是回去后通过网上查询以及跟队友同学讨论,最后明白了为什么,按键按下去 之后熄灭,是因为我运用的是延时函数而不是定时器函数,运用定时器函数就可 以避免这种问题。经过本次实验,进一步加深了自己对单片机的了解,以及巩固 了自己的c语言,以后一定会有计划的学习单片机和c语言。....忽略此处
*作延时才可以正确读到ADC_CONTR寄存器的值!
*
* 3. ADC_RES: A/D转换结果高位寄存器;ADC_RESL: A/D转换结果低位寄存器
*调整AUXR1寄存器(不可位寻址)中的第二位ADRJ控制数据存放格式。
* ADRJ = 0 时,(ADC_RES[7:0],ADC_RESL[1:0])
* 取 10 位:ADC'Result = 1024 * Vin / Vcc
* 取 8 位:ADC'Result = 256 * Vin / Vcc
*
* ADRJ = 1 时,(ADC_RES[1:0],ADC_RESL[7:0])
* 取 10 位:ADC'Result = 1024 * Vin / Vcc
展开阅读全文