ADC0809程序
- 格式:docx
- 大小:15.94 KB
- 文档页数:13
与51单片机应用程序电路原理图如下:应用程序如下:#include"reg52.h"#define uchar unsigned charsbit ST=P1^0;sbit EOC=P1^1;sbit OE=P1^2;sbit CLK=P1^3;sbit ADDCS=P1^4;uchar AD_DATA[2];//保存IN0和IN1经AD转换后的数据五一长假除了旅游还能做什么?辅导补习美容养颜家庭家务加班须知/**********延时函数************/void delay(uchar i){while(i--){for(j=125;j>0;j--);}}/*********系统初始化***********/void init(){EA = 1; //开总中断TMOD = 0x02; //设定定时器T0工作方式TH0=216; //利用T0中断产生CLK信号TL0=216;TR0=1; //启动定时器T0ET0=1;ST=0;OE=0;}/***********T0中断服务程序************/void t0(void) interrupt 1 using 0 {CLK=~CLK;}/***********AD转换函数**********/void AD(){ST=0;ADDCS=0; //选择通道IN0delay(10);ST=1; //启动AD转换delay(10);ST=0;while(0==EOC);OE=1;AD_DATA[0]=P2; OE=0;ST=0;ADDCS=1; //选择通道IN1delay(10);ST=1; //启动AD转换delay(10);ST=0;while(0==EOC);OE=1;AD_DATA[1]=P2; OE=0;}/***************** 主函数**************/ void main(){init();while(1){AD();}}。
最佳答案#include<reg51.h>#define uchar unsigned char#define LCM_Data P0#define Busy 0x80 //用于检测LCM状态字中的Busy? sbit RW=P2^1; //定义引脚sbit RS=P2^0;sbit EN=P2^2;sbit int1=P3^3;//定义管脚功能//sbit cs=P3^2; //使能端sbit wr=P3^6; //写端口sbit rd=P3^7; //读端口unsigned char disp[4]={0,0,0,0};unsigned char _adc;void dataproc(unsigned char);void display(unsigned);void delay1ms(char);unsigned char adc0804();unsigned char v='v';unsigned char adc0804( ) //读AD0804子程序{unsigned char addata,i;rd=1;wr=1;int1=1; //读ADC0804 前准备P1=0xff; //P1全部置一准备//cs=0;wr=0;wr=1; //启动ADC0804开始测电压while(int1==1); //查询等待A/D转换完毕产生的INT(低电平有效)信号rd=0; //开始读转换后数据i=i; i="i"; //无意义语句,用于延时等待ADC0804 读数完毕addata=P1; //读出的数据赋与addate//while(1);rd=1;//cs=1; //读数完毕return(addata); //返回最后读出的数据}void dataproc(unsigned char data_in){ int results;results=data_in*196;disp[3]=(results/10000)+0x30;disp[2]=((results/1000)%10)+0x30;disp[1]=((results/100)%10)+0x30;disp[0]=((results/10)%10)+0x30;}/*************************lcd1602程序**************************/ void delay1ms(unsigned int ms)//延时1毫秒(不够精确的,内部函数){unsigned int i,j;for(i=0;i<ms;i++)for(j=0;j<100;j++);}void wr_com(unsigned char com)//写指令// (内部函数){ delay1ms(1);RS=0;RW=0;P0=com;EN=1;delay1ms(1);EN=0;}void wr_dat(unsigned char dat)//写数据// (内部函数){ delay1ms(1);;RS=1;RW=0;EN=0;P0=dat;delay1ms(1);EN=1;delay1ms(1);EN=0;}void lcd_init()//初始化设置// (外部调用){delay1ms(15);wr_com(0x38);delay1ms(5);wr_com(0x08);delay1ms(5);wr_com(0x01);delay1ms(5);wr_com(0x06);delay1ms(5);wr_com(0x0c);delay1ms(5);}void main()//主函数{ while(1){_adc= adc0804( ) ;dataproc(_adc);lcd_init();wr_com(0x80);wr_dat(disp[3]);wr_com(0x81);wr_dat(0x2E);wr_com(0x82);wr_dat(disp[2]);wr_com(0x83);wr_dat(disp[1]);wr_com(0x84);wr_dat(disp[0]);wr_com(0x85);wr_dat(v);//while(1);}。
/*---------------------------------------------------------------------------------------------------程序说明:adc0809接到51单片机的P1口,P1口接有8个LED,每次转换结束都可以通过LED观察到转换结果(低电平亮),ADC参考电压与单片机的电源要一致通过验证:输入5v则LED全灭输入0v则LED全亮通过电位器控制输入0~5v则1602显示输出从0~255逐次增加------------------------------------------------------------------------------------------------------*/#include<reg52.h>#include<intrins.h>#include"1602.c"#define uchar unsigned char#define uint unsigned intsbit ADC_START=P2^0;sbit ADC_ALE =P2^1;sbit ADC_OE =P2^2;sbit ADC_EOC =P2^3;sbit D0=P1^0;sbit D1=P1^1;sbit D2=P1^2;sbit D3=P1^3;sbit D4=P1^4;sbit D5=P1^5;sbit D6=P1^6;sbit D7=P1^7;uchar ad_dat;/*---------------------------------函数名:delayus(i)功能:延时t=(12*i+14)us参数:i返回值:无备注: 晶振12MHz-----------------------------------*//*void delayus(i){for(i;i>0;i--);}*//*---------------------------------dac0809初始化----------------------------------*/void init0809(){ADC_START=0;ADC_OE =0;_nop_();ADC_ALE=0;_nop_();_nop_();_nop_();ADC_ALE=1; //ALE=1时地址进入锁存器_nop_();_nop_();_nop_();ADC_ALE=0; //ALE=0时地址被锁存住_nop_();_nop_();_nop_();}/*---------------------------------dac0809模数转换----------------------------------*/void ADC_0809(){ADC_START=1; //上升沿复位_nop_();_nop_();_nop_();ADC_START=0; //下降沿开始_nop_();_nop_();_nop_();while(!ADC_EOC); //等待转换结束ADC_OE =1;w_dat_1602(0x30+(uchar)D0);w_dat_1602(0x30+(uchar)D1);w_dat_1602(0x30+(uchar)D2);w_dat_1602(0x30+(uchar)D3);w_dat_1602(0x30+(uchar)D4);w_dat_1602(0x30+(uchar)D5);w_dat_1602(0x30+(uchar)D6);w_dat_1602(0x30+(uchar)D7);delayus(5);ADC_OE =0;}void main(){init0809();init_1602();delayus(10);while(1){w_com_1602(0x80);ADC_0809();}}#include<reg52.h>#define uchar unsigned char#define uint unsigned intsbit rs=P2^4; //1602io引脚sbit rw=P2^5; //1602io引脚sbit e=P2^6; //1602io引脚/*---------------------------------函数名:delayusus(i)功能:延时t=(12*i+14)us参数:i返回值:无备注: 晶振12MHz-----------------------------------*/ void delayus(i){for(i;i>0;i--);}/*---------------------------------函数名:w_com_1602(uchar com) 功能:写命令参数:uchar com返回值:无-----------------------------------*/ void w_com_1602(uchar com) {e=0;rs=0;rw=0;delayus(2);P0=com;e=1;delayus(2);e=0;delayus(2);}/*---------------------------------函数名:w_dat_1602(uchar dat)功能:写数据参数:uchar dat返回值:无-----------------------------------*/void w_dat_1602(uchar dat){e=0;rs=1;rw=0;delayus(2);P0=dat;e=1;delayus(2);e=0;delayus(2);}/*---------------------------------函数名:init_1602()功能:1602初始化参数:无返回值:无-----------------------------------*/void init_1602(){P0=0xff; //端口初始化w_com_1602(0x38); //功能设置w_com_1602(0x0f); //开光标但不闪烁w_com_1602(0x06); //设置输入方式w_com_1602(0x01); //清屏delayus(5);}投标人在《招标投标法实施条例》中应重点关注的19个法律问题《招标投标法实施条例》(以下简称《条例》)日前已公布,将于2012年2月1日起施行。
ADC0809与DAC0832进行ADDA转换程序使用0809将电压数据采集回来,然后再用DAC0832输出电压。
练习AD,DA的使用。
程序:#include<reg51.h>#include<absacc.h>#define DAC0832 XBYTE[0x7fff] /* 定义DAC0832端口地址*/#define uchar unsigned char#define uint unsigned intsbit ST=P3^0;sbit OE=P3^1;sbit EOC=P3^2;sbit CLK=P3^3;sbit A1=P3^4;sbit A2=P3^5;sbit A3=P3^7;void delay(unsigned int Delay) //Delay(1000)延时一秒{unsigned int q;for(;Delay>0;Delay--){ for(q=0;q<124;q++){;}}}/*void TimeInitial(){TMOD=0x20;TH1=0xff;TL1=0xff;EA=1;ET1=1;TR1=1;}*/uchar adin0(void) //AD0通道转换{uchar getdATa;//TimeInitial();ST=0;OE=0;ST=1;ST=0;A1=0;A2=0;A3=0;while(EOC==0);OE=1;getdA Ta=P1;OE=0;//TR1=0;return(getdATa);}uchar adin1(void) //AD1通道转换{uchar getdA Ta;//TimeInitial();ST=0;OE=0;ST=1;ST=0;A1=1;A2=0;A3=0;while(EOC==0);OE=1;getdA Ta=P0;OE=0;//TR1=0;return(getdATa);}void main(void){uchar dATa0,i;while(1){dA Ta0=adin0();DAC0832=dATa0;}}void time1(void) interrupt 3 using 0 {TH1=0xff;TL1=0xff;CLK=~CLK;}ADC0809 A/D转换程序基本知识ADC0809是带有8位A/D转换器、8路多路开关以及微处理机兼容的控制逻辑的CMOS组件。
精品文档AD0809应用原理--很全面的资料1.0809 的芯片说明:ADC0809是带有 8 位 A/D 转换器、 8 路多路开关以及微处理机兼容的控制逻辑的 CMOS 组件。
它是逐次逼近式 A/D 转换器,可以和单片机直接接口。
(1) ADC0809的内部逻辑结构由上图可知, ADC0809由一个 8 路模拟开关、一个地址锁存与译码器、一个A/D 转换器和一个三态输出锁存器组成。
多路开关可选通8 个模拟通道,允许8 路模拟量分时输入,共用 A/D 转换器进行转换。
三态输出锁器用于锁存A/D 转换完的数字量,当OE端为高电平时,才可以从三态输出锁存器取走转换完的数据。
( 2).引脚结构IN0- IN7:8 条模拟量输入通道ADC0809对输入模拟量要求:信号单极性,电压范围是0-5V,若信号太小,必须进行放大;输入的模拟量在转换过程中应该保持不变,如若模拟量变化太快,则需在输入前增加采样保持电路。
地址输入和控制线: 4 条ALE为地址锁存允许输入线,高电平有效。
当ALE线为高电平时,地址锁存与译码器将 A,B,C三条地址线的地址信号进行锁存,经译码后被选中的通道的模拟量进转换器进行转换。
A,B 和 C 为地址输入线,用于选通 IN0-IN7 上的一路模拟量输入。
通道选择表如下表所示。
C B A 选择的通道000IN0001IN1010IN2011IN3100IN4101IN5110IN6111IN7数字量输出及控制线: 11 条ST 为转换启动信号。
当 ST 上跳沿时,所有内部寄存器清零;下跳沿时,开始进行 A/ D 转换;在转换期间, ST应保持低电平。
EOC为转换结束信号。
当 EOC为高电平时,表明转换结束;否则,表明正在进行 A/D 转换。
OE为输出允许信号,用于控制三条输出锁存器向单片机输出转换得到的数据。
OE= 1,输出转换得到的数据; OE=0,输出数据线呈高阻状态。
D7- D0为数字量输出线。
们重在实际制做,太罗嗦的内容我就不说了,只讲些跟制做有关的最精炼的知识。
ADC0809是可以将我们要测量的模拟电压信号量转换为数字量从而可以进行存储或显示的一种转换IC。
下面是它的管脚图和逻辑图:管脚功能说明:IN0-IN7:模拟量输入通道。
就是说它可以分时地分别对八个模拟量进行测量转换。
ADDA-C:地址线。
也就是通过这三根地址线的不同编码来选择对哪个模拟量进行测量转换。
ALE:地址锁存允许信号。
在低电平时向ADDA-C写地址,当ALE跳至高电平后ADDA-C上的数据被锁存START:启动转换信号。
当它为上升沿后,将内部寄存器清0。
当它为下降沿后,开始A/D转换。
D0-D7:数据输出口。
转换后的数字数据量就是从这输出给S52的。
OE:输出允许信号,是对D0-D7的输出控制端,OE=0,输出端呈高阻态,OE=1,输出转换得到的数据。
CLOCK:时种信号。
ADC0809内部没有时钟电路,需由外部提供时钟脉冲信号。
一般为500KHzEOC:转换结束状态信号。
EOC=0,正在进行转换。
EOC=1,转换结束,可以进行下一步输出操作REF(+)、REF(-):参考电压。
参考电压用来与输入的模拟量进行比较,作为测量的基准。
一般REF(=)=5v REF(-)=0V。
下面我先给出ADC0809的时序图再说说它的工作过程:它的工作过程是这样的,①在IN0-IN7上可分别接上要测量转换的8路模拟量信号。
有人问了,可不可以只接一路?我就只想测一个模拟信号。
当然可了②将ADDA-ADDC端给上代表选择测量通道的代码。
如000(B)则代表通道0;001(B)代表通道1;111则代表通道7。
③将ALE由低电平置为高电平,从而将ADDA-ADDC送进的通道代码锁存,经译码后被选中的通道的模拟量送给内部转换单元。
④给START一个正脉冲。
当上升沿时,所有内部寄存器清零。
下降沿时,开始进行A/D转换;在转换期间,START保持低电平。