历史上的今天

今天是:2024年08月24日(星期六)

2020年08月24日 | 51单片机控制信号发生器源程序(正弦波、方波)

发布者:SereneMeadow7 来源: 51hei关键字:51单片机控制  信号发生器  正弦波  方波 手机看文章 扫描二维码
随时随地手机看文章

单片机型号:STC15W4K32S4
数字编码器EC11作为控制波形、频率、占空比的开关
液晶1602A作为显示信息
 

单片机源程序如下:

Note:

        2020-05-06 Update

        1. Fix an error in main funciton, cause the EC11 Encoder rotate disorder.

        2. Fix an error of interface display during switch frequency.


        2020-05-24 Update

        1. Fix precision of PWM frequency

        2. Fix the information error in interface

        

        波形发生器

        作者:老刘爱捣鼓

        版本:V0.3.1

        单片机型号:STC15W4K32S4 @24MHz

        B站视频教程:https://www.bilibili.com/video/BV12k4y197Qu

        老刘爱捣鼓(全网同名)期待您的关注!


        规格:

        输出:单通道

        方波:1Hz~4MHz

        正弦波:1Hz-10kHz

        波幅:约等于VCC,5V左右

        带载能力:无带载能力

        显示屏:LCD1602

        控制:EC11编码器


        界面:

        左下角显示波形图标(方波/正弦波)和输出状态(On/OFF)

        F:频率

        D:方波占空比

        CD:时钟分频系数(For information only)

        P:用于生成正弦波的PWM频率(For information only)

        Pt:用于生成正弦波的点数(For information only)


        操作:

        单击编码器:方波界面下,切换频率和占空比

        双击编码器:开启或关闭波形输出

        长按编码器:切换方波界面/正弦波界面/电压显示界面

        旋转编码器:调节参数


        2020-05-06 更新

        1. 修正main函数循环中会引起编码器旋转混乱的错误

           将main函数中while循环中的Update_Flag=0;放到前面清零,放在后面会在编码器高速旋转时,多次触发中断而Update_Flag在最后被清零则无法正确更新LCD

        2. 修正在切换频率时,界面的显示错误


        2020-05-24 Update

        1. 修正PWM频率精度

        2. 修正界面信息的显示错误

*/


#include

#include

#include "lcd1602.h"

#include "wave.h"

#include "settings.h"

#include "delay.h"

#include "config_stc.h"

//#include "uart.h"

//#include "stdio.h"


#ifndef uint8

#define uint8 unsigned char

#endif


#ifndef int8

#define int8 char

#endif


#ifndef uint16

#define uint16 unsigned int

#endif


#ifndef uint32

#define uint32 unsigned long int

#endif


#define TIMER_0 1 //定时器0中断序号

#define INT_1 2          //编码器旋转 触发外部中断

#define INT_0 0          //编码器按下 触发外部中断


uint8 Timer0_Count;

bit Update_Flag = 1;


void main(void)

{

        //LCD Pin

        P1M1 &= 0x00; //设置P1口为准双向

        P1M0 &= 0x00; //设置P1口为准双向

        P0M1 &= 0x00; //设置P0口为准双向

        P0M0 &= 0x00; //设置P0口为准双向


        //信号输出Pin

        PWM3 = 0;           //设置PWM3 P4.5低电平

        PWM4 = 0;           //设置PWM4 P4.4低电平

        P4M1 |= 0x30;  //设置P4.4(PWM4_2),4.5(PWM3_2)为高阻

        P4M0 &= ~0x30; //设置P4.4(PWM4_2),4.5(PWM3_2)为高阻


        /* 编码器旋转中断

           Interrupt for Encoder Rotation */

        IT1 = 0; //外部中断1触发方式,上升沿和下降沿

        PX1 = 1; //外部中断1高优先级

        EX1 = 1; //开启外部中断1


        /* 编码器按键中断

           Interrupt for Encoder Click */

        IT0 = 1; //外部中断0触发方式,下降沿

        PX0 = 1; //外部中断0高优先级

        EX0 = 1; //开启外部中断0


        /* 定时器0,用于更新电压信息计时

           Timer 0 for updating the information of VCC*/

        TMOD &= 0xF0;  //设置定时器0模式 16位自动重载,在Keil中debug的话,请注意,这种设置是8051的旧13位模式

        AUXR &= ~0x80; //定时器0时钟12T模式

        TL0 = 0xC0;           //设置定时初值 24MHz 20ms

        TH0 = 0x63;           //设置定时初值 24MHz 20ms

        ET0 = 1;           //允许T0溢出中断


        /* 定时器1,用于生成小于50Hz的PWM

           Timer 1 for generate the PWM when frequency less than 50Hz*/

        TMOD &= 0x0F;  //工作模式,0: 16位自动重装

        AUXR &= ~0x40; //12T

        ET1 = 1;           //允许中断


        EA = 1; //开总中断


        //UartInit();

        //UartInit_interrupt();

        PWM_Hz_Pre = PWM_Hz;

        Wave_Shape_Pre = Wave_Shape;

        Get_PWM_Duty_Limit();

        if (PWM_Duty > PWM_Max_Duty)

                PWM_Duty = PWM_Max_Duty;

        else if (PWM_Duty < PWM_Min_Duty)

                PWM_Duty = PWM_Min_Duty;

        Lcd_Init();

        while (1)

        {

                if (Update_Flag)

                {

                        /*        Update_Flag要马上清零,如果放在Update_LCD后面,会造成假如Update_LCD的过程中再次触发编码器旋转中断的话,

                                在执行完Update_LCD后,在中断中置位的Update_Flag却被清零了,造成LCD没刷新,输出和显示的不一致。

                                另一种方法是在执行Update_LCD前把中断关掉,执行完再打开中断, 但如果这里面的函数执行时间比较长,会产生旋转触发不及时,使用感受卡顿。

                                关中断来避免重复触发是有好处的,可以避免在函数执行过程中多次触发将参数修改掉,

                                函数执行过程中参数被修改,可能会造成计算结果混乱,严重时会造成溢出,甚至单片机复位死机。        */

                        Update_Flag = 0;

                        Wave_OFF();

                        if (Wave_Shape_Pre != Wave_Shape)

                        {

                                Wave_Shape_Pre = Wave_Shape;

                                if (Wave_Shape == 0)

                                {

                                        EX1 = 0; //关闭外部中断1(编码器旋转)

                                        TF0 = 0; //清除TF0标志

                                        TR0 = 1; //定时器0开始计时 (定时器0为VCC更新计时)

                                }

                                else if (Wave_Shape == 1)

                                {

                                        PWM_Hz = PWM_Hz_Pre;

                                        EX1 = 1; //开启外部中断1(编码器旋转)

                                        TR0 = 0; //关闭定时器0 (定时器0为VCC更新计时)

                                        TF0 = 0; //清除TF0标志

                                }


                                else if (Wave_Shape == 2)

                                {

                                        PWM_Hz_Pre = PWM_Hz;

                                }

                        }

                        if (Wave_Shape == 1) //方波

                        {

                                Set_PWMCKS_PS();

                                Set_PWM_Cycle();

                                Set_PWM_Width();

[1] [2]
关键字:51单片机控制  信号发生器  正弦波  方波 引用地址:51单片机控制信号发生器源程序(正弦波、方波)

上一篇:电阻、电容和电感测试仪设计
下一篇:基于中科微GPS的OLED显示的微型时钟

推荐阅读

   可以看出,近年来,语音助手在手机中的地位已经越来越高,厂商对其投入的研发力度也在日益增长。这次,我们就为大家集齐了四个目前在市面上较为受欢迎的语音助手,做一次语音助手横评,来看看语音助手到底哪家强。选手背景2011 年 10 月,苹果在库比蒂诺推出了自家的语音助手——Siri。当时 Siri 的出现带动了手机行业语音助手的发展。但相信不...
编写串口流程很简单:初始化端口 ==> 发送程序编写 + 接受程序编写 ==> PC串口调试助手第一步:因为涉及接受和发送的优先级,所以在初始化串口端口之前必须先初始化中断的设置,下面就先给出主函数的程序:int main(void){ NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //中断向量的初始化 Usart_Init(115200); ...
西部数码(Western Digital)今天以 WD 品牌推出了一款新的 USB 3.2 Gen 2 的 My Passport SSD,该新设备配备了 NVMe 技术,支持高达 1050MB/s 的读取速度和高达 1000MB/s 的写入速度。全新的 My Passport SSD 可提供高达 2TB 的容量,并且像大多数 SSD 一样,其体积小到可以放在手掌中。它具有带圆角和波浪状脊线的金属外壳,并...
据Digitimes报道,供应链消息称,苹果原计划在新款iPad中取消充电口侧的喇叭声孔,但如今2021新款iPad恐怕难以实现这一设计。但需要注意的是,该媒体同时指出,新款iPad出货量并没有受到太大影响,预计可达6000万台。此前彭博社记者马克・古尔曼 (Mark Gurman) 报道称,新款iPad mini有望在今年秋季与 iPhone 13一同发布。此前爆料称,iPad mini 6...

史海拾趣

问答坊 | AI 解惑

生物传感器在医疗领域的应用

 一、生物生物传感器。该系统利用一个回旋装置来检测,类似导航系统和气袋的原理。振荡晶片的大小类似于一颗尘埃尺寸,有望可使医生诊断和监测常见类型的肿瘤,获得最佳治疗方案。该装置可以鉴定肿瘤标志物-蛋白以及其它肿瘤细胞产生的丰度不同的 ...…

查看全部问答∨

液晶咋不亮?

大家看看这个图我照着上面接液晶咋没有反应呢?12864我以前没用过。…

查看全部问答∨

新手升级8位到32位单片机,TM32与LPCl7xx哪个容易学?

  新手升级8位到32位单片机,TM32与LPCl7xx哪个容易学?     价格 性能 开发平台 开发资料       转贴一下比较:   TM32 和 LPCl7xx 速度比较(基于uCOS-II平台) 测试1 STM32平台 72MHz--------- ...…

查看全部问答∨

音乐T恤

音乐T恤是一款为播放器量身打造的时尚多媒体T恤,它能带你体验前所未有的炫酷便捷的触控(Touch)音乐之旅!轻触衣服上的多媒体按钮,即可迅速唤醒兜里的播放器,千首曲目,随心更换。美妙音乐,尽在触摸!  通过它你可以告别繁杂的耳机线的困扰 ...…

查看全部问答∨

multisim修改参数

我需要查看multisim下元件参数,比如三极管放大倍数等如何查看和修改呢,还是这些元件都是封装在模块中的,我想查看怎么看?…

查看全部问答∨

PXA270核心板方案:

PXA270核心板方案:   CPU:PXA270   SDRAM:128M   FLASH:32M   接口:USB、SDCARD、SERIAL等   LCD+TOUCH:3.5‘   支持WIFI 方案可提供:SCH + PCB + BOOM + WINCE ...…

查看全部问答∨

求助:4線touch controller 來控制 5線panel

由於當初沒搞清楚5線的定義,就使用了5線式PANEL 分別接在6410 CPU的touch ADC,第五線SG則接在AIN0上。 如果不透過五線式的touch controller,有辦法直接用6410 內建4線controller 來控制嗎? …

查看全部问答∨

如何测试出JTAG更个引脚的功能

如何测试出JTAG更个引脚的功能 资源:我这里有一块手机焊有20 针的JTAG接口,目前没有这块手机的任何资料。           拥有Lauterbach JTAG+trace32 调试器。 现象:目前通过Lauterbach JTAG+trace32调试器调试其 ...…

查看全部问答∨

谁有《Windows 2000 /XP WDM设备驱动程序开发》电子版?

哪位兄弟有这本电子书,发给小弟看一下啊,多谢了 邮箱:guanbenben@yahoo.com.cn…

查看全部问答∨
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
随便看看

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved