【Proteus仿真】【51单片机】简易信号发生器设计

2023-11-02


一、主要功能

1、可生成常用波形,方波、锯齿波、三角波、阶梯波、正玄波;
2、可通过按键切换不同波形输出;


二、使用方法

系统运行后,按下K1键输出方波信号,按下K2键输出锯齿波,按下K3键输出三角波,按下K4键输出阶梯波,按下K5键输出正弦波。可通过示波器测量显示输出波形。

三、硬件资源

1、51单片机核心模块
2、DAC0832模块
3、按键模块

四、软件设计

1、主要代码

代码如下:

#include <reg52.h>
#include <absacc.h>
#define uint unsigned int
#define uchar unsigned char
#define DAC0832 XBYTE[0xfffe]
sbit k1=P1^0;
sbit k2=P1^1;
sbit k3=P1^2;
sbit k4=P1^3;
sbit k5=P1^4;
sbit beep=P1^7;
unsigned char mm=0;
unsigned char flag=0;
unsigned char x,y;
uchar code SETTAB[]={ //正弦波数据(正部分)
0x80, 0x83, 0x86, 0x89, 0x8D, 0x90, 0x93, 0x96, //(正上升部分)
0x99, 0x9C, 0x9F, 0xA2, 0xA5, 0xA8, 0xAB, 0xAE,
0xB1, 0xB4, 0xB7, 0xBA, 0xBC, 0xBF, 0xC2, 0xC5,
0xC7, 0xCA, 0xCC, 0xCF, 0xD1, 0xD4, 0xD6, 0xD8,
0xDA, 0xDD, 0xDF, 0xE1, 0xE3, 0xE5, 0xE7, 0xE9,
0xEA, 0xEC, 0xEE, 0xEF, 0xF1, 0xF2, 0xF4, 0xF5,
0xF6, 0xF7, 0xF8, 0xF9, 0xFA, 0xFB, 0xFC, 0xFD,
0xFD, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xFD,
0xFD, 0xFC, 0xFB, 0xFA, 0xF9, 0xF8, 0xF7, 0xF6, //(正下降部分)80
0xF5, 0xF4, 0xF2, 0xF1, 0xEF, 0xEE, 0xEC, 0xEA,
0xE9, 0xE7, 0xE5, 0xE3, 0xE1, 0xDE, 0xDD, 0xDA,
0xD8, 0xD6, 0xD4, 0xD1, 0xCF, 0xCC, 0xCA, 0xC7,
0xC5, 0xC2, 0xBF, 0xBC, 0xBA, 0xB7, 0xB4, 0xB1,
0xAE, 0xAB, 0xA8, 0xA5, 0xA2, 0x9F, 0x9C, 0x99,
0x96, 0x93, 0x90, 0x8D, 0x89, 0x86, 0x83, 0x80,
//正弦波数据(负部分)
0x80, 0x7C, 0x79, 0x78, 0x72, 0x6F, 0x6C, 0x69 , //(负下降部分)128,0x80
0x66, 0x63, 0x60, 0x5D, 0x5A, 0x57, 0x55, 0x51 ,
0x4E, 0x4C, 0x48, 0x45, 0x43, 0x40, 0x3D, 0x3A ,
0x38, 0x35, 0x33, 0x30, 0x2E, 0x2B, 0x29, 0x27 ,
0x25, 0x22, 0x20, 0x1E, 0x1C, 0x1A, 0x18, 0x16 ,
0x15, 0x13, 0x11, 0x10, 0x0E, 0x0D, 0x0B, 0x0A ,
0x09, 0x08, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02 ,
0x02, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02 ,
0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09 , //(负上升部分)//80
0x0A, 0x0B, 0x0D, 0x0E, 0x10, 0x11, 0x13, 0x15 ,
0x16, 0x18, 0x1A, 0x1C, 0x1E, 0x20, 0x22, 0x25 ,
0x27, 0x29, 0x2B, 0x2E, 0x30, 0x33, 0x35, 0x38 ,
0x3A, 0x3D, 0x40, 0x43, 0x45, 0x48, 0x4C, 0x4E ,
0x51, 0x55, 0x57, 0x5A, 0x5D, 0x60, 0x63, 0x66 ,
0x69, 0x6C, 0x6F, 0x72, 0x76, 0x79, 0x7C, 0x80
};
void DelayMS(uint ms)
{
	uchar i;
	while(ms--)
	{
		for(i=0;i<120;i++);
	}
}
void delay(uint i)
{
	while(i--);	
}
void sound()
{
	uchar i=100;
	while(i--)
	{
		beep=~beep;
		delay(100);
	}
}
void fangbo()
{
	DAC0832=y;
	x++;
	if(flag==0)
	{	
		y=0xff;
		if(x==128)
		{
			flag=1;
			y=0x00;
		} //方波+
	}
	else
	{
		y=0x00;
		if(x==0)
		{
			flag=0;
			y=0xff;
		} //方波-
	}
}
void juchibo() //锯齿波
{
	DAC0832=y;
	y+=1;
}
void sanjiaobo()   //三角波
{
	DAC0832=y;
	x++;
	if(flag==0)
	{
		y+=2; //三角波数据(上升部分)
		if(x==128)
		{
			flag=1;
			y-=2;
		}
	}
	else 
	{
		y-=2;
		if(x==0)
		{
			flag=0;
			y=0;
		} //三角波数据(下升部分)
	}
}
void jietibo() //阶梯波
{
	DAC0832=y;
	y+=25;
}
void sin() //正弦波
{
	DAC0832=SETTAB[y];
	x++;
	y++;
}
void read_key()
{
	if(k1==0)	  //方波
	{
		DelayMS(10);
		if(k1==0)
		{ 
			mm=1;
			
			while(k1==0);
		}
	}
	else if(k2==0)
	{
		DelayMS(10);
		if(k2==0)
		{ 
			mm=2;
		
			while(k2==0);
		}
	}
	else if(k3==0)	 // 三角波
	{
		DelayMS(10);
		if(k3==0)
		{
		 	mm=3;
			
			while(k3==0);
		}
	}
	else if(k4==0)
	{
		DelayMS(10);
		if(k4==0)
		{ 
			mm=4;
			
			while(k4==0);
		}
	}
	else if(k5==0)	   //正弦波
	{
		DelayMS(10);
		if(k5==0)
		{ 
			mm=5;
			
			while(k5==0);
		}
	}
}
void main()
{
	TMOD=0x02;
	TL0=156;
	TH0=156;
	TR0=1;
	ET0=1;
	EA=1;
	mm=0;
	for(;;)
	{ 
		read_key();
	}
}
void t_0() interrupt 1 using 2
{ 
	switch(mm)
	{
		case 1: fangbo();break;
		case 2: juchibo();break;
		case 3: sanjiaobo();break;
		case 4: jietibo();break;
		case 5: sin();break;
	}
}

五、实验现象

B站演示视频:https://space.bilibili.com/444388619
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

联系作者

作者B站链接:https://space.bilibili.com/444388619
可提供手把手教学服务,资料获取请联系作者QQ:3443792007
专注于51单片机、STM32、国产32、DSP、Proteus、ardunio、ESP32、物联网软件开发,PCB设计,视频分享,技术交流。

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

【Proteus仿真】【51单片机】简易信号发生器设计 的相关文章

  • IT项目管理-项目时间管理

    IT项目管理 项目时间管理 题目 教材练习题6 教材练习题7 解答 教材练习题6 a
  • CCS安装编译器的方法

    TI公司的编译器叫CGT code generation tools 先下载所需版本的CGT 到TI官网找CGT 在www ti com cn上搜索CGT 即可找到C2000 CGT C2000代码生成工具 编译器 也可以直接到这里找 C2
  • 新浪微博发图片时报错

    error does multipart has image error code 20007 2 statuses upload json JAVA 新浪微博 官网sdk 在调用 public Status UploadStatus St
  • 几种linux内核文件的区别(vmlinux、zImage、bzImage、uImage、vmlinuz、initrd )

    对于Linux内核 编译可以生成不同格式的映像文件 例如 make zImage make uImage zImage是ARM Linux常用的一种压缩映像文件 uImage是U boot专用的映像文件 它是在zImage之前加上一个长度为
  • 3D WEB引擎HOOPS Commuicator助力Naval Architect Jumpstart快速启动船舶信息建模平台开发

    行业 造船业 挑战 新公司希望将创新的船舶信息建模产品推向市场 基于浏览器的产品需要支持高级可视化和强大的数据转换 以处理大型 复杂的造船项目 小型开发团队的任务是雄心勃勃的平台发布计划 解决方案 Tech Soft 3D提供领先的SDK
  • 请问在CSS里面,这个符号是什么 意思?

    是HTML注释 不是CSS注释 CSS是 之所以会有人这么写是因为有的浏览器不支持CSS CSS的标记就会被直接显示出来 用HTML注释掉是为了确保兼容性 而那些支持CSS的浏览器就可以正确解析了 追问 那请问我在什么地方都用就可以了吗 回
  • 开放-封闭原则

    一 定义 开放 封闭原则 是说软件实体 类 模块 函数等等 应该是可扩展的 但是不可修改 ASD 这个原则其实是有两个特征 一个是说 对于扩展是开放的 Open for extension 对于更改是封闭的 Closed for modif

随机推荐

  • java语言利用正则表达式判断身份证号码合法性

    判断身份证 要么是15位 要么是18位 最后一位可以为字母 并写程序提出其中的年月日 我们可以用正则表达式来定义复杂的字符串格式 d 17 0 9a zA Z d 14 0 9a zA Z 可以用来判断是否为合法的15位或18位身份证号码
  • AI人像抠图及图像合成:让你一键环游世界

    本程序基于百度飞浆 PaddlePaddle 平台完成 该程序通过DeepLabv3 模型完成一键抠图 encoder decoder进行多尺度信息的融合 同时保留了原来的空洞卷积和ASSP层 其骨干网络使用了Xception模型 提高了语
  • conda activate base报错Your shell has not been properly configured to use ‘conda activate‘.

    conda activate base报错Your shell has not been properly configured to use conda activate 使用conda activate base激活base环境时 出现
  • HTTP缓存机制

    缓存的作用 提高资源加载速度 减少网络请求 提高页面渲染速度 缓存的分类 前端缓存主要包括http缓存 数据缓存 HTTP缓存 常见的 HTTP 缓存只能存储 GET 响应 对于其他类型的响应则无能为力 浏览器在每次GET URL时都会先检
  • 【车联网原型系统|二】数据库+应用层协议设计

    物联网原型系统导航 车联网原型系统 一 项目介绍 需求分析 概要设计 https blog csdn net weixin 46291251 article details 125807297 车联网原型系统 二 数据库 应用层协议设计 h
  • Excel里关于if的9个函数,如何指定条件求和、计数、平均等

    总结了一下Excel里的求满足条件的计数 求和 平均值 最大值 最小值 标准差等9个方法 01 countif 作用 对满足条件的区域统计个数 模板 countif 条件所在的区域 条件 实例 A B列是广东不同地市的得分评价情况 在E2单
  • labelme标注结果可视化(持续补充)

    图像数据常用的标注工具是labelme 标注的格式是json labelme标注结果可视化 是将标注结果绘制到原始图像上 以方便查看标注结果 1 json文件读取与保存 由于labelme标注的保存格式为json 所以必须掌握json文件的
  • 【已解决】SpringBoot整合security账号密码正确却提示错误

    已解决 SpringBoot整合security账号密码正确却提示错误 一 引言 SpringSecurity的密码校验并不是直接使用原文进行比较 而是使用加密算法将密码进行加密 更准确地说应该进行Hash处理 此过程是不可逆的 无法解密
  • react 是怎么运行的?

    react 是怎么运行的 import React from react import ReactDOM from react dom const App div style color 000000 hello world div con
  • 如何完全删除,删的可以重新下载新的MySQL·

    第一步 快捷键win r输入regedit进入注册表 找到HKEY LOCAL MACHINE SYSTEM ControlSet001 Services Eventlog Application MySQL文件夹删除 删除HKEY LOC
  • 程序员精进之路:性能调优利器--火焰图

    本文主要分享火焰图使用技巧 介绍 systemtap 的原理机制 如何使用火焰图快速定位性能问题原因 同时加深对 systemtap 的理解 让我们回想一下 曾经作为编程新手的我们是如何调优程序的 通常是在没有数据的情况下依靠主观臆断来瞎蒙
  • Docker 镜像使用基本操作

    今天我将围绕 Docker 核心概念镜像展开 首先重点讲解一下镜像的基本操作 然后介绍一下镜像的实现原理 首先说明 咱们本课时的镜像均指 Docker 镜像 你是否还记得镜像是什么 我们先回顾一下 镜像是一个只读的 Docker 容器模板
  • 作为网络工程师,你知道私有IP地址范围吗?

    RFC 1918定义了私有IP的范围私有 内网 IP地址范围 A类 10 0 0 0 10 255 255 255B类 172 16 0 0 172 31 255 255C类 192 168 0 0192 168 255 255 提高 RF
  • C++ string的用法和例子

    https blog csdn net tengfei461807914 article details 52203202 string是C 标准库的一个重要的部分 主要用于字符串处理 可以使用输入输出流方式直接进行操作 也可以通过文件等手
  • LinearAlgebraMIT_6_ColumnSpaceAndNullSpace

    这节课的两个重点是column space列空间和null space零空间 x 1 pre multiply left multiply and post multiply right multiply 对于pre multiply le
  • 了解MQ和安装使用RabbitMQ

    什么是消息队列 本质是一个队列 队列中出存放的是跨进程的通信机制 用于上下游传递消息 MQ是常见的上下游 逻辑解耦 物理解耦 的消息通信服务 在使用MQ之后 消息发送上只需要依赖MQ 不用依赖其他服务 功能 1 流量削峰 举个例子 系统最多
  • 最新抖音快手小红书西瓜全平台解析接口api开发文档

    简介 从短视频平台APP中复制出来的分享链接 通过接口获取或通过主页在线一键解析获取短视频中的 视频标题 视频封面 无水印视频地址 图集列表等参数信息 接口地址 https eeapi cn 返回格式 JSON 请求方式 GET 客户UId
  • 常见的Java框架有哪些?

    作为一名合格的Java开发工程师 不仅需要了解开发技术 还需要了解清楚Java主流框架信息 那么常见的Java框架有哪些 常见的Java框架有哪些 1 Spring框架 Spring框架是现在Java后端框架家族里面最强大的一个 拥有IOC
  • 【PTA】约瑟夫环问题

    n个小孩围成一圈 从第一个小孩开始从1到m报数 报到m的小孩出列 下一个小孩继续从1开始报数 出列的小孩不参与报数 问小孩的出列顺序 import java util public class Main public static void
  • 【Proteus仿真】【51单片机】简易信号发生器设计

    文章目录 一 主要功能 二 使用方法 三 硬件资源 四 软件设计 1 主要代码 五 实验现象 联系作者 一 主要功能 1 可生成常用波形 方波 锯齿波 三角波 阶梯波 正玄波 2 可通过按键切换不同波形输出 二 使用方法 系统运行后 按下K