DA转换

本文介绍了一种通过编程实现DA转换的方法,给出了具体的代码实现,并通过实验验证了其准确性。文中详细解释了如何根据输出电压计算DA转换值,以及如何使用IIC协议与DA转换芯片进行通信。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

转换代码:

注意:
这里的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();
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值