PIC单片机C语言程序设计(14)
在电子技术中,传感器是一种很重要的器件,传感器的种类也有多种,如温度传感器、光敏传感器、压力传感器……,其特点是能把非电量,如温度、光度、压力等转换成相关的电量(电流或电压)。这些电量都是模拟量,可用Pic 单片机的A/D 转换,将上述的模拟量转换成数字量,再将数字量进行各种处理,如LED、LCD 显示。
Pic16F87X 系列单片机, 具有A/D 转换的功能。Pic16F876/873 芯片为28 引脚, 有5 个模拟输入端的10 位A/D 转换(5 通道);Pic16F877 为40 引脚,有8 个模拟输入端的10位A/D 转换(8 通道)。Pic16F876/873 芯片的模拟输入端为AN0~AN3,其引脚是② ~ ⑤脚和⑦脚AN4,几乎占用了Pic16F876/873 所有的A 口。由于Pic 单片机的端口具有复用功能,所以上述的模拟输入口不会影响I/O 端口的通用特性。
上述芯片的A/D 转换,都已模块化,具有10 位(二进制的)分辨率,所以完全可以满足大多数测量精度的要求,此外,还可利用Pic 单片机睡眠状态下进行A/D 转换(利用内部自带的RC 振荡作时钟),因在睡眠模式下,部分数字电路的开关噪声已停止,所以可获得更高的A/D 转换精度。
Pic 单片机的A/D 转换功能的操作,远比本连载1~13 中介绍的各种功能的C 程序要复杂些,学会编写A/D 转换的C 程序,也是进一步学习Pic 单片机C 程序设计的重要内容之一。因为在编辑A/D 转换的C 程序时,会用到芯片内部多个专用寄存器(控制模块),学会相关模块的使用方法,可为编辑其它复杂功能的C 程序建立良好的思维方法。
1.Pic16F87X 的 A/D 转换必备知识
⑴ A/D 转换控制寄存器ADCON1
ADCON1 是8 位的可读写的寄存器,如图59 所示,其功能是A/D 转换时,选择芯片引脚输入信号的类型(模拟量A 或数字量D),以及A/D 转换结果存放的格式(见下文)。
图59
ADCON1 的第6、5、4 位,在A/D 转换中未派上用场,读作“0”。 ADCON1 的第3、2、1、0 位(Bit3、Bit2、Bit1 和Bit0), 是管理Pic16F87X 引脚功能(A 或D)的选择(可参看相关书藉的A/D 转换引脚功能选择表,因该表占用版面多,这里略去),例如在下文C 程序中,设ADCON1=0x8a 时, 选择Pic16F873A 的AN0(RA0)、AN1(RA1)RA4(AN4)、RA5(AN5)为模拟量输入、(AN6、AN7 为数字量输入),AN3、AN2 参考电压设置端(十、一)。
⑵ A/D 转换结果寄存器ADRESH、ADRESL。因Pic16F87X 的A/D 转换值是10 位的二进制数(代码),而A/D 转换的结果是存放在指定的结果寄存器中,因结果寄存器是8 位的,所以A/D 转换结果的10 位数, 利用ADRESH存放A/D 的高字节;利用ADRESL 存放A/D的低字节。存放方法是利用前述的ADCON1( 图59) 的第7 位(bit)ADFM 进行选择, 当令ADFM=1 时,A/D 转换结果的低8 位存放在ADREL 中;高两位存放在ADRESH 中;当令ADFM=0 时,A/D 转换结果的低两位存放在ADRESL 中,余下的高8 位存放在ADRESH 中,这由C 语言设计者自由选择。若对A/D 转换代码的分辨率要求不高(如实验程序),可取A/D转换的高8 位而舍去低2 位,以使C 程序简化。
⑶ A/D 转换控制寄存器ADCON0
ADCON0 的功能是用于控制A/D 转换的操作,其相关位的功能如图60 所示。
图60
图中ADCONO 的第0 位(Bit0),ADON是A/D 转换允许位(俗称打开A/D 转换),当令ADON=1 时,打开的A/D 转换;AD0N=0 时,关闭A/D 转换。ADCON0 的第1 位, 未使用读作0。
ADCON0 的第2 位也是重要的功能位:在ADON=1 时,若令=1,启动A/D 转换;若令=0,A/D 转换完成。
ADCONO 的5~3 位(Bit5、Bit4 和Bit3)CHS2、CHS1、CHS0 是A/D 转换模拟通道的选择,对Pic16F873A 芯片,有下述关系:
ADCONO 的第7、6 位即ADCS1和ADCS0,是A/D 转换时钟选择位,有以下关系:
此外,在A/D 转换时,还会用到外围接口中断标志寄存器PIR1 的标志位ADIF(Bit6)和外围接口中断使能寄存器PIE1 的使能位ADIE。
当令ADIF=1 时, 代表A/D 转换已完成;ADIF=0 时,A/D 转换未完成。
当令ADIE=1 时, 打开A/D 转换中断;ADIE=0 时,关闭A/D 转换中断。
评论