【TB作品】msp430g2553单片机,OLED,PCF8591,ADC,DAC

硬件

OLED

PCF8591


/*
 * OLED
 * VCC GND
 * SCL接P2^0
 * SDA接P2^1
 */


/*
 * PCF8591
 * VCC GND
 * SCL接P1^4
 * SDA接P1^5
 */

/* 板子上按键 P1.3 */

/* 单片机ADC输入引脚 P1.1 */

/* 说明:将PCF8591的DAC输出接到单片机ADC输入引脚 P1.1,单片机采集电压并显示 */

功能

这个程序是一个用于嵌入式系统的C语言程序,主要功能是控制一个数字模拟转换器(DAC)输出电压,并通过模数转换器(ADC)采集电压值,同时在OLED显示屏上实时显示这两组电压数据。具体步骤和功能如下:

  1. 初始化: 程序开始时,会停止看门狗定时器(WDT),并根据系统时钟校准常数进行时钟配置,确保系统稳定运行。接着初始化OLED显示屏,并在其上显示字符串"DAC:"和"ADC:"作为标题。

  2. DAC控制:

    • 程序设定一个变量dac_temp来控制输出电压,默认值为0.0。
    • 通过公式dac_value = dac_temp / 3.3 * 255将期望的电压值转换成DAC能识别的数字量,并通过I2C协议写入到地址0x90的设备的0x40寄存器中,实现电压输出控制。
    • 同时,将dac_temp对应的电压值格式化为字符串,并在OLED的第二行显示该电压值。
  3. ADC读取与处理:

    • 配置ADC10(10位模数转换器),开启中断并设置采样时间。
    • 设置P1.3作为按钮输入,启用内部上拉电阻。
    • 主循环中检测按钮状态,如果按钮被按下,则增加dac_temp的值(每次增加0.1V,范围限制在0到3V之间),并更新显示的DAC电压值及实际输出电压。
    • 在主循环中启动ADC采样与转换,进入低功耗模式等待转换完成中断。转换完成后,计算得到的实际电压值(0到3.3V范围内),将其扩大100倍后转换为整数,格式化为字符串,并在OLED的第四行显示ADC采集到的电压值。

综上所述,此程序实现了一个简单的电压控制系统,用户可以通过按钮调节DAC输出电压,并实时查看设置的电压值以及通过ADC采集到的电压反馈值,所有数据显示在连接的OLED显示屏上。

部分程序


int main( void )
{
    unsigned char   display[10], counta;
    float       volt;
    int     last_volt;

    int dac_temp    = 0.0;
    uchar   dac_value   = 0;

    WDTCTL = WDTPW + WDTHOLD;                                               /* Stop WDT */

    if ( CALBC1_8MHZ == 0xFF )                                              /* If calibration constant erased */
    {
        while ( 1 )
            ;                                                       /* do not load, trap CPU!! */
    }
    DCOCTL  = 0;                                                            /* Select lowest DCOx and MODx settings */
    BCSCTL1 = CALBC1_8MHZ;                                                  /* Set range */
    DCOCTL  = CALDCO_8MHZ;                                                  /* Set DCO step + modulation * / */

    OLED_Init();                                                            /* OLED初始化 */
    OLED_ShowString( 0, 0, "DAC:" );
    OLED_ShowString( 0, 4, "ADC:" );

    /* 控制DAC输出电压 */
    dac_value = dac_temp / 3.3 * 255;
    Single_WriteI2C( 0x90, 0x40, dac_value );                               /* 地址  寄存器  电压 */

    /* DAC输出电压的显示 */
    counta          = 0;
    display[counta++]   = dac_temp % 100 / 10 + '0';                    /* SHI位数字 */
    display[counta++]   = '.';
    display[counta++]   = dac_temp % 10 + '0';                          /* GE位数字 */
    display[counta++]   = 'V';
    display[counta++]   = 0;
    OLED_ShowString( 0, 2, display );                                       /* 在第2行显示DAC电压 */


    /* P1.1 ADC输入引脚 */
    ADC10CTL0   = ADC10SHT_2 + ADC10ON + ADC10IE;                       /* ADC10ON, interrupt enabled */

    P1DIR   &= ~BIT3;                                                       /*按键输入引脚寄存器设置 */
    P1REN   |= BIT3;
    P1OUT   |= BIT3;

    while ( 1 )
    {
        if ( (P1IN & BIT3) == 0 )                                       /*按键按下去了 */
        {
            while ( (P1IN & BIT3) == 0 )
                ;                                               /*按键按下去了条件一直成立 */
            dac_temp = dac_temp + 1;                                /* 加0.1V */
            if ( dac_temp > 30 )                                    /* 电压大于3V */
            {
                dac_temp = 0;
            }
            counta          = 0;
            display[counta++]   = dac_temp % 100 / 10 + '0';    /* SHI位数字 */
            display[counta++]   = '.';
            display[counta++]   = dac_temp % 10 + '0';          /* GE位数字 */
            display[counta++]   = 'V';
            display[counta++]   = 0;
            OLED_ShowString( 0, 2, display );                       /* 在第2行显示DAC电压 */

            dac_value = (float) dac_temp / 10 / 3.3 * 255;          /* 0到3.3转换到 0到255 传给模块 */
            Single_WriteI2C( 0x90, 0x40, dac_value );               /* 地址  寄存器  电压 */
        }

        ADC10CTL0 |= ENC + ADC10SC;                                     /* Sampling and conversion start */
        __bis_SR_register( CPUOFF + GIE );                              /* LPM0, ADC10_ISR will force exit */

        volt            = (float) ADC10MEM * 3.3 / 1025;        /* 得到电压 0到3.3V */
        last_volt       = (int) (volt * 100);                   /* 扩大100倍 */
        counta          = 0;
        display[counta++]   = last_volt / 100 + '0';                /* 百位数字 */
        display[counta++]   = '.';
        display[counta++]   = last_volt % 100 / 10 + '0';           /* 十位数字 */
        display[counta++]   = last_volt % 10 + '0';                 /* 个位数字 */
        display[counta++]   = 'V';
        display[counta++]   = 0;
        OLED_ShowString( 0, 6, display );                               /* 在第4行显示ADC采集到的电压 */
    }
}

全部程序

https://docs.qq.com/sheet/DUEdqZ2lmbmR6UVdU?tab=BB08J2

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/679584.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Angular 由一个bug说起之六:字体预加载

浏览器在加载一个页面时,会解析网页中的html和css,并开始加载字体文件。字体文件可以通过css中的font-face规则指定,并使用url()函数指定字体文件的路径。 比如下面这样: css font-face {font-family: MyFont;src: url(path/to/font.woff2…

MySQL 关键特性一:插入缓冲、双写缓冲

前言 ​ 本文主要介绍 mysql 的几大特性之几,如:双写缓冲和插入缓存。 双写缓冲 基本概念 ​ 双写缓冲(doublewrite buffer)是MySQL/InnoDB中用于支持原子页面更新的一种机制。在传统的数据库系统中,为了保证数据的…

C++ XML文件和解析

XML(可扩展标记语言)是一种用于存储和传输数据的标记语言。它具有自描述性和平台无关性的特点。XML 文档的格式主要由一组嵌套的元素和属性构成,结构清晰,易于理解和解析。 XML 文档的基本格式 一个 XML 文档通常包括以下部分&a…

React 中的 ForwardRef的使用

React 中的 forwardRef Hooks 是指将子组件的 Dom 节点暴露给给父组件,在 React 中如果想要访问 Dom 节点是通过 useRef 这个 hooks,而 forwardHook 在 useRef 做了扩展。useRef 是当前组件中间中的节点,而 forwardRef 相当于做了一层封装将父…

屏幕录制工具分享6款,附上详细电脑录屏教程(2024全新)

当你即将参加一个重要的在线会议或一堂关键的直播课,但又担心错过关键点或无法及时做笔记时,屏幕录制无疑是最好的方法之一。屏幕录制是一项非常有价值的技能,它能让你出于各种目的捕捉屏幕上的活动。无论你的目的是创建教程、演示软件功能、…

重学java 62.IO流 字节流 ③ 字节输入流

告别这种事情,没有道理可讲 —— 24.6.4 一、字节输入流的介绍以及方法的使用 1.概述: 字节输入流 InputStream,是一个抽象类 子类:FileInputStream 2.作用: 读数据,将数据从硬盘上读到内存中来 3.构造: FileInputstream(File file) FileInputstream(String path…

容器中运行ifconfig提示bash: ifconfig: command not found【笔记】

容器中运行ifconfig提示bash: ifconfig: command not found 这个问题是因为在容器中没有安装ifconfig命令。 在容器中安装ifconfig命令,可以使用以下命令: 对于基于Debian/Ubuntu的容器,使用以下命令: apt-get update apt-get …

Spring Boot 使用自定义注解和自定义线程池实现异步日志记录

😄 19年之后由于某些原因断更了三年,23年重新扬帆起航,推出更多优质博文,希望大家多多支持~ 🌷 古之立大事者,不惟有超世之才,亦必有坚忍不拔之志 🎐 个人CSND主页——Mi…

leetcode739 每日温度

题目 给定一个整数数组 temperatures ,表示每天的温度,返回一个数组 answer ,其中 answer[i] 是指对于第 i 天,下一个更高温度出现在几天后。如果气温在这之后都不会升高,请在该位置用 0 来代替。 示例 输入: tempe…

探秘Android系统启动的神秘面纱

系统启动过程对于任何操作系统来说都是一个非常关键的环节,Android作为移动设备领域中占据主导地位的操作系统,其启动过程也是个值得深入研究的重点话题。本文将为您解开Android启动过程的神秘面纱,详细剖析其中的每一个步骤,并通…

vue 将echart 下载为base64图片

1 echart是页面的子组件, 2 页面有多个echart 3 将多个echart下载为base64图片 // 子组件 echart,要保存echartconst chart this.$echarts.init(this.$refs.chart, light) this.chartData chart; //保存数据,供父组件alarmReport调用(th…

专业130+总分400+四川大学951信号与系统考研经验川大电子信息与通信工程,真题,大纲,参考书。教材。

今年四川大学951信号与系统专业课130(据我所知没有140以上的今年),总分400,顺利上岸川大,回顾一下自己这一年的复习,希望自己的经历可以对大家复习有所借鉴,也是对自己的考研画上句话。专业课&a…

重庆耶非凡科技业务大盘点:这些领域你都了解吗?

重庆耶非凡科技有限公司,这家位于重庆市经开区的企业,以其独特的业务模式和专业的技术实力,赢得了业界的广泛认可。它的主要业务涵盖了选品师项目和人力RPO项目两大领域。 首先,我们不得不提的是耶非凡科技的选品师项目 在当今消费…

算法004:盛水最多的容器

这道题比较简单,使用双指针。 要求的是最大面积,对于一个水桶(水杯来说),面积的算法是固定的,就是底乘以高。 在这个题中,我们把左边的位置设为left,右边的位置设为right&#xff…

vue3 + echarts 二次开发百分比饼图

效果图&#xff1a; 安装 pnpm i echarts 公共模块组件 <divclass"pie"ref"percent"style"width: 100%; height: calc(100% - 48px)"></div> import { ref, onMounted } from vue import * as echarts from echarts const prop…

JavaEE:http请求 | 过滤器 | 同步与异步请求 | 跨域问题 | axios框架 有这一篇就够!

&#x1f4c3;HTTP请求 ▐ http超文本传输协议&#xff1a; ⦁ http超文本传输协议属于应用层协议&#xff0c;传输内容必须是超文本内容 (网页内容) ⦁ 例如在网页上点击超链接&#xff0c;提交表单&#xff0c;都可以向后端发送一个http请求 ⦁ 一次http请求中包含请求行、…

盘点哪些企业容易被ddos攻击

DDoS&#xff08;分布式拒绝服务&#xff09;攻击已成为网络安全威胁中的重要一环。本文将探讨哪些类型的企业容易成为DDoS攻击的目标&#xff0c;并提出相应的防范策略&#xff0c;帮助企业更好地保护自身网络安全。 一、电子商务平台 电子商务平台作为线上交易和支付的重要场…

Direct local .aar file dependencies are not supported when building an AAR.

最近升级了最新的AndroidStdio版本&#xff0c;然后导入之前的安卓工程 然后经过一番折腾后项目可以跑了&#xff0c;但是意外发现出release包的时候报错了&#xff0c; Direct local .aar file dependencies are not supported when building an AAR. 网上有很多解决方法&am…

鸿蒙HarmonyOS实战—如何使用Video组件播放视频

1.视频播放 鸿蒙系统中&#xff0c;关于视频播放&#xff0c;可以使用上层视频组件Video。 参数如下 src 支持file:///data/storage路径前缀的字符串&#xff0c;用于读取应用沙箱路径内的资源。需要保证目录包路径下的文件有可读权限。 说明&#xff1a;视频支持的格式是&am…

opencv-python(四)

读取图像文件 image cv2.imread(path, flag) flag&#xff1a;1. 默认值&#xff0c;依原图像读取图像&#xff0c;保留Alpha透明度通道。2.IMREAD_GRAYSCALE&#xff1a;将图像转为灰度再读取。3.IMREAD_COLOR&#xff1a;将图像转为三通道BGR彩色再读取。 可读取的图像格…