首页 > 编程知识 正文

stm32单片机,51单片机

时间:2023-05-04 21:01:53 阅读:112334 作者:1690

ADC0809更详细的参数说明可以查看它的芯片手册(英文原版)

链接: https://share.weiyun.com/wyAdZUPP

密码: eteeec

文章目录1、ADC0809模数转换器主要特性2、ADC0809外部特征2、ADC0809动作序列3、ADC与单片机的接口方式(1)等待延迟方式——时序传输方式)不推荐

1、ADC0809模数转换器的主要特性ADC0809为8通道8位,在根据逐次逼近原理进行模式——数字转换的器件内部设置http://www.Sina.com 其能够根据地址码锁存解读后的8通道模拟多路开关A/D转换后的数据在从三态锁存器输出的芯片内没有时钟,外部时钟信号是切换启停控制端切换时间为100us的单一550秒

2、ADC0809外部特征

ADC0809芯片有28条引线,采用双列直插式封装

3358www.Sina.com/8路模拟输入端3358www.Sina.com/8路数字量输出端只选择8路模拟输入信号中的一个进行A/D转换。3位地址输入线指示8路模拟输入中的一路3358www.Sina.com/时钟脉冲输入引脚IN0~IN7:基准电压D0~D8:电源,单一5V ADDA、ADDB、ADDC:电源地3358 www 输入d转换开始脉冲输入端子,输入正脉冲(至少100ns宽)开始(脉冲上升时复位0809,下降时开始A/D转换) 3358 www.Sina.com/a

2、ADC0809的动作时序

ADC0809完成一次转换需要CLK:左右,可以交换REF(+)、REF(-):信号。

3358www.Sina.com/正脉冲锁存器ADDA、ADDB、ADDC通道3358www.Sina.com/正脉冲的上升沿清除内部寄存器数据,在下降沿启动AD转换

AD启动后的EOC从高变为低;

在模数转换中EOC维持低电平;

模数转换结束后,EOC从低电平变为高电平。 输入VCC:正脉冲,接通三态门输出

3、ADC和单片机接口方式的A/D转换后得到的是数字量的数据,这些数据传输给单片机处理。 数据的关键问题是如何确定A/D转换完成。 由于只能在完成后传输,因此可以采用等待方式、查询方式和中断方式。

)等待延迟方案——对于定时传输方案(不推荐) A/D转换器之一来说,转换时间作为指标是已知的且固定的。 例如,如果ADC0809的转换时间为128us,则相当于12MHZ的51单片机的共计128个机器周期。 可以在此基础上设计延迟子程序,在A/D转换启动后调用该子程序,当延迟时间到来时一定完成转换时间,然后进行数据传输。

)查询方式A/D转换芯片上有表示完成的状态信号,ADC0809的EOC侧为转换结束指示针。 因而,通过软件以查询方式测试EOC的迁移状态,能够判断转换是否完成,进行数据传输。

)3)中断模式要求将表示切换完成的转变信号EOC作为中断信号,将EOC信号通过反相器发送回单片机INT0或INT1,以中断模式进行数据传输。

4、附上参考例程(Proteus模拟方式)前绘制的模拟电路

链接: https://share.weiyun.com/nYRBzGt0

密码: q3mivs

)1)查询方式使用ADC0809数模转换器,通过查询方式将电位上的模拟量(模拟量电压)转换为数字量,并将转换结果发送给数码管显示。

# includereg 52.h # defineucharunsignedchar # defineuintunsignedint/* ADC 0809端口定义*/#define OUTPUT_PORT P1; //ADC输出的总线接口sbit EOC=P3^5; //A/D转换结束信号,并在A/D转换结束时,从该端子开始高电平(转换期间一直为低电平) sbit START=P3^6; //A/D转换启动脉冲输入端子

,输入一个正脉冲(至少100ns宽)使其启动(脉冲上升沿使0809复位,下降沿启动A/D转换)。sbit CLOCK = P3^7;//时钟脉冲输入端sbit OE = P3^4;//数据输出允许信号,输入,高电平有效。当A/D转换结束时,此端输入一个高电平,才能打开输出三态门,输出数字量sbit ADD_A = P3^0;//通道Asbit ADD_B= P3^1;//通道Bsbit ADD_C= P3^2;//通道C//数码管位选定义sbit smg1 = P2^0;sbit smg2 = P2^1;sbit smg3 = P2^2;sbit smg4 = P2^3;//数码管码表,共阴极unsigned char leddata[10]={ 0x3F, //"0"0x06, //"1"0x5B, //"2"0x4F, //"3"0x66, //"4"0x6D, //"5"0x7D, //"6"0x07, //"7"0x7F, //"8"0x6F, //"9" };/*1毫秒延时函数*/void Delay1ms()//@12.000MHz{unsigned char i, j;i = 2;j = 239;do{while (--j);} while (--i);}/*毫秒延时函数*/void delay_ms(uint time){uint i;for(i=0; i<time; i++){Delay1ms();}}//在数码管显示三位数字显示函数,//unsigned char i 输入0-999以内的数字void disply_three_digit(unsigned int i){unsigned int ge,shi,bai;bai = i / 100;shi = i % 100 / 10;ge = i % 10;P0 = leddata[ge];smg4 = 0;delay_ms(1);smg4 = 1;P0 = leddata[shi];smg3 = 0;delay_ms(1);smg3 = 1;P0 = leddata[bai];smg2 = 0;delay_ms(1);smg2 = 1;}/*系统初始化*/void system_Init(void){/*上电后P0、P1、P2全部置1*/P0 = 0xff;P1 = 0xff;P2 = 0xff;}/***********************************************程序名称:InitTimer1程序功能:定时器1初始化程序说明:使用定时器1,工作方式2来产生一个时钟脉冲程序输入:无程序返回:无***********************************************/void InitTimer1(void){ TMOD = 0x20;//定时器T1,工作方式2,自动重装 TH1 = 0x38; TL1 = 0x38;//定时约200us EA = 1;//打开总中断 ET1 = 1;//开定时中断 TR1 = 1;//启动定时器T1}/***********************************************程序名称:ADC0809_Result程序功能:获取ADC0809 ADC值程序说明:因为ADC0809是并行输出方式,所以输出的 ADC结果反馈到单片机的对应的OUTPUT_PORT引脚。程序输入:uchar adc_number(要获取的ADC通道号1-7)程序返回:unsigned char result 返回当前通道的ADC值***********************************************/uchar ADC0809_Result(uchar adc_number){uchar result = 0;//定义一个临时变量,用于存放转换后的ADC值/*初始化ADC0809*/START = 0; OE = 0; START = 1;/*选择相应输入通道*/switch(adc_number){case 1:ADD_C = 0;ADD_B = 0;ADD_A = 0;break;case 2:ADD_C = 0;ADD_B = 0;ADD_A = 1;break;case 3:ADD_C = 0;ADD_B = 1;ADD_A = 1;break;case 4:ADD_C = 0;ADD_B = 1;ADD_A = 1;break;case 5:ADD_C = 1;ADD_B = 0;ADD_A = 0;break;case 6:ADD_C = 1;ADD_B = 0;ADD_A = 1;break;case 7:ADD_C = 1;ADD_B = 1;ADD_A = 0;break;case 8:ADD_C = 1;ADD_B = 1;ADD_A = 1;break;}/*启动ADC转换*/START = 0;while(EOC == 0);//等待EOC = 1OE = 1;//打开三态门输出result = OUTPUT_PORT;return result;//将结果返回输出}void main(){uchar temp = 0;system_Init();InitTimer1();while(1){temp = ADC0809_Result(3);//读取通道3的AD值disply_three_digit(temp);//将读取到的ADC值送到数码管}}void Timer1Interrupt(void) interrupt 3{CLOCK = ~CLOCK;//通过定时器T1提供时钟脉冲} (2)中断方式

(3)将转换的ADC结果换算成电压值 电压值 = ADC值 * (参考电压 / 分辨率最大位) * 100(保留小数点后两位)

参考例程

#include <reg52.h>#define uchar unsigned char#define uint unsigned int/*ADC0809端口定义*/#define OUTPUT_PORT P1;//ADC输出的总线接口sbit EOC = P3^5;//A/D转换结束信号,输出,当A/D转换结束时,此端输出一个高电平(转换期间一直为低电平)sbit START = P3^6;//A/D转换启动脉冲输入端,输入一个正脉冲(至少100ns宽)使其启动(脉冲上升沿使0809复位,下降沿启动A/D转换)。sbit CLOCK = P3^7;//时钟脉冲输入端sbit OE = P3^4;//数据输出允许信号,输入,高电平有效。当A/D转换结束时,此端输入一个高电平,才能打开输出三态门,输出数字量sbit ADD_A = P3^0;//通道Asbit ADD_B= P3^1;//通道Bsbit ADD_C= P3^2;//通道C//数码管位选定义sbit smg1 = P2^0;sbit smg2 = P2^1;sbit smg3 = P2^2;sbit smg4 = P2^3;//数码管码表,共阴极unsigned char leddata[10]={ 0x3F, //"0"0x06, //"1"0x5B, //"2"0x4F, //"3"0x66, //"4"0x6D, //"5"0x7D, //"6"0x07, //"7"0x7F, //"8"0x6F, //"9" };unsigned char leddata2[10]={0xBF,//"0."0x86,//"1."0xDB,//"2."0xCF,//"3."0xE6,//"4."0xED,//"5."0xFD,//"6."0x87,//"7."0xFF,//"8."0xEF,//"9."};/*1毫秒延时函数*/void Delay1ms()//@12.000MHz{unsigned char i, j;i = 2;j = 239;do{while (--j);} while (--i);}/*毫秒延时函数*/void delay_ms(uint time){uint i;for(i=0; i<time; i++){Delay1ms();}}//在数码管显示三位数字显示函数,//unsigned char i 输入0-999以内的数字void disply_three_digit(unsigned int i){unsigned int ge,shi,bai;bai = i / 100;shi = i % 100 / 10;ge = i % 10;P0 = leddata[ge];smg4 = 0;delay_ms(1);smg4 = 1;P0 = leddata[shi];smg3 = 0;delay_ms(1);smg3 = 1;P0 = leddata2[bai];smg2 = 0;delay_ms(1);smg2 = 1;}/*系统初始化*/void system_Init(void){/*上电后P0、P1、P2全部置1*/P0 = 0xff;P1 = 0xff;P2 = 0xff;}/***********************************************程序名称:InitTimer1程序功能:定时器1初始化程序说明:使用定时器1,工作方式2来产生一个时钟脉冲程序输入:无程序返回:无***********************************************/void InitTimer1(void){ TMOD = 0x20;//定时器T1,工作方式2,自动重装 TH1 = 0x38; TL1 = 0x38;//定时约200us EA = 1;//打开总中断 ET1 = 1;//开定时中断 TR1 = 1;//启动定时器T1}/***********************************************程序名称:ADC0809_Result程序功能:获取ADC0809 ADC值程序说明:因为ADC0809是并行输出方式,所以输出的 ADC结果反馈到单片机的对应的OUTPUT_PORT引脚。程序输入:uchar adc_number(要获取的ADC通道号1-7)程序返回:unsigned char result 返回当前通道的ADC值***********************************************/uchar ADC0809_Result(uchar adc_number){uchar result = 0;//定义一个临时变量,用于存放转换后的ADC值/*初始化ADC0809*/START = 0; OE = 0; START = 1;/*选择相应输入通道*/switch(adc_number){case 1:ADD_C = 0;ADD_B = 0;ADD_A = 0;break;case 2:ADD_C = 0;ADD_B = 0;ADD_A = 1;break;case 3:ADD_C = 0;ADD_B = 1;ADD_A = 1;break;case 4:ADD_C = 0;ADD_B = 1;ADD_A = 1;break;case 5:ADD_C = 1;ADD_B = 0;ADD_A = 0;break;case 6:ADD_C = 1;ADD_B = 0;ADD_A = 1;break;case 7:ADD_C = 1;ADD_B = 1;ADD_A = 0;break;case 8:ADD_C = 1;ADD_B = 1;ADD_A = 1;break;}/*启动ADC转换*/START = 0;while(EOC == 0);//等待EOC = 1OE = 1;//打开三态门输出result = OUTPUT_PORT;return result;//将结果返回输出}void main(){uint temp = 0;system_Init();InitTimer1();while(1){temp = ADC0809_Result(3);//读取通道3的AD值temp = temp * 0.0196078431372549 * 100;//转换电压=转换ADC值 * (参考电压 / 分辨率最大位) * 100(保留小数点后两位)disply_three_digit(temp);//将读取到的ADC值送到数码管}}void Timer1Interrupt(void) interrupt 3{CLOCK = ~CLOCK;//通过定时器T1提供时钟脉冲}

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。