历史上的今天

今天是:2024年08月30日(星期五)

正在发生

2021年08月30日 | 51单片机-AD与DA合成文件

发布者:Serendipitous55 来源: eefocus关键字:51单片机 手机看文章 扫描二维码
随时随地手机看文章

这一章节的内容比较简单,大家反复细读学习《手把手教你学51单片机》文档第17章就会了解透彻这部分的知识。


1.简要解析概念和代码


我们知道PCF8591有4个通道是可以用来读取输入的电压值的。


那么宋老师写的“unsigned char GetADCValue(unsigned char chn)”就是选择读取其中一个通道输入的测量电压是多少V,受基准源影响,测量范围是0V~2.5V,函数返回值代表读出的电压值为0.01V的n倍左右,也就是返回值为150时,测得的输入电压大概为1.5V。大于2.5V的输入电压,返回值最高为255,也就是测量范围只支持到最高为2.5V。这个概念叫做A/D。


D/A则是选择通道需要输出的电压值,范围同样是只能输出0V~2.5V之间,宋老师写的“void SetDACOut(unsigned char val)”,参数val就是决定输出多少V的电压,参数为100时,PCF8591的AOUT引脚输出电压就是1.0V。


函数“void ValueToString(unsigned char *str, unsigned char val)”也比较实用,


我们一起把这三个函数封装成单独的文件,创建好“adc.c”和“adc.h”文件。


2.adc.c的代码


#include

#include

  

/* 读取当前的ADC转换值,chn-ADC通道号0~3 */

unsigned char GetADCValue(unsigned char chn)

{

    unsigned char val;

     

    I2CStart();

    if (!I2CWrite(0x48<<1))      //寻址PCF8591,如未应答,则停止操作并返回0

    {

        I2CStop();

        return 0;

    }

    I2CWrite(0x40|chn);          //写入控制字节,选择转换通道

    I2CStart();

    I2CWrite((0x48<<1)|0x01);    //寻址PCF8591,指定后续为读操作    

    I2CReadNAK_OR_ACK(0);        //先空读一个字节,提供采样转换时间

    val = I2CReadNAK_OR_ACK(1);  //读取刚刚转换完的值

    I2CStop();

     

    return val;

}

 

/* 设置DAC输出值,val-设定值 */

void SetDACOut(unsigned char val)

{

    I2CStart();

    if (!I2CWrite(0x48<<1)) //寻址PCF8591,如未应答,则停止操作并返回

    {

        I2CStop();

        return;

    }

    I2CWrite(0x40);         //写入控制字节

    I2CWrite(val);          //写入DA值  

    I2CStop();

}

 

/* ADC转换值转为实际电压值的字符串形式,str-字符串指针,val-AD转换值 */

void ValueToString(unsigned char *str, unsigned char val)

{

    //电压值=转换结果*2.5V/255,式中的25隐含了一位十进制小数

    val = (val*25) / 255;

    str[0] = (val/10) + '0';  //整数位字符

    str[1] = '.';             //小数点

    str[2] = (val%10) + '0';  //小数位字符

    str[3] = 'V';             //电压单位

    str[4] = '';            //结束符

}


3.adc.h的代码


#ifndef __ADC_H__

#define __ADC_H__

  

unsigned char GetADCValue(unsigned char chn);              //读取当前的ADC转换值,chn-ADC通道号0~3

void SetDACOut(unsigned char val);                         //设置DAC输出值,val-设定值

void ValueToString(unsigned char *str, unsigned char val); //ADC转换值转为实际电压值的字符串形式,str-字符串指针,val-AD转换值

  

#endif

14.0.png

4.main.c测试代码


#include

#include //详见第六章第8讲

#include    //详见第八章第11讲

#include      //详见第十一章第3讲

#include

 

u8 flag300ms=0;

void main()

{

    u8 val,key,volt;

    u8 str[10];

    EA = 1;   

    KEY_Init();           //初始化按键模块

    InitLcd1602();        //初始化液晶屏

    TIM0_Init(10000,11);  //定时10ms,11是微调使定时更精确

    LcdShowStr(6, 0, "AIN3");

 

    while (1)

    {

        //请将开发板底部中间那里的位置插针将第一个和最后一个跳线帽拔出,把AOUT引脚与AIN3引脚用杜邦线连接起来测试代码

        if (flag300ms)

        {

            flag300ms = 0;

            val = GetADCValue(3);     //获取ADC通道3的转换值

            ValueToString(str, val);  //转为字符串格式的电压值

            LcdShowStr(6, 1, str);    //显示通道3的电压       

        }

     

        //按键控制AOUT的输出电压值

        key=KEY_Scan(0,500);

        if(key==4)

        {       

            if (volt<25)volt++;   

            SetDACOut(volt*255/25); //转换为AD输出值  

        }

     

        if(key==12)

        {      

            if(volt>0)volt--;           

            SetDACOut(volt*255/25); //转换为AD输出值

        }       

    }

}

  

void TIM0_IRQHandler() interrupt 1

    static u8 tmr300ms = 0;

    TH0 = T0RH;         //重新加载重载值

    TL0 = T0RL;

   

    tmr300ms++;

    if (tmr300ms >= 30) //定时300ms

    {

        tmr300ms = 0;

        flag300ms = 1;

    }

}


我们就是通过K4,K12来控制PCF8591的AOUT引脚输出不同的电压,每按一次按键电压改变0.1V,然后通过PCF8591的ADC通道3来检测所读到的电压值显示在液晶屏上,在测试之前我们还需在开发板上像如下一样用杜邦线连接起来

14.1.png

因为PCF8591的AOUT引脚输出电压有50mV的偏差,也就是有0.05V的偏差,所以我们通过按键把AOUT引脚输出电压调到最高时,液晶屏上看到的只是2.4V,也就是说由于偏差导致,PCF8591的ADC通道3读到的电压有可能是2.45V,然后液晶屏就只显示成2.4V而已。

关键字:51单片机 引用地址:51单片机-AD与DA合成文件

上一篇:51单片机-温度传感器代码独立文件
下一篇:51单片机-电位器控制舵机

推荐阅读

4月8日晚,旷视科技(Face++)宣布收购艾瑞思机器人,进军智能机器人业务。AGV行业,乃至整个人工智能领域都在好奇——艾瑞思机器人有哪些值得收购的亮点?被收购后的艾瑞思接下来怎么打这手牌,是否能实现“1+1>2”的效果? 初创型公司技术过硬,实现最大规模单仓机器人集群作业 艾瑞思机器人是一家智能仓储解决方案提供商,致力于为客户提供整体仓...
本文使用stm32f411ret的串口1的DMA方式发送数据,刚开始调试的时候发现串口只能发送一次数据,之后就把系统hang住了。通过网上搜资料和不断尝试,发现问题是中断回调函数没有写的原因。使用HAL库的DMA,需要同时实现DMA中断回调函数和串口中断回调函数。void DMA2_Stream7_IRQHandler(void){ HAL_DMA_IRQHandler(Uart1Handle.hdmatx);} void USART1...
半导体业投资热,相对应的生产动能也很畅旺;受惠远距需求延续、半导体高阶制程需求强劲,今年电子零组件业、集成电路业生产指数维持在高点,替国内制造业增色不少,弥补受疫情而拖累而损失的传统货品制造商机。中国台湾地区经济部统计处指出,截至7月,电子零组件生产指数已连续九个月正成长,所属的集成电路业不仅连九红,还都是双位数成长,生产动能非...
熟悉数码圈的朋友都知道,今年6月2日,深陷制裁泥潭中的华为为了摆脱国外系统的制约,正式推出了自研可控的HarmonyOS 2系统。目前,HarmonyOS 2的公测升级活动已经全面启动,目前国内发布的新款华为手机基本全部出厂预装HarmonyOS 2系统,不少老款华为和荣耀手机也都在紧锣密鼓地推送中 在Harmony OS2系统公布以后,华为EMUI的版本号停滞在了EMUI 11...

史海拾趣

问答坊 | AI 解惑

初学PLC经验

初学PLC不知从何入手,经过一段时间的磨练终于发现原来PLC也不是很难学。最主要的还是要从电工基础学习。PLC只是把时间继电器,中间继电器,移位寄存器,数据寄存器等,组合在一起。在学习前要是传统的继电接触方式能力比较高的话,那学PLC 真 ...…

查看全部问答∨

几个DSP高手的经验介绍(转)

一. 我是已经从事DSP开发有几年了,看到许多朋友对DSP的开发非常感兴取,我结合这几年对DSP的开发写一写自己的感受,一家之言,欢迎指教。我上研究生的第一天起根据老板的安排就开始接触DSP,那时DSP开发在国内高校刚刚开始,一台DSP开发器接近一万 ...…

查看全部问答∨

碰到一怪现象

昨天调试FPGA程序时,程序下载到EP2C35时发现,程序部分不工作。请问大侠啥原因?…

查看全部问答∨

IGBT逆变器缓冲电路的设计

IGBT逆变器缓冲电路的设计…

查看全部问答∨

Altium(Protel) 公司出“年报预告”信息了

根据Altium(Protel) 公司在2010年7月12日向悉尼证交所提交的2010年年报预告信息,该公司2009年7月1日至2010年6月30日止,预计共完成销售额是4650万美元,同比下降9% 。 在大中国地区(包括台湾和香港),预计共完成销售额是440万美元,同比下降43% ...…

查看全部问答∨

SD卡注册表存储

2440 WinCE5.0 目前已实现Flash注册表Hive存储,现在希望存储在SD卡中 存储在Flash中时的注册表是: [HKEY_LOCAL_MACHINE\\System\\StorageManager\\AutoLoad\\MSFlash]     "DriverPath"="Drivers\\\\BuiltIn\\\\MSFlash" ...…

查看全部问答∨

DIY FPGA学习板简介附原理图

我给这个板子取了个名字叫 EE_FPGA,感谢eeworld给我们一个这样好的学习平台。希望大家在这里能够真正的学到自己想要的东西。 适用对象: 1.       FPGA初学者:希望能够迈入FPGA开发大门的初学者和爱好者,让大家 ...…

查看全部问答∨

大家谈谈这两个GPIO函数的区别?

GPIOPinTypeGPIOInput () GPIODirModeSet() 这两个函数都是设置GPIO的,而且应该能实现同样的功能,但是我在使用时发现,用GPIOPinTypeGPIOInput ()设置按键输入时,并不能读取按键,读取的值总是0,但是如果用GPIODirModeSet()设置就能实现。这 ...…

查看全部问答∨

【TI建议】组织DIY学习板,更新参考原理图

组织DIY MSP430  Stellaris学习板     如果参与的人够多,可以把我的这2块PCB发出来做参考! [ 本帖最后由 蓝雨夜 于 2011-10-9 08:17 编辑 ]…

查看全部问答∨

8962板子还能申请吗?

8962板子还能申请吗?…

查看全部问答∨
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
随便看看

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved