历史上的今天
返回首页

历史上的今天

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

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

2020-08-24 来源:51hei

单片机型号: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();

推荐阅读

史海拾趣

BITECH公司的发展小趣事

非常抱歉,由于BITECH公司并非我所熟知的特定电子行业公司,我无法直接提供关于其发展的具体故事。同时,要准确描述一个公司的发展故事,需要详细的数据和事实支持,而这些信息通常需要直接从公司本身或相关报道中获取。

然而,我可以尝试构建一个关于电子行业中某家公司发展故事的框架,供您参考。这些故事可能会涉及公司的创新、市场扩张、技术突破、合作伙伴关系以及行业挑战等方面。

故事一:创新引领发展
BITECH公司自创立之初,便以技术创新为核心竞争力。公司研发团队不断推出具有颠覆性的电子产品,如高效能电池、智能传感器等,这些产品在市场上取得了巨大成功。公司通过持续创新,不仅提升了自身品牌影响力,还为整个电子行业的发展做出了重要贡献。

故事二:市场扩张战略
随着产品线的不断丰富和技术的日益成熟,BITECH公司开始实施市场扩张战略。公司积极拓展国内外市场,通过参加国际展会、建立海外销售网络等方式,将产品推向全球。同时,公司还针对不同市场需求,定制个性化产品解决方案,赢得了众多客户的青睐。

故事三:技术突破助力成长
在电子行业竞争激烈的背景下,BITECH公司不断寻求技术突破。公司投入大量研发资源,成功攻克了一系列关键技术难题,如5G通信、人工智能等。这些技术突破不仅提升了公司产品的竞争力,还为公司带来了新的增长点。

故事四:合作伙伴关系共赢
BITECH公司注重与产业链上下游企业的合作,建立了广泛的合作伙伴关系。通过与供应商、客户以及同行业企业的紧密合作,公司实现了资源共享、优势互补,共同推动电子行业的发展。

故事五:应对行业挑战
在电子行业发展过程中,BITECH公司也面临着诸多挑战,如市场竞争加剧、技术更新换代迅速等。然而,公司始终保持敏锐的市场洞察力,及时调整战略方向,通过加强内部管理、提升产品质量、优化服务体系等方式,成功应对了这些挑战,实现了稳健发展。

请注意,以上仅为故事框架,具体内容需要根据实际情况进行填充。如需获取关于BITECH公司或其他电子行业公司的真实发展故事,建议您查阅相关新闻报道、行业分析或公司年报等资料。

GREATECS公司的发展小趣事

在电子行业中,有许多伟大的企业(GREATECS公司,这里假设为泛指多个杰出电子企业)通过不同的路径和策略实现了显著的发展。以下是五个相关故事,每个故事均基于事实,旨在展示这些企业如何成长和壮大。

1. 通用电气(General Electric, GE)的多元化扩张

通用电气(GE)的故事始于1888年,由托马斯·爱迪生创立,最初专注于电力和照明领域。随着时间的推移,GE通过一系列的战略并购和内部创新,逐渐扩展到电机、电动机制造、航空、医疗设备、核能等多个领域。在20世纪,GE成为全球最大的多元化企业之一,其业务遍布全球。特别是在杰克·韦尔奇担任CEO期间(1981-2001),通过大规模的并购和扩张,GE的营业收入和市值显著增长。然而,2008年金融危机后,GE面临经济困境,随后进行了战略调整,出售金融资产并重点发展核心业务,如今仍是全球领先的科技和工业公司之一。

2. 索尼(Sony)的创新之路

索尼公司成立于1946年,最初由井深大和盛田昭夫创立,起初是一家小型电子产品制造商。索尼的崛起得益于其持续的创新精神和对消费者需求的敏锐洞察。1958年,索尼推出了世界上第一台便携式晶体管收音机,开启了便携式电子产品的新时代。随后,索尼又推出了Walkman便携式音乐播放器、PlayStation游戏机等一系列革命性产品,这些产品不仅改变了人们的娱乐方式,也奠定了索尼在全球电子行业的领先地位。索尼的成功在于其不断追求技术创新和产品质量,以及对市场趋势的准确把握。

3. 三星电子的崛起

三星电子是韩国最大的电子企业,其发展历程充满了挑战与机遇。起初,三星主要从事贸易和低端电子产品制造。然而,在20世纪80年代末至90年代初,三星决定实施“新经营”战略,通过大规模投资研发、提升产品质量和品牌形象,实现了从低端制造商向高端科技企业的转型。在半导体、智能手机、显示面板等领域,三星取得了重大突破,成为全球市场的领导者。三星的成功在于其强大的研发能力、高效的供应链管理以及对市场变化的快速响应。

4. 英特尔(Intel)的芯片霸主地位

英特尔公司成立于1968年,最初是一家专注于半导体存储器的初创企业。然而,随着日本存储器制造商的崛起,英特尔面临了巨大的竞争压力。在关键时刻,英特尔决定放弃存储器业务,转而专注于微处理器(CPU)的研发和生产。这一战略转型使英特尔迅速崛起为全球最大的CPU制造商,其“Intel Inside”计划更是深入人心,成为个人电脑行业的标准配置。英特尔的成功在于其强大的技术创新能力、对市场需求的精准把握以及与全球合作伙伴的紧密合作。

5. 华为的技术突破与全球化战略

华为作为中国电子行业的代表企业,其发展历程充满了传奇色彩。起初,华为主要从事电信设备的研发和销售。然而,随着技术的不断进步和市场需求的不断变化,华为逐渐将业务扩展到智能手机、云计算、人工智能等多个领域。华为的成功在于其持续的技术研发投入、对全球市场的深入洞察以及灵活的市场策略。特别是在5G技术方面,华为取得了重大突破,成为全球领先的5G解决方案提供商。同时,华为还积极推动全球化战略,与全球多个国家和地区的运营商建立了紧密的合作关系。

品赞(G-Switch)公司的发展小趣事
采用成熟的技术和元器件,具有较高的可靠性和稳定性。
AVG [AVG Semiconductors(HITEK)]公司的发展小趣事

AVG深知在竞争激烈的电子行业中,单打独斗难以取得长远的发展。因此,公司积极寻求与行业内外的合作伙伴建立紧密的合作关系。通过与上下游企业建立供应链合作关系,AVG确保了原材料的稳定供应和产品质量的可靠性;通过与高校和研究机构合作开展技术研发,AVG不断引入新的技术和创新思路。这些合作伙伴关系的建立,为AVG的发展提供了有力支持,也促进了整个电子行业的共赢发展。

粤翔(FlyWin)公司的发展小趣事
保护计算机中的数据不因突然断电而丢失。
CONTRINEX公司的发展小趣事

自1972年在瑞士成立以来,Contrinex便踏上了成为全球传感器行业领军企业的征程。起初,公司专注于开发工业用的位置判定传感器,凭借其卓越的技术和精准的性能,很快便在市场上崭露头角。随着技术的不断进步和市场的不断扩大,Contrinex逐渐将业务拓展至全球60多个国家,旗下拥有500多名优秀员工,成为一家真正的国际化企业。

问答坊 | AI 解惑

在OMAP3530上用libusb座USB程序的问题

下载libusb-0.1.12的代码, 首先在pc上编译libusb,然后编译自己的代码,运行,一切正常,没有异常。 然后交叉编译,完成之后在交叉编译自己的程序,将编译后的库和可执行文件放到OMAP3530上面 运行提示错误:error submitting URB: No such f ...…

查看全部问答>

S3C2440奇美4.3寸屏调试没图像。

大家好:     小弟最近开始调试奇美的4.3寸屏,型号是LR430LC9601。现在遇到的问题是背光是亮起来了。可是一点图像都没有(我在boot里面加了logo)     boot里面做了LCD控制器的引脚定义。抓了几个信号也都基本正常VCLK 12MH ...…

查看全部问答>

430不用的引脚必须接地么??

我用的149的端口P5.2和焊盘之间断了,我把它悬空不会有什么问题吧,因为实在焊不上了! 谢谢!…

查看全部问答>

这样画外围的电路,我真想踢他

我今天有时间准备给LM3S811搭一个RS232电路,我就参考买的一块板子的原理图。可是和MAX3232datasheet的参考电路一看,我要哭了。这是datasheetd的,绝对权威啊。 ,这是我那破板子上的,注意那第二引脚V+。     我真的想用脚踢他。 ...…

查看全部问答>

关于发表博客的问题

为什么我在网上转了一篇学stm32GPIO的博文发表不了?网站提示说是包含了站点屏蔽的文字。我看了一下没什么敏感的字眼啊,求解答。谢过。 …

查看全部问答>

请教大侠们LaunchPad的USI使用方法

最近想利用MSP430G2231通过SPI总线来控制一个DAC,可怎么编程都没成功,主要是USI的寄存器不太会配置,请各位大侠们支招…

查看全部问答>

MSP430并口下载错误

求助!!IAR出现这种错误怎么解决第一次接触430,下载时出现这个错误:  Fri Oct 19 22:23:39 2012: No device found Fri Oct 19 22:23:39 2012: Failed to load debugee:  这是怎么回事,与下载器的问题有关吗?   求高手指 ...…

查看全部问答>

最近有朋友遇到M3提货困难的问题吗?

虽然M3的问题已经讨论很久了,不过原来我司的货期都还正常,不过最近一下子紧张了,不知道有没有其他朋友也遇到这样的问题呢? …

查看全部问答>

EK-TM4C1294XL 连接到交换机 D4会亮吗

EK-TM4C1294XL 连接到交换机会有灯亮吗? 我的开发板连接到交换机没有反应。连接不上。有知道原因的啊? …

查看全部问答>