STC89C52制作可程控低频信号发生器

2023-05-16

STC89C52制作可程控低频信号发生器

  • 准备工作
  • 操作流程
    • 关于PCF8591
    • 实现构思
  • 相关代码
    • 定时器相关代码
    • 串口控制频率和LCD显示函数
  • 相关功能现象
  • 总结

准备工作

由于51单片机本身并不自带DAC的功能,因此需要借助外置模块实现DAC的功能,在选型上,看重仅需要两只引脚驱动的一款DA/AD模块,PCF8591模块,带有一路DA输出且内部自带晶振,可以配合STC89C52RC的定时器实现小频率的信号发生器。

操作流程

有了一定构思之后就需要确认操作流程!

关于PCF8591

PCF8591是一个8位分辨率的DA/AD模块,并且使用IIC通信,可以很方便的使用51单片机模拟IIC通信,使用过程中需要注意的一个点就是PCF8591的手册中有说明,IIC速率最大不超过100K,因此需要搭配合适的延时。
在这里插入图片描述

实现构思

结合手册和DA的实现我们可以发现,所谓的DA其实就是,数字量转换为模拟电压,其中又构成线性比例关系,而我们使用的PCF8591模块的基准电压源接到了,供电电源上,因此存在一下关系:
X:2^8 = N:VCC:X为写入PCF8591的数据,N为输出电压
可以通过这个计算我们可以通过编程实现N跟随X的变化而变化!,而实现一个正弦波,我们该怎么操作?正弦波参数有 : 频率,周期,就够了,幅度我们不用考虑,PCF最大输出不会超过VREF的电压,例如实现一个10HZ的正弦波:
freq = 10 ,T = 1/10 = 0.1S=100000us 那么一个周期内不断的向PCF发送电压数字量是不是可以实现呢!这个时候我们可以借助一些软件直接生成正弦波所需相关数据:如下图64个数据,则意味一个周期内需要向64此数据,这个时候我们可以借助定时器实现!!
在这里插入图片描述

相关代码

定时器相关代码

因为串口用到定时器1作为波特率发生器,串口数据中的数据帧头用到定时器0作为超时判断,只能用STC89C52RC的额外的定时器2,实现定时发送相关数据到PCF8591!

u16 timer2val = 287;   //配置定时器初始值    :频率得出周期,周期内64个点,得出每个点之间的时间就是定时器中断时间
u8 TL2BUFF;
u8 TH2BUFF;
/************************
*     定时器2初始化函数
*     T2工作在16位自动重装 开定时器中断
*************************/
void Timer2_Init(void)		//10毫秒@11.0592MHz
{
	T2MOD = 0;				//初始化模式寄存器
	T2CON = 0;				//初始化控制寄存器
	TL2BUFF = (65535-timer2val)%256;  //设置定时初始值
	TH2BUFF = (65535-timer2val)/256;  //设置定时初始值
	TL2 = TL2BUFF;				//设置定时初始值
	TH2 = TH2BUFF;				//设置定时初始值
	RCAP2L = TL2BUFF;			//设置定时重载值
	RCAP2H = TH2BUFF;			//设置定时重载值
	TR2 = 1;				//定时器2开始计时
	ET2 = 1;				//使能定时器2中断
}
/************************
*     定时器2中断服务函数
*     T0工作在方式1.开定时器中断
*************************/
void Timer2_Isr(void) interrupt 5
{
	TF2 = 0;
	timer2flag = 1;
}

串口控制频率和LCD显示函数

发送相关对应的判断指令即可控制输出不同频率的正弦波:原理通过改变定时器2的初值实现周期的改变从而实现频率的改变!!因为STC89C52RC定时器2只有16位自动重装模式,所以不能在主函数循环前开启初始化!

void Uart_service(u8 *buf)
{
	  u8 recv_move_index;
    if(recv_flag)
		 {
		    recv_flag = 0; //清除接受标志位
			  start_timer = 0;//关掉软件计时器
			  Send_Str(buf);//处理数据
			  while((recv_cnt >= 5) && (recv_move_index <= recv_cnt))
				{
				     if((buf[recv_move_index+0]) == 0x55 && (buf[recv_move_index+1]) == 0xAA && (buf[recv_move_index+2]) == 0x55)
						 {
						     if((buf[recv_move_index+3] == 0x01) && (buf[recv_move_index+4] == 0x02))
								 {
								    timer2val = 287;   //配置定时器初始值    :频率得出周期,周期内32个点,得出每个点之间的时间就是定时器中断时间
									 Timer2_Init();
									 Send_Byte_uart(0x10);
									 LcdShowStr(3,1,"Freq:");
									 LcdShowStr(9,0,"50HZ");
								 }
								 if((buf[recv_move_index+3] == 0x02) && (buf[recv_move_index+4] == 0x01))
								 {
								     timer2val = 1435;   //配置定时器初始值    :频率得出周期,周期内32个点,得出每个点之间的时间就是定时器中断时间
									 Timer2_Init();
									 Send_Byte_uart(0x50);
									 LcdShowStr(3,1,"Freq:");
									 LcdShowStr(9,0,"10HZ");
								 }
								 break;
						 }
						 recv_move_index++;
				}
			  clr_recvbuffer(buf);//清除缓冲BUF
			  recv_cnt = 0;
		 }
}

相关功能现象

串口控制实现改变便频率且LCD1602显示频率
在这里插入图片描述
在这里插入图片描述

总结

在平时的小型实验中,用不上专用的信号发生器,用这么个小模块实现小频率的正弦波用来学习还是很不错的,其实也还可作为方波发生器或者三角波,原理都跟上面说的类似,博文中仅贴出相关功能代码,需要源代码的可以留言邮箱获取哦,长期发布电子相关文章,喜欢的点个关注吧~~

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

STC89C52制作可程控低频信号发生器 的相关文章

  • Win10 摄像头:由于其配置信息(注册表中的)不完整或已损坏,Windows无法启动这个硬件设备.【未解决完全】

    问题描述 xff1a 刚刚重装完win10系统之后 xff0c 出现无法打开摄像头的问题 xff0c 解决方法 xff1a 通过修改注册表中得相关信息进行解决 首先打开设备管理器 xff0c 找到设备的类Guid记录下Guid 的值 如此处
  • 2021年总结与2022年展望

    一 工作和学习 通过调剂 xff0c 正式成为了一名研究生 xff0c 结束了自己两年的考研备考 xff0c 不知道是好还是坏 xff0c 看到周围朋友考的时候心里还是会有点失落感 在一家通信设备公司实习软件测试 xff0c 收获很多 xf
  • 计算机网络---网络基础(TCP/IP五层模型,数据的封装和分用)

    认识网络中常用的名词以及基本的概念熟悉OSI七层模型和TCP IP五层模型理解网络通信的数据传输流程 认识网络中常用的名词 ip地址 ip地址就是表示我们一台主机的因为数字不好记忆 xff0c 通常使用点分十进制表示IP xff0c 每条数
  • C语言简易TCP服务端程序

    C语言TCP服务端程序 文章目录 C语言TCP服务端程序项目介绍关键技术代码实现一请求一线程方式epoll方式实现多个客户端连接的TCP服务端程序epoll的水平触发和边缘触发 完整代码编译和启动使用NetAssist测试 项目介绍 本项目
  • C++使用gRPC实例

    什么是gRPC RPC 即远程过程调用协议 xff08 Remote Procedure Call Protocol xff09 xff0c 可以让我们像调用本地对象一样发起 远程调用 RPC 凭借其强大的治理功能 xff0c 成为解决分布
  • 复睿智行CC++开发实习面试

    线上面试 xff0c HR和一位技术的面试官 自我介绍 现在研究生学习的方向是什么 xff1f 我还去答区块链 xff0c 本来就半桶水 xff0c 还不如直接回答C C 43 43 后端这个方向 大数据分析这一块有做过吗 xff1f 我
  • 经纬恒润LinuxC++日常实习面经

    自我介绍 在学校成绩如何 xff0c 有没有获得奖学金 xff0c 考研的时间等等相关问题 能实习多久 xff0c 研究生研究的方向 你这个LinuxC 43 43 开发的学习是自学的吗 xff0c 怎样的自学途径 我 xff1a 看书 看
  • 集群聊天服务器项目(三)——负载均衡模块与跨服务器聊天

    负载均衡模块 为什么要加入负载均衡模块 原因是 xff1a 单台服务器并发量最多两三万 xff0c 不够大 负载均衡器 Nginx的用处或意义 xff08 面试题 xff09 把client请求按负载算法分发到具体业务服务器Chatserv
  • C++校招面试题

    C 43 43 static关键字的作用 xff08 从elf结构 链接的过程 xff09 答 xff1a static可以修饰全局变量 函数 局部变量 xff0c 这些符号在加了staitc后就只能在当前文件可见 xff0c 其他文件不可
  • make_shared知识点

    背景 普通创建shared ptr的方法如 xff1a shared ptr span class token operator lt span span class token keyword int span span class to
  • emplace方法原理剖析

    emplace back 和 push back 的差别 有一个类Test定义如下 span class token keyword class span span class token class name Test span span
  • 【 rbx1翻译 第七章、控制移动基座】第八节、使用里程计进行往返运动

    7 8 Out and Back Using Odometry 使用里程计进行往返运动 现在 xff0c 我们了解了里程表信息是如何在ROS中表示的 xff0c 我们可以更精确地在往返过程中移动机器人 下一个脚本将监视 odom和 base
  • 项目总结一:串口通信 || 串口接收数据和写入的数据不一致

    在做项目串口通信时遇到一个奇怪的bug xff0c 我写入的一个两个字节short类型数据3 xff0c 接受到的数据很奇怪有时是一个很大的数 xff0c 有时又是300多 xff0c 为了找到原因也是废了一些时间 xff0c 这里给分享一
  • linux---套接字编程

    一 Socket是什么 1 socket套接字 xff1a socket起源于Unix xff0c 而Unix Linux基本哲学之一就是 一切皆文件 xff0c 都可以用 打开open gt 读写write read gt 关闭close
  • ROS订阅者只订阅一次消息

    include lt ros ros h gt include lt opencv2 core core hpp gt include lt opencv2 imgproc imgproc hpp gt include lt opencv2
  • 【FPGA练习】(一): UART串口通信实验

    由于之前学习FPGA的过程中 xff0c 没有做一个良好的记录 xff0c 以及已学知识的扩展 xff0c 所以从今天开始每一个实验例程和扩展应用 xff0c 都要做文档记录 本实验 xff0c 是基于正点原子达芬奇xc7a35tfgg48
  • Ubuntu配置GStreamer实现python推流

    想用python实现一个推流服务 xff0c 下面记录一下配置过程 系统是ubuntu18 04 xff0c python3 6和3 8中都试过 1 安装gstreamer sudo apt get install libgstreamer
  • CMake 引用第三方库

    一 cmake简介 cmake 是gnu工具链中构建项目重要的一环 xff0c 而且在windows linux OS X中都可以使用 xff0c 特别是linux C C 43 43 程序员必备基本功 二 基本命令 xff1a 命名变量
  • C/C++:struct和class区别

    C和C 43 43 中的Struct区别 CC 43 43 不能将函数放在结构体声明能将函数放在结构体声明在C结构体声明中不能使用C 43 43 访问修饰符 public protected private 在C 43 43 中可以使用 在
  • 四旋翼无人机学习之准备篇(一)

    最近我哥要给我邮递个四旋翼无人机 xff0c 再加上本人对蓝天从小就很感兴趣 所以在学习完四驱小车后打算上手下无人机 刚开始学习根本不知道要看哪些 xff0c 在几天漫无头绪的学习 xff0c 终于有点气色了 xff0c 就把学习经验分享给

随机推荐

  • 更改Ubuntu默认python版本的方法

    可以按照以下方法使用 ls 命令来查看你的系统中都有那些 Python 的二进制文件可供使用 1 2 ls usr bin python usr bin python usr bin python2 usr bin python2 7 us
  • c++求素数

    C 43 43 练习第一课 C 43 43 输入一个n 求n以内的素数 xff1a C 43 43 输入一个n 求n以内的素数 xff1a include span class token operator lt span iostream
  • 贪吃蛇

    C尝试写的贪吃蛇项目 xff08 数组实现 xff09 以后会更新用链表实现贪吃蛇 span class token macro property span class token directive keyword define span
  • Android公司面试题

    Android 面试题及面试经验 我的第一次面试经验 今天来到成都面试 xff0c 面试的是Android xff0c 说实话 xff0c Android并不是我的强项 xff0c 只是在大学期间接触过 第一关人事还可以 xff0c 第二关
  • linux---tcp通信流程以及代码实现

    TCP通信特性 xff1a xff08 在网络版块详细讲解 xff09 面向连接 可靠 面向字节流 TCP通信过程 c 43 43 封装TCP通信 1 include lt iostream gt 2 include lt arpa ine
  • 物联网学习及理解

    物联网学习及理解 xff08 来自一个物联网专业学生的心得 xff09 什么是物联网物联网能做什么一 物联网运用领域二 物联网发展趋势 物联网怎么实现一 局域网内的物联网二 广域网内的物联网 总结 在开始写这篇博客之前 xff0c 我不得不
  • vscode代码格式化快捷键

    Windows xff1a Shift 43 Alt 43 F Linux Ctrl 43 Shift 43 I MacOS Shift 43 Option 43 F
  • 多线程和网络编程(多线程)

    一 多线程 1 进程和线程 进程 xff1a 是正在运行的程序 是系统进行资源分配和调用的独立单位 每一个进程都有它自己的内存空间和系统资源 线程 xff1a 是进程中的单个顺序控制流 xff0c 是一条执行路径 单线程 xff1a 一个进
  • Java八种基本数据类型(图文详解)

    Java八种基本数据类型 Java八种数据类型Java八种数据类型的分类 xff08 图 xff09 基本数据类型分为三大类 数值型 字符型 布尔型 数值型整数类型 xff08 byte short int long xff09 浮点型 f
  • numpy基础用法-学习笔记-task10

    大作业 本次练习使用 鸢尾属植物数据集 iris data xff0c 在这个数据集中 xff0c 包括了三类不同的鸢尾属植物 xff1a Iris Setosa xff0c Iris Versicolour xff0c Iris Virg
  • STM32F103驱动LD3320语音识别模块

    STM32F103驱动LD3320语音识别模块 LD3320语音识别模块简介模块引脚定义STM32F103ZET6开发板与模块接线测试代码实验结果 LD3320语音识别模块简介 基于 LD3320 xff0c 可以在任何的电子产品中 xff
  • Arduino UNO驱动土壤湿度传感器检测

    Arduino UNO驱动土壤湿度传感器检测 简介运行要求Arduino UNO与传感器接线程序展示实践效果总结 简介 本次使用到是这个新款土壤湿度传感器 xff01 这款电容式土壤湿度传感器区别于市面上绝大部分的电阻式传感器 xff0c
  • ESP32使用TCP HTTP访问API接口JSON解析获取数据

    ESP32使用TCP HTTP访问API接口JSON解析获取数据 API接口代码解析获取时间代码烧录效果总结 API接口 单片机常用的API接口基本都是返回的一串JSON格式的数据 xff0c 这里以ESP32联网获取时间信息作为获取API
  • 电池保护板 - 问题归纳

    电池保护板 问题归纳 简介充电锂电池磷酸铁锂电池 放电总结 最近更新日期 xff1a 2023 03 07 简介 电池充放电过程中 xff0c 如果电压 电流或温度等参数不稳定或超出电池的安全范围 xff0c 就会对电池造成损害 xff0c
  • Arduino驱动DS1302显示时钟

    Arduino驱动DS1302显示时钟 前言电气参数经典应用电路接线程序实验结果 前言 目前有许多流行的串行时钟电路 xff0c 例如 DS1302 xff0c DS3231 xff0c DS1307 xff0c PCF8485 等 它们由
  • 计算机网络---应用层以及HTTP协议

    网络层是程序员接触最多的一个层级 xff0c 应用层是层级体系中的最上层的一级 xff0c 是我们做逻辑处理最多的 应用层的功能什么是urlhttp协议 应用层的功能 是程序员写的一个一个解决的实际的问题都是在应用层 xff0c 是做逻辑运
  • 51驱动NRF24L01通信,NRF24L01与TTL转NRF24L01模块通信

    51驱动NRF24L01通信 xff0c NRF24L01与TTL转NRF24L01模块通信 NRF24L01一 简介二 引脚功能描述 程序设计一 对 24L01 的程序编程的基本思路如下 xff1a 二 Tx 与 Rx 的配置过程1 Tx
  • 51单片机驱动K型热电偶 OLED0.96显示

    51单片机驱动K型热电偶 OLED0 96显示 一 基本参数二 接线三 部分代码引脚定义时序对用代码 四 实验现象五 注意事项 一 基本参数 二 接线 K型热电偶 MAX6675 模块引脚说明GNDGND接地 单独供电需要与MCU共地VCC
  • 基于ESP32做低功耗墨水屏时钟

    基于ESP32做低功耗墨水屏时钟 电子墨水屏概述 ESP32实验低功耗电子时钟功能描述接线开发实验结果 电子墨水屏 概述 电子墨水是一种革新信息显示的新方法和技术 和传统纸差异是电子墨水在通电时改变颜色 xff0c 并且可以显示变化的图象
  • STC89C52制作可程控低频信号发生器

    STC89C52制作可程控低频信号发生器 准备工作操作流程关于PCF8591实现构思 相关代码定时器相关代码串口控制频率和LCD显示函数 相关功能现象总结 准备工作 由于51单片机本身并不自带DAC的功能 xff0c 因此需要借助外置模块实