模数转换AD 实验

 

一、  实验目的:

1、了解IO口的结构;

                    2、熟悉A/D的特性;

                    3、掌握A/D的使用。

二、实验仪器:MEGA16实验板  一块

PC  一台

 

三、实验原理:

四、实验步骤及内容

#include <iom16v.h>

#include <macros.h>

#define VREF 4.950

unsigned  int V=0;

float Vin=0;

unsigned char led[]={0X3F,0X06,0X5B,0X4F,0X66,0X6D,0X7D,0X07,0X7F,0X6F}; //0-9

unsigned char led_putff[]={0X3F,0X3F,0X3F,0X3F};

 

//*******************延时  us

void delay_us(int t)

{

do

 t--;                                                                                       

while(t>1);

}

//*******************延时  ms

void delay_ms(unsigned int t)

{

while(t!=0)

{

delay_us(1142);

t--;}

}

 

/*....中断....*/

#pragma interrupt_handler ADC_isr:15

void  ADC_isr(void)

{

 V=ADCL;

V=(ADCH<<8)+V;              //读取转换数值

}

 

 

/*....系统初始化....*/

void xhushihua(void)

{

DDRD=0XFF;                  //位选

DDRB=0XFF;                  //数码管

DDRA=0XFE;                  //C0口电压输入

PORTD=0X00;

PORTB=0XC0;

PORTA=0X00;

ADCSRA|=(1<<ADEN);                //开启AD

SEI();

}

 

/*....AD初始化....*/

void ad_link(void)

{

 ADCSRA|=(1<<ADSC)|(1<<ADIE);        //启动转换       

ADCSRA|=(1<<ADPS0)|(1<<ADPS1);      //八分频

ADCSRA|=(1<<ADATE);                 //开启连续模式使能

ADMUX=0X00;                         //右对齐,基准电源VREF。零通道

SFIOR=0X00;                           //开启连续模式

}

 

/*....计算转换值....*/

void led_put(void)

{

unsigned  char sreg;

unsigned  char i=0;

unsigned  char f=0;

unsigned  int X=0;

sreg = SREG;              //保存全局中断标志

CLI();                    //禁用中断

Vin=V*VREF/1024;         //转换数值

X=(unsigned short)(1000*Vin);

for(i=0;i<4;i++)

 {

f=X%10;

led_putff[i]=led[f]; 

X=X/10;

}

led_putff[3]=0X80|led_putff[3];

 SREG=sreg;               //恢复全局中断标志

}

 

/*....数码管扫描....*/

void display(void)

{

unsigned  char i=0;

 for(i=0;i<4;i++)

{

 PORTB=led_putff[i];

PORTD|=(1<<i);

delay_us(30);

PORTD=0X00;

}

}

/*....主函数....*/

void main(void)

{

 xhushihua();

 ad_link();

 for(;;)

{

 led_put();

display();

}

}

### AD模数转换汇编实验资料与教程 #### 实验目的 通过本实验掌握AD0809模数转换器的工作原理及其应用方法,熟悉使用汇编语言编写程序实现模拟量到数字量的转换过程。 #### 实验设备 - 单片机开发板(如STC系列) - AD0809芯片模块 - 连接线若干 - 电源适配器 - 计算机一台安装有Keil C51集成开发环境 #### 实验原理概述 ADCO809是美国国家半导体公司生产的CMOS工艺8通道,8位逐次逼近式A/D模数转换器。其内部有一个8通道多路开关,可根据地址码选通其中一路输入信号进行AD转换[^3]。该器件具有如下特点: - **分辨率**:8位; - **启动停止控制端口**:具备独立的启动和结束标志引脚用于同步操作; - **转换时间**:当外部时钟频率设置为640kHz时约为100μs;如果降低至500kHz,则增加到大约130μs; - **供电需求**:仅需单一+5V直流电即可正常运作,并保持较低能耗水平; - **输入电压范围**:支持从0伏特直到正向最大值+5伏特之间的任意连续变化而不必担心精度损失或额外调整措施; - **工作温度区间宽泛**:能够在极端环境下稳定运行(-40°C ~ +85°C)。 #### 汇编代码实例 以下是基于上述理论基础构建的一个简单例子来展示如何利用汇编指令完成一次完整的数据采集流程: ```assembly ORG 0H ; 定义起始位置 MAIN: MOV P2,#0FFH ; 初始化P2口作为高阻态 CLR EA ; 关闭全局中断 START_CONVERSION: SETB START ; 启动ADC转换命令 WAIT_FOR_EOC: JNB EOC,WAIT_FOR_EOC ; 等待EOC置位表示已完成转换 READ_DATA: MOV A,P0 ; 将结果读取到累加寄存器A中 ANL A,#0FCH ; 清除无关位只保留有效部分 DISPLAY_RESULT: CALL DISPLAY_FUNCTION ; 显示函数调用 ENDLESS_LOOP: SJMP ENDLESS_LOOP ; 循环等待下一轮采样周期到来 DISPLAY_FUNCTION: ... ; 用户自定义显示逻辑此处省略具体实现细节 RET ; 返回上级调用者处继续执行后续任务 ``` 此段代码展示了基本框架下的核心环节——初始化配置、触发转换请求以及获取最终数值并处理输出的过程。需要注意的是,在实际项目里还需要考虑更多因素比如错误检测机制等以确保系统的可靠性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值