精华内容
下载资源
问答
  • DA转换

    千次阅读 2019-03-28 12:58:36
    DA输出电压公式:volt = temp*5/255(volt为输出电压,temp为DA转换值) void SetDAC(unsigned char temp) { IIC_Start(); IIC_SendByte(0x90); IIC_WaitAck(); IIC_SendByte(0x40); IIC_WaitAck(...

    转换代码:

    注意:
    这里的temp还不是DA输出电压
    DA输出电压公式:volt = temp*5/255(volt为输出电压,temp为DA转换值)

    void SetDAC(unsigned char temp)
    {
    		IIC_Start();
    		IIC_SendByte(0x90);
    		IIC_WaitAck();
    		IIC_SendByte(0x40);
    		IIC_WaitAck();	
    		IIC_SendByte(temp);
    		IIC_WaitAck();
    		IIC_Stop();
    }
    

    实验测试 :
    当temp = 200
    输出电压经过以上公式求得volt = 200*5/255 =3.92V
    准备一个示波器,接上板子的D/A口和GND
    在这里插入图片描述在这里插入图片描述示波器输出3.84V,大概0.1V的误差,还可以接受。
    所以,想要输出多少V的电压,就根据公式逆推求temp值就可以了

    全部代码:

    main.c

    ******************************************************************************
    * 文件名:DA转换
    * 描  述:
    * 作  者:思索与猫
    * 日  期:  19/3/28
    * 备  注: 
    *         
    ******************************************************************************
    #include<stc15f2k60s2.h>
    #include<iic.h>
    typedef unsigned char uchar;
    typedef unsigned int uint;
    
    uchar temp= 200;
    
    void CloseFucker();
    
    void main()
    {
    		CloseFucker();
    		while(1)
    		{
    				SetDAC(temp);   //设置输出模拟电压
    		}
    }
    
    void CloseFucker()
    {
    		P2 = P2&0x1f|0xa0;
    		P0 = 0xaf;
    		P2 = P2&0x1f;
    }
    

    iic.h

    #ifndef _IIC_H
    #define _IIC_H
    
    void IIC_Start(void); 
    void IIC_Stop(void);  
    bit IIC_WaitAck(void);  
    void IIC_SendAck(bit ackbit); 
    void IIC_SendByte(unsigned char byt); 
    unsigned char IIC_RecByte(void); 
    void Delay5us();
    void SetDAC(unsigned char temp);
    
    #endif
    

    iic.c

    #include <STC15F2K60S2.H>
    #include <iic.h>
    #include "intrins.h"
    
    #define DELAY_TIME 5
    
    #define SlaveAddrW 0xA0
    #define SlaveAddrR 0xA1
    #define IIC_Delay(DELAY_TIME) Delay5us()	
    
    sbit SDA = P2^1;  
    sbit SCL = P2^0;  
    
    void Delay5us()		//@12.000MHz
    {
    	unsigned char i;
    
    	_nop_();
    	_nop_();
    	i = 12;
    	while (--i);
    }
    
    void IIC_Start(void)
    {
        SDA = 1;
        SCL = 1;
        IIC_Delay(DELAY_TIME);
        SDA = 0;
        IIC_Delay(DELAY_TIME);
        SCL = 0;	
    }
    
    void IIC_Stop(void)
    {
        SDA = 0;
        SCL = 1;
        IIC_Delay(DELAY_TIME);
        SDA = 1;
        IIC_Delay(DELAY_TIME);
    }
    
    void IIC_SendAck(bit ackbit)
    {
        SCL = 0;
        SDA = ackbit;  					
        IIC_Delay(DELAY_TIME);
        SCL = 1;
        IIC_Delay(DELAY_TIME);
        SCL = 0; 
        SDA = 1;
        IIC_Delay(DELAY_TIME);
    }
    
    bit IIC_WaitAck(void)
    {
        bit ackbit;
    	
        SCL  = 1;
        IIC_Delay(DELAY_TIME);
        ackbit = SDA;
        SCL = 0;
        IIC_Delay(DELAY_TIME);
        return ackbit;
    }
    
    void IIC_SendByte(unsigned char byt)
    {
        unsigned char i;
    
        for(i=0; i<8; i++)
        {
            SCL  = 0;
            IIC_Delay(DELAY_TIME);
            if(byt & 0x80) SDA  = 1;
            else SDA  = 0;
            IIC_Delay(DELAY_TIME);
            SCL = 1;
            byt <<= 1;
            IIC_Delay(DELAY_TIME);
        }
        SCL  = 0;  
    }
    
    unsigned char IIC_RecByte(void)
    {
        unsigned char i, da;
        for(i=0; i<8; i++)
        {   
        	SCL = 1;
    	IIC_Delay(DELAY_TIME);
    	da <<= 1;
    	if(SDA) da |= 1;
    	SCL = 0;
    	IIC_Delay(DELAY_TIME);
        }
        return da;    
    }
    
    void SetDAC(unsigned char temp)
    {
    		IIC_Start();
    		IIC_SendByte(0x90);
    		IIC_WaitAck();
    		IIC_SendByte(0x40);
    		IIC_WaitAck();	
    		IIC_SendByte(temp);
    		IIC_WaitAck();
    		IIC_Stop();
    }
    
    展开全文
  • 单片机AD/DA转换

    2011-07-18 17:54:52
    单片机AD/DA转换单片机AD/DA转换单片机AD/DA转换单片机AD/DA转换单片机AD/DA转换单片机AD/DA转换单片机AD/DA转换单片机AD/DA转换单片机AD/DA转换
  • AD和DA转换

    千次阅读 2019-07-07 09:28:01
    AD和DA转换 1.转换类别 电信号:电压、电流等 非电信号:压力、温度、湿度、位移、声音等 但在A/D转换前,输入到A/D转换器的输入信号必须经各种传感器把各种物理量转换成电压信号。 2.转换原理 (1)比较器,所有的AD...

    AD和DA转换

    1.转换类别

    电信号:电压、电流等

    非电信号:压力、温度、湿度、位移、声音等

    但在A/D转换前,输入到A/D转换器的输入信号必须经各种传感器把各种物理量转换成电压信号。

    2.转换原理

    (1)比较器,所有的AD转换芯片内部都是用比较器来实现的。

    (2)和10进制转2进制有点像。

    3.积分类型

    逐次逼近类型

    并行比较类型

    sigma类型

    ​ 过采样(over sampling),量化噪声整形(quantization),数字滤波(digital filtering),抽取(decimation)。Σ-Δ转换器中的模拟部分非常简单(类似于一个1bit ADC),而数字部分要复杂得多,按照功能可划分为数字滤波和抽取单元。由于更接近于一个数字器件,Σ-ΔADC的制造成本非常低廉。

    过采样:首先,考虑一个传统ADC的频域传输特性。输入一个正弦信号,然后以频率fs采样–按照 Nyquist定理,采样频率至少两倍于输入信号。从FFT分析结果可以看到,一个单音和一系列频率分布于DC到fs /2间的随机噪声。这就是所谓的量化噪声,主要是由于有限的ADC分辨率而造成的。单音信号的幅度和所有频率噪声的RMS幅度之和的比值就是信号噪声比(SNR)。对于一个Nbit ADC,SNR可由公式:SNR=6.02N+1.76dB得到。为了改善SNR和更为精确地再现输入信号,对于传统ADC来讲,必须增加位数。

    4.关键技术参数

    3.1分辨率

    3.2转换速率

    转换速率(Conversion Rate)是指完成一次从模拟转换到数字的AD转换所需的时间的倒数。积分型AD的转换时间是毫秒级属低速AD,逐次比较型AD是微秒级属中速AD,全并行/串并行型AD可达到纳秒级。采样时间则是另外一个概念,是指两次转换的间隔。为了保证转换的正确完成,采样速率(Sample Rate)必须小于或等于转换速率。因此有人习惯上将转换速率在数值上等同于采样速率也是可以接受的。

    3.3精度与误差

    常用的A/D转换器主要存在:失调误差、增益误差和线性误差。

    3.4基准误差

    采用内部或外部基准的ADC的一个最大潜在误差源是参考电压。很多情况下,内置于芯片内部的基准通常都没有足够严格的规格。为了理解基准所带来的误差源,有必要特别关注一下三项指标:温漂,电压噪声,和负载调整。

    3.5量化误差

    量化误差(Quantizing Error) 由于AD的有限分辩率而引起的误差,即有限分辩率AD的阶梯状转移特性曲线与无限分辩率AD(理想AD)的转移特性曲线(直线)之间的最大偏差。通常是1个或半个最小数字量的模拟变化量,表示为1LSB、1/2LSB。

    3.6失调误差与增益误差

    失调误差与增益误差用数学公式可表达为:y=ax+b。其中,a为增益误差,b为失调误差。失调误差(Offset Error) 输入信号为零时输出信号不为零的值,可外接电位器调至最小。

    3.7线性度

    线性度指标有两个:INL:翻译过来叫“积分非线性”,指的是ADC整体的非线性程度。DNL:翻译过来叫“微分非线性”,指的是ADC局部(细节)的非线性程度。

    (1)INL(Interger NonLinear,Linearity error)精度。理解为单值数据误差,对应该点模拟数据由于元器件及结构造成的不能精确测量产生的误差。(2)DNL(Differential NonLinear)差分非线性值。理解为刻度间的差值,即对每个模拟数据按点量化,由于量化产生的误差。

    3.8信噪比(signal-to-noise,SNR)

    3.9有效位数

    3.10动态范围

    (1)位数,AD转换后转出来的二进制数由几位二进制来表示。位数越多,越细腻。

    (2)量程,AD转换器可以接受的模拟量的范围。

    (3)精度,简单理解就是转出来到底有多准。

    (4)分辨率,AD转换器转出来的二进制数,每一格表示多少。

    (5)转换速率(转换时间)。

    举个栗子:
    输入电压范围0-5V,AD转换输出位数是10,精度是0.01V,则:量程为0-5V,
    分辨率为:(5-0)/2exp(10)=0.00488V

    譬如一次AD转换后得到的数据是1010101010,则对应的电压值为:3.328V,考虑精度后为3.33V

    5.AD转换代码

    实现现象:下载程序后数码管后4位显示外部输入IN3通道检测的AD值,模拟信号电压范围在0-5V

    1.main.c

    #include "reg52.h"			 //此文件中定义了单片机的一些特殊功能寄存器
    #include"XPT2046.h"	
    
    typedef unsigned int u16;	  //对数据类型进行声明定义
    typedef unsigned char u8;
    
    sbit LSA=P2^2;
    sbit LSB=P2^3;
    sbit LSC=P2^4;
    
    u8 disp[4];
    u8 code smgduan[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
    
    /*******************************************************************************
    * 函 数 名         : delay
    * 函数功能		   : 延时函数,i=1时,大约延时10us
    *******************************************************************************/
    void delay(u16 i)
    {
    	while(i--);	
    }
    
    /*******************************************************************************
    * 函数名         :datapros()
    * 函数功能		 :数据处理函数
    * 输入           : 无
    * 输出         	 : 无
    *******************************************************************************/
    void datapros()
    {
    	u16 temp;
    	static u8 i;
    	if(i==50)
    	{
    		i=0;
    		temp = Read_AD_Data(0xE4);		//   AIN3 外部输入
    	}
    	i++;
    	disp[0]=smgduan[temp/1000];//千位
    	disp[1]=smgduan[temp%1000/100];//百位
    	disp[2]=smgduan[temp%1000%100/10];//个位
    	disp[3]=smgduan[temp%1000%100%10];		
    }
    
    
    /*******************************************************************************
    * 函数名         :DigDisplay()
    * 函数功能		 :数码管显示函数
    * 输入           : 无
    * 输出         	 : 无
    *******************************************************************************/
    void DigDisplay()
    {
    	u8 i;
    	for(i=0;i<4;i++)
    	{
    		switch(i)	 //位选,选择点亮的数码管,
    		{
    			case(0):
    				LSA=0;LSB=0;LSC=0; break;//显示第0位
    			case(1):
    				LSA=1;LSB=0;LSC=0; break;//显示第1位
    			case(2):
    				LSA=0;LSB=1;LSC=0; break;//显示第2位
    			case(3):
    				LSA=1;LSB=1;LSC=0; break;//显示第3位	
    		}
    		P0=disp[3-i];//发送数据
    		delay(100); //间隔一段时间扫描	
    		P0=0x00;//消隐
    	}		
    }
    
    /*******************************************************************************
    * 函 数 名       : main
    * 函数功能		 : 主函数
    * 输    入       : 无
    * 输    出    	 : 无
    *******************************************************************************/
    void main()
    {	
    	while(1)
    	{
    		datapros();	 //数据处理函数
    		DigDisplay();//数码管显示函数		
    	}		
    }
    
    
    

    2.XPT2046.C

    #include"XPT2046.h"
    /****************************************************************************
    *函数名:TSPI_Start
    *输  入:无
    *输  出:无
    *功  能:初始化触摸SPI
    ****************************************************************************/
    
    void SPI_Start(void)
    {
    	CLK = 0;
    	CS  = 1;
    	DIN = 1;
    	CLK = 1;
    	CS  = 0;		
    }
    /****************************************************************************
    *函数名:SPI_Write
    *输  入:dat:写入数据
    *输  出:无
    *功  能:使用SPI写入数据
    ****************************************************************************/
    
    void SPI_Write(uchar dat)
    {
    	uchar i;
    	CLK = 0;
    	for(i=0; i<8; i++)
    	{
    		DIN = dat >> 7;  	//放置最高位
    		dat <<= 1;
    		CLK = 0;			//上升沿放置数据
    
    		CLK = 1;
    
    	}
    }
    /****************************************************************************
    *函数名:SPI_Read
    *输  入:无
    *输  出:dat:读取 到的数据
    *功  能:使用SPI读取数据
    ****************************************************************************/
    
    uint SPI_Read(void)
    {
    	uint i, dat=0;
    	CLK = 0;
    	for(i=0; i<12; i++)		//接收12位数据
    	{
    		dat <<= 1;
    
    		CLK = 1;
    		CLK = 0;
    
    		dat |= DOUT;
    
    	}
    	return dat;	
    }
    
    /****************************************************************************
    *函数名:Read_AD_Data
    *输  入:cmd:读取的X或者Y
    *输  出:endValue:最终信号处理后返回的值
    *功  能:读取触摸数据
    ****************************************************************************/
    uint Read_AD_Data(uchar cmd)
    {
    	uchar i;
    	uint AD_Value;
    	CLK = 0;
    	CS  = 0;
    	SPI_Write(cmd);
    	for(i=6; i>0; i--); 	//延时等待转换结果
    	CLK = 1;	  //发送一个时钟周期,清除BUSY
    	_nop_();
    	_nop_();
    	CLK = 0;
    	_nop_();
    	_nop_();
    	AD_Value=SPI_Read();
    	CS = 1;
    	return AD_Value;	
    }
    
    

    3.XPT2046.h

    #ifndef	  __XPT2046_H_
    #define   __XPT2046_H_
    
    //---包含头文件---//
    #include<reg52.h>
    #include<intrins.h>
    
    //---重定义关键词---//
    #ifndef uchar
    #define uchar unsigned char
    #endif
    
    #ifndef uint
    #define uint  unsigned int
    #endif
    
    #ifndef ulong
    #define ulong  unsigned long
    #endif
    
    //---定义使用的IO口---//
    sbit DOUT = P3^7;	  //输出
    sbit CLK  = P3^6;	  //时钟
    sbit DIN  = P3^4;	  //输入
    sbit CS   = P3^5;	  //片选
    
    uint Read_AD_Data(uchar cmd);
    uint SPI_Read(void);
    void SPI_Write(uchar dat);
    
    #endif
    
    

    论文阅读

    1.Hardware and Software Design of Onboard Computer of ISRASAT1 CubeSat

    天线,外部电源,信标接收机,核心计算版(atmega 32),传感器,摄像头

    [外链图片转存失败(img-IUNOXkHZ-1562462801513)(1543672357912.png)]

    对我的启发:一期模型未做电池组和蓄电池组,我们部门也可开始着手建立这样的一个简易模型,先不做蓄电池组,和电源管理,大大降低了难度,让模型能够拍照,并发送图片即可,且成本低廉,又可以让大家上手开发。

    疑惑:整篇论文介绍里说用了主动姿控,却并未提到。。。

    2.Design and Implementation of Active Attitude Determination and Control Subsystem for ISRASAT1 Cube Satellite

    对我的启发:卫星的模式分为了姿态控制模式和拍照模式,当到达指定区域上空时才开始拍照,卫星稳定时才能读取传感器数据,卫星的倾斜角好像不能变,但是所有仿真内容的形式可以借鉴

    疑惑:依然没有提到姿态调整效应器,只说了actuators,

    3. ISRASAT1 Cube Satellite模型器件

    ,又可以让大家上手开发。

    疑惑:整篇论文介绍里说用了主动姿控,却并未提到。。。

    2.Design and Implementation of Active Attitude Determination and Control Subsystem for ISRASAT1 Cube Satellite

    对我的启发:卫星的模式分为了姿态控制模式和拍照模式,当到达指定区域上空时才开始拍照,卫星稳定时才能读取传感器数据,卫星的倾斜角好像不能变,但是所有仿真内容的形式可以借鉴

    疑惑:依然没有提到姿态调整效应器,只说了actuators,

    3. ISRASAT1 Cube Satellite模型器件

    [外链图片转存失败(img-GDrPZovx-1562462801515)(1543672901719.png)]

    展开全文
  • AD转换与DA转换的应用

    千次阅读 2016-09-20 20:06:01
    AD转换就是模数转换,也可以是整流。顾名思义,就是把模拟信号转换成数字信号。 模拟量可以是电压、电流等电信号,也可以是压力、温度、...DA转换就是数模转换,就是将离散的数字量转换为连接变化的模拟量。与数模转换
    AD转换就是模数转换,也可以是整流。顾名思义,就是把模拟信号转换成数字信号。
    模拟量可以是电压、电流等电信号,也可以是压力、温度、湿度、位移、声音等非电信号。但在A/D转换前,输入到A/D转换器的输入信号必须经各种传感器把各种物理量转换成电压信号。A/D转换后,输出的数字信号可以有8位、10位、12位、14位和16位等。
    
    DA转换就是数模转换,就是将离散的数字量转换为连接变化的模拟量。与数模转换相对应的就是模数转换,模数转换是数模转换的逆过程。接下来我们将从转换器的分类,技术指标,模数变换的方法以及模数转换器的参数等这几方面来介绍数模转换。

    展开全文
  • AD和DA转换-第1季第16部分

    千人学习 2016-12-29 22:07:01
    本课程是《朱有鹏老师单片机完全学习系列课程》第1季第16个课程,主要讲解AD转换和DA转换。目标是理解模拟量和数字量的概念,并且学会使用AD转换来采集现实世界的模拟量。
  • DA转换(IIC总线)

    千次阅读 2019-06-13 17:12:13
    项目描述 ...然后将AD转换后的数据写入PCF8591中进行DA转换,并用LED灯的亮度来显示模拟量的大小。 C语言代码如下: /*------------------------ FileName: DAC.h Function: 头文件 Author: Zhan...

    项目描述
    向PCF8591芯片的AN2通道输入一个电压模拟量,经过AD转换后,单片机通过IIC总线读取转换后的数据,并将其量化后实时显示在LCD上。然后将AD转换后的数据写入PCF8591中进行DA转换,并用LED灯的亮度来显示模拟量的大小。
    仿真原理图如下:
    在这里插入图片描述
    C语言代码如下:

    /*------------------------
    FileName: DAC.h
    Function: 头文件
    Author: Zhang Kaizhou
    Date: 2019-6-13 17:12:49
    ------------------------*/
    #include <reg52.h>
    #include <intrins.h>
    #include <string.h>
    #define uchar unsigned char
    #define uint unsigned int
    #define FACTOR 0.01953125 // 量化单位(用一个字节来量化表示5V的电压值,共为256个量化等级; FACTOR = 5 / 256)
    	
    /*IIC总线端口定义*/
    sbit SDA = P2^0;
    sbit SCL = P2^1;
    
    /*LCD1602显示模块端口定义*/
    sbit lcdrs = P1^0;
    sbit lcdrw = P1^1;
    sbit lcden = P1^2;
    
    /*IIC总线模块函数声明*/
    void initIIC();
    void startIIC();
    void responseIIC();
    void stopIIC();
    void writeDataIIC(uchar dat);
    void readDataIIC(uchar * dat);
    
    /*DAC模块函数声明*/
    void writeData8591(uchar dat);
    void readData8591(uchar channel, uchar * dat);
    
    /*LCD1602显示模块函数声明*/
    void writeCommand(uchar command);
    void writeDataLCD(uchar dat);
    void delay(uint xms);
    void LCDInit();
    void display(uchar dat);
    
    /*-----------------------------------------------------
    FileName: main.c
    Function: ADC IIC
    Description: 向PCF8591芯片的AN2通道输入一个电压模拟量,
    经过AD转换后,单片机通过IIC总线读取转换后的数据,
    并将其量化后实时显示在LCD上。
    然后将AD转换后的数据写入PCF8591中进行DA转换,
    并用LED灯的亮度来显示模拟量的大小。
    Author: Zhang Kaizhou
    Date: 2019-6-13 17:12:40
    ------------------------------------------------------*/
    #include "DAC.h"
    
    void main(){
    	uchar dat = 0;
    	initIIC();
    	LCDInit();
    	while(1){
    		/*AD转换*/
    		readData8591(2, &dat); // 读取通道2模拟输入量化后的数据
    		display(dat);	
    		delay(10);
    		
    		/*DA转换*/
    		writeData8591(dat);
    		delay(10);
    	}
    }
    
    /*向PCF85991写数据*/
    void writeData8591(uchar dat){
    	/*向PCF8591写入地址字节和控制字节*/
    	startIIC();
    	writeDataIIC(0x90); // 向IIC总线发送寻址信号(PCF8591器件地址位90H),并声明要进行写操作
    	responseIIC();
    	writeDataIIC(0x40); // 向PCF8591写入控制字节(DA允许; AD为4路单端输入; 禁止自动增益)
    	responseIIC();
    	
    	/*向PCF8591中写入要进行DA转换的数据*/
    	startIIC();
    	responseIIC();
    	writeDataIIC(0x90);
    	responseIIC();
    	writeDataIIC(dat);
    	responseIIC();
    	stopIIC();
    }
    
    /*从PCF8591的channel模拟输入所对应的ADC数据寄存器中读出数据到变量dat*/
    void readData8591(uchar channel, uchar * dat){
    	/*向PCF8591写入地址字节和控制字节*/
    	startIIC();
    	writeDataIIC(0x90); // 向IIC总线发送寻址信号(PCF8591器件地址位90H),并声明要进行写操作
    	responseIIC();
    	writeDataIIC(0x40 | channel); // 向PCF8591写入控制字节(DA允许; AD为4路单端输入; 禁止自动增益; 选择通道channel)
    	responseIIC();
    	
    	/*从PCF8591读取数据*/
    	startIIC();
    	writeDataIIC(0x91); // 向IIC总线发送寻址信号,并声明要进行读操作
    	responseIIC();
    	readDataIIC(dat);
    	stopIIC(); // 注意此处无响应信号,直接关闭IIC总线即可(否则会导致读取的数据不稳定)
    }
    
    /*----------------------------
    FileName: IIC.c
    Function: 实现IIC总线基本操作
    Author: Zhang Kaizhou
    Date: 2019-6-13 17:13:07
    ----------------------------*/
    #include "DAC.h"
    
    /*IIC总线初始化*/
    void initIIC(){
    	SCL = 1;
    	_nop_();
    	SDA = 1;
    	_nop_();
    }
    
    /*IIC总线启动信号*/
    void startIIC(){ // 在SCL高电平期间,SDA产生一个下降沿表示启动
    	SDA = 1;
    	_nop_();
    	SCL = 1;
    	_nop_();
    	SDA = 0;
    	_nop_();
    }
    
    /*IIC总线应答信号*/
    void responseIIC(){ // 从机在SCL高电平期间将SDA拉低表示应答
    	SDA = 0;
    	_nop_();
    	SCL = 1;
    	_nop_();
    	SCL = 0;
    	_nop_();
    }
    
    /*IIC总线停止信号*/
    void stopIIC(){ // 在SCL高电平期间,SDA产生一个上升沿表示停止
    	SDA = 0;
    	_nop_();
    	SCL = 1;
    	_nop_();
    	SDA = 1;
    	_nop_();
    }
    
    /*向IIC总线写一个字节数据*/
    void writeDataIIC(uchar dat){
    	uchar i, temp;
    	temp = dat;
    	for(i = 0; i < 8; i++){
    		temp = temp << 1;
    		SCL = 0;
    		_nop_();
    		SDA = CY;
    		_nop_();
    		SCL = 1;
    		_nop_();
    	}
    	SCL = 0;
    	_nop_();
    	SDA = 1;
    	_nop_();
    }
    
    /*从IIC总线读一个字节数据*/
    void readDataIIC(uchar * dat){
    	uchar i;
    	SCL = 0;
    	_nop_();
    	SDA = 1;
    	_nop_();
    	for(i = 0; i < 8; i++){
    		SCL = 1;
    		_nop_();
    		* dat = ((* dat) << 1) | SDA;
    		SCL = 0;
    		_nop_();
    	}
    }
    
    /*-----------------------------
    FileName:display.c
    Function: LCD1602显示函数
    Author: Zhang Kaizhou
    Date: 2019-6-13 17:12:59
    ------------------------------*/
    #include "DAC.h"
    
    uchar code table0[] = {"ADC"};
    uchar code table1[] = {"Voltage:"};
    uchar code table2[] = {"0123456789"};
    uchar num = 0;
    
    /*初始化LCD1602的设置*/
    void LCDInit(){
    	uchar i;
    	lcden = 0; // 拉低使能端,准备产生使能高脉冲信号
    	writeCommand(0x38); // 显示模式设置(16x2, 5x7点阵,8位数据接口)
    	writeCommand(0x0c); // 开显示,不显示光标
    	writeCommand(0x06); // 写一个字符后地址指针自动加1
    	writeCommand(0x01); // 显示清零,数据指针清零
    	
    	/*LCD上电界面*/
    	writeCommand(0x80); // 将数据指针定位到第一行首
    	for(i = 0; i < strlen(table0); i++){
    		writeDataLCD(table0[i]);
    		delay(5);
    	}
    	
    	writeCommand(0x80 + 0x40); // 将数据指针定位到第二行首
    	for(i = 0; i < strlen(table1); i++){
    		writeDataLCD(table1[i]);
    		delay(5);
    	}
    }
    
    /*LCD显示函数*/
    void display(uchar dat){
    	/*数据的量化*/
    	float temp = FACTOR * dat;
    	uchar i, j;
    	if(dat == 255){
    		i = 5;
    		j = 0;
    	}else{ // 分离整数和小数部分
    		i = (uchar)temp;
    		j = (temp - i) * 10;
    	}
    	
    	/*数据显示*/
    	writeCommand(0x80 + 0x40 + strlen(table1));
    	writeDataLCD(table2[i]);
    	delay(5);
    	writeCommand(0x80 + 0x40 + strlen(table1) + 1);
    	writeDataLCD('.');
    	delay(5);
    	writeCommand(0x80 + 0x40 + strlen(table1) + 2);
    	writeDataLCD(table2[j]);
    	delay(5);
    }
    
    /*写指令函数*/
    void writeCommand(uchar command){
    	lcdrs = 0; // 命令选择
    	lcdrw = 0;
    	P0 = command;
    	delay(5);
    	
    	lcden = 1; // 产生一个正脉冲使能信号
    	delay(5);
    	lcden = 0;
    }
    
    /*写数据函数*/
    void writeDataLCD(uchar dat){
    	lcdrs = 1; // 数据选择
    	lcdrw = 0;
    	P0 = dat;
    	delay(5);
    	
    	lcden = 1;
    	delay(5);
    	lcden = 0;
    }
    
    /*延时xms函数*/
    void delay(uint xms){
    	uint i, j;
    	for(i = xms; i > 0; i--)
    		for(j = 110; j > 0; j--);
    }
    
    展开全文
  • 51单片机播放音乐(二):DA转换播放任意波形原理DA转换器仿真电路图音频文件转成C语言数组代码单片机代码仿真输出波形 本文完整源码 用数字信号带动蜂鸣器同一时间只能发出一种频率的声音,也没有和弦,会比较难听...
  • 51单片机学习笔记——DA转换

    千次阅读 2020-05-14 22:16:16
    一、DA转换器的分类 权电阻网络D/A转换器 一个多位二进制数中每一位的1所代表的数值大小称为这一位的权。 (此处放一个位数和权重的表格) 对于N位的权电阻网络D/A转换器,当反馈电阻为Rf=R/2时,输出电压的计算...
  • 我们上篇文章DA转换器是什么?快来一起学习一下吧!已经谈论了AD转换器是什么,以及如何使用,那么这篇文章我们就来学习一下他的卵生兄弟DA转换器的一些知识吧! 一、什么是DA转换器 看过上篇文章后大家应该已经对DA...
  • 单片机ad/da转换

    2017-02-08 09:05:06
     名称:IIC协议 PCF8591 AD/DA转换  论坛:www.doflye.net  编写:shifang  修改:无  内容:使用DA输入,数码管显示输出数字量,LED显示模拟电压大小 ------------------------------------------
  • AD/DA转换芯片pcf8591

    2018-01-29 10:31:00
    1月——华清远见成都中心——胡昆——嵌入式学科...DA转换的功能正好相反,就是讲数字量转换位模拟量。 二.芯片PCF8591介绍  PCF8591是一个单片集成、单独供电、低功耗、8-bit CMOS数据获取器件。PCF8591具有4个...
  • 基于ARM stm32的AD与DA转换程序,两个是配套的,而且通过串口实现两个单片机的通信。没有用DMA
  • 主要讲解AD、DA的种类几各自的工作原理,帮助大家掌握!
  • 产生波形实验(DA转换

    千次阅读 2017-11-09 13:17:00
    /*DA转换实验 例如产生锯齿波*/#include <reg52.h>unsigned char xdata ad_cs0 _at_ 0xc000;unsigned char xdata ad_cs1 _at_ 0xc001 ;unsigned char xdata key_seg _at_ 0xd004;unsigned...
  • 常用高速AD/DA转换芯片

    千次阅读 2016-06-13 20:52:21
    原文地址:常用高速AD/DA转换芯片作者:风风车车 型号 位数 采样频率 通道数 接口 NMC2 电压功耗 封装 ADS1110 16位 ...
  • PCF8591 AD/DA转换

    千次阅读 2017-02-08 09:04:32
     名称:IIC协议 PCF8591 AD/DA转换   论坛:www.doflye.net   编写:shifang   修改:无   内容:使用4路AD中的4路检测外部模拟量输入(main.c)  --------------------------------------
  • 51单片机上的AD-DA转换程序,分别由汇编和C编写。经验证,能成功运行
  • AD/DA转换

    2016-09-21 23:21:51
    A/D是模数转换。 有以下的转换: 1.双积分型A/D转换器 2.逐次逼近比较型A/D转换器 3.并行A/D转换器 在德飞莱的实验板上用的是PCF8591芯片。 AD/DA是基于IIC基础上的。所以在昨天IIC的基础上,可以写出以下对...
  • AD/DA转换

    千次阅读 2019-07-09 15:19:31
    一、数模转换器(DAC):将数字信号到模拟信号的转换。按照基本原理可以分为电流求和型和分压器型两种。 电流求和型包括:权电阻型DAC、权电流型DAC、倒T型电阻网络DAC。 分压器型包括:开关树型DAC、权电容网络DAC...
  • 51单片机PCF8591-AD-DA转换

    千次阅读 2019-03-19 14:14:32
    51单片机PCF8591-AD-DA转换,中断实现切换。 #include <reg51.h> #define uchar unsigned char #define uint unsigned int sbit SCL=P2^1; //串行时钟输入端 sbit SDA=P2^0; //串行数据输入端 sbit HC...
  • 通过PCF8591控制电压值(DA转换

    千次阅读 2020-07-06 10:47:39
    通过PCF8591控制电压值(DA转换)ADC理论常用D/A器件 PCF8591代码 ADC理论 ADC的理论上一篇已说过 常用D/A器件 PCF8591 1、PCF8591 是一个单片集成、单独供电、8-bit CMOS数据获取器件。 2、AIN0、AIN1、AIN2、AIN3...
  • 基于DAC0832的51单片机DA转换电路设计实现 1、 ADC0832芯片引脚介绍 主要性能: 8位分辨率 电流建立时间1us 数据输入可以采用双缓冲、单缓冲或直通方式 输出电流线性度可在满量程下调节 逻辑电平输入与TTL兼容 单一...
  • 1.16.7.DA转换 第二部分、章节介绍 1.16.1.AD转换及其相关背景知识1 本节对整个课程做介绍,并且主要讲了模拟量和数字量这两个概念。1.16.2.AD转换及其相关背景知识2 本节接上节继续讲AD转换相关概念,主要是...
  • AD转换和DA转换的应用

    千次阅读 2016-09-01 12:27:03
    一、A/D 1.定义:将连续变化的模拟信号转化为数字信号。 2.分类 双积分型A/D转换器:精度高,价格便宜,但是转换速度慢。 逐次逼近比较型A/D转换器:速度价格...2.需要注意的地方:转换范围、转换精度、转换时间。
  • Protues仿真的一个dac0832做的DA转换输出0到5V,完全实现的仿真,有电路图还有程序,要学DA看这个就足够了。
  • DA转换原理及实现

    千次阅读 2020-06-18 13:16:22
    这一篇介绍D/A转换原理以及在TX-1C上的接线方式(实现方法),再用一个例子来加深理解 D/A转换原理及参数指标 1.基本原理 数字量是二进制代码数位组合而来的,每位都有一定的权重,在D/A转换中,怎么样把这些权重以...
  • 51单片机PID控制(含DAC0832DA转换)程序完全代码 需安装Ceil软件来打开工程文件 转换原理可以到网上查 或书本上找 标签 单片机 数字PID 数模转换 DAC PID控制
  • 音频DA转换芯片CS4334及基于FPGA的时钟配置   特征 ?完整的立体声DAC系统:插入, D / A,输出模拟滤波 ? 24位转换 ? 96分贝动态范围 ? -88 dB的THD + N ?低时钟抖动敏感性 ? +5 V单电源 ?滤波...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 69,277
精华内容 27,710
关键字:

da转换