2.3.4 ADC0809的8路通道的地址锁存电路
地址锁存采用74LS373芯片,如图所示,OE(1号引脚)端接低电平,锁存控制端LE(11号引脚)可以直接与CPU的地址锁存控制信号ALE相连,当LE为高电平时,Q端等于D端,当LE端从高电平下降到低电平时,输入端D的数据锁入锁存器中。D0~D7与8051的P0.0~P0.7相连。A0,A1,A2分别接ADC0809的A,B,C端,当A0A1A2=000~111时,就实现了对ADC0809的8路通道的选择。
2.3.4 读写控制信号电路
读写控制电路由或非门实现的。74LS02是4输入或非门,其中A,B为输入,Y为输出。8051的P2.7(A15)和WR经或非门后的信号YSA与ADC0809的ALE端和START端相连,平时START因译码器输入端P2.7上的高电平而封锁,当单片机执行如下程序后 MOV DPTR,#7FF8H MOV @DPTR,A
就启动了AD转换。
8051的P2.7(A15)和RD经或非门后的信号YOE与ADC0809的OE端相连,但单片机执行如下程序后, MOV DPTR,#7FF8H MOV A,@DPTR
就可以获取AD的转换结果。
转换数据的传送可以有定时传送方式,查询方式和中断方式,在这里我们采用中断方式。因为ADC0809的转换时间为100us,而单片机执行一条指令的时间为1us,它们之间相差两个数量级。而且采用中断方式的好处在于可以不占用CPU
硬件资源,使CPU可以在转换的过程中完成其他的工作。将ADC0809的EOC引脚经或非门后与8051的INT0相连,这样就能在外部中断子程序中实现对采集来的数据进行存储。
第三章 软件设计
3.1 Keil uVison 3 集成开发环境简介
Keil uVison 3 是一套在windows环境下8051单片机整合性开发接口(Intergrated Development Environment,IDE )软件,它具备完善的项目管理系统,提供编译器以编写程序及说明文件,可以协助编写,翻译(包含C语言的编译器C51 Compiler以及A51组译器)除错和测试嵌入式系统程序。其中C51compiler是C语言软件开发系统。与汇编相比,C语言在功能,结构性,可读性和可维护性等方面有明显的优势,而且易学易用,Keil C51软件提供丰富的库函数和功能强大的集成开发调试工具,全Windows界面。另外,重要的一点是只要看一下编译后生成的汇编代码,就能体会到Keil C51生成的目标代码的效率是非常高的。
3.2 主程序
主程序主要是设置数据区的起始地址为60H,模拟路数为8路,设置外部中断方式是下降沿触发,开总中断,向ADC0809写数据启动AD转换。
开始 设数据区的起始地址,模拟路数 设外部中断方式,开总中断 启动AD转换
转换数据结束,触发中断 响应中断服务子程序T0
中断返回 结束 图1 主流程图的设计框架
3.3中断服务程序
中断服务程序主要完成取AD转换结果存储,模拟路数自增1,存储区自增1,判断8路是否转换完毕,若完毕则返回。
T0中断服务程序 取AD转换结果,存储
DPTR,R0自增。R2自减
否 R2=0?
是
中断返回 图2 T0中断服务程序流程图
汇编语言代码 ORG 0000H LJMP MAIN ORG 0003H LJMP INT_T0 ORG 0010H MAIN:
MOV R0,#60H ;数据区起始地址送R0 MOV R2,#08H ;模拟量路数 8路 SETB EA SETB IT0
MOV DPTR,#7FF8H
MOVX @DPTR,A ;启动AD转换 SJMP $ ;等待中断
INT_T0:
MOVX A,@DPTR MOV @R0,A INC DPTR INC R0
DJNZ R2,LOOP CLR EA CLR EX0 RETI LOOP:
MOVX @DPTR,A ;再次启动 RETI END
C语言代码
#include
#define uchar unsigned char
#define ADC0809 XBYTE[0x7FF8]//ADC0809的地址
#define STO0809 PBYTE[0x60]//将采集来的8路数据存到内存0x60~0x67中去
uchar data R_data[8]={0};
uchar i=0;
uchar idata *p,*q; void Init() {
EA=1; CPU开总中断 EX0=1; IT0=1;
*p=ADC0809; *q=STO0809;
ADC0809=0x00; //启动ADC0809 }
void main() { Init() while(1) {;} }
void Int_t0 interrupt 0 using 1 {
ACC=*p;
R_data[i]=ACC;
*q=ACC; //存入数据区 p++; //模拟路数加1 q++; //存储区指针加1 i++; //数据区指针加1
if(i==8) //判断是否转换完毕。转换完毕关总中断
{
EA=0; EX0=0 } }
第四章 总结
这一次的单片机课程设计使我学到不少东西,尽管上课的时候听的挺带劲的,也感觉自己学的不错,但还是暴露了不少的问题。第一个问题就是ADC0809的CLK信号的产生,D触发器当Q与D相接时,输出是输入的2分频。这个知识点以前是没有掌握的。第二个问题是数据传输方式的问题,有三种传输方式:定时方式,查询方式和中断方式,我感觉这三种方式各有应用场合,但中断方式应用的应该更宽广一些。第三个问题就是软件这一块的程序流图画的不太好,想以后用Visio画一下。
单片机的课程已经结课了,也挺怀念杨老师对我们讲课的时光。但我觉得我
们对单片机的学习才正式开始,以后不能在课堂上学习单片机,可以在业余时间买一个开发板研究一下,单片机对我们电子工科的学生是立身之本,学好它我们完全可以找一个不错的工作。在这里感谢杨老师对我们的风趣,认真的授课。 参考文献
【1】 张鑫主编.单片机原理与应用(第2版).电子工业出版社.2010.
【2】 常喜茂、孔英会、付小宁.C51基础与应用实例.电子工业出版社.2009. 【3】 王迎旭.单片机原理与应用.机械工业出版社.2004 【4】 何利民.单片机应用系统设计.北航出版社.1990