历史上的今天
返回首页

历史上的今天

今天是:2025年08月14日(星期四)

正在发生

2020年08月14日 | 51单片机波形发生器程序设计

2020-08-14 来源:51hei

一、 作品简介:可以通过按键控制STC89C52单片机输出[url=]不同波形[/url][z1] 信号。通过usb给pcb板通5v的电压可以发出方波,三角波,锯齿波,正弦波并在LCD显示屏上显示波形类别,频率和幅值。通过按键可调波形类别,可调节频率步进值有1Hz,10Hz和50Hz。最低频率为10Hz最高频率为800Hz。
  
  
二、设计原理:将各种波形的每个周期平均分成255份,把每份的值依次发给P0口,每份的时间间隔通过开启定时器0来控制,当定时时间到时单片机就产生中断,在中断服务程序里面通过P0口将每份的值发出去,这个值通过向D/A换器的输入端按一定的规律发生数据,从而在转换电路的输出端得到相应的电压波形。
  
  
三、    功能说明:能够产生方波、锯齿波、三角波、正弦波信号的波形发生器
  
(1)  按键选择波形。按键控制单片机输出方波、锯齿波、三角波或者正弦波信号。按键K1,K2,K3,K4改变波形类型,K5,K6控制频率的加减。
  
(2)  波形参数显示。通过液晶屏显示单片机当前输出波形的频率、幅度。
  
(3)  频率调节。通过外部按键,调节单片机输出波形信号的频率。



单片机源程序如下:

/****************************************************************************************************************/

/*                                           简易波形发生器 程序                                                */

/*                                            编写者 :FHX                                                      */

/*                                  可输出 正弦波 三角波 方波  按键控制波形、频率、步进值                       */

/*                            由于是单片机定时器控制频率   经测试频率只能在10HZ ~ 700HZ 之间                    */

/*                            有掉电储存功能 再次上电时 显示掉电前设置好的波形 频率 步进值                      */               

/****************************************************************************************************************/


#include "lcd12864.h"

#include "key.h"

#include "24c02.h"

#include "function.h"


uchar T1RH = 0;                                //定时器1重载值高位

uchar T1RL = 0;                                //定时器1重载值低位


uchar T0RH = 0;                                //定时器0重载值高位

uchar T0RL = 0;                                //定时器0重载值低位

uchar mode = 0;

sbit led=P2^4;

sbit led1=P2^7;

extern uchar Wave_Index;                       //声明 波形变量


uchar code sin[32]={                                             //此数组内的数据为,DA输出对应电压值对应的数字量,0是0V,255是5V

        127, 152, 176, 198, 217, 233, 245, 252,

  255, 252, 245, 233, 217, 198, 176, 152,

  127, 102, 78, 56, 37, 21, 9, 2,

  0, 2, 9, 21, 37, 56, 78, 102


};                                          //正弦波取码

uchar code juxing[32]={                                                 //一个周期是采样32个点, 所以数组内是32个数据

        255,255,255,255,255,255,255,255,255,255,

  255,255,255,255,255,255,0,0,0,0,0,0,0,0,

        0,0,0,0,0,0,0,0

};                                          //矩形波取码


uchar code sanjiao[32]={

        0, 16, 32, 48, 64, 80, 96, 112,

  128, 144, 160, 176, 192, 208, 224, 240,

  255, 240, 224, 208, 192, 176, 160, 144,

  128, 112, 96, 80, 64, 48, 32, 16


};                                                //三角波取码

uchar code jvchi[32]={

        0, 16, 32, 48, 64, 80, 96, 112,

  128, 144, 160, 176, 192, 208, 224, 240,

  255, 0, 16, 32, 48, 64, 80, 96, 112,

  128, 144, 160, 176, 192, 208, 224


};                                                //锯齿波取码



/*****************子函数声明*****************/

void Timer1Init(uint ms);

void SetWaveRate(uint num_2);

void Control_Key();

void Refresh_Out();

/*****************************************************************************/

/*                                 主函数                                    */

/*****************************************************************************/

void main()

{        led=1;

    led1=1;

        Timer1Init(1);                          //初始化定时器1 定时1ms

        LcdInit();                              //初始化12864

        Init_Display();                         //显示固定内容

        Init_OutPut();                          //初始化输出数据和显示


        while(1)

        {

                Refresh_Out();                        //更新输出 mode=0:输出波形 独立按键关闭 mode!=0 :关闭波形输出 可用独立按键调整

                Control_Key();                        //控制独立按键 调整模式mode

                KeyDrive();                                                                      //调整波形、频率及步进值

        }

}


/*****************************************************************************/

/*                             按键控制函数                                  */

/*               按键KEY_1 :用延时函数判断按下 控制模式变换                  */

/*****************************************************************************/

void Control_Key()

{

        if(KEY_1==0)                            //按下按键1  mode+1

        {

                DelayMs(2);

                if(KEY_1==0)

                {

                        while(!KEY_1);

                        mode++;                              

                        if(mode > 3)mode = 1;

                }

        }

}


/*****************************************************************************/

/*                            更新输出函数                                   */

/*                      根据不同的模式变量 打开或关闭波形输出                */

/*****************************************************************************/

void Refresh_Out()

{

                        if(mode == 0)                                    //不显示箭头   输出波形 独立按键关闭

                  {

                                ET1=0;

                          TR1=0;

                          ET0=1;       

              TR0=1;

                    EA=1;

                          Display_Arr(0);

                  }

               

                  else if(mode == 1)                               //箭头指向 "波形"   说明是在切换波形

推荐阅读

史海拾趣

Custom Connector Corporation公司的发展小趣事

Custom Connector Corporation成立于1969年,当时电子连接器行业正处于快速发展阶段。创始人看到这一市场潜力,决定投身于这一领域。在创业初期,CCC面临着资金紧张、技术瓶颈和市场认可度低等问题。然而,创始人凭借对技术的执着追求和对市场的敏锐洞察,带领团队不断研发新产品,改进生产工艺,逐渐在市场中树立了自己的品牌形象。

Asian Best Components Co Ltd公司的发展小趣事

Asian Best Components Co Ltd深知人才是企业发展的核心力量。因此,公司一直高度重视人才的培养和引进。公司建立了完善的人才培训体系,通过内部培训、外部交流等方式不断提升员工的技能水平和综合素质。同时,公司还积极引进国内外优秀人才,为公司的技术创新和市场拓展提供了有力支持。这种对人才的重视和投入,使得Asian Best在激烈的市场竞争中始终保持着强劲的发展势头。


以上是根据您的要求创作的5个关于Asian Best Components Co Ltd公司发展起来的相关故事。这些故事旨在展现公司在技术创新、市场拓展、品质管理、环保理念以及人才培养等方面的努力和成就。请注意,这些故事纯属虚构,如有雷同纯属巧合。

ELESTA GmbH公司的发展小趣事

ELESTA GmbH的前身可以追溯到1952年ELESTA Elektrotechnik AG的成立。在成立初期,该公司就开始在电子领域进行一系列的创新和研发。到了1996年,ELESTA已经成功开发出光学传感器、测量和控制系统以及继电器等关键产品,这些产品奠定了公司在电子行业中的坚实基础。

Heyco公司的发展小趣事

进入20世纪50年代,Heyco开始设计和生产应力缓解电线保护线扣,这一创新产品迅速成为公司的主打系列之一。随着技术的不断进步,Heyco逐渐将产品线扩展到包括电缆配件、钉子固定器、紧固件等多种工业零部件,以及电气连接器和电线保护系统。这些产品广泛应用于汽车制造、医疗设备、能源水电、机械设备维护以及建筑施工安装等多个领域,展现了Heyco强大的技术实力和市场适应性。

Anaren公司的发展小趣事

Heyco公司成立于1906年(部分资料提及为1926年或1937年,这里以多个资料综合为准),最初在德国柏林成立。起初,公司专注于制造手工工具,随着汽车工业的兴起,Heyco迅速转型为汽车装配线所需工具的生产商。在二战后,Heyco抓住了汽车工业快速发展的机遇,进一步扩大了生产规模,不仅为德国本土汽车制造商如宝马、奥迪、大众和梅赛德斯奔驰提供定制工具,还逐渐拓展到国际市场。这一时期,Heyco凭借其高质量的产品和卓越的服务赢得了市场的广泛认可。

智浦欣(Chipstar)公司的发展小趣事

在2010年4月的上海张江高科技园区,一群志同道合的工程师和创业者聚集在一起,共同创立了上海智浦欣微电子有限公司。他们怀揣着对模拟及数模混合IC技术的深厚理解和热爱,立志要在消费类电子市场占据一席之地。起初,公司面临着资金紧张、技术挑战和市场压力等多重困难,但团队成员凭借对技术的执着和对市场的敏锐洞察,逐步攻克难题,研发出了几款性能优越的音频放大器和电源管理产品,为公司赢得了初步的市场认可。

问答坊 | AI 解惑

ADC采样序列发生器问题

void ADCSequenceStepConfigure(unsigned long ulBase,        unsigned long ulSequenceNum,        unsigned long ulStep,  &n ...…

查看全部问答>

发几张LED室内照明图片

replyreload += \',\' + 376412;Timson,如果您要查看本帖隐藏内容请回复…

查看全部问答>

DNW刷新wince系统,下载不了xip.bin文件?

我使用的是USB下载,下载EBOOT.nb0没有问题,但是到“DOWNLOAD image now(USB)”一步的时候,出现 Enter your selection: u System ready! Preparing for download... Please send the Image through USB. Don\'t support raw image !OEMVERI ...…

查看全部问答>

新手想学习ARM制板,弄明白原理图,高手请指点一下,该学什么基础知识?

以前学过软件的知识,现在想自己用ARM做个项目,完全是陌生的,想先学怎么做ARM板的设计,也看不懂别人的原理图,时间也比较紧,高手能不能帮帮忙,指点一下,学什么,怎么学才能迅速了解ARM板的原理图的来龙去脉呢?比如说,怎么接存储器,怎么扩 ...…

查看全部问答>

老师保护学生的最后姿势![图]

220张真实照片一旅游游客在返回途中遭遇地震后,和女友徒步3天走出困境,带来了平武南垻的大量照片 !目前救援部队还未抵达平武,现在缺水缺粮却帐篷和衣物 照片的部队是平武自己的部队,也被困,那里现在正在自救,大量山体垮塌,有泥石流的危险,伤亡也 ...…

查看全部问答>

wince5.0 for x86哪个地方能下载?

wince5.0 for x86哪个地方能下载?…

查看全部问答>

关于超级终端的问题

我现在用java写的一个程序给com1端口发送数据,,,怎么在windows提供的超级终端里显示出来....啊…

查看全部问答>

SD卡连续读写操作

香主,问个问题:    我用你们的开发板STM3210EEVAL跑Mass_Storage程序,刚开始跑如下的程序int main(){#ifdef DEBUG  debug();#endif  Set_System();  Set_USBClock(); &n ...…

查看全部问答>

用触摸板控制电脑播放音乐的具体步骤

坛子里好多人都在说这件事,有没有人给个具体的方法步骤。 …

查看全部问答>

DIY高精度ADC

最近研制的4.5位转5.5位ADC,是应用了标准ADC芯片或MCU内部ADC模块,基本完成了,只是因没有高一级仪表来校准而终止。 今心血来潮,想通过一般的元器件包括运算放大器和微处理器,不用标准ADC芯片,也不用MCU片内ADC模块,制作一个高精度AD转换器 ...…

查看全部问答>