【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

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Docker run 命令常用参数详解

Docker run 命令提供了丰富的参数选项,用于配置容器的各种设置。以下是docker run命令的主要参数详解, 主要参数详解 后台运行与前台交互 -d, --detach: 在后台运行容器,并返回容器ID。-it: 分配一个伪终端(pseudo-TTY&#xff0…

RGB转LAB,HSV

Excel如下 目标 代码(改下两个地址就可以) import pandas as pd import colorspacious import colorsys# 读取Excel文件 df pd.read_excel(未分类output.xlsx)# 定义RGB到LAB和HSV的转换函数 def rgb_to_lab(rgb):lab colorspacious.cspace_convert(r…

Layui:一款强大的前端UI框架

随着互联网技术的快速发展,前端技术也在不断更新和演进。前端工程师们面临着越来越多的挑战,需要在短时间内构建出高质量、高效率的网页应用。为了提高开发效率和降低开发难度,许多前端UI框架应运而生。在这些框架中,Layui凭借其优…

Git-lfs入门使用教程

在备份我的毕设到github私有库的时候,发现git对于单文件大于100MB的会限制上传,一番折腾一下发现了git-lfs [Git LFS(Large File Storage,大文件存储)是 Github 开发的一个Git 的扩展,用于实现 Git 对大文件的支持]。 …

揭秘Linux启动的层层面纱,一文看懂从黑屏到界面的精彩之旅

从按下开机键到Linux系统界面显示,这中间究竟经历了怎样的过程?本文将为您一一揭开Linux启动的神秘面纱,详细剖析每个环节的工作原理,让你从内核出生到系统服务启动,一路见证这个过程的壮阔与精彩。 一、概述 Linux系统的启动过…

【场景题】如何排查CPU偏高的问题

为了解决CPU偏高的问题,我们首先看一下每一个进程的CPU占用情况,使用命令Top 可以看见是进程id为2266的进程里面的java程序,占用了CPU90%使用情况 所以我们需要找到是哪一个代码导致的这样的情况,由于代码是线程执行的&#xff…

测绘GIS和遥感领域比较好的公众号有哪些

测绘GIS和遥感领域,微信公众号作为信息传播和知识分享的重要渠道,为从业者提供了一个快速获取行业动态、技术进展和职业发展机会的平台。分享一些在测绘GIS和遥感领域表现突出的公众号推荐: 1. 慧天地:慧天地是一个知名的测绘公众…

【数据结构】穿梭在二叉树的时间隧道:顺序存储的实现

专栏引入 哈喽大家好,我是野生的编程萌新,首先感谢大家的观看。数据结构的学习者大多有这样的想法:数据结构很重要,一定要学好,但数据结构比较抽象,有些算法理解起来很困难,学的很累。我想让大家…

CDN(Content Delivery Network)内容分发网络原理、组成、访问过程、动静态加速、作用详解

CDN简介 什么是CND CDN(Content Delivery Network)的缩写,是一种利用分布式节点技术,在全球部署服务器,即时地将网站、应用视频、音频等静态或动态资源内容分发到用户所在的最近节点,提高用户访问这些内容…

PDF分页处理:技术与实践

引言 在数字化办公和学习中,PDF文件因其便携性和格式稳定性而广受欢迎。然而,处理大型PDF文件时,我们经常需要将其拆分成单独的页面,以便于管理和分享。本文将探讨如何使用Python编程语言和一些流行的库来实现PDF文件的分页处理。…

管道液位传感器在蒸汽清洗机的应用

管道光电液位传感器采用了先进的光学感应原理,无需机械运动,具有长久的寿命和稳定的性能。与传统的机械式和电容式传感器相比,管道光电液位传感器具有更高的精度和可靠性,解决了机械式传感器容易卡死失效和电容式传感器感度衰减的…

数据结构之初始泛型

找往期文章包括但不限于本期文章中不懂的知识点: 个人主页:我要学编程(ಥ_ಥ)-CSDN博客 所属专栏:数据结构(Java版) 目录 深入了解包装类 包装类的由来 装箱与拆箱 面试题 泛型 泛型的语法与使用…

springboot+elementui健康饮食系统

此系统是springboot健康饮食管理平台 得简化版,适合期末大作业 系统包括 管理员端和用户端 1.用户端注册即可登录到用户端,用户端包括首页轮播图,以及个人中心,个人信息修改,头像修改,后台根据用户信息&am…

构造+割点,F2. Spanning Tree with One Fixed Degree

一、题目 1、题目描述 2、输入输出 2.1输入 2.2输出 3、原题链接 Problem - 1133F2 - Codeforces 二、解题报告 1、思路分析 考虑以根节点为割点,会有若干个连通块 连通块的数目为根节点至少要连出去的边,不妨记为mi 如果mi > D,那…

mysql终端使用中的错误

在这个过程中,出现了几个问题: 在退出 MySQL 后,你尝试再次使用 mysql 命令登录,但系统提示找不到该命令。这可能是因为 MySQL 的执行文件路径没有加入到系统的环境变量中。你可以尝试使用绝对路径来运行 mysql 命令,或…

mac环境基于llama3和metaGPT自动开发2048游戏

1.准备虚拟环境 conda create -n metagpt python3.9 && conda activate metagpt 2.安装metagpt pip install --upgrade metagpt 3.初始化配置文件 metagpt --init-config 4. 安装llama3 5. 修改配置文件 6.让metegpt自动开发2048游戏 7.经过多轮迭代,最终…

个人网站建设方案书

个人网站建设方案书 一、项目背景 随着互联网的迅猛发展,个人网站已经成为展示个人能力、情感表达的重要平台。无论是个人品牌推广,还是个人作品展示,个人网站都能够为个人提供一个独特的展示空间。因此,建设一个个人网站已经成为…

深度神经网络——什么是 CNN(卷积神经网络)?

Facebook和Instagram自动检测图像中的面孔,Google通过上传照片搜索相似图片的功能,这些都是计算机视觉技术的实例,它们背后的核心技术是卷积神经网络(CNN)。那么,CNN究竟是什么呢?接下来&#x…

HTB 靶场 Mailing 未完待续

访问网页 在/etc/hosts 添加ip和域名 hosts 文件包含ip地址与主机名之间的映射,还包括主机的别名。 Linux系统所有程序查询/etc/hosts文件解析对主机名或者域名的IP地址。没有找到就需要使用DNS服务器解释域名。 DNS原理 1 输入域名,在本地缓存服务…

新手教程之使用LLaMa-Factory微调LLaMa3

文章目录 为什么要用LLaMa-Factory什么是LLaMa-FactoryLLaMa-Factory环境搭建微调LLaMA3参考博文 为什么要用LLaMa-Factory 如果你尝试过微调大模型,你就会知道,大模型的环境配置是非常繁琐的,需要安装大量的第三方库和依赖,甚至…