基于C8051F350的称重系统软件设计 下载本文

常州工学院毕业设计论文 持引脚上的输出数据值不变。读端口数据寄存器(或端口位)将总是返回引脚本身的逻辑状态,而与XBRn的设置值无关,即使在引脚被交叉开关分配给其它信号时,端口寄存器总是读其对应的端口I/O引脚。但在对端口SFR执行下面的读-修改-写指令(ANL、ORL、XRL、JBC、CPL、INC、DEC、DJNZ)和对端口SFR中的某一位执行MOV、CLR、SETB期间例外。这些指令读端口寄存器(而不是引脚)的值,修改后再写回端口SFR。

P0:端口0寄存器

P0.7 P0.6 P0.5 P0.4 P0.3 P0.2 P0.1 P0.0 P0.[7:0] 写 - 输出出现在 I/O 引脚。(0:逻辑低电平输出。1:逻辑高电平输出。若相应的P0MDOUT.n位 = 0,则为高阻态。)

读 - 读那些在P0MDIN中被选择为模拟输入的引脚时总是返回‘0’。被配置为数字输入时直接读端口引脚。(0:P0.n为逻辑低电平。1:P0.n为逻辑高电平。)

P0MDIN:端口0输入方式寄存器

P0.7 P0.6 P0.5 P0.4 P0.3 P0.2 P0.1 P0.0 P0.7–P0.0:输入方式配置位(当端口引脚被配置为模拟输入时,其弱上拉、数字驱动器和数字接收器都被禁止。0:对应的P0.n引脚被配置为模拟输入。1:对应的P0.n引脚不配置为模拟输入。)

P0MDOUT:端口0输出方式寄存器

P0.7 P0.6 P0.5 P0.4 P0.3 P0.2 P0.1 P0.0 P0.7–P0.0:输出方式配置位(分别对应)。如果P0MDIN寄存器中的对应位为逻辑‘0’,则输出方式配置为被忽略。(0:对应的P0.n输出为漏极开路。1:对应的P0.n输出为推挽方式。)

P0SKIP:端口 0 跳过寄存器

P0.7 P0.6 P0.5 P0.4 P0.3 P0.2 P0.1 P0.0 P0SKIP.[7:0]:端口0交叉开关跳过使能位。这些位选择被交叉开关译码器跳过的端口引脚。作为模拟输入(ADC或比较器)或特殊功能(VREF输入、外部振荡器电路、CNVSTR输入)的引脚应被交叉开关跳过。(0:对应的P0.n不被交叉开关跳过。1:对应的P0.n被交叉开关跳过。)

P1(端口1寄存器)、P1MDIN(端口1输入方式寄存器)、P1MDOUT(端口1输出方式寄存器)、P0SKIP(端口1跳过寄存器)、P2(端口2寄存器)、P2MDOUT

21

常州工学院毕业设计论文 (端口2输出方式寄存器)也类似。

子程序如下:void PORT_Init (void) {

P0SKIP |= 0xCC; // 跳过P0.2、P0.3晶振引脚,P0.6、P0.7、P1.0、P1.1 P1SKIP |= 0x0F; // 显示引脚,P1.2、P1.3去皮和清零引脚 XBR0 = 0x01; // 使用串口UART0

XBR1 = 0x40; // 使用弱上拉电阻,使能交叉开关 P0MDOUT |= 0xDF; // 设置输出方式 }

4.2.3 A/D转换初始化子程序

A/D转换初始化子程序ADC0_Init用于设置采样速率、输出字速率、采样引脚等。

C8051F350内部有一个全差分24位Sigma-Delta模/数转换器,该ADC具有在片校准功能。两个独立的抽取滤波器可被编程到1KHz的采样率。可以使用内部的电压基准,也可以用差分外部基准进行比率测量。ADC0中包含一个可编程增益放大器,有8种增益设置,最大增益可达128倍。模拟多路选择器将ADC的差分输入与8个外部引脚及内部温度传感器相连。可以使用内部输入缓冲器为直接连接的变送器提供高输入阻抗。一个8位的偏移DAC允许修正较大的输入偏移电压。

通过将寄存器ADC0MD中的AD0EN位置‘1’来使能ADC0。ADC0在被禁止时处于低功耗关断方式(所有的时钟都被关断),以使功耗最低。除ADC0SM位外,ADC0在关断方式下保持其所有设置,ADC0SM位被复位到000b(空闲方式)。

ADC的电压基准由寄存器ADC0CF中的ADC0VREF选择。当ADC0VREF位被置‘1’时,ADC使用外部电压基准源;当ADC0VREF位被清‘0’时,ADC使用内部基准。

ADC的模拟输入被连接到器件的外部引脚或内部电压。模拟输入可以被配置为单端方式(相对与AGND来测量一个独立的输入)或差分方式(测量两个独立输入之间的差值)。

可编程增益放大器(PGA)对ADC输入进行放大, PGA增益设置由寄存器ADC0CN中的AD0GN位控制。

AIN+和AIN-之前有两个独立的输入缓冲器。每个输入都有一组(两个)缓

22

常州工学院毕业设计论文 冲器,可用于使ADC的输入电流最小(对于敏感的测量)。当绝对引脚输入电压位于测量范围的低半部分时使用“low” 输入缓冲器,当绝对引脚输入电压位于测量范围的高半部分时使用“high”输入缓冲器。输入缓冲器也可以被旁路,以便AIN+和AIN-与PGA输入直接相连。ADC输入缓冲器由ADC0BUF寄存器控制。

ADC0CLK寄存器保持调制器时钟(MDCLK)的分频数。调制器时钟决定ADC采样电容的开关频率。当MDCLK频率等于2.4576 MHz时,ADC的性能最佳。调制器以MDCLK/128的速率对输入信号采样。

ADC滤波器的抽取比由寄存器ADC0DECH和ADC0DECL中的DECI[10:0]位选择。抽取比等于1+DECI[10:0]。抽取比决定用多少个调制器采样值来生成一个输出字。ADC输出字的速率等于调制器采样速率除以抽取比。较高的抽取比会产生具有较低噪声的结果,但需要较长的转换周期。最小的抽取比为20。当使用快速滤波器输出时,抽取比必须被设置为8的整数倍。

可以使用内部或系统校准方式对ADC0的增益和偏移进行在系统校准。为保证校准精度,应先进行偏移校准,然后再进行增益校准。没有必要既进行内部校准又进行系统校准,因为系统校准会对任何内部误差源进行补偿。

偏移校准是进行一次单点测量,使一个输入电压产生零值的ADC输出。当执行一次偏移校准时,任何偏离零值的测量偏差都被保存到偏移寄存器中。进行ADC转换时,所有的转换结果都要减去该偏移值。

增益校准是进行两点测量,它决定ADC传输函数的斜率。当执行增益校准时,实际上只进行一次测量,其结果被认为是ADC传输函数的期望满度值。偏移校准值被作为增益校准测量的另外一点,借此可计算出增益系数。在进行完偏移校准之后,转换值被乘以增益系数。

通过写ADC系统方式位(AD0SM)来选择校准选项并启动校准过程。在校准期间,AD0CBSY位被置‘1’。在校准完成后,AD0SM位回到空闲方式,AD0CBSY位被清‘0’,AD0CALC位被置‘1’,并产生ADC中断。清‘0’AD0INT标志时,AD0CALC位被清‘0’。校准结束后,校准结果被写入相应的校准寄存器。

进行内部校准时不需要在ADC输入引脚施加一个特殊电压。内部校准有三种选项:仅偏移校准、仅增益校准或全校准(偏移和增益)。全内部校准时,先进行内部偏移校准,然后进行内部增益校准。如果偏移和增益校准独立进行,则必须在增益校准之前进行偏移校准。在内部偏移校准期间,ADC输入被从内部连接到AGND。对于内部增益校准,ADC输入被从内部连接到一个满度电压,该满度电

23

常州工学院毕业设计论文 压等于所选择的参考电压除以PGA增益。

进行系统校准时使用在ADC输入引脚施加的电压。系统校准有两种选项:偏移校准和增益校准。为保证校准精度,应先进行偏移校准,然后再进行增益校准。在系统偏移校准期间,ADC输入应被连接到“零”值。在系统增益校准期间,ADC输入应被连接到正满度值(对于当前的PGA增益设置)。

偏移和增益的校准结果均为24位。校准结果保存在可用软件读和写的特殊功能寄存器中。偏移校准结果为以2的补码形式(24位)保存在寄存器ADC0COH、ADC0COM和ADC0COL中。偏移寄存器中各位的权值如下:

ADC0COH 23(MSB)-16 223ADC0COM 15-8 215ADC0COL 7-0(LSB) ?216 ?28 2?270 增益校准结果为定点24位数,保存在寄存器ADC0CGH、ADC0CGM和ADC0CGL中。增益寄存器中各位的权值如下:

ADC0CGH 23(MSB)-16 2?20?7ADC0CGM 15-8 2?8ADC0CGL 7-0(LSB) ?2?15 2?16?2?23 偏移校准值用于调整ADC传输函数的零点。偏移校准值为满度正值(0x7FFFFF)或满度负值(0x800000)时将导致ADC错误条件。

增益校准值用于调整ADC传输函数的斜率。增益校准寄存器中的数值范围为0 ~2?2?23。增益校准值为极限值时(0或2?2?23)将导致ADC错误条件。

ADC提供两种转换方式:单次转换和连续转换。在单次转换方式,每个滤波器(SINC3滤波器和快速滤波器)都输出转换结果。在连续转换方式,ADC执行back-to-back转换,直到ADC方式改变。

通过向ADC系统方式位(AD0SM)写“单次转换”选项对应的值来启动单次转换。在单次转换方式,ADC采集足够的信息为AD0ISEL位所选择的滤波器产生一个结果。在转换期间,AD0BUSY位被置‘1’。快速滤波器中的结果在一个ADC转换周期(由调制器周期和抽取比决定)之后可用,而SINC3滤波器中的结果在三个ADC转换周期之后可用。寄存器ADC0CF中的AD0ISEL位决定何时产生转换结束中断,并使ADC返回到空闲方式。如果AD0ISEL位被置‘1’,则AD0INT位在快速滤波器中的结果可用时被置‘1’。如果AD0ISEL位被清‘0’,则AD0INT

24