版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、.学号序号 19单片机原理与接口技术实验报告实验项目序号实验五实验项目名称I2C 的 DA/ADC 转换实验.专业 .专注.姓名 卢志雄专业 电子信息工程班级 电信 14-2BF完成时间2016-05-20一、实验目的1、 掌握 I2 C 的 DA/ADC 芯片与单片机接口方法 ;2、 掌握 I2 C 器件编程方法 ;3、 掌握 DAC 和 ADC 的使用方法 。二、实验前准备1、 完成作业 7;2、 根据实验内容编写好相关程序,并进行 Proteus 仿真。三、实验内容实验内容为 3 项,其中第 1、 2 项必做 。1、D/A 转换实验 。设置一个一维数组data uchar c4=0x00
2、,0xa0,0xaa,0xff;按下 K1、K2、K3、K4,分别将 c0 、 c1 、c2 、 c3 的值转换成模拟量输出 ,观察发光二极管 D23 的亮度 。若是仿真 ,可以通过电压表观察模拟量的电压值 。2、单通道采样与动态显示 。对 AIN0 通道进行采样 ,将采样数据在 1、2 两位动态显示 ,调节电位器观察显示数据变化 。3、简易电压表实现 。对 AIN0 通道进行采样 ,将采样数据转换成 4 位电压值在 1、2、3、4 四位动态显示 ,注意只有 1 位整数 3 位小数 。调节电位器观察显示数据变化 。四 、实验原理图.专业 .专注.实验原理图如图 3.5 所示:987654329
3、8765432111111111111111101234567U2101234567U3QQQQQQQQQQQQQQQQ74HC573RN174HC57301234567E E10k01234567E EDDDDDDDD LO098765432DDDDDDDDLO23456789111234567891111U119P0.0/AD039K1XTAL138P0.1/AD137K2P0.2/AD21836P0.3/AD3XTAL2K335P0.4/AD434P0.5/AD533K4P0.6/AD6932P0.7/AD7RSTP2.0/A821D17D18D19D2022P2.1/A923P2.2/
4、A102924P2.3/A11PSEN25R530P2.4/A12ALE2631R7EAP2.5/A1327U41kP2.6/A1428200P2.7/A15101110SCLAIN0P3.0/RXD92P1.011SDAAIN1RP92P3.1/TXD3P1.1125AIN23P3.2/INT04D2350% 10kP1.213A0AIN34P3.3/INT16R8P1.314A1155P3.4/T7P1.40A2AOUT6P3.5/T15100P1.5112147P3.6/WR16LED-REDR6P1.617EXTVREF81113+4.99P1.7P3.7/RDOSCAGNDAT89C
5、51PCF85911kVolts图 3.5I2C 的 DA/ADC 转换实验电路原理图电路中 , P3.6、 P3.4 分别连接 SCL、 SDA ,地址引脚 A2A1A0=000 , PCF8591 的特征编码为 1001 ,电路中 PCF8591 的地址为 1001000 。4 路模拟输入,AIN0 连接一个 10K电位器的中心抽头 ,调节电位器可改变 AIN0 的模拟电压,AIN1 连接电源 , AIN2 、AIN3 连接地 。PCF8591 的 15 脚 AOUT 是 DAC 输出的模拟量 , AOUT 引脚通过 50电阻 、 LED 与电源连接 ,输出模拟量越小 ,LED 越亮 。注
6、意在 HNIST-2 型实验装置中 ,将 J16 的 1、2 脚短路 。五、软件设计思想1、 编程思路仿照例题编写程序 ,采用例题的 I2C 的相关函数 。 动态显示采用实验四的方法,只将显示数据送人相应显示数组元素 。2、 简易电压表实现注意在采样数据转换成4 位电压值时 ,中间变量要设置长整形数据类型,并注意小数点设置 。六、源程序.专业 .专注.#include<reg52.h>#include<intrins.h>#include"i2c.h"#define uchar unsigned chardata uchar d,a,num;data
7、 uchar c4=0x00,0xa0,0xaa,0xff;#define_Nop() _nop_()void main()EA=1;IT0=1;EX0=1;sen: erflags=0;Start();SendByte(0x90);cAck();if(erflags) goto sen;SendByte(0x40);cAck();if(erflags) goto sen;while(1)SendByte(d);cAck();.专业 .专注.void EX0_int() interrupt 0 a=P2;if(a=1)num=0;if(a=2)num=1;if(a=4)num=2;if(a=8
8、)num=3;d=cnum;/ 实验 5 第 2 题, PCF8591 只对 0 通道进行采样的 A/D 转换程序 。#include <reg52.h>#include <intrins.h>#include <I2C.h>#define uchar unsigned char#define uint unsigned int.专业 .专注.#define _Nop( )_nop_( )/ 定义空操作 ,1ssbit oe=P13;/ 数码管段选 、位选锁存器输出控制信号sbit dula=P14;/ 数码管段选锁存器控制信号sbit wela=P15;/
9、 数码管位选锁存器控制信号uchar j=0;uchar code sled_bit=0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f;/ 定义点亮数码管位选码data uchar disp8=16,16,16,16,16,16,16,16;/8 位数码管都不亮ucharcodetable18=0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00;/ 共阴极数码管显示段码 (0-F)sbit P3_5=P35;void main(void)data
10、uchar d;P3_5=0;TMOD=0x01;/设置定时器 T0 为方式 1 定时TH0=(65536-500)/256;/给 T0 装入初值.专业 .专注.TL0=(65536-500)%256;/给 T0 装入初值ET0=1;/允许 T0 中断EA=1;/ CPU 开中断TR0=1;/启动 T0oe=0;sen:erflags=0;Start( );/ 发送起始信号SendByte(0x90);/ 发送写PCF8591 的寻址字节(写)cAck( );/ 检查应答if(erflags) goto sen;/ 无应答,重来SendByte(0x00);/ 发送写入 PCF8591 的控制
11、字 ,选择0通道cAck( );/ 检查应答if(erflags) goto sen;/ 无应答,重来sen1:Start( );/ 发送起始信号SendByte(0x91);/ 发送写PCF8591 的寻址字节(读)cAck( );/ 检查应答if(erflags) goto sen1;/ 无应答,重来.专业 .专注.d=RcvByte();/ 第 1 次读的数据无效Ack();/ 应答位函数 ,while(1)d=RcvByte( );Ack();/ 应答位函数 ,disp0=d/16;disp1=d%16;voidT0_int(void)interrupt 1uchar k;TH0=(6
12、5536-1000)/256;TL0=(65536-1000)%256;oe=1;/关闭 2 个 573 输出,防止在送数据时相互影响k = dispj;/每次显示 arj 的数据P0 = tablek;/相应显示数字段码dula=1;dula=0;/锁存段码.专业 .专注.P0=sled_bitj;/选择相应数码管位选wela=1;wela=0;/锁存位码oe=0;/打开 2 个 573 三态门,输出段码和位码j+;/为下一个显示做准备if(j>=8)j=0;/ 实验 5 第 3 题,简易电压表 。#include <reg52.h>#include <intrins
13、.h>#include <I2C.h>#define uchar unsigned char#define uint unsigned int#define _Nop( )_nop_( )/ 定义空操作 ,1ssbit oe=P13;/ 数码管段选 、位选锁存器输出控制信号sbit dula=P14;/ 数码管段选锁存器控制信号sbit wela=P15;/ 数码管位选锁存器控制信号uchar j=0;uchar code sled_bit=0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f;/ 定义点亮.专业 .专注.数码管位选码data uch
14、ar disp8=1,6,16,16,16,16,16,16;/8 位数码管都不亮ucharcodetable18=0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00;/ 共阴极数码管显示段码 (0-F)sbit P3_5=P35;void main(void)unsigned long d;P3_5=0;TMOD=0x01;/设置定时器 T0 为方式 1 定时TH0=(65536-500)/256;/给 T0 装入初值TL0=(65536-500)%256;/给 T0 装入初
15、值ET0=1;/允许 T0 中断EA=1;/ CPU 开中断TR0=1;/启动 T0oe=0;sen:erflags=0;Start( );/ 发送起始信号.专业 .专注.SendByte(0x90);/ 发送写PCF8591 的寻址字节(写)cAck( );/ 检查应答if(erflags) goto sen;/ 无应答,重来SendByte(0x00);/ 发送写入 PCF8591 的控制字 ,选择0通道cAck( );/ 检查应答if(erflags) goto sen;/ 无应答,重来sen1:Start( );/ 发送起始信号SendByte(0x91);/ 发送 写 PCF8591
16、的寻址字节(读)cAck( );/ 检查应答if(erflags) goto sen1;/ 无应答,重来d=RcvByte();/ 第 1 次读的数据无效Ack( );/ 应答位函数 ,while(1)d=RcvByte();Ack( );/ 应答位函数 ,d=(d*5*1000)/256;disp0=d/1000;disp1=d%1000/100;.专业 .专注.disp2=d%100/10;disp3=d%10;voidT0_int(void)interrupt 1uchar k;TH0=(65536-1000)/256;TL0=(65536-1000)%256;oe=1;/关闭 2 个
17、573 输出,防止在送数据时相互影响k = dispj;/每次显示 arj 的数据P0 = tablek;/相应显示数字段码if(j=0) P0=P0|0x80;dula=1;dula=0;/锁存段码P0=sled_bitj;/选择相应数码管位选wela=1;wela=0;/锁存位码oe=0;/打开 2 个 573 三态门,输出段码和位码.专业 .专注.j+;/为下一个显示做准备if(j>=8)j=0;六、实验结果第一题:给单片机上电 ,依次按下 K1,K2,K3, K4 键,发光二极管的亮度逐次变暗 。第二题:给单片机上电 ,调节电位器 ,数码管显示数值改变 。第三题:给单片机上电 ,
18、数码管显示通道 AIN0 的电压值 ,且调节电位器 ,数码管显示电压值改变 。七、实验思考题1、 采用 I2 C 接口的 ADC 有什么好处 ?答:可以简化电路结构 ,节约成本 。2、 如果通过按 K1、K2、 K3、K4 键分别选择 ADC 采样 0、 1、 2、 3 通道,程序如何处理 ?答:按键后进入中断程序判断按了哪一个键,根据按键键值分别对通道进行采样 。3、 如何利用芯片的通道自动增量的功能,对 AIN0 、 AIN1 、AIN2 、 AIN3通道轮流进行采样 。4、 答:采用循环结构 ,依次对 AIN0 、AIN1 、 AIN2 、 AIN3 通道轮流进行采样。八、实验心得通过这次实验设计使我懂得了理论与实际相结合是很重要的
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
评论
0/150
提交评论