当前位置: 首页 > news >正文

【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

在这里插入图片描述

相关文章:

【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#WPF数字大屏项目实战10--不良指标分页

1、区域划分 2、区域布局 3、视图模型 4、控件绑定 5、运行效果 走过路过,不要错过,欢迎点赞,收藏,转载,复制,抄袭,留言,动动你的金手指,财务自由...

数字塔问题

#include<iostream> using namespace std; //从下向上得到最优值 void dtower(int a[][100],int s[][100],int n) {for(int in; i>1; i--){for(int j1; j<i; j){if(in)s[i][j]a[i][j];else{int ts[i1][j];if(t<s[i1][j1])ts[i1][j1];s[i][j]a[i][j]t;}}} } void…...

【介绍下Pwn,什么是Pwn?】

&#x1f308;个人主页: 程序员不想敲代码啊 &#x1f3c6;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f44d;点赞⭐评论⭐收藏 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共…...

Python:b站多个视频爬取下载

&#x1f4da;博客主页&#xff1a;knighthood2001 ✨公众号&#xff1a;认知up吧 &#xff08;目前正在带领大家一起提升认知&#xff0c;感兴趣可以来围观一下&#xff09; &#x1f383;知识星球&#xff1a;【认知up吧|成长|副业】介绍 ❤️如遇文章付费&#xff0c;可先看…...

Java常规题技术分享

一、数组排序和添加成员 设计类Student和类StudentClass。 (1) 类Student有字符串属性name、double属性grade和int属性age 有带参数的构造方法&#xff0c;可设置三个属性的值 有各个属性的置取方法 (2)类StudentClass有Student数组属性stus存放班级成员&#xff0c;有int…...

Pytorch语义分割(1)-----加载数据

在语义分割中用到的数据无非就是原始图片&#xff08;image&#xff09;和标注后得到的mask图片&#xff0c;所以在读取数据的时候只要返回图片和标签信息就OK 了。 import torch import os import numpy as np from torch.utils.data import Dataset from utils_func import …...

Java中加号的多种用途

在Java中&#xff0c; 符号有多种用途&#xff0c;主要根据上下文而定。以下是在Java中的一些主要用途&#xff1a; 加法运算符&#xff1a; 这是最常见的用途&#xff0c;用于数字相加。 int a 5;int b 3;int sum a b; // sum is 8 字符串连接符&#xff1a; 当用…...

React useCallback用法

useCallback 是 React 中的一个 Hook&#xff0c;它用于优化性能&#xff0c;通过缓存函数的引用来避免在组件的每次渲染时都创建新的函数实例。这对于避免不必要的子组件重新渲染特别有用&#xff0c;因为如果传递给子组件的回调函数在每次渲染时都不同&#xff0c;即使子组件…...

Flutter 中的 ErrorWidget 小部件:全面指南

Flutter 中的 ErrorWidget 小部件&#xff1a;全面指南 Flutter 是一个由 Google 开发的跨平台 UI 框架&#xff0c;它允许开发者使用 Dart 语言构建高性能、美观的应用。在 Flutter 的丰富组件库中&#xff0c;ErrorWidget 是一个特殊的组件&#xff0c;用于在渲染过程中捕获…...

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

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

【数据结构与算法 经典例题】链表的回文结构(图文详解)

&#x1f493; 博客主页&#xff1a;倔强的石头的CSDN主页 &#x1f4dd;Gitee主页&#xff1a;倔强的石头的gitee主页 ⏩ 文章专栏&#xff1a;《数据结构与算法 经典例题》C语言 期待您的关注 ​ 目录 一、问题描述 二、解题思路 三、C语言代码实现 一、问题描述 二、解…...

通过DirectML和ONNXRuntime运行Phi-3模型

更多精彩内容&#xff0c;欢迎关注我的公众号“ONE生产力”&#xff01; 上篇我们讲到通过Intel Core Ultra系列处理器内置的NPU加速运行Phi-3模型&#xff0c;有朋友评论说他没有Intel处理器是否有什么办法加速Phi-3模型。通常&#xff0c;使用GPU特别是NVIDA的GPU加速AI模型…...

C语言经典例题-18

1.判断是不是字母 题目描述: KK想判断输入的字符是不是字母&#xff0c;请帮他编程实现。 输入描述: 多组输入&#xff0c;每一行输入一个字符。 输出描述: 针对每组输入&#xff0c;输出单独占一行&#xff0c;判断输入字符是否为字母&#xff0c;输出内容详见输出样例。 输…...

计算机网络之crc循环冗余校验、子网划分、rip协议路由转发表、时延计算、香浓定理 奈氏准则、TCP超时重传 RTO

crc循环冗余校验 异或运算 : 相同得0,相异得1 从多项式获取除数 在原数据的末端补0 , 0的个数等于最高次项的阶数 如果最后结果的有效位数较少时&#xff0c;前面应该补0&#xff0c;补到个数与阶位相同 子网划分 子网掩码&#xff1a;用于识别IP地址中的网络号和主机号的…...

揭秘高效人事财务对接新方案!

一、客户介绍 某生物医药科技有限公司是一家专注于生物创新药物研发与生产的科技型企业。公司的主要业务范围包括技术开发、技术服务、医学研究与试验发展、经济信息咨询、企业管理等。公司凭借其强大的技术实力、丰富的研发经验和优秀的团队阵容&#xff0c;在生物创新药领域…...

Unity中的MVC框架

基本概念 MVC全名是Model View Controller 是模型(model)-视图(view)-控制器(controller)的缩写 是一种软件设计规范&#xff0c;用一种业务逻辑、数据、界面显示 分离的方法组织代码 将业务逻辑聚集到一个部件里面&#xff0c;在改进和个性化定制界面及用户交互的同时&#x…...

网工内推 | 上市公司网工,Base广东,思科DE/IE认证优先

01 广州赛意信息科技股份有限公司 &#x1f537;招聘岗位&#xff1a;技术架构师 &#x1f537;职责描述&#xff1a; 1、设计、开发和维护工业数据库及其架构&#xff0c;包括数据采集、存储、处理和分析的工具和系统。 2、开发和维护数据管道和工作流程&#xff0c;确保数据…...

ZYNQ AXI4 FDMA内存读写

1 概述 如果用过ZYNQ的都知道,要直接操作PS的DDR 通常是DMA 或者VDMA,然而用过XILINX 的DMA IP 和 VDMA IP,总有一种遗憾,那就是不够灵活,还需要对寄存器配置,真是麻烦。对于我们搞 FPGA 的人来说,最喜欢直接了当,直接用FPGA代码搞定。现在XILINX 的总线接口是AXI4总线…...

签名安全规范:解决【请求对象json序列化时,时间字段被强制转换成时间戳的问题】

文章目录 引言I 签名安全规范1.1 签名生成的通用步骤1.2 签名运算(加密规则)1.3 对所有传入参数按照字段名的 ASCII 码从小到大排序(字典序)1.4 允许的请求头字段1.5 签名校验工具II 注解校验签名2.1 获取请求数据,并校验签名数据2.2 解决时间格式被强制转换成时间戳的问题…...

Kubernetes与GitOps最佳实践

Kubernetes与GitOps最佳实践 1. GitOps概述 GitOps是一种基于Git的持续部署方法&#xff0c;它将基础设施和应用配置存储在Git仓库中&#xff0c;并通过自动化工具来实现部署。GitOps的核心原则是&#xff1a; Git作为单一事实来源&#xff1a;所有配置变更都通过Git进行版本控…...

告别视图切换混乱:用快马平台和cc-switch提升前端开发效率

告别视图切换混乱&#xff1a;用快马平台和cc-switch提升前端开发效率 最近在开发一个需要多工作模式切换的项目时&#xff0c;遇到了视图管理混乱的问题。不同模式下的UI组件互相干扰&#xff0c;状态管理变得异常复杂。经过一番摸索&#xff0c;我发现cc-switch这个方案能很…...

STM32F103C8T6+TJA1042+UTA0403:手把手教你搭建CAN通讯测试环境(附完整接线图)

STM32F103C8T6TJA1042UTA0403&#xff1a;从零构建工业级CAN总线测试平台 第一次接触CAN总线的工程师往往会被物理层连接的各种细节困扰——为什么收发器需要独立供电&#xff1f;STB引脚悬空会导致什么后果&#xff1f;如何避免共模干扰&#xff1f;本文将用实验室级精度拆解S…...

Oracle 12c安装实战:解决PRVG-0449堆栈软限制配置难题

1. 初识PRVG-0449错误&#xff1a;堆栈软限制的"拦路虎" 第一次在Oracle 12c安装过程中遇到PRVG-0449错误时&#xff0c;我盯着屏幕上的红色警告愣了好几秒。错误信息明确告诉我&#xff1a;"Proper soft limit for maximum stack size was not found"&…...

高速ADC采样时钟不准?手把手教你理解时钟占空比校正(DCC)电路的核心原理

高速ADC采样时钟不准&#xff1f;手把手教你理解时钟占空比校正&#xff08;DCC&#xff09;电路的核心原理 当你在调试一块高速ADC板卡时&#xff0c;发现ENOB&#xff08;有效位数&#xff09;始终比规格书低2-3位&#xff0c;频谱分析显示谐波失真异常。这种困扰可能来自一…...

N_m3u8DL-RE:突破流媒体下载限制的全场景解决方案 - 开发者与内容创作者的高效工具

N_m3u8DL-RE&#xff1a;突破流媒体下载限制的全场景解决方案 - 开发者与内容创作者的高效工具 【免费下载链接】N_m3u8DL-RE Cross-Platform, modern and powerful stream downloader for MPD/M3U8/ISM. English/简体中文/繁體中文. 项目地址: https://gitcode.com/GitHub_…...

5分钟学会NCM文件转换:ncmdumpGUI让你的网易云音乐随处播放

5分钟学会NCM文件转换&#xff1a;ncmdumpGUI让你的网易云音乐随处播放 【免费下载链接】ncmdumpGUI C#版本网易云音乐ncm文件格式转换&#xff0c;Windows图形界面版本 项目地址: https://gitcode.com/gh_mirrors/nc/ncmdumpGUI 你是否曾经在网易云音乐下载了心爱的歌…...

Qwen2.5-14B-Instruct开源大模型应用:像素剧本圣殿实现剧本动作/对白/旁白自动分段

Qwen2.5-14B-Instruct开源大模型应用&#xff1a;像素剧本圣殿实现剧本动作/对白/旁白自动分段 1. 项目概述 像素剧本圣殿&#xff08;Pixel Script Temple&#xff09;是一款基于Qwen2.5-14B-Instruct深度微调的专业剧本创作工具。它将先进的AI推理能力与独特的8-Bit复古美学…...

从电源完整性到可制造性:一份给硬件工程师的电容封装选型全流程清单(附DDR4/5、射频电路实例)

从电源完整性到可制造性&#xff1a;硬件工程师的电容封装选型全流程实战指南 当DDR5内存接口的电源噪声导致系统频繁崩溃时&#xff0c;我们才意识到那颗被替换成0805封装的退耦电容有多重要。在深圳某通信设备厂商的案例中&#xff0c;仅仅因为将IC电源引脚旁的0402电容改为&…...

别再只用手动调参了!用ArcGIS的Geostatistical Analyst工具包自动优化克里金插值参数

解锁ArcGIS隐藏技能&#xff1a;用Geostatistical Analyst实现克里金插值参数智能优化 当你在深夜盯着屏幕上半变异函数模型的参数犹豫不决时&#xff0c;是否想过让软件替你做出更科学的选择&#xff1f;克里金插值作为地统计学的黄金标准&#xff0c;其精度高度依赖于半变异函…...