1、第10章 A/D转换单片机原理及应用系统设计 自然界中的物理量大多是模拟信号,如温度、压力、位移自然界中的物理量大多是模拟信号,如温度、压力、位移、转速等,单片机在采集模拟信号时,一般先根据实际的、转速等,单片机在采集模拟信号时,一般先根据实际的物理量借助相应的传感器将其转为物理量借助相应的传感器将其转为电信号(电压或电流)电信号(电压或电流)。然后再将电信号转换为对应的数字量输入到单片机进行信然后再将电信号转换为对应的数字量输入到单片机进行信号处理,在这过程中,把实现模拟量转换为数字量的器件号处理,在这过程中,把实现模拟量转换为数字量的器件称为称为模数转换器模数转换器,也称,也称A/DA/D
2、转换器转换器。第第1010章章 A/D转换转换10.1 A/D10.1 A/D转换原理及性能指标转换原理及性能指标 一般的一般的A/DA/D转换过程包括三个部分:转换过程包括三个部分:采样保持采样保持、量化量化和和编码编码。首先,对输入的模拟电压信号采样即将模拟信号在时间首先,对输入的模拟电压信号采样即将模拟信号在时间上离散化,结束后进入保持时间。上离散化,结束后进入保持时间。其次,在这段时间内将采样的电压量转化为数字量即在其次,在这段时间内将采样的电压量转化为数字量即在幅度上离散化。幅度上离散化。最后,将每个量化后的样值用一定的二进制码来表示转最后,将每个量化后的样值用一定的二进制码来表示转
3、换结果。换结果。为确保转换结果的精确度,为确保转换结果的精确度,A/DA/D转换器必须满足一定的转换转换器必须满足一定的转换精度和速度。转换精度和转换速度是衡量精度和速度。转换精度和转换速度是衡量A/DA/D转换器的重要转换器的重要技术指标。此外还有分辨率、量程、量化误差、线性度等。技术指标。此外还有分辨率、量程、量化误差、线性度等。1.1.分辨率分辨率 分辨率表示分辨率表示A/DA/D转换器对微小输入信号变化的敏感程度,转换器对微小输入信号变化的敏感程度,通常用转换后数字量的位数来表示。通常用转换后数字量的位数来表示。N N位转换器,其数字量变化范围为位转换器,其数字量变化范围为0 02 2
4、N N-1-1。例如例如8 8位位A/DA/D转换器,输入转换器,输入5V5V满量程电压,则分辨率为满量程电压,则分辨率为5/25/28 8=19.5mV=19.5mV。3.3.量化误差量化误差 量化误差是量化误差是A/DA/D转换器实际输出的数字量与理论输出数字转换器实际输出的数字量与理论输出数字量之间的差值。量之间的差值。一般是由于一般是由于A/DA/D转换器的分辨率有限引起的。转换器的分辨率有限引起的。量化误差在量化误差在1/2LSB(1/2LSB(最低有效位最低有效位)之间。之间。2.2.转换精度转换精度 转换精度是指与数字输出量所对应的模拟输入量的实际值转换精度是指与数字输出量所对应
5、的模拟输入量的实际值与理论值之间的差值。与理论值之间的差值。A/DA/D转换电路中与每个数字量对应的模拟输入量并非是一转换电路中与每个数字量对应的模拟输入量并非是一个单一的数值,而是一个范围值个单一的数值,而是一个范围值,其中其中 的大小理论上取决的大小理论上取决于分辨率。定义于分辨率。定义 为数字量的最小有效位为数字量的最小有效位LSBLSB。4.4.转换时间转换时间 转换时间是转换时间是A/DA/D转换器完成一次转换所需的时间,单位为转换器完成一次转换所需的时间,单位为SPS(Sample Per Second)SPS(Sample Per Second)每秒采样点数,常称为每秒采样点数,
6、常称为采样频率采样频率。一般转换速率越快越好,常见的有高速(转换时间一般转换速率越快越好,常见的有高速(转换时间1s1s),中速(转换时间中速(转换时间1ms1ms)和低速(转换时间)和低速(转换时间1s1s)等。)等。在实际应用中,应从系统数据总的位数、精度要求、输入在实际应用中,应从系统数据总的位数、精度要求、输入模拟信号的范围及输入信号极性等方面综合考虑模拟信号的范围及输入信号极性等方面综合考虑A/DA/D转换转换器的选用。器的选用。10.2 IAP15W4K58S410.2 IAP15W4K58S4单片机单片机A/DA/D模块的结构模块的结构 IAP15W4K58S4IAP15W4K5
7、8S4单片机集成有单片机集成有8 8路路1010位高速电压输入型模拟位高速电压输入型模拟转换器(转换器(ADCADC),转换方式为转换方式为逐次逼近式逐次逼近式,频率可达,频率可达300kHZ300kHZ(3030万次万次/秒)。秒)。10.2.1 A/D10.2.1 A/D转换器的结构转换器的结构 IAP15W4K58S4IAP15W4K58S4单片机单片机ADC(A/DADC(A/D转换器转换器)的结构如下图的结构如下图10-110-1所示。所示。其输入通道与其输入通道与P1P1端口复用,系统上电复位后,端口复用,系统上电复位后,P1P1口默认为口默认为弱上拉弱上拉I/OI/O口,可通过设
8、置口,可通过设置P1ASFP1ASF寄存器的相应位将对应引寄存器的相应位将对应引脚设置为脚设置为ADCADC输入通道。输入通道。图图10-1 IAP15W4K58S410-1 IAP15W4K58S4单片机单片机ADCADC转换器结构图转换器结构图 IAP15W4K58S4IAP15W4K58S4单片机的单片机的ADCADC由多路选择开关、比较器、逐次比较寄由多路选择开关、比较器、逐次比较寄存器、存器、1010位位DACDAC、转换结果寄存器、转换结果寄存器(ADC_RES(ADC_RES和和ADC_RESL)ADC_RESL)以及以及ADCADC控制寄存器(控制寄存器(ADC_CONTRAD
9、C_CONTR)等构成。)等构成。IAP15W4K58S4IAP15W4K58S4单片机的单片机的ADCADC是逐次比较型是逐次比较型ADCADC,由一个比较器和,由一个比较器和D/AD/A转换器构成,通过逐次比较,从最高位转换器构成,通过逐次比较,从最高位(MSB)(MSB)开始,顺序地对每开始,顺序地对每一输入电压与内置一输入电压与内置D/AD/A转换器输出进行比较,经过多次比较,使转换转换器输出进行比较,经过多次比较,使转换所得的数字量逐次逼近输入模量对应值,转换结束,将转换结果保存所得的数字量逐次逼近输入模量对应值,转换结束,将转换结果保存到到ADCADC转换结果寄存器转换结果寄存器A
10、DC_RESADC_RES和和ADC_RESLADC_RESL,同时,置位,同时,置位ADCADC控控制寄存器制寄存器ADC_CONTRADC_CONTR中的中的A/DA/D转换结束标志位转换结束标志位ADC_FLAG,ADC_FLAG,以供程序以供程序查询或发出中断申请。查询或发出中断申请。8 8位逐次逼近位逐次逼近A/DA/D转换器,若参考电压为转换器,若参考电压为5V5V,档输入电压为,档输入电压为2.52V2.52V时,时,输出的数字量是什么?输出的数字量是什么?分析:参考电压为分析:参考电压为5V5V的的8 8位位A/DA/D转换,其量化电平为转换,其量化电平为10.2.2 A/D1
11、0.2.2 A/D转换器的相关寄存器转换器的相关寄存器 IAP15W4K58S4IAP15W4K58S4单片机的单片机的ADCADC相关寄存器主要有:相关寄存器主要有:P1P1口模拟功能控制寄存器口模拟功能控制寄存器P1ASFP1ASF ADCADC控制寄存器控制寄存器ADC_CONTRADC_CONTR A/DA/D转换结果寄存器转换结果寄存器ADC_RESADC_RES、ADC_RESLADC_RESL10.2.2 A/D转换器的相关寄存器转换器的相关寄存器1.P11.P1口模拟功能控制寄存器口模拟功能控制寄存器P1ASFP1ASF 寄存器寄存器P1ASF控制控制P1口口8个个I/O的功能
12、。的功能。P1ASF寄存器(地寄存器(地址为址为9DH,复位值为,复位值为0000 0000B)各位定义如表)各位定义如表10-1所示:所示:P1nASF(n=07),P1.0P1.7为功能控制位:为功能控制位:当当P1nASF=0,对应引脚为基本对应引脚为基本I/O。当当P1nASF=1,对应引脚为对应引脚为ADC的相应输入通道。的相应输入通道。P1ASF寄存器不能位寻址,可采用字节操作。实际程序中可采用控制寄存器不能位寻址,可采用字节操作。实际程序中可采用控制位与位与1相或实现置相或实现置1的原理,如执行语句的原理,如执行语句P1ASF|1=0X01,使,使P1.作为作为模拟输入通道。模拟
13、输入通道。2.ADC控制寄存器控制寄存器ADC_CONTR ADC_CONTR寄存器主要用于设定寄存器主要用于设定ADC转换输入通道、转转换输入通道、转换速度和启动、转换结束标志等。换速度和启动、转换结束标志等。ADC_CONTR寄存器(地址为寄存器(地址为BCH,复位值为,复位值为0000 0000B)的各位定义如表的各位定义如表10-2所示:所示:ADC_POWER:ADC 电源控制位。电源控制位。ADC_POWER=0,关闭,关闭ADC 电源。电源。ADC_POWER=1,打开,打开ADC电源。电源。建议进入空闲模式和掉电模式前,将建议进入空闲模式和掉电模式前,将ADCADC电源关闭,可
14、降低功耗。电源关闭,可降低功耗。启动启动A/DA/D转换前一定要确认转换前一定要确认A/DA/D电源已打开,电源已打开,A/DA/D转换结束后可关闭转换结束后可关闭A/DA/D电源,也可不关闭。初次打开内部电源,也可不关闭。初次打开内部A/DA/D转换模拟电源,需适当延时转换模拟电源,需适当延时,等内部模拟电源稳定后,再启动,等内部模拟电源稳定后,再启动A/DA/D转换。建议在转换结束之前,不转换。建议在转换结束之前,不改变任何改变任何I/OI/O口的状态,这样有利于高精度口的状态,这样有利于高精度A/D A/D 转换。转换。IAP15W4K58S4IAP15W4K58S4单片机的参考电压源是
15、输入工作电压单片机的参考电压源是输入工作电压VccVcc,一般不用外接,一般不用外接参考电压源。若参考电压源。若V Vcccc不稳定,则在不稳定,则在8 8路路A/DA/D转换的任意一个通道外接一个转换的任意一个通道外接一个稳定的参考电压源,来计算出此时的工作电压稳定的参考电压源,来计算出此时的工作电压V Vcccc,再计算出其他,再计算出其他A/DA/D转转换通道的电压。换通道的电压。ADC_FLAG:A/D转换结束标志位。转换结束标志位。ADC_FLAG=0,ADC转换没有结束。转换没有结束。ADC_FLAG=1,ADC转换结束。转换结束。不管不管A/D 转换是工作于中断还是查询方式,当转
16、换是工作于中断还是查询方式,当A/D转换结束后,转换结束后,必须通过软件将必须通过软件将ADC_FLAG清清0。ADC_START:ADC转换启动控制位。转换启动控制位。ADC_START=0,ADC转换停止。转换停止。ADC_START=1,ADC转换开始。转换开始。3.ADC转换结果调整寄存器位转换结果调整寄存器位ADRJ A D C 转 换 结 果 调 整 寄 存 器 位转 换 结 果 调 整 寄 存 器 位 A D R J 位 于 寄 存 器位 于 寄 存 器CLK_DIV/PCON中,用于控制中,用于控制ADC转换结果存放的位置。转换结果存放的位置。其各位定义如表其各位定义如表10-
17、5所示。所示。ADRJ:ADC转换结果存储格式调整控制位转换结果存储格式调整控制位ADRJ=0:ADC_RES存放高存放高8位位ADC结果,结果,ADC_RESL存放低存放低2位位ADC结果。结果。ADRJ=1:ADC_RES存放高存放高2位位ADC结果,结果,ADC_RESL存放低存放低8位位ADC结果结果4.A/D转换结果寄存器转换结果寄存器ADC_RES、ADC_RESL 特殊功能寄存器特殊功能寄存器ADC_RES和和ADC_RESL寄存器用于保存寄存器用于保存A/D转转 换结果。换结果。其存储格式如下表其存储格式如下表10-6和和9-7所示。所示。A/D转换结果计算公式如下:转换结果计
18、算公式如下:ADRJ=0,取,取10位结果(位结果(ADC_RES7:0,ADC_REL1:0)D=1024*Vin/Vcc ADRJ=0,取,取8位结果(位结果(ADC_RES7:0,)=256*Vin/Vcc ADRJ=1,取,取10位结果(位结果(ADC_RES1:0,ADC_REL7:0,)D=1024*Vin/Vcc 式中,式中,Vin为模拟输入通道输入电压,为模拟输入通道输入电压,Vcc为单片机实际工为单片机实际工作电压,用单片机工作电压作为作电压,用单片机工作电压作为模拟参考电压模拟参考电压。5.与与A/D转换中断相关的寄存器转换中断相关的寄存器(1 1)中断允许寄存器)中断允许
19、寄存器IEIE 中断允许寄存器中断允许寄存器IEIE地址为地址为A8HA8H,可位寻址。,可位寻址。格式如表格式如表10-810-8所示:所示:EA:CPU的中断总控制标志的中断总控制标志 EA=1,CPU 允许中断,允许中断,EA=0,CPU 屏蔽所有的中断申请。屏蔽所有的中断申请。EADC:A/D转换中断允许位转换中断允许位 EADC=1,允许,允许A/D转换中断,转换中断,EADC=0,禁止,禁止A/D转换中断。转换中断。(2 2)中断优先级控制寄存器)中断优先级控制寄存器IPIP 中断优先级控制寄存器地址为中断优先级控制寄存器地址为B8HB8H,可位寻址。,可位寻址。其格式如表其格式如
20、表10-910-9所示:所示:PADC:A/D 转换中断优先级控制位。转换中断优先级控制位。当当PADC=0 时,时,A/D转换中断为最低优先级中断转换中断为最低优先级中断(优先级优先级0)当当PADC=1 时,时,A/D转换中断为最高优先级中断转换中断为最高优先级中断(优先级优先级1)10.3 IAP15W4K58S4单片机单片机A/D转换的应用转换的应用 IAP15W4K58S4单片机单片机A/D转换的应用编程要点如下:转换的应用编程要点如下:(1)设置)设置ADC_CONTR寄存器中的寄存器中的ADC_POWER=1,打开,打开ADC电源。电源。(2)延时大约)延时大约1ms,等待,等待
21、ADC内部电源稳定。内部电源稳定。(3)设置)设置P1ASF寄存器相关位,选择寄存器相关位,选择P1口相应引脚为口相应引脚为A/D转换模拟输入通道。转换模拟输入通道。(4)设置)设置ADC_CONTR寄存器中的寄存器中的CHS2CHS0,选择,选择ADC输入通道。输入通道。(5)设置)设置CLK_DIV寄存器中的寄存器中的ADRJ,选择转换结果存储格式。,选择转换结果存储格式。(6)启动)启动ADC。(7)若采取查询法,查询)若采取查询法,查询ADC_FLAG位判断转换是否完成,完成则读取转位判断转换是否完成,完成则读取转 换结果。若采取中断法,开换结果。若采取中断法,开ADC中断,在中断服务
22、程序中读取转换结中断,在中断服务程序中读取转换结 果并清除果并清除ADC_FLAG位。位。【例例1】利用利用IAP15W4K58S4单片机中的单片机中的ADC转换器对输入电压进转换器对输入电压进行测量并显示在数码管上。请编写单片机程序。行测量并显示在数码管上。请编写单片机程序。解:解:C语言源程序代码如下:语言源程序代码如下:#include stc15w4k32s4.h /包含单片机头文件包含单片机头文件#include tm1638.h /包含数码管显示头文件包含数码管显示头文件#include /包含该文件可以使用包含该文件可以使用_nop_()函数函数#define VCC 5000
23、/定义电源电压定义电源电压#define ADC_POWER 0 x80 /ADC控制位定义,控制位定义,ADC电源控制位电源控制位#define ADC_FLAG 0 x10 /ADC转换完成标记转换完成标记#define ADC_START 0 x08 /ADC开始转换标记开始转换标记#define ADC_SPEEDLL 0 x00 /ADC转换速率转换速率540时钟时钟#define ADC_SPEEDL 0 x20 /ADC转换速率转换速率360时钟时钟#define ADC_SPEEDH 0 x40 /ADC转换速率转换速率180时钟时钟#define ADC_SPEEDHH 0
24、x60 /ADC转换速率转换速率90时钟时钟10.3 IAP15W4K58S4单片机单片机A/D转换的应用转换的应用/*ADC通道定义通道定义*/#define ADC_CHANNEL0 0 x00 /转换通道转换通道P1.0#define ADC_CHANNEL1 0 x01 /转换通道转换通道P1.1#define ADC_CHANNEL2 0 x02 /转换通道转换通道P1.2#define ADC_CHANNEL3 0 x03 /转换通道转换通道P1.3#define ADC_CHANNEL4 0 x04 /转换通道转换通道P1.4#define ADC_CHANNEL5 0 x05
25、/转换通道转换通道P1.5#define ADC_CHANNEL6 0 x06 /转换通道转换通道P1.6#define ADC_CHANNEL7 0 x07 /转换通道转换通道P1.7/*ADC端口模拟功能端口模拟功能*/#define P1ASF_00 x01 /设置设置P1.0口为口为ADC端口端口#define P1ASF_10 x02 /设置设置P1.1口为口为ADC端口端口#define P1ASF_20 x04 /设置设置P1.2口为口为ADC端口端口#define P1ASF_30 x08 /设置设置P1.3口为口为ADC端口端口#define P1ASF_40 x10 /设置
26、设置P1.4口为口为ADC端口端口#define P1ASF_50 x20 /设置设置P1.5口为口为ADC端口端口#define P1ASF_60 x40 /设置设置P1.6口为口为ADC端口端口#define P1ASF_70 x80 /设置设置P1.7口为口为ADC端口端口/*定义全局变量定义全局变量 */unsigned char ADCCnt=0;unsigned int ADCResult=0;unsigned long int ADCSum=0;/*函数声明函数声明 */void IO_Init(void);void ADC_Init(void);void ADC_Process
27、(void);void Delay_ms(unsigned int ms);unsigned int ADC_GetResult(unsigned char ch);void main(void)/主函数主函数 IO_Init();/端口初始化端口初始化ADC_Init();/ADC初始化初始化 TM1638_Init();/TM1638初始化初始化 while(1)ADC_Process();/ADC数据采集并且处理数据采集并且处理 Delay_ms(10);/适当延时,无需采集过快适当延时,无需采集过快 void ADC_Process(void)/ADC数据处理函数数据处理函数 ADCS
28、um+=ADC_GetResult(ADC_CHANNEL2);/从从AD通道采集数据,通道采集数据,/并且进行累加并且进行累加 ADCCnt+;/计数器加计数器加1 if(ADCCnt=32)/如果累加到如果累加到32个数据,则开始处理个数据,则开始处理 ADCCnt=0;ADCSum=ADCSum5;/(ADCSum5)等价于等价于(ADCSum/32),/对对32个数据取平均个数据取平均 ADCSum=ADCSum*VCC/1024;/ADC=(Vin/Vref)*1024,根据,根据 /ADC计算公式进行转换计算公式进行转换 ADCResult=(unsigned int)ADCSum
29、;/保存转换结果并进行类型转换,保存转换结果并进行类型转换,/方便显示方便显示 ADCSum=0;/清除清除AD暂存变量暂存变量 ToDisplayBuf(ADCResult);/显示测量结果显示测量结果void Delay_ms(unsigned int ms)/延时函数延时函数 unsigned int i;while(ms-)!=0)for(i=0;i 580;i+);void ADC_Init(void)/ADC初始化函数初始化函数P1ASF|=P1ASF_2;/P1.2口做为口做为AD转换通道转换通道ADC_RES=0;/ADC数据寄存器清零数据寄存器清零ADC_CONTR=ADC_
30、POWER|ADC_SPEEDLL;/打开打开AD转换器转换器 /电源,设置转换速率电源,设置转换速率Delay_ms(2);/延时延时2ms,等待,等待ADC上电稳定上电稳定/*获取获取ADC转换的结果转换的结果*/unsigned int ADC_GetResult(unsigned char ch)unsigned int ADC_Value;ADC_CONTR=ADC_POWER|ADC_SPEEDLL|ch|ADC_START;/启动启动ADC _nop_();/延时延时 _nop_();_nop_();_nop_();while(!(ADC_CONTR&ADC_FLAG);/等待等
31、待AD转换完成转换完成 ADC_CONTR&=ADC_FLAG;/清除转换完成标记清除转换完成标记 ADC_Value=ADC_RES;/读取读取ADC高八位高八位 ADC_Value=(ADC_Value2)|ADC_RESL;/读取读取ADC低两位且数低两位且数据据 /合并合并 return ADC_Value;/返回数据返回数据/*单片机单片机IO端口模式初始化函数端口模式初始化函数*/void IO_Init(void)P2M1&=(15)|(16)|(17);/初始化初始化P2.5,P2.6,P2.7口口 /为准双向口为准双向口P2M0&=(15)|(16)|(17);P1M1|=(
32、12);/初始化初始化P12为输入为输入P1M0&=(12);P1M1&=(10)|(14);P1M0&=(10)|(14);【例例2】利用利用IAP15W4K58S4单片机中的单片机中的ADC内部基准对单片机的内部基准对单片机的工作电压进行测量并显示在数码管上。工作电压进行测量并显示在数码管上。解:解:C语言源程序代码如下:语言源程序代码如下:#define MAIN_Fosc 22118400L /定义主时钟定义主时钟#include STC15Fxxxx.H#define DIS_DOT 0 x20#define DIS_BLACK 0 x10#define DIS_ 0 x11#def
33、ine P1n_pure_input(bitn)P1M1|=(bitn),P1M0&=(bitn)#define LED_TYPE 0 x00 /定义定义LED类型类型,0 x00-共阴共阴,0 xff-共阳共阳#define Timer0_Reload (65536UL-(MAIN_Fosc/1000)/Timer 0 中断频中断频率率,1000次次/秒秒/*本地常量声明本地常量声明*/标准字库标准字库0、1、2、3、4、5、6、7、8、9、A、B、C、D、E、F、black、/-、H、J、K、L、N、o、P、U、t、G、Q、r、M、y、0.、1.、2.、/3.、4.、5.、6.、7.、8.
34、、9.、-1u8 code t_display=0 x3F,0 x06,0 x5B,0 x4F,0 x66,0 x6D,0 x7D,0 x07,0 x7F,0 x6F,0 x77,0 x7C,0 x39,0 x5E,0 x79,0 x71,0 x00,0 x40,0 x76,0 x1E,0 x70,0 x38,0 x37,0 x5C,0 x73,0 x3E,0 x78,0 x3d,0 x67,0 x50,0 x37,0 x6e,0 xBF,0 x86,0 xDB,0 xCF,0 xE6,0 xED,0 xFD,0 x87,0 xFF,0 xEF,0 x46;u8 code T_COM=0 x0
35、1,0 x02,0 x04,0 x08,0 x10,0 x20,0 x40,0 x80;/位码位码/*IO口定义口定义*/sbit P_HC595_SER =P40;/pin 14 SER数据输入数据输入 P_HC595_RCLK =P54;/pin 12RCLk存储时钟存储时钟P_HC595_SRCLK=P43;/pin 11SRCLK转移数据块转移数据块/*本地变量声明本地变量声明*/u8 LED88;/显示缓冲显示缓冲u8 display_index;/显示位索引显示位索引bit B_1ms;/1ms标志标志u8 msecond;u16 Get_ADC10bitResult(u8 cha
36、nnel);/选择通道选择通道07/*主函数*/void main(void)u8 i;u16 j;P0M1=0;P0M0=0;/设置为准双向口设置为准双向口 P1M1=0;P1M0=0;/设置为准双向口设置为准双向口 P2M1=0;P2M0=0;/设置为准双向口设置为准双向口 P3M1=0;P3M0=0;/设置为准双向口设置为准双向口 P4M1=0;P4M0=0;/设置为准双向口设置为准双向口 P5M1=0;P5M0=0;/设置为准双向口设置为准双向口 P6M1=0;P6M0=0;/设置为准双向口设置为准双向口 P7M1=0;P7M0=0;/设置为准双向口设置为准双向口/*主函数主函数*/d
37、isplay_index=0;P1ASF=0;/对内部基准做对内部基准做ADC ADC_CONTR=0 xE0;/90T,ADC上电上电 AUXR=0 x80;/Timer0 工作在工作在1T,16 位定时器自动重载位定时器自动重载 TH0=(u8)(Timer0_Reload/256);TL0=(u8)(Timer0_Reload%256);ET0=1;TR0=1;EA=1;/打开总中断打开总中断 for(i=0;i=200)/200ms到到 msecond=0;for(j=0,i=0;i16;i+)j+=Get_ADC10bitResult(0);/读内部基准读内部基准ADC,P1ASF=
38、0,读读0通道通道 j=(u32)128000UL*16/j;/ADC=1024*Uref/Ux,则则Ux=1024*Uref/ADC /=1024*1.25/ADC=1280/ADC LED85=j/100+DIS_DOT;/显示显示MCU电压值电压值,计算时放大计算时放大100倍倍,电压有两位小数电压有两位小数 LED86=(j%100)/10;/十位十位 LED87=j%10;/个位个位 /主程序结束主程序结束/*查询法读一次查询法读一次ADC结果结果.*/u16 Get_ADC10bitResult(u8 channel)/选择通道选择通道 07 ADC_RES=0;ADC_RESL=
39、0;ADC_CONTR=(ADC_CONTR&0 xe0)|0 x08|channel;/启动启动ADC NOP(4);while(ADC_CONTR&0 x10)=0);/等待等待 ADC 完成完成 ADC_CONTR&=0 x10;/清除清除ADC结束标志结束标志 return (u16)ADC_RES 2)|(ADC_RESL&3);/*向向HC595发送一个字节函数发送一个字节函数*/void Send_595(u8 dat)u8i;for(i=0;i8;i+)dat=8)display_index=0;/8位结束回位结束回0/*Timer0 1ms中断函数中断函数*/void timer0(void)interrupt TIMER0_VECTOR DisplayScan();/1ms扫描显示一位扫描显示一位 B_1ms=1;/1ms标志标志