单片机实验(AD转换)
单片机AD转换实验报告
单片机实验报告(五)实验名称:A/D转换姓名:张昊学号:110404247班级:通信2班时间:2013.12南京理工大学紫金学院电光系一、实验目的1、理解A/D转换的工作原理;2、理解掌握ADC0809的A/D转换原理和并行A/D转换器接口的编程方法;3、学习使用并行模/数转换芯片ADC0809进行电压信号的采集和数据处理。
二、 实验原理在设计A/D 转换器与单片机接口之前,往往要根据A/D 转换器的技术指标选择A/D 转换器。
A/D 转换器的主要技术指标-----量化间隔和量化误差是A/D 转换器的主要技术指标之一。
量化间隔可用下式表示,其中n 为A/D 转换器的位数:A/D 转换器芯片种类很多,按其转换原理可分为逐次比较式、双重积分式、量化反馈式和并行式A/D 转换器;按其分辨率可分为8~16位的A/D 转换器芯片。
目前最常用的是逐次逼近式和双重积分式。
A/D 转换器与单片机接口具有硬、软件相依性。
一般来说,A/D 转换器与单片机的接口主要考虑的是数字量输出线的连接、ADC 启动方式、转换结束信号处理方法以及时钟的连接等。
一个ADC 开始转换时,必须加一个启动转换信号,这一启动信号要由单片机提供。
不同型号的ADC ,对于启动转换信号的要求也不同,一般分为脉冲启动和电平启动两种:对于脉冲启动型ADC ,只要给其启动控制端上加一个符合要求的脉冲信号即可,如ADC0809、ADC574等。
通常用WR 和地址译码器的输出经一定的逻辑电路进行控制;对于电平启动型ADC ,当把符合要求的电平加到启动控制端上时,立即开始转换。
在转换过程中,必须保持这一电平,否则会终止转换的进行。
因此,在这种启动方式下,单片机的控制信号必须经过锁存器保持一段时间,一般采用D 触发器、锁存器或并行I/O 接口等来实现。
AD570、AD571等都属于电平启动型ADC 。
当ADC 转换结束时,ADC 输出一个转换结束标志信号,通知单片机读取转换结果。
单片机AD模数转换实验报告
单片机AD模数转换实验报告一、实验目的和要求1、掌握单片机与ADC0809的接口设计方法。
2、掌握Proteus软件与Keil软件的使用方法。
二、设计要求。
1、用Proteus软件画出电路原理图,在单片机的外部扩展片外三总线,并通过片外三总线与0809接口。
2、在0809的某一模拟量输入通道上接外部模拟量。
3、在单片机的外部扩展数码管显示器。
4、分别采用延时和查询的方法编写A/D 转换程序。
5、启动A/D转换,将输入模拟量的转换结果在显示器上显示。
三、电路原理图。
图1、电路仿真图四、实验程序流程框图和程序清单。
1、查询法:ORG 0000HSTART: LJMP MAINORG 0100HMAIN: MOV SP, #2FH NT: MOV DPTR, #0FF78H MOVX @DPTR, A LOOP: JB P3.3, LOOP MOVX A, @DPTR MOV B, #51 DIV AB MOV R0, A MOV A, B MOV B, #5 DIV AB MOV R1, A MOV R2, B LCALL DIR SJMP NT DIR: MOV R7, #0 SJMP LOOP1 BH: MOV A, R1 MOV R2, A LOOP1: MOV DPTR, #WK MOV A, R7 MOVC A, @A+DPTR MOV P2, A MOV DPTR, #DK MOV A, R2 MOVC A, @A+DPTR MOV P1, A LCALL DELAY INC R7 CJNE R7, #2, BH MOV DPTR, #WK MOV A, R7 MOVC A, @A+DPTR MOV P2, A MOV DPTR, #DK MOV A, R0 MOVC A, @A+DPTR ANL A, #7FH MOV P1, A LCALL DELAY RET DELAY: M OV R5, #01H DL1: MOV R4, #8EH DL0: MOV R3, #02H DJNZ R3, $ DJNZ R4, DL0 DJNZ R5, DL1 RET WK: DB 10H DB 20H DB 40H DK: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H ENDdisplay 送百分位字符代码送位选信号延时1ms 送十分位字符代码送位选信号延时1ms 送个位及小数点字符代码送位选信号延时1ms 熄灭第四位数码管延时1ms 返回display 送百分位字符代码送位选信号延时1ms 送十分位字符代码送位选信号延时1ms 送个位及小数点字符代码送位选信号延时1ms 熄灭第四位数码管延时1ms 返回2、延时法:ORG 0000H START: LJMP MAIN ORG 0100H MAIN: MOV SP, #2FH LOOP: MOV DPTR, #0FF78H MOVX @DPTR, A LCALL DELAY MOVX A, @DPTR MOV B, #51 DIV AB MOV R0, A MOV A, B MOV B, #5 DIV AB MOV R1, A MOV R2, B LCALL DIR SJMP LOOP DIR: MOV R7, #0 SJMP LOOP1 BH: MOV A, R1 MOV R2, A LOOP1: MOV DPTR, #WK MOV A, R7 MOVC A, @A+DPTR MOV P2, A MOV DPTR, #DK MOV A, R2 MOVC A, @A+DPTR MOV P1, A LCALL DELAY INC R7 CJNE R7, #2, BH MOV DPTR, #WK MOV A, R7 MOVC A, @A+DPTR MOV P2, A MOV DPTR, #DK MOV A, R0 MOVC A, @A+DPTR ANL A, #7FH MOV P1, A LCALL DELAY RET DELAY: M OV R5, #01H DL1: MOV R4, #8EH DL0: MOV R3, #02H DJNZ R3, $ DJNZ R4, DL0 DJNZ R5, DL1 RET WK: DB 10H DB 20H DB 40H DK: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H开始启动AD 延时从AD中取数据数据处理结束调显示子函数END五、实验结果。
单片机AD转换实验
一、实验目的1、掌握单片机与ADC0809的接口设计方法。
2、掌握Proteus软件与Keil软件的使用方法。
二、实验要求1、用Proteus软件画出电路原理图,在单片机的外部扩展片外三总线,并通过片外三总线与0809接口。
2、在0809的某一模拟量输入通道上接外部模拟量。
3、在单片机的外部扩展数码管显示器。
4、分别采用延时和查询的方法编写A/D转换程序。
5、启动A/D转换,将输入模拟量的转换结果在显示器上显示。
三、实验电路图四、实验程序流程框图和程序清单1、查询ORG 0000H START:LJMP MAINORG 0100HMAIN: MOV SP, #6FHCLR EALOOP: MOV DPTR, #0fef8H MOVX @DPTR, ALOOP1:JNB P3.2, LOOP1MOVX A, @DPTRMOV B, #51DIV ABMOV 23H, AMOV A, #10MOV 22H, AMOV A, BLCALL CHULIMOV 21H, AMOV A, BLCALL CHULIMOV 20H, A LCALL DIRLJMP LOOPDIR: PUSH ACCPUSH DPHPUSH DPLPUSH PSWSETB RS1SETB RS0MOV R0, #20HMOV R3, #0FEH LOOP2:MOV P2, R3 MOV DPTR, #TAB1MOV A, @R0MOVC A, @A+DPTRMOV P1, ALCALL DELAYINC R0MOV A, R3JNB ACC.3, LOOP3RL AMOV R3, ALJMP LOOP2LOOP3:POP PSWPOP DPLPOP DPHPOP ACCRETTAB1:DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,07FH DELAY:MOV R7, #01HDL1: MOV R6, #8EHDL0: MOV R5, #02HDJNZ R5, $DJNZ R6, DL0DJNZ R7, DL1RETCHULI:CJNE A, #25, LPLJMP LP2LP: JNC LP1LP2: MOV B, #10MUL ABMOV B, #51DIV ABLJMP LP3LP1: CLR CSUBB A, #25MOV B, #10MUL ABCLR CSUBB A, #5MOV B, #51DIV ABADD A, #5LP3: RETEND2、延时ORG 0000HSTART:LJMP MAINORG 0100HMAIN: MOV SP, #6FHCLR EALOOP: MOV DPTR, #0fef8HMOVX @DPTR, ALCALL DELAY100MOVX A, @DPTRMOV B, #51DIV ABMOV 23H, AMOV A, #10MOV 22H, AMOV A, BLCALL CHULIMOV 21H, AMOV A, BLCALL CHULIMOV 20H, ALCALL DIRLJMP LOOPDIR: PUSH ACCPUSH DPHPUSH DPLPUSH PSWSETB RS1SETB RS0MOV R0, #20HMOV R3, #0FEHLOOP2:MOV P2, R3MOV DPTR, #TAB1MOV A, @R0MOVC A, @A+DPTRMOV P1, ALCALL DELAYINC R0MOV A, R3JNB ACC.3, LOOP3RL AMOV R3, ALJMP LOOP2LOOP3:POP PSWPOP DPLPOP DPHPOP ACCRETTAB1:DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,07FH DELAY:MOV R7, #01HDL1: MOV R6, #8EHDL0: MOV R5, #02HDJNZ R5, $DJNZ R6, DL0DJNZ R7, DL1RETCHULI:CJNE A, #25, LPLJMP LP2LP: JNC LP1LP2: MOV B, #10MUL ABMOV B, #51DIV ABLJMP LP3LP1: CLR CSUBB A, #25MOV B, #10MUL ABCLR CSUBB A, #5MOV B, #51DIV ABADD A, #5LP3: RETDELAY100: MOV R6,#01H;误差 0usDL0:MOV R5,#2FHDJNZ R5,$DJNZ R6,DL0RETEND3、中断ORG 0000HSTART:LJMP MAINORG 0003HLJMP INTT0ORG 0100HMAIN: MOV SP, #6FHSETB EASETB EX0MOV DPTR, #0000HMOVX @DPTR, AHERE: LJMP HEREINTT0:MOVX A, @DPTRMOV B, #51DIV ABMOV 23H, A //整数部分放22H中MOV A, #10MOV 22H, A //小数点放22H中MOV A, BLCALL CHULIMOV 21H, A //小数点后第一位放21H中 MOV A, BLCALL CHULIMOV 20H, A //小数点后第一位放21H中 LCALL DIRMOV DPTR, #0000HMOVX @DPTR, ARETIDIR: PUSH ACCPUSH DPHPUSH DPLPUSH PSWSETB RS1SETB RS0MOV R0, #20HMOV R3, #01HLOOP2:MOV P2, R3 //位控码初始值MOV DPTR, #TAB1MOV A, @R0MOVC A, @A+DPTRMOV P1, ALCALL DELAYINC R0MOV A, R3JB ACC.3 LOOP3RL AMOV R3, ALJMP LOOP2LOOP3:POP PSWPOP DPLPOP DPHPOP ACCRETTAB1:DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,07FH DELAY:MOV R7, #01HDL1: MOV R6, #8EHDL0: MOV R5, #02HDJNZ R5, $DJNZ R6, DL0DJNZ R7, DL1RETCHULI:CJNE A, #25, LPLJMP LP2LP: JNC LP1MOV B, #10MUL ABMOV B, #51DIV ABLJMP LP3LP1: CLR CSUBB A, #25MOV B, #10MUL ABCLR CSUBB A, #5MOV B, #51DIV ABADD A, #5LJMP LP3LP2: MOV A, #5MOV B, #0LP3: RETEND五、实验结果六、实验总结通过本次试验掌握了A/D转换的电路设计,掌握了AD0808的使用以及编址技术,熟悉了A/D转换的方法和A/D转换的程序设计方法。
单片机实验数据采集_AD转换
单片机实验报告姓名: XX班级: XXXXX学号: XXXXXXX专业:电气工程与自动化实验1 名称:数据采集_A/D转换一、实验目的⑴掌握A/D转换与单片机接口的方法;⑵了解A/D芯片0809 转换性能及编程方法;⑶通过实验了解单片机如何进行数据采集。
二、实验设备装有proteus和keil软件的电脑一台三、实验说明及实验原理:A/D 转换器大致分有三类:一是双积分A/D 转换器,优点是精度高,抗干扰性好,价格便宜,但速度慢;二是逐次逼近式A/D转换器,精度、速度、价格适中;三是并联比较型A/D转换器,速度快,价格也昂贵。
实验用ADC0809属第二类,是8位A/D转换器。
每采集一次一般需100μs。
由于ADC0809A/D 转换器转换结束后会自动产生EOC 信号(高电平有效),取反后将其与8031 的INT0 相连,可以用中断方式读取A/D转换结果。
ADC0809 是带有8 位A/D转换器、8 路多路开关以及微处理机兼容的控制逻辑的CMOS组件。
它是逐次逼近式A/D转换器,可以和单片机直接接口。
(1) ADC0809 的内部逻辑结构由图1.1 可知,ADC0809 由一个8 路模拟开关、一个地址锁存与译码器、一个A/D 转换器和一个三态输出锁存器组成。
多路开关可选通8 个模拟通道,允许8 路模拟量分时输入,共用A/D 转换器进行转换。
三态输出锁器用于锁A/D 转换完的数字量,当OE 端为高电平时,才可以从三态输出锁存器取走转换完的数据。
(2) ADC0809 引脚结构ADC0809各脚功能如下:D7 ~ D0:8 位数字量输出引脚。
IN0 ~ IN7:8位模拟量输入引脚。
VCC:+5V工作电压。
GND:地。
REF(+):参考电压正端。
REF(-):参考电压负端。
START:A/D转换启动信号输入端。
ALE:地址锁存允许信号输入端。
(以上两种信号用于启动A/D转换).EOC:转换结束信号输出引脚,开始转换时为低电平,当转换结束时为高电平。
AD DA实验
A/D D/A转换实验一、实验目的1. 学习理解模/数信号转换的基本原理,数/模转换的基本原理;;2. 掌握模/数转换芯片ADC0809 的使用方法。
3. 掌握DAC0832 的使用方法。
二、实验环境1、软件环境要求Windows XP操作系统以及Keil C51 单片机集成开发环境。
2、硬件环境要求电脑一台,TD-51单片机系统,A/D单元,D/A单元。
三、实验内容编写实验程序,将ADC 单元中提供的0V~5V 信号源作为ADC0809 的模拟输入量,进行A/D 转换,转换结果通过变量进行显示。
设计实验电路图实验线路并编写程序,实现D/A 转换,要求产生锯齿波、脉冲波,并用示波器观察电压波形。
四、实验原理分析1.A/D转换实验原理ADC0809 包括一个8 位的逐次逼近型的ADC 部分,并提供一个8 通道的模拟多路开关和联合寻址逻辑。
用它可直接输入8 个单端的模拟信号,分时进行A/D 转换,在多点巡回检测、过程控制等应用领域中使用非常广泛。
ADC0809 的主要技术指标为:·分辨率:8 位·单电源:+5V·总的不可调误差:±1LSB·转换时间:取决于时钟频率·模拟输入范围:单极性0~5V·时钟频率范围:10KHz~1280KHzADC0809 的外部管脚如图1所示,地址信号与选中通道的关系如表1所示。
图1 ADC0809 外部引脚图表1 地址信号与选中通道的关系2.D/A转换实验原理D/A转换器是一种将数字量转换成模拟量的器件,其特点是:接收、保持和转换的数字信息,不存在随温度、时间漂移的问题,其电路抗干扰性较好。
大多数的D/A 转换器接口设计主要围绕D/A 集成芯片的使用及配置响应的外围电路。
DAC0832是8位芯片,采用CMOS 工艺和R-2RT 形电阻解码网络,转换WR1结果为一对差动电流Iout1 和Iout2 输出,其主要性能参数如表2示,引脚如图2所示。
单片机实验程序AD转换
程序分析5-中断服务-显示部分
j=dis_buffer[Disp_cnt];//显示内容:2 5 5 P2_tmp=array[j]; //查表,数据端口 if(!ADC_CS) { if(F_ADC_CLK)//P2.1 is clk_adc P2_tmp |=0x02; else P2_tmp &=0xfd; } P2 = P2_tmp; P0=display_con[Disp_cnt];//位控制 Disp_cnt++; if(Disp_cnt>=3) Disp_cnt=0;
}
程序分析3-AD转换器时序
ADI: 1 1 0(启动 单端 通道0 的AD转换)
程序分析3-生成脉冲
void Pulse(void) { unsigned char i; F_ADC_CLK=1; ADC_CLK=1; i=2; while(i-->0); F_ADC_CLK=0; ADC_CLK=0; i=2; while(i-->0); } F_ADC_CLK的作用?
实验19 AD转换
功能&演示
• 0.4s启动一次AD转换 • 将AD转换的结果(0~255)显示在数码管 DS1~DS3上 • 调整电位器,可观察到数码管显示数字的 变化
程序分析1-程序结构
• • • • AD转换模块(对通道0 CH0) 显示模块(定时器中断中完成) 初始化部分 主循环部分
void ADConvert() { unsigned char temp; unsigned char i; temp=0; ADC_CS=0; i=5; ADC_CS=1; while(i-->0); ADC_CS=0; ADC_DI=1; //1:启动AD转换器 Pulse(); ADC_DI=1; //SGL = 1 : 单端模式 Pulse(); ADC_DI=0; //ODD=0 : 对通道0进行 AD转换(单端模式) Pulse(); for(i=0;i<8;i++) { temp=temp<<1; Pulse(); if(ADC_DO) temp=temp|0x01; }
单片机AD转换实验报告
单⽚机AD转换实验报告三、实验电路五、实验结果将程序产⽣的⼗六进制代码加载到proteus中,运⾏仿真,调节滑动变阻器改变AD 输⼊的电压,可以到如图7.1—7.4所⽰的实验结果。
图7.1输⼊电压0.76V 图7.2输⼊电压1.31V图7.3输⼊电压2.50V 图7.4输⼊电压4.99V四、程序清单及流程图程序⼀(查询):ORG 0000HLJMP MAINORG 0010HMAIN: MOV SP, #2FH CLR EAMOV DPTR, #0EFF8H MOVX @DPTR, AJB P3.3, $MOVX A, @DPTRMOV B, #51DIV ABMOV 7AH, AMOV A, BLCALL CL1MOV 79H, AMOV A, BLCALL CL1MOV 78H, AMOV 7BH, #0AHLCALL DISPLJMP MAINDISP: PUSH ACCPUSH DPHSETB RS1SETB RS0MOV R0, #78HMOV R7, #04HMOV R2, #01HDISP1: MOV A, @R0MOV DPTR, #DKMOVC A, @A+DPTRMOV P2, R2MOV P0, AJNB P2.2, DISP2CLR P0.7DISP2: LCALL DELAYMOV A, R2RL AMOV R2, AINC R0 INC R1DJNZ R7, DISP1POP PSWPOP DPLPOP DPHPOP ACCRETDK: DB 0C0H,0F9H,0A4H,0B0H, 99H,92H,82H,0F8H,80H,90H,0FFH DELAY: MOV R3, #02HLOP: MOV R4, #250DJNZ R4, $DJNZ R3, LOPRETCL1: CJNE A, #25, L00PLJMP L00P2L00P: JNC L00P1L00P2: MOV B, #10DIV ABLJMP L00P3L00P1: CLR CSUBB A, #25MOV B, #10MUL ABCLR CSUBB A, #6MOV B, #51DIV ABADD A, #5L00P3: RETEND开始初始化调⽤延时,等待转换读取数据,并转换调⽤显⽰程序启动下⼀次A/D转换程序⼆(延时):延时⽅式只需将查询指令改为⼀个调⽤延时指令,在主程序后加⼊100us延时程序即可。
实验AD转换
实验AD转换实验AD转换⼀、实验⽬的了解STC单⽚机ADC的结构;掌握STC单⽚机ADC的使⽤。
⼆、实验原理STC15F2K60S2单⽚机内含8路10位⾼速AD转换器,速度可达30万次/秒。
单⽚机P1⼝既可作为普通I/O⼝,也可作为AD转换器模拟电压输⼊⼝。
AD转换器相关的寄存器如表1所⽰。
表1 ADC转换相关寄存器P1ASF某⼀位为“1”,P1⼝对应的引脚设为模拟功能。
某⼀位为“0”,对应的引脚设为普通I/O。
②ADC控制寄存器ADC_CONTRADC_POWER=1,打开AD转换器电源(关闭电源可降低功耗,ADC初次上电需适当延时,再启动AD转换)。
SPEED1、SPEED0选择AD转换速度。
ADC_FLAG:ADADC_START:AD转换启动控制。
CHS2、CHS1、CHS0:选择模拟输⼊通道P1.0~P1.7。
转换结果存放在ADC_RES和ADC_RESL寄存器中,当CLK_DIV.5/ADRJ=0时,ADC_RES为结果的⾼8位,ADC_RESL为结果的低2位(如表2所⽰)。
当CLK_DIV.5/ADRJ=1时,ADC_RES为结果的⾼2位,ADC_RESL为结果的低8位(如表3所⽰)。
STC15F2K60S2的AD 转换器以Vcc 为参考电压,当ADRJ=0时,10位转换结果与输⼊模拟电压的关系由式(1)计算:VccVin 10240]:ADC_RESL[10],:ADC_RES[7= (1)如果只取⾼8位,则由式(2)计算: VccVin 2560]:ADC_RES[7=……………………………………...…………………(2)当ADRJ=1时,10位转换结果与输⼊模拟电压的关系由式(3)计算:VccVin10240]:ADC_RESL[70],:ADC_RES[1=…………………………………(3)如果单⽚机Vcc 电压不稳,会引起AD 转换误差,在实际应⽤中,可⽤⼀路AD 采样外部的基准电压(如⽤TL431基准电源),另⼀路AD 采样被测电压,按式(4)计算:转换结果基准电转换结果被测VrefVin 源电压= (4)三、实验环境Windows XP ; Keil µ V ision 4; STC-ISP-6.28。
AT89C51单片机AD转换器接口实验
班级电科 081 班姓名龚浪学号 ************ 实验名称电脑时钟程序实验指导教师马光喜理学院时间:2011年月日实验十一 A/D转换器接口实验一.实验目的⑴熟悉单片机与A/D转换芯片的接口方法。
⑵了解A/D转换芯片的转换性能及编程方法。
⑶通过实验了解单片机如何进行数据采集。
二.实验内容利用电位器提供模拟量输入,输入到0809的IN3输入端,编制程序,将模拟量转换成数字量,并在数码管显示出来。
三.实验步骤1.在Proteus中画出实验电路ADC0808转换原理电路3.进入Keil C51组合软件的操作环境,编辑源程序并进行编译;4.设置Proteus 与Keil C51之间的连接;5.程序设计(1)进行A/D转换时,采用查询EOC的标志信号来检测A/D转换是否完毕,若完毕则把数据通过P1端口读入,经过数据处理之后经P0口从数码管上显示。
(2)进行A/D转换之前,要启动转换的方法:CBA=011选择第三通道Start的正脉冲(start从0→1→0)起动AD转换,本程序中用P2^0控制。
(3)本程序用C语言编写,代码如下://EXP11#include <reg51.h>sbit start=P2^0;//控制起动转换信号sbit finish=P2^1;//转换结束标志sbit ale=P2^2; //地址锁存信号#define address P3 //地址口#define date P1 //数据口#define disp P0 //显示口void transform(); //AD转换函数void main(){start=0;while(1)transform();//循环调用AD转换函数}//**********************//AD转换函数//**********************void transform (){start=1; //正脉冲起动AD转换start=0;address=0x3f;//送地址给AD转换ale=1; //锁存地址while(1)//等待转换结束{if(finish==1)//转换完成{disp=date;// 取走数据ale=0; //撤消地址锁存信号break;//跳出循环进行下一次AD转换}}}6.运行、调试程序和结果检查⑴采用单步,设置断点等方法,态观察程序走向是否正确。
实验二 AD转换实验
实验二 AD转换实验实验预习要求1、学习 MSP430F6638 单片机中ADC12的配置方法。
2、了解ADC转换原理。
一、实验目的1、了解AD转换原理及LED灯的控制方法。
2、掌握MSP430F6638 中ADC12的配置使用方法。
3、结合电位器与ADC12模块实现对LED灯的控制。
二、实验器材PC 机,MSP430F6638 EVM,USB数据线,万用表,信号发生器。
三、实验内容1、验证性实验:利用MSP430F6638开发板上的拨盘电位器,控制改变AD转换的输入电压值,转换后的数字量显示在段式液晶上面。
使用万用表测得当前输入电压,通过计算得到转换后的理想的数字量与液晶显示的数字量进行比较。
2、设计性实验:AD转换结束会产生中断,编写AD中断服务程序。
利用信号发生器输出信号(例如正弦波、三角波信号)作为AD转换的输入,根据输入电压的大小控制LED灯的亮灭(例如随着输入电压值的增大,LED1到LED5按顺序点亮;随着输入电压值减小,LED灯按顺序熄灭),LED和单片机IO口连接如下图所示。
图2.1 LED灯电路原理图四、实验原理模数转换器(ADC)是指将连续的模拟信号转换为离散的数字信号的器件。
真实世界 的模拟信号,例如温度、压力、声音或者图像等,需要转换成更容易储存、处理和发射的数 字形式。
在A/D 转换中,因为输入的模拟信号在时间上是连续的,而输出的数字信号是离 散量,所以进行转换时只能按一定的时间间隔对输入的模拟信号进行采样,然后再把采样值 转换为输出的数字量。
通常A/D 转换需要经过采样、保持量化、编码几个步骤。
ADC12 电 路如下图所示。
图2.2 ADC12 模块结构框图ADC12 模块中由以下部分组成:输入的16 路模拟开关,ADC 内部电压参考源,ADC12 内核,ADC 时钟源部分,采集与保持/触发源部分,ADC 数据输出部分,ADC 控制寄存器等组成。
ADC12 的模块内核是共用的,通过前端的模拟开关来分别完成采集输入。
单片机实验报告AD转换器实验
.
西华大学实验报告(机械类)
开课学院及实验室:机械工程与自动化学院运算机机房实验时刻:2021年 4月 7 日
一、实验目的
把握SPI总线的ADC0832(或TLC549)数模转换器的利用方式。
二、实验内容
利用ADC0832搜集直流0--5V的电压,并在LCM1602上显示结果。
三、实验电路
四、实验程序
;
DispBuffer[2]=(ad_data%10)+0x30; DispBuffer[3]='v';
DispBuffer[5]='\0';
LCD_Prints(6,1,DispBuffer);
}
}
五、实验步骤
1)依如实验原理图编写程序,用“keil uVision4”编译元件进行编译,如未通过,修改程序,直至通过。
(2)用软件将所编程序的“HEX”码下载到实验板的STC89C52芯片中。
(3)运行程序,用手凝动实验板左端的可变电阻,观看LCM1602是不是显现“改变可变电阻时,LCM1602的数值是不是在之间变更。
若是不符合要求,改写程序,按步骤(1)开始从头做实验,直至成功。
六、附录
用本实验能够开发哪些实际仪表?
答:用本实验能够开发电压表,称重仪等实际仪表。
实验十二 AD转换实验
实验十二A/D转换实验一、实验目的1.掌握A/D转换与单片机接口的方法。
2.了解A/D芯片0809转换性能及编程方法。
3.用AT89C51单片机控制ADC0809将模拟信号(0~5V)转换成数值量(0~255),再控制LED数码管以十六进制实时显示出来。
ADC0809为模/数(A/D)转换器。
4.用PROTEUS实现该接口的电路设计和程序设计,并进行实时交互仿真。
5.要求使用查询和中断两种方式编写程序。
二、电路设计1.从PROTEUS库中选取元件①AT89C51.BUS:总线式的单片机;②RES:电阻;③LED-BLUE:蓝色发光二极管;④CAP、CAP-ELEC:电容、电解电容;⑤CRYSTAL:晶振;⑥AD0808:8位A/D转换器;⑦74LS28:四路或非门;⑧NOT :非门;⑨74LS373:八 D 锁存器;⑩POT-LIN :滑动变阻器;○11RESPACK-8:8位排阻。
2.放置元器件3.放置电源和地4.连线5.元器件属性设置6.电气检测三、源程序设计、生成目标代码文件1.流程图2.源程序设计3.源程序编译汇编、生成目标代码文件通过菜单“sourc e →Build All ”编译汇编源程序,生成目标代码文件。
若编译失败,可对程序进行修改调试直至汇编成功。
四、PROTEUS 仿真1.加载目标代码文件2.仿真 单击按钮,启动仿真。
U1X1C1C2U4U5RV1U6U7:AU7:B D1U10D2D3D4U11U12U13D5U14D6D7D8U15U16U17RP1五、思考题:1.目前应用较广泛的A/D 转换器主要有哪几种类型?它们各有什么特点?2.在一个AT89C51单片机与一片ADC0809组成的数据采集系统中,ADC0809的8个通道的地址为7FF8H~7FFFH,试画出相应的接口电路图。
单片机AD转换实验
页眉内容四、电路原理图P [10..17]P [00..07]P[10..17]p [00..07]Q [0..7]p [00..07]P07P00P01P02P03P04P05P06P07P00P01P02P03P04P05P06GND ALERST ALE WR RDQ0Q1Q2Q3Q4Q5Q6Q7WR Q3P20Q3RD Q0STQ2OEEOC Q1P 10P 11P 12P 13P 14P 15P 16P 17P 425P 26P 27P07P06P05P04P03P02P01P00P10P11P12P13P14P15P16P17EOC STST P25P26P27P24OEINT0VREF(-)INT1INT0XTAL218XTAL119ALE 30EA31PSEN 29RST9P0.0/AD039P0.1/AD138P0.2/AD237P0.3/AD336P0.4/AD435P0.5/AD534P0.6/AD633P0.7/AD732P1.0/T21P1.1/T2EX 2P1.23P1.34P1.45P1.56P1.67P1.78P3.0/RXD 10P3.1/TXD 11P3.2/INT012P3.3/INT113P3.4/T014P3.7/RD17P3.6/WR 16P3.5/T115P2.7/A1528P2.0/A821P2.1/A922P2.2/A1023P2.3/A1124P2.4/A1225P2.5/A1326P2.6/A1427U1AT89C52D03Q02D14Q15D27Q26D38Q39D413Q412D514Q515D617Q616D718Q719OE 1LE 11U274LS373OUT121ADD B 24ADD A 25ADD C 23VREF(+)12VREF(-)16IN31IN42IN53IN64IN75START 6OUT58EOC 7OE9CLOCK 10OUT220OUT714OUT615OUT817OUT418OUT319IN228IN127IN026ALE 22U4ADC0808+88.8Volts12U5:A74LS04231U6:A74LS02564U6:B74LS02R1470R2470R4470R6470R3470R5470R7470R8470U4(CLOCK)59%RV21k五、流程框图开始启动A\D 转换整数位转移小数位转移调用延时子程序读通道数据表格首地址查个位送LED2查小数点后第一位送LED1查小数点后第二位送LED0通道首地址六、程序清单1.汇编语言程序:ORG 0000HMAIN: MOV DPTR , #0000H MOVX @DPTR , ALCALL DELAY200USMOVX A , @DPTRMOV B , #51DIV ABMOV DPTR , #TABMOVC A , @A+DPTRANL A , #7FHMOV 78H , AMOV A , BMOV B , #5DIV ABMOVC A , @A+DPTRMOV 79H , AMOV A , BMOVC A , @A+DPTRMOV 7AH , ALCALL LOOPLJMP MAINLOOP : MOV P2 , #20HMOV P1 , 78HLCALL DELAY1MSMOV P2 , #40HMOV P1 , 79HLCALL DELAY1MSMOV P2 , #80HMOV P1 , 7AHLCALL DELAY1MSRETDELAY1MS:MOV R7 , #01HDL1: MOV R6 , #8EHDL0: MOV R5 , #02HDJNZ R5 , $DJNZ R6 , DL0DJNZ R7 , DL1RETDELAY200US:MOV R4 , #01HDL2: MOV R3 , #61HDJNZ R3 , $DJNZ R4 , DL2RETTAB:DB0C0H,0F9H,0A4H,0B0H,99H,92H,82H, 0F8H,80H,90HEND C语言程序:#include<reg52.h>#define uchar unsigned char#define uint unsigned intUchar code smg_duan[]={0xc0,0xf9,0xa4,0xb0,0x99, 0x92,0x82,0xf8,0x80,0x90};uchar code wei[]={0x80,0x40,0x20}; uchar xdata *ad;uint ad_data,duan[2];void delay_us(uint x){while(x--);}void smg_display(){ uchar i;for(i=0;i<3;i++){P2=wei[i];P1=duan[i];delay_us(1000);}}void main(){while(1){ad=0x0000;*ad=0;delay_us(200);ad_data=*ad;ad_data=ad_data*1.;duan[0]=smg_duan[ad_data%100%1 0];duan[1]=smg_duan[ad_data%100/10 ];duan[2]=smg_duan[ad_data/100]&0 x7f;smg_display();}}2.汇编语言程序:ORG 0000HMAIN: MOV DPTR , #0000HMOVX @DPTR, A EOC: JNB P3.2 , LOOP1LJMP EOCLOOP1: MOVX A , @DPTRMOV B , #51DIV ABMOV DPTR , #TABMOVC A , @A+DPTRANL A , #7FHMOV 78H , AMOV A , BMOV B , #5DIV ABMOVC A , @A+DPTRMOV 79H , AMOV A , BMOVC A , @A+DPTRMOV 7AH , ALCALL LOOP2LJMP MAINLOOP2 :MOV P2 , #20HMOV P1 , 78HLCALL DELAY1MSMOV P2 , #40HMOV P1 , 79HLCALL DELAY1MSMOV P2 , #80HMOV P1 , 7AHLCALL DELAY1MSRETDELAY1MS:MOV R7 , #01HDL1: MOV R6 , #8EHDL0: MOV R5 , #02HDJNZ R5 , $DJNZ R6 , DL0DJNZ R7 , DL1RETTAB:DB0C0H,0F9H,0A4H,0B0H,99H,9 2H,82H,0F8H,80H,90H ;0-9END C语言程序:#include<reg52.h>#define uchar unsigned char#define uint unsigned int ucharcodesmg_duan[]={0xc0,0xf9,0xa4, 0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; uchar xdata *ad;uintad_data,duan[2],wei[]={0x80,0x40,0x20} ;sbit EOC=P3^2;void delay_us(uint x){while(x--);}void smg_display(){uchar i;for(i=0;i<3;i++){P2=wei[i];P1=duan[i];delay_us(1000);}}void main(){while(1){ad=0x0000;*ad=0;while(EOC);ad_data=*ad;ad_data=ad_data*1.;duan[0]=smg_duan[ad_data%100%1 0];duan[1]=smg_duan[ad_data%100/10 ];duan[2]=smg_duan[ad_data/100]&0 x7f;smg_display();}}七、实验结果分析调节可变电阻得到以下结果:延时法:查询法:中断法由proteus仿真结果可看出,电压表显示电压值跟数码管显示值一样,成功进行了模数转换,故程序正确。
单片机及其应用开发-AD转换实验
实验五模数转换应用实验1 实验目的通过实验,了解A VR单片机模数转换器的初始化、工作原理,以及AD按键的检测方法和工作原理。
2 实验内容1、通过AD转换采集PA7(ADC7)引脚上的模拟电压,并将转换值在数码管上显示。
参照教材315页的ADC应用实例;2、将转换结果通过串口发送到PC机,熟悉串口的使用。
3 实验预习要求仔细阅读ATmega16单片机的数据手册,了解模数转换寄存器的设置P191;参考教材第6章节。
4实验步骤1、启动ICCA VR,新建工程文件“ADkey.PRJ”,新建Adkey.c文件,并将Adkey文件添加到Adkey工程中,并设置project->option->target 下的device configuration 选择ATMega16;2、本实验的ADC初始化代码请独立完成,Application Builder直接生成的ADC初始化代码不正确, 本实验板ADC的参考电源请选择A VCC,Prescale请选择64,AD键盘所用的AD输入为ADC7通道;参考Mega16 数据手册中203页的ADC相关寄存器介绍和教材315页的范例关于ADC的启动方式一般可选:用定时器触发启动,也可以使用软件启动的方法。
(1)如果采用定时器触发AD转换,一般选择定时器比较匹配时触发AD转换的方法。
例如选用Timer0比较匹配来触发启动AD转化,即当Timer0比较匹配发生时,自动启动AD转换,不需要程序干预,如果Timer0的比较匹配时间为5ms,那么ADC将5ms 自动启动一次。
此时SFIOR寄存器的ADTS[2:0]需要设为011(2)采用软件启动AD转换的方式:又称单次转换模式,即每次AD转换的启动都需要程序触发.方法是:程序中置位ADCSRA寄存器中的第六位(ADSC位),便会立即启动一次AD转化;例如:ADCSRA |= (1 << ADSC); //开始AD转换(3)关于转换结果的读取,可以用查询方式读取也可以用AD转换完成中断方式读取;(4)查询方式读取实例:(注:AD转换结果为左对齐方式)unsigned int AD_GetData(){ADCSRA |= (1 << ADSC); //开始AD转换while(!(ADCSRA & (1 << ADIF))); //等待转换完成ADCSRA |= (1 << ADIF); //清零ADC中断标志位return ADCH; //返回ADCH值,只取高8位}然后通过以下方法将ADC转换结果换算为电压值;adc_v=(unsigned long)ADC*3300/1024;通过以下方法将电压值刷新到display buffer中adc_to_disbuffer(adc_v);数码管显示方法采用前几次实验的现实方法,Display函数会自动将display buffer中的内容显示在数码管上。
《单片机原理与应用》AD和DA转换实验
《单片机原理与应用》AD和DA转换实验一、实验目的1、学习AD转换芯片PCF8591的基本共组原理。
2、掌握PCF8591的编程方法二、实验说明PCF8591是一个单片集成、单独供电、低功耗、8-bit CMOS数据获取器件。
PCF8591具有4个模拟输入、1个模拟输出和1个串行I2C总线接口。
PCF8591的3个地址引脚A0, A1和A2可用于硬件地址编程,允许在同个I2C总线上接入8个PCF8591器件,而无需额外的硬件。
在PCF8591器件上输入输出的地址、控制和数据信号都是通过双线双向I2C总线以串行的方式进行传输。
1、地址寄存器I2C总线系统中的每一片PCF8591通过发送有效地址到该器件来激活,该地址包括固定部分和可编程部分。
可编程部分必须根据地址引脚A0. A1和A2来设置。
在I2C总线协议中地址必须是起始条件作为第一个字节发送。
地址字节的最后一位是用于设置以后数据传输方向的读写位。
如图8-1所示。
图8-1 地址寄存器2 控制字寄存器发送到PCF8591的第二个字节将被存储在控制寄存器,用于控制器件功能,控制寄存器的高半字节用于容许模拟输出,和将模拟输入编程为单端或差分输入。
低半字节选择一个由高半字节定义的模拟输入通道。
如果自动增量(auto-increment)标志置1,每次AD转换后通道号将自动增加。
如果自动增量(auto-increment)模式是使用内部振荡器的应用中所需要的,那么控制字节中模拟输出容许标志应置1.这要求内部振荡器持续运行,因此要防止振荡器启动延时的转换错误结果。
模拟输出容许标志可以在其他时候复位以减少静态功耗。
选择一个不存在的输入通道将导致分配最高可用的通道号。
所以,如果自动增量(auto-increment)被置1,下一个被选择的通道将总是通道0.两个半字节的最高有效位(即第7位和第3位)是留给未来的功能,必须设置为逻辑0.控制寄存器的所有位在上电复位后被复位为逻辑0.DA转换器和振荡器在节能时被禁止。
基本C51单片机的AD转换实验
基本C51单片机的A/D转换实验1.实验目的掌握A/D转换芯片ADC0809与单片机的接口方法及ADC0809芯片性能;了解单片机实现数据采集的方法。
2.实验设备及器件PC机一台单片机综合创新实验箱一台8孔排线一根杜邦线3根3.实验内容编写一段程序,通过ADC0809实现单片机对模拟输入通道电压的采集,使采集到的数据显示在数码管上。
4.实验步骤①用1根杜邦线将J200的左针与D3区J44的CH0相接,或者不连,因为印刷板上已连通。
连接一下只是增加学生的感性认识(注意:标CH0的实际是ADC0809的IN7);②将D4区的J2用杜邦线与B7区J100相连(注意:B7区此时必须将拨码开关向下拨,B8区J58短路帽断开,拨码开关向下拨,否则显示有问题);③用两根杜邦线将D4区的J4中的P34、P35与B7区J102的BIT0、BIT1相连;④运行编写好的软件程序,调节电位器,仿真观察显示的是否变化。
ALE AD启动、使能电路图3.12 A/D转换接口电路图5.参考程序/*位码分别接P34和P35 ,段码P1口,其它接线同以前*/AD EQU 30HBAI EQU 31HSHI EQU 32HGEW EQU 33HAD1 EQU 34HORG 0000HLJMP MAINMAIN: MOV A,#00HMOV DPTR,#7F07HMOVX @DPTR,AMOV R6,#0aHDELAY: NOPNOPNOPDJNZ R6,DELAYMOVX A,@DPTRMOV AD,AACALL DISPJMP MAINDISP: MOV A,ADMOV B,#5DIV ABMOV B,#10DIV ABMOV BAI,AMOV A,BMOV SHI,AD0: MOV R0,#100D1:MOV A,BAIMOV DPTR,#TAB1MOVC A,@A+DPTRMOV P1,ACLR P3.4ACALL D1MSSETB P3.4MOV A,SHIMOV DPTR,#TABMOVC A,@A+DPTRMOV P1,ACLR P3.5ACALL D1MSSETB P3.5DJNZ R0,D1RETD1MS: MOV R6,#2DSS: MOV R7,#0FFHDJNZ R7,$DJNZ R6,DSSRETTAB1: DB 0BFH,86H,0DBH,0CFH,0E6H,0EDH,0FDH,87H,0FFH,0EFH,80H TAB: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH,00HENDC51例程:#include "reg51.h"#define THCO 0xee#define TLCO 0x0unsigned char codeDuan[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x00}; //共阴极数码管-9段码表unsigned char Data_Buffer[4]={10,0,0,0};float AdValue;sbit P34=P3^4; //四个数码管的位码口定义sbit P35=P3^5;sbit P36=P3^6;sbit P37=P3^7;/**************************************************/sbit ADWR=P1^0;sbit RS=P1^1;sbit CS=P1^2;sbit Add1=P1^3;sbit Add2=P1^4;sbit Add3=P1^5;sbit EOC=P1^6;sbit LED=P1^7;/**************************************************/ void Sysinit();void AD_Start(void);void LED_Fresh();void delay_ms(unsigned int x);void main(){ unsigned int i;Sysinit();Add1=0;Add2=0; //模拟量通道输入选择Add3=0;while(1){AD_Start();while(!EOC);LED=!LED;RS=0;AdValue=P0;LED_Fresh();RS=1;for(i=0;i<40000;i++);}}void Timer0_ISR() interrupt 1{static unsigned char Bit=0;TH0=THCO;TL0=TLCO;Bit++;if(Bit>=4)Bit=0;P34=0;P35=0;P36=0;P37=0;//关位码P2=Duan[Data_Buffer[Bit]];switch(Bit){case 0: P34=0;break;case 1: P35=0;break;case 2: P36=0;break;case 3: P37=0;break;}}void LED_Fresh(){unsigned int temp;temp=AdValue;Data_Buffer[1]=temp/100;Data_Buffer[2]=temp/10%10;Data_Buffer[3]=temp%10;}void Sysinit(){TMOD=0x11; //定时器0初始化TH0=THCO;TL0=TLCO;TR0=1;ET0=1;EA=1;}void AD_Start(void){ADWR=1;CS=0;delay_ms(1);ADWR=0;delay_ms(1);ADWR=1;}void delay_ms(unsigned int x){unsigned char y;for(x;x>0;x--)for(y=110;y>0;y--); }。
单片机AD转换实验报告
实验八A/D实验报告㈠实验目的1.掌握单片机与A/D的接口及编程方法;2.进一步了解A/D的工作原理;3.通过实验了解单片机如何进行数据采集;4.进一步了解单片机系统地址分配概念。
㈡实验器材1.G6W仿真器一台2.MCS—51实验板一台3.PC机一台4.信号发生器一台㈢实验内容及要求首先利用8051单片机的高位地址进行线译码,以分别给实验板中的各有关芯片提供CS信号,实现单片机系统地址分配。
ADC0809是输入为8通道、可与8051单片机直接接口的8位逐次逼近型CMOSA/D。
在8模拟输入通道中的每个通道上接至不同的信号源,改变通道号,并把A/D转换结果显示出来,即可检查A/D转换过程是否正确。
根据实验板的硬件线路可知,当8051向0809写入通道数时,即启动A/D转换,约经过100μs后,A/D转换完成,并向8051发出中断申请。
要求在ADC0809的输入端加上不同的模拟信号,通过键盘输入ADC0809的通道号并启动A/D转换,采集N个(如N=256)数据存入外部RAM中,打开XDATA窗口,检查实验结果。
注意:①在进行A/D采样前,应先检查ADC0809的参考电压是否正确。
(要求ADC0809的参考电压值Vref = +5V,用万用表观察ADC0809芯片的12脚电压值。
若不对,可调节实验板上的电位器W1来改变A/D的参考电压值。
)②实验板上电位器W2可调节校准信号的值。
㈣实验框图(见下页)㈤思考题1.本实验中,对采样信号的频率有没有限制?若有,其频率应在什么范围内?根据采样定理,采样频率必须大于最高频率的两倍。
2.如果要采集具有正负值的输入模拟信号,则应对实验板中的A/D线路接法作哪些修正?关于这一点,记得实验前夏兰老师好像提过,但是由于专注于硬件电路的连接,忘记了该怎么修正,希望老师给点提示。
ORG 0000HLJMP STARTORG 0003HLJMP INT_0ORG 0040HSTART:MOV SP, #60HMOV R7,#0FFH ;读取数据个数初始化MOV R1,#0B0H ;片外储存数据首地址MOV R0, #00HMOV DPTR,#7FFFH ;选中6116芯片MOV A,#02H ;根据硬件连接选择通道号MOVX @DPTR,A ;启动A_DSETB IT0 ;开中断SETB EASETB EX0CJNZ R7,#0H,T ;判断256个数据是否转换完毕,是则停止,否则原地等待中断INT_0:MOVX A,@DPTR ;读A_D 数据MOV DPH,R1MOV DPL,R0MOVX @DPTR,A ;将数据放到片外存储地址INC R0 ;指向下一个单元DEC R7 ;数据个数减一MOV DPTR,#7FFFHMOV A,#02HMOVX @DPTR,A ;再次启动A_DRETI ;返回中断T:SJMP $ ;数据转换完毕则程序停止实验过程中犯了一些很低级的错误,比如说中断地址和所用中断不匹配,中断返回的位置自己不确定,对于怎样写地址才能选中芯片不确定,这些看似不起眼的细微的东西往往决定了整个实验的成败。
单片机AD模数转换实验报告
单片机AD模数转换实验报告实验目的:通过单片机完成模数转换实验,了解AD模数转换的原理,掌握AD转换器的使用方法。
实验设备:1.STC89C52RC单片机开发板2.电位器3.电阻4.电容5.连接线实验原理:AD模数转换是将连续的模拟信号转换为离散的数字信号的过程。
在单片机中,通过ADC模块将模拟电压转换为数字量。
STC89C52RC单片机具有内置的10位ADC模块,可以将模拟电压转换为0-1023之间的数字量。
实验步骤:1.连接电位器、电阻和电容的引脚到单片机上。
2.在单片机的引脚配置中,将ADC0的引脚配置为模拟输入。
3.在主函数中初始化ADC模块。
4.使用AD转换函数来获取模拟电压的数字量。
5.将数字量通过串口输出。
实验结果:经过以上步骤,我们成功地将连续的模拟信号转换为了数字信号,并通过串口输出。
通过电位器、电阻和电容的调整,我们可以观察到不同的输入信号对应的数字量。
实验总结:通过本次实验,我们深入了解了AD模数转换的原理,并学会了使用单片机的ADC模块来完成模数转换。
在实验过程中,我们还发现了一些问题和注意事项。
首先,在连接电路时,需要将模拟输入连接到ADC0引脚,并在引脚配置中正确设置。
其次,在初始化ADC模块时,需要根据实际情况设置参考电压和转换速率等参数。
最后,在使用AD转换函数时,需要根据需要进行适当的调整和计算,以获取正确的数字量。
总体来说,本次实验帮助我们更好地理解了AD模数转换的原理和单片机的ADC模块的使用方法。
通过实际操作,我们掌握了实验步骤和注意事项,提高了实际操作的能力和理论知识的运用。
这对我们的电子技术学习和应用都起到了积极的促进作用。
单片机报告(ad转换)
实验报告自动化与电气工程类实训实验实验一:数据采集_A/D转换实验组员:李彩芹 2014212744蒋添云 2014212756班级:08051401指导老师:蔡军实验一、数据采集_A/D转换实验一、实验目的⑴掌握A/D转换与单片机接口的方法;⑵了解A/D芯片0808转换性能及编程方法;⑶通过实验了解单片机如何进行数据采集。
二、实验设备装有proteus的电脑一台三、实验说明及实验原理:A/D转换器大致分有三类:一是双积分A/D转换器,优点是精度高,抗干扰性好,价格便宜,但速度慢;二是逐次逼近式A/D转换器,精度、速度、价格适中;三是并联比较型A/D转换器,速度快,价格也昂贵。
实验用ADC0808属第二类,是8位A/D转换器。
每采集一次一般需100μs。
由于ADC0808A/D转换器转换结束后会自动产生EOC信号(高电平有效),取反后将其与8031的INT0相连,可以用中断方式读取A/D转换结果。
ADC0808是带有8位A/D转换器、8路多路开关以及微处理机兼容的控制逻辑的CMOS 组件。
它是逐次逼近式A/D转换器,可以和单片机直接接口。
(1) ADC0808的内部逻辑结构由图1.1可知,ADC0808由一个8路模拟开关、一个地址锁存与译码器、一个A/D转换器和一个三态输出锁存器组成。
多路开关可选通8个模拟通道,允许8路模拟量分时输入,共用A/D转换器进行转换。
三态输出锁器用于锁存A/D转换完的数字量,当OE端为高电平时,才可以从三态输出锁存器取走转换完的数据。
图1.1 ADC0809 内部结构框图(2) ADC0808引脚结构ADC0808各脚功能如下:D7 ~ D0:8位数字量输出引脚。
IN0 ~ IN7:8位模拟量输入引脚。
VCC:+5V工作电压。
GND:地。
REF(+):参考电压正端。
REF(-):参考电压负端。
START:A/D转换启动信号输入端。
ALE:地址锁存允许信号输入端。
(以上两种信号用于启动A/D转换).EOC:转换结束信号输出引脚,开始转换时为低电平,当转换结束时为高电平。
MSP430单片机AD转换实验
AD转换实验、转换原理MSP430F149勺A/D转换器原理请参考相关书籍。
实验板上与AD相关的硬件电路:RV§10K----------J6P61SIP2A1)输入电路{设计主程序和中断服务程序。
二、转换程序1、程序 1:转换结果发送到 PC主程序中进行 A/D 初始化,中断服务程序读 A/D 转换结果,主程序中通过串口发送结果。
“”主程序与中断程序:/*********************************************************程序功能:将ADC 对端口电压的转换结果按转换数据和对应的模拟电压的形式通过串口发送到PC 机屏幕上显示通信格式: 9600测试说明:打开串口调试精灵,正确设置通信格式,观察接收数据**********************************************************/ #include <> #include "" #include "" #include ""#define Num_of_Results 32 uint results[Num_of_Results]; // uint average; uchar tcnt = 0;主函数 ***********************/void main( void )保存ADC 转换结果的数组/***********************uchar i;uchar buffer[5];WDTCTL = WDTPW + WDTHOLD; // /* 下面六行程序关闭所有的IO 口*/P1DIR=0XFF;P1OUT = 0XFF;P2DIR= 0XFF;P2OUT = 0XFF;P3DIR= 0XFF;P3OUT = 0XFF;P4DIR= 0XFF;P4OUT = 0XFF;P5DIR= 0XFF;P5OUT = 0XFF;P6DIR= 0XFF;P6OUT = 0XFF;P6DIR |= BIT2;P6OUT |= BIT2; //P6DIR|=BIT6;P6OUT&=~BIT6; // InitUART();Init_ADC();_EINT();buffer[4] = '\0';while(1){LPM1;Hex2Dec(average,buffer);for(i = 0; i < 4; i++)buffer[i] += 0x30;PutString0("The digital value is: ");PutString(buffer);关狗关闭电平转换关闭数码管显示Trans_val(average,buffer);buffer[3] = buffer[2];buffer[2] = buffer[1];buffer[1] = 0x2e - 0x30;for(i = 0; i < 4; i++)buffer[i] += 0x30;PutString0("The analog value is: ");PutString(buffer);}}/*******************************************函数名称:ADC12ISR功能:ADC中断服务函数,在这里用多次平均的计算口的模拟电压数值参数:无返回值:无********************************************/#pragma vector=ADC_VECTOR__interrupt void ADC12ISR (void){static uchar index = 0;results[index++] = ADC12MEM0; // Move results if(index == Num_of_Results)uchar i;{average = 0;for(i = 0; i < Num_of_Results; i++){average += results[i];}average >>= 5; // 除以32index = 0;tcnt++;if(tcnt == 250) // 主要是降低串口发送速度{LPM1_EXIT;tcnt = 0;}}}“” A/D 转换相关程序:#include <>typedef unsigned int uint;/********************************************函数名称:Init_ADC功能:初始化ADC参数:无返回值:无****************************************** void Init_ADC(void) {P6SEL |= 0x01; //ADC12CTL0 = ADC12ON+SHT0_15+MSC; // ADC12CTL1 = SHP+CONSEQ_2; // ADC12IE = 0x01; // ADC12CTL0 |= ENC; // ADC12CTL0 |= ADC12SC; // } /********************************************函数名称: Hex2Dec 功能:将16进制ADC 转换数据变换成十进制表示形式参数: Hex_Val--16 进制数据ptr--指向存放转换结果的指针返回值 :无 ********************************************/ void Hex2Dec(uint Hex_val,uchar *ptr) {ptr[0] = Hex_val / 1000;ptr[1] = (Hex_val - ptr[0]*1000)/100;ptr[2] = (Hex_val - ptr[0]*1000 - ptr[1]*100)/10; ptr[3] = (Hex_val - ptr[0]*1000 - ptr[1]*100 - ptr[2]*10); } /*******************************************函数名称: Trans_val功 能:将16进制ADC 转换数据变换成三位10进制真实的模拟电压数据,并在液晶上显示参 数: Hex_Val--16 进制数据 返回值 :无使能ADC 通道打开ADC 设置采样时间 使用采样定时器 使能ADC 中断 使能转换 开始转换********************************************/void Trans_val(uint Hex_Val,uchar *ptr){unsigned long caltmp;uint Curr_Volt;uchar t1;caltmp = Hex_Val;caltmp = (caltmp << 5) + Hex_Val; //caltmp = Hex_Val * 33caltmp = (caltmp << 3) + (caltmp << 1); //caltmp = caltmp * 10Curr_Volt = caltmp >> 12; 〃Curr_Volt = caltmp / 25ptr[0] = Curr_Volt / 100; //Hex->Dec变换t1 = Curr_Volt - (ptr[0] * 100);ptr[1] = t1 / 10;ptr[2] = t1 - (ptr[1] * 10);}“”串口程序:#include <>typedef unsigned char uchar;/*******************************************函数名称:InitUART功能:初始化UART端口参 数:无 返回值 :无********************************************/ void InitUART(void)ME1 |= URXE0 + UTXE0;// Enable USART0 T/RXDUCTL0 |= CHAR;// 8-bit characterUBR00 = 0x03; UBR10 = 0x00;// Initialize USART state machine/*******************************************函数名称: Send1Char 功 能:向 PC 机发送一个字符参数: sendchar-- 要发送的字符 返回值 :无********************************************/ void Send1Char(uchar sendchar)while (!(IFG1 & UTXIFG0)); // TXBUF0 = sendchar;'*****************************************函数名称: PutSting 功 能:向 PC 机发送字符串并换行指令 参数: ptr-- 指向发送字符串的指针返回值 :无********************************************/ void PutString(uchar *ptr)P3SEL |= 0x30;// ,5 = USART0 TXD/RXDUTCTL0 |= SSEL0; // UCLK = ACLK UMCTL0 = 0x4A;// Modulation// 32k/9600 - //UCTL0 &= ~SWRST; 等待发送寄存器为空{while(*ptr != '\0'){Send1Char(*ptr++); // 发送数据}while (!(IFG1 & UTXIFG0));TXBUF0 = '\n'; // 发送换行指令}/*******************************************函数名称:PutSting0功能:向PC 机发送字符串,无换行参数:ptr-- 指向发送字符串的指针返回值:无********************************************/void PutString0(uchar *ptr){while(*ptr != '\0'){Send1Char(*ptr++); // 发送数据2、程序2:转换结果显示在1602 显示模块上“”程序#include <>#include ""typedef unsigned char uchar;typedef unsigned int uint;**//************** 宏定义*************#define DataDir P2DIR#define DataPort P2OUT#define Busy 0x80#define CtrlDir P6DIR#define CLR_RS P6OUT&=~BIT3;//RS =#define SET_RS P6OUT|=BIT3;#define CLR_RW P6OUT&=~BIT4; //RW = #define SET_RW P6OUT|=BIT4;#define CLR_EN P6OUT&=~BIT5; //EN = #define SET_EN P6OUT|=BIT5;/*******************************************函数名称:DispNchar功能:让液晶从某个位置起连续显示N 个字符参数:x-- 位置的列坐标y-- 位置的行坐标n-- 字符个数ptr-- 指向字符存放位置的指针返回值:无****************************************** void DispNChar(uchar x,uchar y, uchar n,uchar *ptr){uchar i;for (i=0;i<n;i++){Disp1Char(x++,y,ptr[i]);if (x == 0x0f){x = 0;y A= 1;}}}/*******************************************函数名称:LocateXY功能:向液晶输入显示字符位置的坐标信息参数:x-- 位置的列坐标y-- 位置的行坐标返回值:无******************************************void LocateXY(uchar x,uchar y){uchar temp;temp = x&0x0f;y &= 0x01;if(y) temp |= 0x40; // 如果在第2 行temp |= 0x80;LcdWriteCommand(temp,1);} /******************************************* 函数名称:Disp1Char功能:在某个位置显示一个字符参数:x-- 位置的列坐标y-- 位置的行坐标data-- 显示的字符数据返回值:无********************************************/ void Disp1Char(uchar x,uchar y,uchar data) {LocateXY( x, y );LcdWriteData( data );}/*******************************************函数名称:LcdReset功能:对1602 液晶模块进行复位操作参数:无返回值:无********************************************/ void LcdReset(void)DataDir = 0xFF; // LcdWriteCommand(0x38, 0);Delay5ms();LcdWriteCommand(0x38, 0);Delay5ms();LcdWriteCommand(0x38, 0);Delay5ms(); LcdWriteCommand(0x38, 1);LcdWriteCommand(0x08, 1);LcdWriteCommand(0x01, 1);LcdWriteCommand(0x06, 1);LcdWriteCommand(0x0c, 1);}/*******************************************函数名称: LcdWriteCommand 功 能:向液晶模块写入命令参 数: cmd-- 命令,chk-- 是否判忙的标志,返回值 :无********************************************/void LcdWriteCommand(uchar cmd,uchar chk) {CtrlDir |= 0x07;// 控制线端口设为输出状态 数据端口设为输出状态 // 规定的复位操作// 显示模式设置 // 显示关闭 // 显示清屏 // 写字符时整体不移动 // 显示开,不开游标,不闪烁 1:判忙, 0:不判if (chk) WaitForEnable(); // 检测忙信号CLR_RS;CLR_RW;_NOP();DataPort = cmd; // 将命令字写入数据端口_NOP();SET_EN; // 产生使能脉冲信号_NOP();_NOP();CLR_EN;}/*******************************************函数名称:LcdWriteData功能:向液晶显示的当前地址写入显示数据参数:data-- 显示字符数据返回值:无********************************************/void LcdWriteData( uchar data ){WaitForEnable(); // 等待液晶不忙SET_RS;CLR_RW;_NOP();DataPort = data; // 将显示数据写入数据端口_NOP();SET_EN; // 产生使能脉冲信号_NOP();_NOP();CLR_EN;}/*******************************************函数名称:WaitForEnable功能:等待1602 液晶完成内部操作参数:无返回值:无********************************************/void WaitForEnable(void){P2DIR &= 0x00; // 将P4 口切换为输入状态CLR_RS;SET_RW;_NOP();SET_EN;_NOP();_NOP();while((P2IN & Busy)!=0); // 检测忙标志CLR_EN;P2DIR |= 0xFF; // 将P4 口切换为输出状态'*****************************************函数名称:Delay5ms功能:延时约5ms返回值:无******************************************** void Delay5ms(void){uint i=40000;while (i != 0){i--;}}/******************************************* 函数名称:Delay400ms功能:延时约400ms参数:无返回值:无******************************************** void Delay400ms(void){uchar i=50;uint j;while(i--)while(j--);}}“”程序#include <>#include ""typedef unsigned char uchar; typedef unsigned int uint;#define DataDir P2DIR #define DataPort P2OUT #define Busy 0x80#define CtrlDir P6DIR #define CLR_RSP6OUT&=~BIT3; //RS =#define SET_RS P6OUT|=BIT3;#define CLR_RW P6OUT&=~BIT4; //RW#define SET_RW P6OUT|=BIT4;#define CLR_EN P6OUT&=~BIT5;//EN #define SET_EN P6OUT|=BIT5;*****************************************函数名称: DispNchar功 能:让液晶从某个位置起连续显示参 数: x-- 位置的列坐标 y-- 位置的行坐标 n--字符个数 ptr--指向字符存放位置的指针返回值 :无 ********************************************/void DispNChar(uchar x,uchar y, uchar n,uchar *ptr) ************ 宏定义 ************* N 个字符{uchar i;for (i=0;i<n;i++){Disp1Char(x++,y,ptr[i]);if (x == 0x0f){x = 0;y A= 1;}}}/*******************************************函数名称:LocateXY功能:向液晶输入显示字符位置的坐标信息参数:x-- 位置的列坐标y-- 位置的行坐标返回值:无******************************************void LocateXY(uchar x,uchar y)uchar temp;temp = x&0x0f;y &= 0x01;if(y) temp |= 0x40; // 如果在第2 行temp |=0x80;LcdWriteCommand(temp,1);}/*******************************************函数名称:Disp1Char功能:在某个位置显示一个字符参数:x-- 位置的列坐标y-- 位置的行坐标data-- 显示的字符数据返回值:无********************************************/ void Disp1Char(uchar x,uchar y,uchar data) { LocateXY( x, y );LcdWriteData( data );}/*******************************************函数名称:LcdReset功能:对1602 液晶模块进行复位操作参数:无返回值:无******************************************** void LcdReset(void){CtrlDir |= 0x07; //DataDir = 0xFF; //LcdWriteCommand(0x38, 0);Delay5ms();LcdWriteCommand(0x38, 0);Delay5ms();LcdWriteCommand(0x38, 0);Delay5ms();LcdWriteCommand(0x38, 1);LcdWriteCommand(0x08, 1);LcdWriteCommand(0x01, 1);LcdWriteCommand(0x06, 1);LcdWriteCommand(0x0c, 1);}/******************************************* 函数名称:LcdWriteCommand 功能:向液晶模块写入命令参数:cmd-- 命令,chk-- 是否判忙的标志,返回值:无控制线端口设为输出状态数据端口设为输出状态// 规定的复位操作// 显示模式设置// 显示关闭// 显示清屏// 写字符时整体不移动// 显示开,不开游标,不闪烁1:判忙,0:不判******************************************void LcdWriteCommand(uchar cmd,uchar chk)if (chk) WaitForEnable(); // CLR_RS;CLR_RW;_NOP();SET_EN; // 产生使能脉冲信号 _NOP();_NOP();CLR_EN;/*******************************************函数名称: LcdWriteData功 能:向液晶显示的当前地址写入显示数据参 数: data-- 显示字符数据返回值 :无 ********************************************/ void LcdWriteData( uchar data ){WaitForEnable(); // 等待液晶不忙SET_RS;CLR_RW;_NOP();检测忙信号DataPort = cmd;// _NOP();将命令字写入数据端口DataPort = data; // 将显示数据写入数据端口_NOP();SET_EN; // 产生使能脉冲信号_NOP();_NOP();CLR_EN;}/*******************************************函数名称:WaitForEnable功能:等待1602 液晶完成内部操作参数:无返回值:无********************************************/void WaitForEnable(void){P2DIR &= 0x00; // 将P4 口切换为输入状态CLR_RS;SET_RW; _NOP();SET_EN;_NOP();_NOP();CLR_EN;P2DIR |= 0xFF; // 将P4 口切换为输出状态}/******************************************* 函数名称:Delay5ms 功能:延时约5ms参数:无返回值:无********************************************/ void Delay5ms(void){uint i=40000;while (i != 0){i--;}}/******************************************* 函数名称:Delay400ms 功能:延时约400ms参数:无返回值:无********************************************/ void Delay400ms(void) uchar i=50;uint j;while(i--){j=7269; while(j--);}}。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
{
uchar i;
AD_EOC=1;
read2543(0); //启动0通道转换,第一次转换结果不准确,丢弃
while(!AD_EOC){}//等待转换完成
time(3);
read2543(0);
TLC2543是TI公司的TLC2543 12位串行A/D转换器,使用开关电容逐次逼近技术完成A/D转换过程。由于是串行输入结构,能够节省80C51系列单片机的I/O资源,而且价格适中。
2. TLC2543的工作过程
TLC2543的工作过程分为两个周期:I/O周期和实际转换周期。
1)I/O周期
I/O周期由外部提供的I/O CLOCK定义,延续8、12或16个时钟周期,决定于选定的输出数据长度。器件进入I/O周期后同时进行两种操作。
{
unsigned char i;
for(i=0;i<4;i++)
{
delay_5us();
}
}
/********延时100us ******************/
void delay_100us(void)//延时100us
{
delay_50us();
delay_50us();
}
/***********延时单位:ms *******************/
U(0∽-5V)=Uref/256×N
U(-5V∽+5V)=2·Uref/256×N-5V (这里Uref为+5V)
4、DAC0832与89C52的接口电路
四、实验内容
1.按照上图设计仿真电路原理图。
2.编写程序实现采集AI0~AI11十二个输入通道模拟输入,并转换结果从串口送到模拟终端显示。
3.编写程序实现产生方波、三角波和梯形波的程序,并在虚拟示波器上显示波形。
do{
CollectADmodule(TLC2543);//调用11通道AD转换
for(i=0;i<11;i++){
printf("TLC2543[%bd]=%u\n",i,TLC2543[i]);//打印输出结果
}
printf("\n\n");//回车2次
time(1000);
}while(TRUE);
#define ulong unsigned long
#define BYTEunsigned char
#define WORDunsigned int
#define TRUE 1
#define FALSE 0
extern void initUart(void);/*初始化串口*/
extern void time(unsigned int ucMs);//延时单位:ms
输入参数:port通道号
输出参数:ad转换值
*************************************/
uint read2543(uchar port)
{
uint ad=0;
uchar i;
P1=0xeb;
CLOCK = 0;
AD_CS = 0;
port<<=4;
for(i=0;i<8;i++)//读高8位
/**************************************
TLC2543驱动程序
*************************************/
/**************************************
名称:read2543
功能:TLC2543驱动模块
总线型AT89C52单片机
U2
TLC2543
串行接口A/D转换器
U3
OP1P
通用理想运算放大器
R1
POT-HG
中间抽头电位器
VIRTUAL TERMINAL
串口虚拟终端
DC VOLTMETER
直流电压表
DC Generators
直流信号发生器
2.并行D/A转换器DA0832
元件编号
元器件名称
说明
U1
}
common.h程序
#include <REG52.H> /* special function register declarations */
#include <stdio.h> /* prototype declarations for I/O functions */
#include <intrins.h>
TLC2543的工作时序如图7.41所示。
3. TLC2543与89C52的接口电路
下图是89C52与TLC2543的接口电路,TLC2543的5条接口线可接到单片机的任何通用双向I/O口上。
(二)并行D/A转换器DAC0832
1.D/A转换是把数字量转换成模拟量的变换,实验台上D/A电路输出的是模拟电压信号。要实现实验要求,比较简单的方法是产生三个波形的表格,然后通过查表来实现波形显示。
80C51.BUS
总线型AT89C52单片机
U2
74LS373
锁存器
U3
74LS04
反相器
U4 U5
74LS08
二输入与门
U6
DAC0832
并行接OSCILLOSCOPE
虚拟示波器
三、相关知识
(一)串行A/D转换器TLC2543
1. TLC2543的特性与引脚
(2)在DATAOUT端串行输出8、12或16位数据。当 保持为低时,第一个数据出现在EOC的上升沿;若转换由 控制,则第一个输出数据发生在 的下降沿。这个数据串是前一次转换的结果,在第一个输出数据位之后的每个后续位均由后续的I/O CLOCK脉冲下降沿输出。
2)转换周期
在I/O周期的最后一个I/O CLOCK脉冲下降沿之后,EOC变低,采样值保持不变,转换周期开始,片内转换器对采样值进行逐次逼近式A/D转换,其工作由与I/O CLOCK同步的内部时钟控制。转换完成后EOC变高,转换结果锁存在输出数据寄存器中,待下一个I/O周期输出。I/O周期和转换周期交替进行,从而可以减小外部的数字噪声对转换精度的影响。
2、产生锯齿波和三角波的表格只需由数字量的增减来控制,同时要注意三角波要分段来产生。要产生正弦波,较简单的方法是造一张正弦数字量表。即查函数表得到的值转换成十六进制数填表。D/A转换取值范围为一个周期,采样点越多,精度越高些。本例采用的采样点为256点/周期。
3、8位D/A转换器的输入数据与输出电压的关系为
(1)在I/O CLOCK的前8个脉冲的上升沿,以MSB前导方式从DATA INPUT端输入8位数据流到输入寄存器。其中前4位为模拟通道地址,控制14通道模拟多路器从11个模拟输入和3个内部自测电压中,选通一路送到采样保持电路,该电路从第4个I/O CLOCK脉冲的下降沿开始,对所选信号进行采样,直到最后一个I/O CLOCK脉冲的下降沿。I/O周期的时钟脉冲个数与输出数据长度(位数)有关,输出数据长度由输入数据的D3、D2选择为8、12或16位。当工作于12或16位时,在前8个时钟脉冲之后,DATA INPUT无效。
#define word unsigned int
#define uint unsigned int
#define ulong unsigned long
#define BYTEunsigned char
#define WORDunsigned int
uint read2543(uchar port);
void CollectADmodule(uint *ad_result);
extern void time(unsigned int ucMs);//延时单位:ms
/**************************************
2543控制引脚宏定义
*************************************/
}
Tlc2543.c程序
#include <reg52.h>
#include <intrins.h>
#include <Absacc.h>
#include <string.h>
#include <ctype.h>
#define byte unsigned char
#define uchar unsigned char
Main.c程序
#include "common.h"
extern void CollectADmodule(uint *ad_result);
/******** main函数*********/
void main (void) {
uint idata TLC2543[11];
uchar i;
initUart(); /*初始化串口*/
实验三 A/D、D/A转换实验
一、实验目的
1.熟悉DAC0832并行接口数模转换器和TLC2543串行接口模数转换器的基本原理和编程方法。
2.进一步熟悉单片机应用系统开发步骤和方法。
二、实验电路
实验所用元件清单如下表所示:
1.串行A/D转换器TLC2543
元件编号
元器件名称
说明
U1
AT89C52.BUS
void time(unsigned int ucMs)//延时单位:ms
{
unsigned char j;
while(ucMs>0){