AT89C51系统中的A/D转换仿真研究
2018-10-12宗素兰张翠侠
宗素兰,张翠侠
宿州学院1.煤矿机械与电子工程研究中心;2.机械与电子工程学院,宿州,234000
单片机处理的是数字量,但在自然界,如温度、压力、速度和流量等都是模拟量[1-3]。这些非电的物理量需要经过传感器转变成模拟电信号[1],然后再进一步转化为数字量才能由单片机处理。将模拟量转换成数字量的过程称为数模转换,即A/D转换[1,4]。ADC0808是一种逐次比较型8路模拟输入,8位数字量并行输出的A/D转换器[5],与实际使用的ADC0809相比,除了精度上有差别外,其余完全一样[6]。
1 A/D转换系统原理
A/D转换系统原理框图如图1所示。
图1 A/D转换系统原理图
A/D转换系统由AT89C51单片机、A/D转换器件和显示器等组成。A/D转换器件把外界传来的模拟量转换成数字量并传送给AT89C51单片机,单片机才能进行数据处理[5,7]。AT89C51单片机把A/D转换器传来的信号经显示器件显示出来。
2 A/D转换程序设计
ADC0808的模数转换在编程时可以通过查询和中断两种方式实现。
2.1 采用查询方式实现A/D转换的程序
查询方式主要通过查询ADC0808芯片的EOC引脚信号是不是1来实现。该引脚信号为1时,表明模数转换结束,可以读取模数转换的结果,并把模数转换的结果送至设计时选好的显示器件显示出来。本次仿真研究选择的显示器件是发光二极管和数码管,显示结果非常形象直观。
ORG 0000H
LJMP MAIN
ORG 0100H
MAIN:
MOV DPTR,#00FFH;00FFH是ADC0808的端口地址
S1:
MOVX @DPTR,A;启动AD转换
MOV P3,#0FFH;P3口设为输入端口
L1:
JB P3.2,$;P3.2即EOC反相后是1吗,是1继续等。
MOVX A,@DPTR;读取转换结果
MOV P1,A;把转换结果送P1口
SJMP S1
END
2.2 采用中断方式实现A/D转换程序
中断方式主要是利用ADC0808芯片的EOC引脚信号是不是1来实现。该引脚信号为1时,表明模数转换结束。AT89C51单片机中断的触发方式有两种:下降沿和低电平。在编程时设置中断的触发方式为低电平,而模数转换结束时EOC的引脚信号为1,所以要经过反相后再送至单片机的P3.2引脚,P3.2即是外部中断0中断请求信号入口。从图2可以看出EOC经反相后连接单片机P3.2引脚。
ORG 0000H
LJMP MAIN
ORG 0003H;外部中断0入口地址
LJMP INTAD
ORG 0100H
MAIN:
SETB EX0;开外部中断0中断
CLR IT0;设置外部中断0的中断触发方式为低电平触发
SETB EA;开总中断
MOV DPTR,#00FFH;00FFH是ADC0808的端口地址
MOVX @DPTR,A; 启动AD转换
SJMP $;死循环,等待中断
INTAD:
MOVX A,@DPTR;读取转换结果
MOV P1,A;结果送P1口显示
MOVX @DPTR,A;再次启动AD转换
RETI;中断返回
END
3 A/D转换仿真实现
3.1 仿真电路图
打开Proteus软件,进入“Schematic Capture”模式[8-9]。因为ADC0808片内无时钟信号,需要外接时钟电路。时钟信号的形成:点击左侧菜单栏的“Generator Mode”,选取DCLOCK项。画出图形后,双击,选取或输入ADC0808的时钟频率。ADC0809模数转换器的工作时钟具有宽广的适用频率范围,最高可达3 MHz[10]。仿真时选择500 kHz。仿真图中的其他元件按照参考文献[5]的操作步骤,根据下图2中的元件名称选取即可。选出所有元件并连接好,可得出A/D转换的仿真电路原理图,如图2所示。
3.2 仿真说明
查询和中断两个程序中ADC0808的端口、地址和EOC信号都以图2为基础。如果连接方式不同,则程序也要改变。ADC0808的6号引脚是启动信号输入端,7号引脚EOC是转换结束标志,高电平表示转换结束,OE是输出允许端,高电平有效[11]。采用图中的连接方式,当单片机执行写指令时,启动AD转换,当执行读指令时,OE有效,AD转换的数字量传给单片机。
图2 系统仿真原理图
3.3 仿真结果与分析
运用Keil软件,分别加载上文中的汇编语言源程序,生成后缀为“HEX”的文件[9]。双击原理图中的单片机,把生成的“HEX”文件加载进去,可得仿真结果[9](图3~6)。仿真时模拟量取值范围为0%~100%,或者说0~1。
图3是滑动变阻器全部接入时即模拟量最小时所对应的数字信息。此时通道0输入的模拟量值最小,为0%,相应的数字量也应该最小,为00H。从图3可以看出对应的发光二极管全灭,表示送过来的数字信号为二进制信号00000000B,此时数码管显示00,表示对应的十六进制为00H,即模拟信号为0时,对应的数字信号也为0,与理论完全一致。从图4可以看出,模拟信号输入量值为25%,发光二极管显示的信号为01000000B,数码管显示40,表示对应的十六进制为40H;理论分析可知,当模拟信号为25%时,对应的数字量应为最大数字信号只有FFH的四分之一,即40H,理论和仿真显示一致。图5表示当滑动变阻器接入50%时,此时模拟信号处于中间值0.5,对应数字量信号应为00H~FFH的中间值,即7FH。从图5可以看出,理论和仿真结果一致。图6表示模拟输入量值最大时,对应的数字也应该最大,为FFH。从图6可以看出,发光二极管全亮,表示数字信号为11111111B,数码管显示FF,表示对应的十六进制为FFH,理论和仿真结果完全一致。
图3 模拟输入量值最小时对应状态 图4 模拟输入量值为25%时对应状态
图5 模拟输入量值为50%时对应状态 图6 模拟输入量值最大时对应状态
4 结 论
通过仿真演示,可看出转换芯片和单片机之间的连接,再结合相应的程序可以清楚展示在单片机系统中如何实现A/D转换。这是实体实验很难做到的,即使一个实验系统只有A/D转换一个实验,复杂的连线也会让人眼花缭乱。因此,仿真虽然不能完全代替实体实验,但是在单片机系统研究中采用仿真来实现A/D转换,可以达到甚至比实体实验更好的效果。