测验五,AD转换测验.docx
4页本文格式为Word版,下载可任意编辑测验五,AD转换测验 【1. 测验目的和要求】 (1)了解典型 AD 芯片布局与功能; (2)掌管 ADC0809 与 8051 接口电路设计; (3)掌管查询和中断方式的 AD 编程 【2. 测验工具与软件】 计算机、Keil uVision4 集成开发环境、Proteus 8 Professional 仿真软件 【3.主要原理和方法步骤】 (1) 任务说明 Ø 正确连接 ADDA 板与 CPU 板,包括:ADC、WR#、RD#、ALE、EOC 等信号;根据所连电路确定 ADC0809各模拟通道的外 RAM 地址 #include "absacc.h' #define ADC0809_AIN0 XBYTE[ 0x ] #define ADC0809_AIN1 XBYTE[ 0x ] #define ADC0809_AIN2 XBYTE[ 0x ] #define ADC0809_AIN3 XBYTE[ 0x ] #define ADC0809_AIN4 XBYTE[ 0x ] #define ADC0809_AIN5 XBYTE[ 0x ] #define ADC0809_AIN6 XBYTE[ 0x ] #define ADC0809_AIN7 XBYTE[ 0x ] Ø 采用查询方式连续对 AIN0 通道举行 AD 转换,并将转换结果通过串口向 PC 机发送,借助示波器、万用表等仪表对比测量结果与实际电压。
可调理 R1 可变电阻变更 AIN0 通道电压; (2) 仿真电路原理图 (3) 程序流程图 (4) 实例代码及解释分析 #include reg51.h #include absacc.h #define COUNT 5000 #define AIN0 XBYTE[0x0000] sbit EOC=P3^3; unsigned char LED_seg[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//共阴极数码管段码 unsigned char LED_bit[4]={0x01,0x02,0x04,0x08}; //位码 unsigned char LED_buf[3]={0}; unsigned char LED_S; unsigned char LED_B; unsigned char ascii_num[10] = {0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39}; //??0~9?ASCII? void delay(unsigned int n)//延时函数 { unsigned int i; for(i=0;in;i++); } void Sbuf_Init(void)//串口初始化函数 9600bps,fosc=11.0592MHz { SCON=0x50; //10 位方式 PCON=0x00; //波特率不倍增 TMOD=(TMOD0x0f)|0x20;//T1 方式 2 TH1=0xfd; //T1 计数初值//波特率设置 TL1=0xfd; EA=1; //串口中断使能 TR1=1; //启动定时器 } void Timer0_Init(void) { TMOD=(TMOD0xf0)|0x01; //工作方式选择 TH0=(65536-COUNT)/256; TL0=(65536-COUNT)%256; //计数初值 ET0=1; EA=1; //中断使能 TR0=1; //启动 T0 } void send_char(unsigned char c) //发送字符 { SBUF = c; while(TI == 0); TI = 0; } void send_str(unsigned char *s) //发送字符串 { while(*s != "\0") { send_char(*s); s++; delay(5); } } void main(void) { unsigned int i=0,ad,pre_ad=0; Sbuf_Init(); Timer0_Init(); while(1) { AIN0=0; //启动转换 i=i; i=i; //延时 delay(20); while(EOC==0); //等待 AD 转换终止 ad=AIN0; //读 AD 转换结果 if(ad!=pre_ad) //当前状态与上一个状态不同 { //ad=ad/51; LED_buf[2]=(ad*100/51)/100; //百位 LED_buf[1]=(ad*100/51)/10%10; //十位 LED_buf[0]=(ad*100/51)%10; //个位 send_char(ascii_num[(ad*100/51)/100]); //通过串口将数据发送给虚拟主机 send_char("."); send_char(ascii_num[(ad*100/51)/10%10]); send_char(ascii_num[(ad*100/51)%10]); send_str(\r\n); } pre_ad=ad; } } void T0_ISR(void) interrupt 1 { static unsigned char i=0; TH0=(65536-COUNT)/256; TL0=(65536-COUNT)%256; //计数初值 if(i==2) { P2=~LED_bit[i]; //先送位码 P1=LED_seg[LED_buf[i]]|0x80; //再送段码 } //小数点显示 else { P2=~LED_bit[i]; //先送位码,不加非号那么位码写成 0xfe,0xfd,0xfb,0xf7(共阴极位码) P1=LED_seg[LED_buf[i]]; //再送段码 } i++; if(i==3) i=0; //延时 } 【4. 数据记录】 通过调理 R1 可变电阻可以变更 AIN0 通道电压,通过 AD 转换,将获取的数字量通过串口发送到虚拟主机上,并通过电压表测量实际电压与之比较,仿真结果如下图所示: 通过调理 R1 可变电阻可以变更 AIN0 通道电压,记录数据如下表所示: 编号 测量参考电压 Vref(V)ADC0809 的 12、16 引脚 A/D 转换结果(数字量) 由 A/D 转换结果计算出的模拟量(V) 万用表测量的模拟量(V) 相对误差 1 5 0xc4 3.84 3.85 0.0026 2 5 0xc1 3.80 3.80 0 3 5 0xbf 3.74 3.75 0.0026 4 5 0xbc 3.70 3.70 0 5 5 0xba 3.64 3.65 0.0027 【5. 测验斟酌与小结】 通过本次测验,我了解典型 AD 芯片布局与功能,对该芯片有了确定的了解,并掌管了 ADC0809 与 8051接口电路设计,理解了电路设计后再去举行查询和中断方式的 AD 编程,感觉理解的更加轻易深刻一点,并通过示波器、电压表测量实际电压和 AD 转换电压值举行对比,从而检测编程电路是否有错误,以及 AD 转换的切实值;同时还将上次的串口通信测验联系在一起,不仅复习了上次的学识点,还掌管了新的学识点,映像深刻,收获颇多! 评语: 教师: 日期: — 4 —。





