51单片机AD DA转换教程
- 格式:ppt
- 大小:1.32 MB
- 文档页数:43
基于51单片机的AD和DA本讲内容:介绍AD/DA芯片PCF8591,通过例程讲解AD和DA过程。
AD和DA的概念:AD转换的功能是把模拟量电压转换为数字量电压。
DA转换的功能正好相反,就是讲数字量转换位模拟量。
分辨率的概念:一位数字量所表示的电压值。
对于5V的满量程,采用8位的DAC 时,分辨率为5V/256=19.5mV。
PCF8591简介:PCF8591是单片、单电源低功耗8位CMOS数据采集器件,具有4个模拟输入、一个模拟输出和一个串行IIC总线接口。
3个地址引脚A0、A1和A2用于编程硬件地址,允许将最多8个器件连接至IIC总线而不需要额外硬件。
PCF8591管脚图:PCF8591接口电路图:PCF8591的控制寄存器:例程:AD程序/**********************AD转换**********************单片机型号:STC89C52RC*开发环境:KEIL*功能:IIC协议 PCF8591 AD转换**************************************************/#include<reg52.h>#include <intrins.h>#define LCD_Data P0#define Busy 0x80#define uchar unsigned char#define delay0;_nop_();#define AddWr 0x90#define AddRd 0x91sbit RST=P2^4;sbit Sda=P2^0;sbit Scl=P2^1;sbit LCD_RS=P1^0;sbit LCD_RW=P1^1;sbit LCD_E =P2^5;bit ADFlag;uchar code table0[]={" SL-51A "};uchar code table1[]={" AD CONVERT "};uchar code table2[]={"CH1: . V"};uchar code table3[]={"CH2: . V"};uchar code table4[]={"CH3: . V"};uchar code table5[]={"CH4: . V"};uchar TempData[8];void Delay5Ms(void);void delay(int In,int Out); void WriteDataLCD(unsigned char WDLCD);void WriteCommandLCD(unsigned char WCLCD,BuysC);uchar ReadDataLCD(void);uchar ReadStatusLCD(void);void LCDInit(void);void DisplayOneChar(unsigned char X,unsigned char Y,unsigned char DData);void DisplayListChar(unsigned char X,unsigned char Y,unsigned char code *DData);void Init_Timer1(void);void Start(void);void Stop(void);void Ack(void);void NoAck(void);void Send(unsigned char Data);uchar Read(void);void DAC(unsigned char Data);uchar ReadADC(unsigned char Chl);void info_disp(void);/**********5ms延时函数***************************/void Delay5Ms(void){unsigned int TempCyc=3552;while(TempCyc--);}/********************延迟函数********************/void delay(int In,int Out) {int i,j;for(i=0;i<In;i++){for(j=0;j<Out;j++){;}}}/*------------------------------------------------初始化定时器1------------------------------------------------*/void Init_Timer1(void){TMOD|=0x10;TH1=0xff;TL1=0x00;EA=1;ET1=1;TR1=1;}/*------------------------------------------------启动IIC总线------------------------------------------------*/void Start(void){Sda=1;delay0;Scl=1;delay0;Sda=0;delay0;Scl=0;}/*------------------------------------------------停止IIC总线------------------------------------------------*/void Stop(void){Sda=0;delay0;Scl=1;delay0;Sda=1;delay0;Scl=0;}/*------------------------------------------------应答IIC总线------------------------------------------------*/void Ack(void){Sda=0;delay0;Scl=1;delay0;Scl=0;delay0;}/*------------------------------------------------非应答IIC总线------------------------------------------------*/void NoAck(void){Sda=1;delay0;Scl=1;delay0;Scl=0;delay0;}/*------------------------------------------------发送一个字节------------------------------------------------*/ void Send(unsigned char Data){uchar BitCounter=8;uchar temp;do{temp=Data;Scl=0;delay0;if((temp&0x80)==0x80){Sda=1;}else{Sda=0;}Scl=1;temp=Data<<1;Data=temp;BitCounter--;}while(BitCounter);Scl=0;}/*------------------------------------------------读入一个字节并返回------------------------------------------------*/ uchar Read(void){uchar temp=0;uchar temp1=0;uchar BitCounter=8;Sda=1;do{Scl=0;delay0;Scl=1;delay0;if(Sda){temp=temp|0x01;}else{temp=temp&0xfe;}if(BitCounter-1){temp1=temp<<1;temp=temp1;}BitCounter--;}while(BitCounter);return(temp);}/*------------------------------------------------写入DA数模转换值------------------------------------------------*/ void DAC(unsigned char Data){Start();Send(AddWr);Ack();Send(0x40);Ack();Send(Data);Ack();Stop();}/*------------------------------------------------读取AD模数转换的值,有返回值------------------------------------------------*/ uchar ReadADC(unsigned char Chl){uchar Data;Start();Send(AddWr);Ack();Send(0x40|Chl);Ack();Start();Send(AddRd);Ack();Data=Read();Scl=0;NoAck();Stop();return Data;}/*******************写数据函数*******************/ void WriteDataLCD(unsigned char WDLCD){ReadStatusLCD();LCD_Data=WDLCD;LCD_RS=1;LCD_RW=0;LCD_E=0;LCD_E=0;LCD_E=1;}/*******************写指令函数*******************/ void WriteCommandLCD(unsigned char WCLCD,BuysC) {if(BuysC)ReadStatusLCD();LCD_Data=WCLCD;LCD_RS=0;LCD_RW=0;LCD_E=0;LCD_E=0;LCD_E=1;}/*******************读数据函数*******************/unsigned char ReadDataLCD(void){LCD_RS=1;LCD_RW=1;LCD_E=0;LCD_E=0;LCD_E=1;return(LCD_Data);}/*******************读状态函数*******************/unsigned char ReadStatusLCD(void){LCD_Data=0xFF;LCD_RS=0;LCD_RW=1;LCD_E=0;LCD_E=0;LCD_E=1;while (LCD_Data&Busy);return(LCD_Data);}/********************LCD初始化*******************/void LCDInit(void){LCD_Data=0;WriteCommandLCD(0x38,0);Delay5Ms();WriteCommandLCD(0x38,0);Delay5Ms();WriteCommandLCD(0x38,0);Delay5Ms();WriteCommandLCD(0x38,1);WriteCommandLCD(0x08,1);WriteCommandLCD(0x01,1);WriteCommandLCD(0x06,1);WriteCommandLCD(0x0C,1);}/********************清屏函数********************/void LCD_Clear(void){WriteCommandLCD(0x01,1);Delay5Ms();}/**************按指定位置显示一个字符*************/void DisplayOneChar(unsigned char X,unsigned char Y,unsigned char DData) {Y&=0x1;X&=0xF;if(Y)X|=0x40;X|=0x80;WriteCommandLCD(X, 0);WriteDataLCD(DData);}/**************按指定位置显示一串字符*************/void DisplayListChar(unsigned char X,unsigned char Y,unsigned char code *DData) {unsigned char ListLength;ListLength=0;Y&=0x1;X&=0xF;while(DData[ListLength]>=0x20){if(X<=0xF){DisplayOneChar(X, Y, DData[ListLength]);ListLength++;X++;}}}/********************系统初始化*******************/void sys_init(void){LCDInit();delay(5,100);Init_Timer1();DisplayListChar(0,0,table0);DisplayListChar(0,1,table1);}/*------------------------------------------------显示------------------------------------------------*/void info_disp(void){DisplayListChar(0,0,table2);DisplayOneChar(4,0,(0x30+TempData[0]));DisplayOneChar(6,0,(0x30+TempData[1]));DisplayListChar(8,0,table3);DisplayOneChar(12,0,(0x30+TempData[2]));DisplayOneChar(14,0,(0x30+TempData[3]));DisplayListChar(0,1,table4);DisplayOneChar(4,1,(0x30+TempData[4]));DisplayOneChar(6,1,(0x30+TempData[5]));DisplayListChar(8,1,table5);DisplayOneChar(12,1,(0x30+TempData[6]));DisplayOneChar(14,1,(0x30+TempData[7]));}/*------------------------------------------------主程序------------------------------------------------*/void main(){uchar num;uchar ADtemp;sys_init();delay(100,1000);LCD_Clear();while(1){DAC(num);num++;delay(5,100);if(ADFlag){ADFlag=0;ADtemp=ReadADC(0);TempData[0]=(ReadADC(0))/50;TempData[1]=((ReadADC(0))%50)/10; ADtemp=ReadADC(1);TempData[2]=(ReadADC(1))/50;TempData[3]=((ReadADC(1))%50)/10; ADtemp=ReadADC(2);TempData[4]=(ReadADC(2))/50;TempData[5]=((ReadADC(2))%50)/10; ADtemp=ReadADC(3);TempData[6]=(ReadADC(3))/50;TempData[7]=((ReadADC(4))%50)/10; info_disp();}}}/*------------------------------------------------定时器中断程序------------------------------------------------*/void Timer1_isr(void) interrupt 3 using 1{static unsigned int j;TH1=0xfb;TL1=0x00;j++;if(j==200){j=0;ADFlag=1;}}DA程序/******************DA转换LED输出*******************单片机型号:STC89C52RC*开发环境:KEIL*功能:此程序通过IIC协议对DAAD芯片操作, 并输出模拟量,用LED亮度渐变指示***************************************************/#include<reg52.h>#include <intrins.h>#define delay0; _nop_();#define uchar unsigned char#define AddWr 0x90#define AddRd 0x91sbit RST=P2^4;sbit Sda=P2^0;sbit Scl=P2^1;sbit Fm=P2^3;sbit LE1=P2^6;sbit LE2=P2^7;bit ADFlag;uchar code Datatab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; data uchar Display[8];/*------------------------------------------------延时程序------------------------------------------------*/void mDelay(uchar j){unsigned int i;for(;j>0;j--){for(i=0;i<125;i++){;}}}/*------------------------------------------------初始化定时器1------------------------------------------------*/void Init_Timer1(void){TMOD|=0x10;TH1=0xff;TL1=0x00;EA=1;ET1=1;TR1=1;}/*------------------------------------------------启动IIC总线------------------------------------------------*/void Start(void){Sda=1;delay0;Scl=1;delay0;Sda=0;delay0;Scl=0;}/*------------------------------------------------停止IIC总线------------------------------------------------*/ void Stop(void){Sda=0;delay0;Scl=1;delay0;Sda=1;delay0;Scl=0;}/*------------------------------------------------应答IIC总线------------------------------------------------*/ void Ack(void){Sda=0;delay0;Scl=1;delay0;Scl=0;delay0;}/*------------------------------------------------非应答IIC总线------------------------------------------------*/ void NoAck(void){Sda=1;delay0;Scl=1;delay0;Scl=0;delay0;}/*------------------------------------------------发送一个字节------------------------------------------------*/ void Send(uchar Data){uchar BitCounter=8;uchar buffer;do{buffer=Data;Scl=0;delay0;if((buffer&0x80)==0x80)Sda=1;else Sda=0;Scl=1;buffer=Data<<1;Data=buffer;BitCounter--;}while(BitCounter);Scl=0;}/*------------------------------------------------读入一个字节并返回------------------------------------------------*/ uchar Read(void){uchar buffer=0;uchar buffer1=0;uchar BitCounter=8;Sda=1;do{Scl=0;delay0;Scl=1;delay0;if(Sda)buffer=buffer|0x01;else buffer=buffer&0xfe;if(BitCounter-1){buffer1=buffer<<1;buffer=buffer1;}BitCounter--;}while(BitCounter);return(buffer);}/*------------------------------------------------写入DA数模转换值------------------------------------------------*/ void DAC(uchar Data){Start();Send(AddWr);Ack();Send(0x40);Ack();Send(Data);Ack();Stop();}/*------------------------------------------------读取AD模数转换的值,有返回值------------------------------------------------*/ uchar ReadADC(uchar Chl){uchar Data;Start();Send(AddWr);Ack();Send(0x40|Chl);Ack();Start();Send(AddRd);Ack();Data=Read();Scl=0;NoAck();Stop();return Data;}void fmg(void){Fm=1;}void cmg(void){LE1=1;P0=0x00;LE1=0;LE2=1;P0=0x00;LE2=0;RST=0;}/*------------------------------------------------主程序------------------------------------------------*/ void main(){uchar num;uchar ADbuffer;Init_Timer1();cmg();fmg();while(1){DAC(num);num++;mDelay(20);if(ADFlag){ADFlag=0;ADbuffer=ReadADC(0);Display[0]=Datatab[(ReadADC(0))/50]|0x80;Display[1]=Datatab[((ReadADC(0))%50)/10];ADbuffer=ReadADC(1);Display[2]=Datatab[((ReadADC(1))/50)]|0x80;Display[3]=Datatab[((ReadADC(1))%50)/10];ADbuffer=ReadADC(2);Display[4]=Datatab[((ReadADC(2))/50)]|0x80;Display[5]=Datatab[((ReadADC(2))%50)/10];ADbuffer=ReadADC(3);Display[6]=Datatab[((ReadADC(3))/50)]|0x80; Display[7]=Datatab[((ReadADC(3))%50)/10]; }}}。
A/D和D/A转换接口技术难点•DAC0832工作方式•ADC0809工作方式要求掌握:•MCS-51单片机与D/A转换器的接口连接•MCS-51单片机与A/D转换器的接口连接•初始化编程及应用了解:•典型D/A转换器芯片DAC0832的管脚功能•典型A/D转换器芯片ADC0809的管脚功能3.1 MCS-51单片机与D/A转换器的接口和应用3.1.1典型D/A转换器芯片DAC0832DAC0832是一个8位D/A转换器芯片,单电源供电,从+5V~+15V均可正常工作,基准电压的范围为±10V,电流建立时间为1μs,CMOS工艺,低功耗20mW。
其内部结构如图9.1所示,它由1个8位输入寄存器、1个8位DAC寄存器和1个8位D/A转换器组成和引脚排列如图1所示。
图1 DAC0832引脚功能该D/A转换器为20引脚双列直插式封装,各引脚含义如下:(1)D7~D0——转换数据输入。
(2)——片选信号(输入),低电平有效。
(3)ILE——数据锁存允许信号(输入),高电平有效。
(4)——第一信号(输入),低电平有效。
该信号与ILE 信号共同控制输入寄存器是数据直通方式还是数据锁存方式:当ILE=1和=0时,为输入寄存器直通方式;当ILE=1和=1时,为输入寄存器锁存方式。
(5)——第2写信号(输入),低电平有效.该信号与信号合在一起控制DAC寄存器是数据直通方式还是数据锁存方式:当=0和=0时,为DAC寄存器直通方式; 当=1和=0时,为DAC寄存器锁存方式。
(6)——数据传送控制信号(输入),低电平有效 。
(7)Iout2——电流输出“1”。
当数据为全“1”时,输出电流最大;为全“0”时输出电流最小。
(8)Iout2——电流输出“2”。
DAC转换器的特性之一是:Iout1 +Iout2=常数。
(9)R fb——反馈电阻端既运算放大器的反馈电阻端,电阻(15KΩ)已固化在芯片中。
因为DAC0832是电流输出型D/A转换器,为得到电压的转换输出,使用时需在两个电流输出端接运算放大器,R fb 即为运算放大器的反馈电阻,运算放大器的接法如图2所示。
四、实验说明1、D/A 转换是把数字量转换成模拟量的变换,实验台上D /A 电路输出的是模拟电压信号。
要实现实验要求,比较简单的方法是产生三个波形的表格,然后通过查表来实现波形显示。
2、产生锯齿波和三角波的表格只需由数字量的增减来控制,同时要注意三角波要分段来产生。
要产生正弦波,较简单的方法是造一张正弦数字量表。
即查函数表得到的值转换成十六进制数填表。
D/A 转换取值范围为一个周期,采样点越多,精度越高些。
本例采用的采样点为256点/周期。
3、8位D/A 转换器的输入数据与输出电压的关系为U(0∽-5V)=Uref/256×N U(-5V ∽+5V)=2·Uref/256×N-5V (这里 Uref 为+5V)五、实验框图六、参考程序xdata unsig n ed char CS 0832 _at_ 0xa000;void Write 0832(unsig n ed char b){CS0832 = b;}void main(){Write 0832(0);Write 0832(0x80);Write 0832(0xff);开始否 是置计数器初值 查表读波形数据 启动D/A 改变计数器及表指针 转换完毕while(1);}/*========================================================== =*/CS0832 equ 0a000hmov dptr, #CS0832mov a, #00hmovx @dptr, amov a, #40hmovx @dptr, amov a, #80hmovx @dptr, amov a, #0c0hmovx @dptr, amov a, #0ffhmovx @dptr, aljmp $end硬件实验十三 A/D 模数转换实验一、实验要求利用实验板上的ADC 0809做A /D 转换器,实验板上的电位器提供模拟量输入,编制程序,将模拟量转换成二进制数字量,用8255的PA 口输出到发光二极管显示。
简述51单片机adc转换流程英文版Brief Introduction to the ADC Conversion Process of the 51 MicrocontrollerThe 51 microcontroller is a popular choice for embedded systems due to its simplicity, reliability, and widespread availability. Among its many features, the microcontroller often includes an Analog-to-Digital Converter (ADC) that converts analog signals into digital formats, enabling precise control and data acquisition. In this article, we will briefly describe the ADC conversion process of the 51 microcontroller.1. Overview of ADC:An ADC converts analog signals, which continuously vary in amplitude, into digital signals represented by discrete values. The 51 microcontroller's ADC typically has a specific number of bits, determining the resolution of the conversion. For example,an 8-bit ADC can represent 256 discrete levels, while a 10-bit ADC can represent 1024 levels.2. The ADC Conversion Process:Initialization: Before performing an ADC conversion, the microcontroller needs to be initialized. This involves setting up the ADC module, configuring the input channels, selecting the desired resolution, and enabling the ADC.Start Conversion: Once initialized, the microcontroller can start the ADC conversion process. This usually involves setting a specific control bit to initiate the conversion.Sampling: During the sampling phase, the ADC captures the analog signal at the selected input channel. The duration of this phase depends on the ADC's sampling rate and the characteristics of the analog signal.Quantization: The captured analog signal is then quantized, which means it is rounded off to the nearest discrete level based on the ADC's resolution. For example, if the ADC is 8-bit,the analog signal will be rounded off to one of the 256 possible levels.Digital Output: After quantization, the ADC outputs the digital representation of the analog signal. This digital value can be read by the microcontroller for further processing or transmitted to other systems.3. Conclusion:The ADC conversion process in the 51 microcontroller involves initialization, starting the conversion, sampling the analog signal, quantizing it, and finally outputting the digital value. This process enables the microcontroller to process and respond to analog signals accurately, making it suitable for a wide range of applications in embedded systems.中文版简述51单片机ADC转换流程51单片机因其简洁性、可靠性和广泛的应用性,在嵌入式系统中备受欢迎。