1、单片机实验5报告 学号 *77 序号 19 湖南理工学院信息与通信工程学院 单片机原理与接口技术 实验报告实验项目序号 实验五 实验项目名称 I2C的DA/ADC转换实验 姓 名 卢志雄 专 业 电子信息工程 班 级 电信14-2BF 完成时间 2016-05-20 一、实验目的1、掌握I2C的DA/ADC芯片与单片机接口方法;2、掌握I2C器件编程方法;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所示:图3.5 I2C的DA/ADC转换实验电路原理图电路中,P3.6、P3.4分别连接SCL、SDA,地址引脚A2A
3、1A0=000,PCF8591的特征编码为1001,电路中PCF8591的地址为1001000。4路模拟输入,AIN0连接一个10K电位器的中心抽头,调节电位器可改变AIN0的模拟电压,AIN1连接电源,AIN2、AIN3连接地。PCF8591的15脚AOUT是DAC输出的模拟量, AOUT引脚通过50电阻、LED与电源连接,输出模拟量越小,LED越亮。注意在HNIST-2型实验装置中,将J16的1、2脚短路。五、软件设计思想1、编程思路仿照例题编写程序,采用例题的I2C的相关函数。动态显示采用实验四的方法,只将显示数据送人相应显示数组元素。2、简易电压表实现注意在采样数据转换成4位电压值时,
4、中间变量要设置长整形数据类型,并注意小数点设置。六、源程序#include#include#includei2c.h#define uchar unsigned chardata uchar d,a,num;data 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
5、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)num=3; d=cnum;/实验5第2题,PCF8591只对0通道进行采样的A/D转换程序。#include #include #include #define uchar unsigned char#define uint unsigned int#define _Nop( ) _nop_( ) /定义空操作,1ssbit oe=P13; /数码管段选、位选锁
6、存器输出控制信号sbit dula=P14; /数码管段选锁存器控制信号sbit wela=P15; /数码管位选锁存器控制信号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位数码管都不亮uchar code table18=0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x0
7、0; /共阴极数码管显示段码(0-F)sbit P3_5=P35;void main(void) data 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; / 启动T0 oe=0; sen: erflags=0; Start( ); /发送起始信号 SendByte(0x90); /发送写PCF8591的寻址字节(写) cAck( ); /检查应答 if(e
8、rflags) goto sen; /无应答,重来 SendByte(0x00); /发送写入PCF8591的控制字,选择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=
9、d/16; disp1=d%16; void T0_int(void) interrupt 1 uchar k; TH0=(65536-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
10、)j=0; /实验5第3题,简易电压表。#include #include #include #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; /定义点亮数码管位
11、选码data uchar disp8=1,6,16,16,16,16,16,16; / 8位数码管都不亮uchar code table18=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
12、)%256; / 给T0装入初值 ET0=1; / 允许T0中断 EA=1; / CPU开中断 TR0=1; / 启动T0 oe=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(0
13、x91); /发送写PCF8591的寻址字节(读) 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; void T0_int(void) interrupt 1 uchar k; TH0=(65536-1000)/256; TL0=(65536
14、-1000)%256; oe=1; / 关闭2个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键,发光二极管的亮度逐次变暗。第二题:给单片机上电,调节电位器
15、,数码管显示数值改变。第三题:给单片机上电,数码管显示通道AIN0的电压值,且调节电位器,数码管显示电压值改变。七、实验思考题1、采用I2C接口的ADC有什么好处? 答:可以简化电路结构,节约成本。2、如果通过按K1、K2、K3、K4键分别选择ADC采样0、1、2、3通道,程序如何处理?答:按键后进入中断程序判断按了哪一个键,根据按键键值分别对通道进行采样。3、如何利用芯片的通道自动增量的功能,对AIN0、AIN1、AIN2、 AIN3通道轮流进行采样。4、答:采用循环结构,依次对AIN0、AIN1、AIN2、 AIN3通道轮流进行采样。八、实验心得通过这次实验设计使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正为社会服务,从而提高自己的实际动手能力和独立思考的能力。在这个实验过程中遇到问题,可以说得是困难重重,对以前所学过的知识理解得不够深刻,掌握得不够牢固。不过新的知识也要不断学习!在编程过程中,不仅要将定时器以及按键中断处理程序的编程方法与I2C器件编程方法相结合,还要采用数据结构的编程方法创建工程使用多个程序共同处理。由其是在显示电压过程中要熟悉采样值与电压值的转换方法,这样才能知道转换后的值对应的电压值。
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1