收藏 分享(赏)

单片机实例27-35ourdev.doc

上传人:dreamzhangning 文档编号:2562839 上传时间:2018-09-22 格式:DOC 页数:72 大小:645KB
下载 相关 举报
单片机实例27-35ourdev.doc_第1页
第1页 / 共72页
单片机实例27-35ourdev.doc_第2页
第2页 / 共72页
单片机实例27-35ourdev.doc_第3页
第3页 / 共72页
单片机实例27-35ourdev.doc_第4页
第4页 / 共72页
单片机实例27-35ourdev.doc_第5页
第5页 / 共72页
点击查看更多>>
资源描述

1、27 ADC0809A/D 转换器基本应用技术 1 基本知识 ADC0809 是带有 8 位 A/D 转换器、8 路多路开关以及微处理机兼容的控制逻辑的 CMOS 组件。它是逐次逼近式 A/D 转换器,可以和单片机直接接口。 (1) ADC0809 的内部逻辑结构 由上图可知,ADC0809 由一个 8 路模拟开关、一个地址锁存与译码器、一个 A/D转换器和一个三态输出锁存器组成。多路开关可选通 8 个模拟通道,允许 8 路模拟量分时输入,共用 A/D 转换器进行转换。三态输出锁器用于锁存 A/D 转换完的数字量,当 OE 端为高电平时,才可以从三态输出锁存器取走转换完的数据。(2) 引脚结构

2、 IN0IN7:8 条模拟量输入通道 ADC0809 对输入模拟量要求:信号单极性,电压范围是 05V,若信号太小,必须进行放大;输入的模拟量在转换过程中应该保持不变,如若模拟量变化太快,则需在输入前增加采样保持电路。 地址输入和控制线:4 条 ALE 为地址锁存允许输入线,高电平有效。当 ALE 线为高电平时,地址锁存与译码器将 A,B,C 三条地址线的地址信号进行锁存,经译码后被选中的通道的模拟量进转换器进行转换。A,B 和 C 为地址输入线,用于选通 IN0IN7 上的一路模拟量输入。通道选择表如下表所示。 C B A 选择的通道0 0 0 IN00 0 1 IN10 1 0 IN20

3、1 1 IN31 0 0 IN41 0 1 IN51 1 0 IN61 1 1 IN7数字量输出及控制线:11 条 ST 为转换启动信号。当 ST 上跳沿时,所有内部寄存器清零;下跳沿时,开始进行 A/D 转换;在转换期间,ST 应保持低电平。EOC 为转换结束信号。当 EOC为高电平时,表明转换结束;否则,表明正在进行 A/D 转换。OE 为输出允许信号,用于控制三条输出锁存器向单片机输出转换得到的数据。OE1,输出转换得到的数据;OE0,输出数据线呈高阻状态。D7D0 为数字量输出线。 CLK 为时钟输入信号线。因 ADC0809 的内部没有时钟电路,所需时钟信号必须由外界提供,通常使用频

4、率为 500KHZ, VREF(),VREF()为参考电压输入。 2 ADC0809 应用说明 (1) ADC0809 内部带有输出锁存器,可以与 AT89S51 单片机直接相连。 (2) 初始化时,使 ST 和 OE 信号全为低电平。 (3) 送要转换的哪一通道的地址到 A,B,C 端口上。 (4) 在 ST 端给出一个至少有 100ns 宽的正脉冲信号。 (5) 是否转换完毕,我们根据 EOC 信号来判断。 (6) 当 EOC 变为高电平时,这时给 OE 为高电平,转换的数据就输出给单片机了。 3 实验任务 如下图所示,从 ADC0809 的通道 IN3 输入 05V 之间的模拟量,通过A

5、DC0809 转换成数字量在数码管上以十进制形成显示出来。ADC0809 的 VREF接5V 电压。 4 电路原理图 图 1.27.1 5 系统板上硬件连线 (1) 把“单片机系统板”区域中的 P1 端口的 P1.0P1.7 用 8 芯排线连接到“动态数码显示”区域中的 A B C D E F G H 端口上,作为数码管的笔段驱动。 (2) 把“单片机系统板”区域中的 P2 端口的 P2.0P2.7 用 8 芯排线连接到“动态数码显示”区域中的 S1 S2 S3 S4 S5 S6 S7 S8 端口上,作为数码管的位段选择。 (3) 把“单片机系统板”区域中的 P0 端口的 P0.0P0.7 用

6、 8 芯排线连接到“模数转换模块”区域中的 D0D1D2D3D4D5D6D7 端口上,A/D转换完毕的数据输入到单片机的 P0 端口 (4) 把“模数转换模块”区域中的 VREF 端子用导线连接到“电源模块”区域中的 VCC 端子上; (5) 把“模数转换模块”区域中的 A2A1A0 端子用导线连接到“单片机系统”区域中的 P3.4 P3.5 P3.6 端子上; (6) 把“模数转换模块”区域中的 ST 端子用导线连接到“单片机系统”区域中的 P3.0 端子上; (7) 把“模数转换模块”区域中的 OE 端子用导线连接到“单片机系统”区域中的 P3.1 端子上; (8) 把“模数转换模块”区域

7、中的 EOC 端子用导线连接到“单片机系统”区域中的 P3.2 端子上; (9) 把“模数转换模块”区域中的 CLK 端子用导线连接到“分频模块”区域中的 /4 端子上; (10) 把“分频模块”区域中的 CK IN 端子用导线连接到“单片机系统”区域中的 ALE 端子上; (11) 把“模数转换模块”区域中的 IN3 端子用导线连接到“三路可调压模块”区域中的 VR1 端子上; 6 程序设计内容 (1) 进行 A/D 转换时,采用查询 EOC 的标志信号来检测 A/D 转换是否完毕,若完毕则把数据通过 P0 端口读入,经过数据处理之后在数码管上显示。 (2) 进行 A/D 转换之前,要启动转

8、换的方法: ABC110 选择第三通道 ST0,ST1,ST0 产生启动转换的正脉冲信号 7 汇编源程序CH EQU 30HDPCNT EQU 31HDPBUF EQU 33HGDATA EQU 32HST BIT P3.0OE BIT P3.1EOC BIT P3.2ORG 00HLJMP STARTORG 0BHLJMP T0XORG 30HSTART: MOV CH,#0BCHMOV DPCNT,#00HMOV R1,#DPCNTMOV R7,#5MOV A,#10MOV R0,#DPBUFLOP: MOV R0,AINC R0DJNZ R7,LOPMOV R0,#00HINC R0MO

9、V R0,#00HINC R0MOV R0,#00HMOV TMOD,#01HMOV TH0,#(65536-4000)/256MOV TL0,#(65536-4000) MOD 256SETB TR0SETB ET0SETB EAWT: CLR STSETB STCLR STWAIT: JNB EOC,WAITSETB OEMOV GDATA,P0CLR OEMOV A,GDATAMOV B,#100DIV ABMOV 33H,AMOV A,BMOV B,#10DIV ABMOV 34H,AMOV 35H,BSJMP WTT0X: NOPMOV TH0,#(65536-4000)/256MO

10、V TL0,#(65536-4000) MOD 256MOV DPTR,#DPCDMOV A,DPCNTADD A,#DPBUFMOV R0,AMOV A,R0MOVC A,A+DPTRMOV P1,AMOV DPTR,#DPBTMOV A,DPCNTMOVC A,A+DPTRMOV P2,AINC DPCNTMOV A,DPCNTCJNE A,#8,NEXTMOV DPCNT,#00HNEXT: RETIDPCD: DB 3FH,06H,5BH,4FH,66HDB 6DH,7DH,07H,7FH,6FH,00HDPBT: DB 0FEH,0FDH,0FBH,0F7HDB 0EFH,0DFH,

11、0BFH,07FHEND8 C 语言源程序#include unsigned char code dispbitcode=0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f;unsigned char code dispcode=0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00;unsigned char dispbuf8=10,10,10,10,10,0,0,0;unsigned char dispcount;sbit ST=P30;sbit OE=P31;sbit EOC=P32;unsigned ch

12、ar channel=0xbc;/IN3unsigned char getdata;void main(void)TMOD=0x01;TH0=(65536-4000)/256;TL0=(65536-4000)%256;TR0=1;ET0=1;EA=1;P3=channel;while(1)ST=0;ST=1;ST=0;while(EOC=0);OE=1;getdata=P0;OE=0;dispbuf2=getdata/100;getdata=getdata%10;dispbuf1=getdata/10;dispbuf0=getdata%10;void t0(void) interrupt 1

13、using 0TH0=(65536-4000)/256;TL0=(65536-4000)%256;P1=dispcodedispbufdispcount;P2=dispbitcodedispcount;dispcount+;if(dispcount=8)dispcount=0; 28 数字电压表 1 实验任务 利用单片机 AT89S51 与 ADC0809 设计一个数字电压表,能够测量 05V 之间的直流电压值,四位数码显示,但要求使用的元器件数目最少。 2 电路原理图 图 1.28.1 3 系统板上硬件连线 a) 把“单片机系统”区域中的 P1.0P1.7 与“动态数码显示”区域中的ABCD

14、EFGH 端口用 8 芯排线连接。 b) 把“单片机系统”区域中的 P2.0P2.7 与“动态数码显示”区域中的S1S2S3S4S5S6S7S8 端口用 8 芯排线连接。 c) 把“单片机系统”区域中的 P3.0 与“模数转换模块”区域中的 ST 端子用导线相连接。 d) 把“单片机系统”区域中的 P3.1 与“模数转换模块”区域中的 OE 端子用导线相连接。 e) 把“单片机系统”区域中的 P3.2 与“模数转换模块”区域中的 EOC 端子用导线相连接。 f) 把“单片机系统”区域中的 P3.3 与“模数转换模块”区域中的 CLK 端子用导线相连接。 g) 把“模数转换模块”区域中的 A2A

15、1A0 端子用导线连接到“电源模块”区域中的 GND 端子上。 h) 把“模数转换模块”区域中的 IN0 端子用导线连接到“三路可调电压模块”区域中的 VR1 端子上。 i) 把“单片机系统”区域中的 P0.0P0.7 用 8 芯排线连接到“模数转换模块”区域中的 D0D1D2D3D4D5D6D7 端子上。 4 程序设计内容 i. 由于 ADC0809 在进行 A/D 转换时需要有 CLK 信号,而此时的ADC0809 的 CLK 是接在 AT89S51 单片机的 P3.3 端口上,也就是要求从 P3.3 输出 CLK 信号供 ADC0809 使用。因此产生 CLK 信号的方法就得用软件来产生

16、了。 ii. 由于 ADC0809 的参考电压 VREFVCC,所以转换之后的数据要经过数据处理,在数码管上显示出电压值。实际显示的电压值 (D/256*VREF) 5 汇编源程序(略)6 C 语言源程序#include unsigned char code dispbitcode=0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f;unsigned char code dispcode=0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00;unsigned char dispbuf8=10,10,10,10,

17、0,0,0,0;unsigned char dispcount;unsigned char getdata;unsigned int temp;unsigned char i;sbit ST=P30;sbit OE=P31;sbit EOC=P32;sbit CLK=P33;void main(void)ST=0;OE=0;ET0=1;ET1=1;EA=1;TMOD=0x12;TH0=216;TL0=216;TH1=(65536-4000)/256;TL1=(65536-4000)%256;TR1=1;TR0=1;ST=1;ST=0;while(1)if(EOC=1)OE=1;getdata=

18、P0;OE=0;temp=getdata*235;temp=temp/128;i=5;dispbuf0=10;dispbuf1=10;dispbuf2=10;dispbuf3=10;dispbuf4=10;dispbuf5=0;dispbuf6=0;dispbuf7=0;while(temp/10)dispbufi=temp%10;temp=temp/10;i+;dispbufi=temp;ST=1;ST=0;void t0(void) interrupt 1 using 0CLK=CLK;void t1(void) interrupt 3 using 0TH1=(65536-4000)/25

19、6;TL1=(65536-4000)%256;P1=dispcodedispbufdispcount;P2=dispbitcodedispcount;if(dispcount=7)P1=P1 | 0x80;dispcount+;if(dispcount=8)dispcount=0;29 两点间温度控制 1 实验任务 用可调电阻调节电压值作为模拟温度的输入量,当温度低于 30时,发出长嘀报警声和光报警,当温度高于 60时,发出短嘀报警声和光报警。测量的温度范围在 099。 2 电路原理图 图 4.29.1 3 系统板上硬件连线 a) 把“单片机系统”区域中的 P1.0P1.7 与“动态数码显示”

20、区域中的ABCDEFGH 端口用 8 芯排线连接。 b) 把“单片机系统”区域中的 P2.0P2.7 与“动态数码显示”区域中的S1S2S3S4S5S6S7S8 端口用 8 芯排线连接。 c) 把“单片机系统”区域中的 P3.0 与“模数转换模块”区域中的 ST 端子用导线相连接。 d) 把“单片机系统”区域中的 P3.1 与“模数转换模块”区域中的 OE 端子用导线相连接。 e) 把“单片机系统”区域中的 P3.2 与“模数转换模块”区域中的 EOC 端子用导线相连接。 f) 把“单片机系统”区域中的 P3.3 与“模数转换模块”区域中的 CLK 端子用导线相连接。 g) 把“模数转换模块”

21、区域中的 A2A1A0 端子用导线连接到“电源模块”区域中的 GND 端子上。 h) 把“模数转换模块”区域中的 IN0 端子用导线连接到“三路可调电压模块”区域中的 VR1 端子上。 i) 把“单片机系统”区域中的 P0.0P0.7 用 8 芯排线连接到“模数转换模块”区域中的 D0D1D2D3D4D5D6D7 端子上。 j) 把“单片机系统”区域中的 P3.6、P3.7 用导线分别连接到“八路发光二极管指示模块”区域中的 L1、L2 上。 k) 把“单片机系统”区域中的 P3.5 用导线连接到“音频放大模块”区域中的 SPK IN 端口上。 l) 把“音频放大模块“区域中的 SPK OUT

22、 插入音频喇叭。 4 汇编源程序(略)5C 语言源程序#include unsigned char code dispbitcode=0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f;unsigned char code dispcode=0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00;unsigned char dispbuf8=10,10,10,10,10,10,0,0;unsigned char dispcount;unsigned char getdata;unsigned int temp;u

23、nsigned char i;sbit ST=P30;sbit OE=P31;sbit EOC=P32;sbit CLK=P33;sbit LED1=P36;sbit LED2=P37;sbit SPK=P35;bit lowflag;bit highflag;unsigned int cnta;unsigned int cntb;bit alarmflag;void main(void)ST=0;OE=0;TMOD=0x12;TH0=0x216;TL0=0x216;TH1=(65536-500)/256;TL1=(65536-500)%256;TR1=1;TR0=1;ET0=1;ET1=1;

24、EA=1;ST=1;ST=0;while(1)if(lowflag=1) LED2=1;else if(highflag=1) LED2=0;elseLED1=1;LED2=1;void t0(void) interrupt 1 using 0CLK=CLK;void t1(void) interrupt 3 using 0TH1=(65536-500)/256;TL1=(65536-500)%256;if(EOC=1)OE=1;getdata=P0;OE=0;temp=getdata*25;temp=temp/64;i=6;dispbuf0=10;dispbuf1=10;dispbuf2=1

25、0;dispbuf3=10;dispbuf4=10;dispbuf5=10;dispbuf6=0;dispbuf7=0;while(temp/10)dispbufi=temp%10;temp=temp/10;i+;dispbufi=temp;if(getdata153)lowflag=0;highflag=1;elselowflag=0;highflag=0;ST=1;ST=0;P1=dispcodedispbufdispcount;P2=dispbitcodedispcount;dispcount+;if(dispcount=8)dispcount=0;if(lowflag=1) if(cn

26、ta=800)cnta=0;alarmflag=alarmflag;if(alarmflag=1)SPK=SPK;else if(lowflag=0) if(cntb=400)cntb=0;alarmflag=alarmflag;if(alarmflag=1)SPK=SPK;elsealarmflag=0;cnta=0;cntb=0;30 四位数数字温度计 1 温度传感器 AD590 基本知识 AD590 产生的电流与绝对温度成正比,它可接收的工作电压为 4V30V,检测的温度范围为55150,它有非常好的线性输出性能,温度每增加 1,其电流增加 1uA。 AD590 温度与电流的关系如下表所

27、示 摄氏温度 AD590 电流 经 10K 电压0 273.2 uA 2.732V10 283.2 uA 2.832 V20 293.2 uA 2.932 V30 303.2 uA 3.032 V40 313.2 uA 3.132 V50 323.2 uA 3.232 V60 333.2 uA 3.332 V100 373.2 uA 3.732 VAD590 引脚图 2 实验任务 利用 AD590 温度传感器完成温度的测量,把转换的温度值的模拟量送入ADC0809 的其中一个通道进行 A/D 转换,将转换的结果进行温度值变换之后送入数码管显示。 3 电路原理图 图 4.30.1 4 系统板上硬

28、件连线 (1) 把“单片机系统”区域中的 P1.0P1.7 与“动态数码显示”区域中的 ABCDEFGH 端口用 8 芯排线连接。 (2) 把“单片机系统”区域中的 P2.0P2.7 与“动态数码显示”区域中的 S1S2S3S4S5S6S7S8 端口用 8 芯排线连接。 (3) 把“单片机系统”区域中的 P3.0 与“模数转换模块”区域中的 ST端子用导线相连接。 (4) 把“单片机系统”区域中的 P3.1 与“模数转换模块”区域中的 OE端子用导线相连接。 (5) 把“单片机系统”区域中的 P3.2 与“模数转换模块”区域中的EOC 端子用导线相连接。 (6) 把“单片机系统”区域中的 P3

29、.3 与“模数转换模块”区域中的CLK 端子用导线相连接。 (7) 把“模数转换模块”区域中的 A2A1A0 端子用导线连接到“电源模块”区域中的 GND 端子上。 (8) 把“模数转换模块”区域中的 IN0 端子用导线连接到自制的 AD590电路上。 (9) 把“单片机系统”区域中的 P0.0P0.7 用 8 芯排线连接到“模数转换模块”区域中的 D0D1D2D3D4D5D6D7 端子上。 5 程序设计内容 (1) ADC0809 的 CLK 信号由单片机的 P3.3 管脚提供 (2) 由于 AD590 的温度变化范围在55150之间,经过 10K之后采样到的电压变化在 2.182V4.23

30、2V 之间,不超过 5V 电压所表示的范围,因此参考电压取电源电压 VCC,(实测 VCC4.70V)。由此可计算出经过 A/D 转换之后的摄氏温度显示的数据为: 如果(D*2350/128)2732,则显示的温度值为(2732(D*2350/128) 如果(D*2350/128)2732,则显示的温度值为(D*2350/128)2732) 6 汇编源程序(略)7C 语言源程序#include #include unsigned char code dispbitcode=0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f;unsigned char code di

31、spcode=0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00,0x40;unsigned char dispbuf8=10,10,10,10,10,10,0,0;unsigned char dispcount;unsigned char getdata;unsigned long temp;unsigned char i;bit sflag;sbit ST=P30;sbit OE=P31;sbit EOC=P32;sbit CLK=P33;sbit LED1=P36;sbit LED2=P37;sbit SPK=P35;void m

32、ain(void)ST=0;OE=0;TMOD=0x12;TH0=0x216;TL0=0x216;TH1=(65536-4000)/256;TL1=(65536-4000)%256;TR1=1;TR0=1;ET0=1;ET1=1;EA=1;ST=1;ST=0;getdata=148;while(1);void t0(void) interrupt 1 using 0CLK=CLK;void t1(void) interrupt 3 using 0TH1=(65536-4000)/256;TL1=(65536-4000)%256;if(EOC=1)OE=1;getdata=P0;OE=0;tem

33、p=(getdata*2350);temp=temp/128;if(tempunsigned char code dispbit=0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f;unsigned char code dispcode=0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00,0x40;unsigned char dispbuf8=0,0,0,0,0,0,10,10;unsigned char temp8;unsigned char dispcount;unsigned char T0count;

34、unsigned char timecount;bit flag;unsigned long x;void main(void)unsigned char i;TMOD=0x15;TH0=0;TL0=0;TH1=(65536-4000)/256;TL1=(65536-4000)%256;TR1=1;TR0=1;ET0=1;ET1=1;EA=1;while(1)if(flag=1)flag=0;x=T0count*65536+TH0*256+TL0;for(i=0;iunsigned char code ps=1,2,3,4,5;unsigned char code dispcode=0x3f,

35、0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00,0x40;unsigned char pslen=9;unsigned char templen;unsigned char digit;unsigned char funcount;unsigned char digitcount;unsigned char psbuf9;bit cmpflag;bit hibitflag;bit errorflag;bit rightflag;unsigned int second3;unsigned int aa;unsigned int bb;bit a

36、larmflag;bit exchangeflag;unsigned int cc;unsigned int dd;bit okflag;unsigned char oka;unsigned char okb;void main(void)unsigned char i,j;P2=dispcodedigitcount;TMOD=0x01;TH0=(65536-500)/256;TL0=(65536-500)%256;TR0=1;ET0=1;EA=1;while(1)if(cmpflag=0)if(P3_6=0) /function keyfor(i=10;i0;i-)for(j=248;j0;j-);if(P3_6=0)if(hibitflag=0)funcount+;if(funcount=pslen+2)funcount=0;cmpflag=1;P1=dispcodefuncount;elsesecond3=0;while(P3_6=0);

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 大学课件

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报