历史上的今天

今天是: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单片机-电位器控制舵机

推荐阅读

据外媒报道,建设全新的先进芯片制造厂需要花费100亿乃至150亿美元资金,而世界上只有少数几家公司能够积累起这样多的专业知识和筹集如此数量的资金。美国加州半导体晶圆代工厂商GlobalFoundries(以下简称GF)日前承认,它将不再投资于尖端7nm制造工厂。AMD也同时表示,将放弃GF并转向台积电(TSMC)生产其最新的高端处理器。美国加州半导体晶圆代工厂商Glo...
2019世界人工智能大会于今年8月29日至31日在上海举办,会上展示出了包括华为、高通、紫光展锐、地平线、依图、平头哥以及寒武纪在内的AI企业的共10款芯片。其中,华为昇腾310芯片是一款面向边缘场景的高效灵活可编程的AI处理器,采用12nm工艺,典型配置在8W的功耗条件下整型性能可达16TOPS,半精度性能达到8TFLOPS。芯片涉及充分考虑边缘计算场景的性能、...
诺基亚 Power Earbuds BH-605 无线耳机虽然知名度不高,但这款耳机能够提供出色的音质和惊人的电池续航,缺点是外形稍大和重量较重,现在诺基亚似乎正在开发 Power Earbuds Lite 耳机。  诺基亚 Power Earbuds Lite 的照片和蓝牙 SIG 认证文件已经现身,型号为 BH-405,不知道 Power Earbuds Lite 精简了哪些功能,不过可...
目前接触到的单片机中都有看门狗模块,不过写过的程序也比较简单,程序能够稳定运行,所以就不怎么理会这看门狗,因此也不知道看门狗是怎么回事。最近写了个超声波测距的程序,运行过程中程序老是会无故停止,就是死机了。因此不得不重新面对看门狗,经过两天的奋斗,终于让看门狗顺利工作了。下面记一下XS128的看门狗的相关寄存器及用法。看门狗模块用于...

史海拾趣

问答坊 | AI 解惑

单相电机变频调速技术综述

单相电机变频调速技术综述…

查看全部问答∨

好.欢迎.喜欢电子技术的朋友.加入45058465QQ群

好   欢迎 喜欢电子技术的朋友 加入 45058465  QQ群    一起研究  探讨   共同向上   促使 维修 技术上进…

查看全部问答∨

世界著名汽车品牌标识演化历史-------马自达

马自达 Mazda 马自达汽车的历史开始于1920年,它坐落在日本广岛市,当时的名字为Toyo Cork Kogyo Co.。那个时候,因为第一次世界大战的影响,软木非常缺乏,公司成立的目的就是用Abemaki(一种日本树)和中国软木橡树制造软木的替代品。这原 ...…

查看全部问答∨

开关电源变压器磁滞损耗分析-part2开关电源原理与设计(连载58)

在实际电路中,磁场强度是由励磁电流通过变压器初级线圈产生的,所谓的励磁电流,就是让变压器铁芯进行充磁和消磁的电流。由(2-24)式很容易看出,虚线a-b-c-d-e-f-a圈起来的面积所对应的就是磁滞损耗的能量;即:磁滞损耗能量的大小与磁滞回线的 ...…

查看全部问答∨

求LABVIEW调用MATLAB脚本的程序、例子 急急急急急急

最好是关于 调MATLAB脚本处理声音的哦(比如男声变女声) 急急急急急急如律令 十分感激…

查看全部问答∨

【PDF电子书】基于uCos-II 的应用程序开发

《嵌入式应用程序开发综合实验9例》里面的例子都是基于uCos II的。上面的平台是用44b0的开发板。这个板子算是经典的入门板子了。个人感觉一本不错的书,很注重实践,配合uCOS理论的书一起看效果不错。刚注册的帐号,不知论坛以前有没有人上传过这本 ...…

查看全部问答∨

电路的方波的上下冲消除问题

各位,请问一个比较器输出波形有上下冲怎么消除,就是一般的方法,不针对某个芯片…

查看全部问答∨

出个二手s3c44b0板子 100包邮

1、三星S3C44B0X(Samsung ARM7TDMI)微处理器 2、2MB 16bit flash(SST39VF160) 3、8MB 16bit PC100/PC133兼容SDRAM 4、符合usb1.1规范USB设备控制器USBN9603 5、2路带有RS232电平转换UART接口 6、IDE接口及多功能扩展口:可挂硬盘或CompactFl ...…

查看全部问答∨

发个用nokia5110液晶画曲线的函数

本帖最后由 paulhyde 于 2014-9-15 04:22 编辑 上次做校内比赛的时候写的,画曲线部分参考了UCgui的写法。用来画温度曲线,伏安特性曲线等等效果挺不错 这里贴了两个关键函数。完整的在附件 /*画竖线*/ void drawVline(unsigned char x,unsigne ...…

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

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

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

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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