发作品签到
专业版

基于51单片机的波形发生器设计

工程标签

319
0
0
2

简介

基于51单片机的波形发生器设计,能产生多种波形并显示出来,能同时输出两种波形

简介:基于51单片机的波形发生器设计,能产生多种波形并显示出来,能同时输出两种波形
STC单片机创意设计大赛

开源协议

CC BY-NC-SA 3.0

(未经作者授权,禁止转载)
创建时间:2024-06-26 06:17:34更新时间:2024-07-15 09:12:04

描述

题目要求

题目:基于单片机的波形发生器设计
内容:
1、设计一款能产生 3 种以上波形的波形发生器;
2、设计波形选择按钮(采用 3 个独立按键);
3、点阵显示波形图案;
4、能同时输出两种波形;
5、显示频率。

题目分析

本设计通过分析比较后采用传统的方法来实现多功能波形发生器。借助高性能单片机运算速度高,系统集成度强的优势,设计的这种信号发生器,比以前的数字式信号发生器具有硬件简单,理解及实现起来较容易,该方案的设计思路较为清晰,且容易对频率和幅值进行控制等优点。依据应用场合,需要实现的波形种类,波形发生器的具体指标要求会有所不同。
依据不同的设计要求选取不同的设计方案。通常,波形发生器需要实现的波形有正弦波、方波、三角波和锯齿波。有些场合可能还需要任意波形的产生。各种波形共有的指标有:波形的频率、幅度要求,频率稳定度,准确度等。

总体设计方案框图

image.png

原理图设计说明

使用STC8H8K64U作为主控芯片,STC8H8K64U 是一款功能强大的单片机,以其超高速 8051 内核、丰富的片上资源和灵活的扩展能力,成为各种嵌入式应用的理想选择。该单片机采用 1T 8051 内核,比传统 8051 快 12 倍以上,提供更快的处理速度和更高的效率,同时兼容传统 8051 指令代码,方便开发迁移。STC8H8K64U 提供高达 64K 字节的 Flash 存储器,支持单页擦除和多次擦写,方便存储用户代码。此外,它还拥有丰富的片上资源,包括 22 个中断源、4 级中断优先级、内部高精度时钟、5 个定时器、4 个高速串口、8 路高级 PWM、SPI、I2C、MDU16、USB、RTC、I/O 口中断、DMA、LCM 驱动等,满足复杂应用的需求。STC8H8K64U 还支持在线仿真、在系统编程、用户配置 EEPROM 大小等,方便开发和应用。工作电压范围广 (1.9V~5.5V),工作温度范围宽 (-40℃~85℃),适用于各种环境,使其在各种嵌入式领域都展现出广阔的应用前景,例如工业控制、消费电子、通信设备、医疗设备和汽车电子等。 因此本课题选取STC8H8K64U作为控制器,其基本功能也可以满足本系统对于计时计数的需求。

image.png

带硬件USB的STC8系列支持USB直接仿真/ISP-烧录,官网(https://www.stcaimcu.com/forum.php?mod=viewthread&tid=1554&extra=page%3D1) 有具体仿真、ISP下载方式
image.png

74HC595是一个8位串行输入、并行输出的位移缓存器。并行输出为三态输出。在SCK 的上升沿,串行数据由SDL输入到内部的8位位移缓存器,并由Q7'输出,而并行输出则是在LCK的上升沿将在8位位移缓存器的数据存入到8位并行输出缓存器。当串行数据输入端OE的控制信号为低使能时,并行输出端的输出值等于并行输出缓存器所存储的值。
波形点阵显示采用 8×8 点阵屏,对于 16 个引脚一个 51 单片机来说实在是太多了;所以利用 74HC595 芯片扩展I/O 口引脚。STC89C52 向 74HC595 串行输入数据,再使 74HC595 并行输出。采用此设计能够达到用较少的引脚便能控制引脚较多的器件的目的。
image.png

DAC0832 主要由 8 位输入寄存器、8 位 DAC 寄存器、8 位 D/A 转换器以及输入控制电路四部分组成。8 位输入寄存器用于存放主机送来的数字量,使输入数字量得到缓冲和锁存,由加以控制;8 位 DAC 寄存器用于存放待转换的数字量,由加以控制;8 位 D/A 转换器输出与数字量成正比的模拟电流;由与门、非与门组成的输入控制电路来控制 2 个寄存器的选通或锁存状态。DAC0832 与反相比例放大器相连,实现电流到电压的转换,因此输出模拟信号的极性与参考电压的极性相反。
image.png

软件说明

总体程序的伪代码

image.png
当单片机开始工作时,定时器0触发开始计时,且OLED开始显示波形频率。当定时器0触发中断时,向DAC0832输出波形码,DAC0832通过反向比例放大电路输出最终波形。同时一直检测是否有按键按下,若有按键按下,则执行相应的功能,并当波形调整时,oled同步输出当前波形形状和频率,可以通过oled所显示内容得知当前选择波形形状。

代码块:

void main()						//主函数
{    
    P0M0 = 0x00;  P0M1 = 0x00;                              //设置P0.0~P0.7为双向口模式
    P1M0 = 0x00;  P1M1 = 0x00;                              //设置P1.0~P1.7为双向口模式
    P2M0 = 0x00;  P2M1 = 0x00;                              //设置P2.0~P2.7为双向口模式
    P3M0 = 0x00;  P3M1 = 0x00;                              //设置P3.0~P3.7为双向口模式
	OLED_Init();//初始化OLED
	OLED_ColorTurn(0);//0正常显示,1 反色显示
	OLED_DisplayTurn(0);//0正常显示 1 屏幕翻转显示
	OLED_ShowString(0,1,"CHANNAL_1: 10 Hz",16);
	OLED_ShowString(0,4,"CHANNAL_2: 10 Hz",16);
	m = 65536-(50000/pinlv);
	a=m/256;					//装填高8位	
	b=m%256;					//装填低8位
	init_interrupt();
	CS0=1;						//片选,低电平有效
	CS1=1;						//片选,低电平有效
	WR1=1;						//数据锁存器写选通输入,低电平有效
	while(1) {}
}

键盘扫描程序设计
键盘扫描函数是为了在外部中断服务程序中读取按键的信息,来为波形的标志位 flag_0 和 flag_1 赋值,达到控制输出波形形状目的。当按键2按下的时候,flag_0 数值加 1,对应控制的波形便会发生变化,当flag_0 到四的时候就会重新置零。当按键2按下的时候,flag_1 数值加 1,对应控制的波形便会发生变化,当flag_1 到四的时候就会重新置零。

image.png

外部中断0程序设计
外部中断0是选择波形而设置的中断,当 INT0 引脚收到一个负跳变沿,就会进入执行键盘扫描函数的循环,想要跳出循环就要按下 S3 按键,为波形的标志位 flag_0 和 flag_1 赋值,达到控制输出波形形状目的。

image.png

image.png

定时器中断0程序设计
对于波形的发送,采用定时器的方式定时发送,能够达到较高的精度。对于产生波形,未采用函数的方法来产生,我采用了取码的方式来产生,这种方法简易明了,逻辑清楚,能够较好的完成同时输出两个波形的要求。也能较好的和定时器中断相结合,只需两个标志位就能完成,逻辑清晰容易理解。

image.png

image.png

实物展示

1720858327274.jpg

注意事项

1.画PCB的时候没注意封装大小,把按钮的封装画太小了,按钮太小不好按,使用体验不好。
2.点阵屏的方向错了,应该顺时针转90°,显示才是正的。

设计图

未生成预览图,请在编辑器重新保存一次

BOM

暂无BOM

附件

序号文件名称下载次数
1
波形发生器.zip
18
2
演示视频.mp4
9
克隆工程
添加到专辑
0
0
分享
侵权投诉

工程成员

评论

全部评论(1)
按时间排序|按热度排序
粉丝0|获赞0
相关工程
暂无相关工程

底部导航