一、 作品简介:可以通过按键控制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)                               //箭头指向 "波形"   说明是在切换波形

[1] [2] [3]

单片机波形发生c语言,51单片机波形发生器程序设计相关推荐

  1. 51单片机呼吸灯c语言,51单片机呼吸灯C语言版.doc

    基于单片机与PWM的呼吸灯设计 实训指导教师: 班 级: 设 计 人姓名: 设 计 日 期: 设 计 地 点: 完 成 时 间: 摘要 本设计是基于单片机的原理与接口设计,采用单片机I/O口,加以C语 ...

  2. 51单片机8255扩展c语言,51单片机8255A扩展IO口

    <51单片机8255A扩展IO口>由会员分享,可在线阅读,更多相关<51单片机8255A扩展IO口(23页珍藏版)>请在人人文库网上搜索. 1.一个芯片可扩展多个并行I/O口 ...

  3. 单片机cpu寄存器 c语言,51单片机共有21个特殊功能寄存器

    描述 在51单片机内部有一个CPU用来运算.控制,有四个并行I/O口,分别是P0.P1.P2.P3,有ROM,用来存放程序,有RAM,用来存放中间结果,此外还有定时/计数器,串行I/O口,中断系统,以 ...

  4. 单片机救护车声音 c语言,51单片机模拟救护车声音 喇叭滴答声 源程序

    /*----------------------------------------------- 名称:喇叭 修改:无 内容:模救护车发声 ----------------------------- ...

  5. 51单片机8255扩展c语言,51单片机8255之PC口控制

    程序编写步骤: 1.设置8255工作方式(PB工作在模式0且为输出,PC上半位在工作模式0且为输入)本文引用地址:http://www.eepw.com.cn/article/201611/32210 ...

  6. 51单片机程序加密c语言,51单片机24C04密码锁(C程序+Proteus仿真)

    #include #include #include #define uint unsigned int #define uchar unsigned char #define NOP4() {_no ...

  7. 51单片机led点阵C语言,51单片机驱动LED点阵扫描显示C语言程序

    #ifndef__Matrix_H__ #define__Matrix_H__ #ifdef__cplusplus extern"C" { #endif #define SET  ...

  8. 51单片机红外线发射c语言,51单片机红外发射程序

    #include #define uchar unsigned char #define uint unsigned int sbit IR_OUT=P1^0 ; void delay_ms(uint ...

  9. 基于单片机的c语言倒计时程序,30秒倒计时c语言51单片机实现.doc

    30秒倒计时c语言51单片机实现 原理图: 程序: #include #define uchar unsigned char #define uint unsigned int sbit dula=P ...

  10. 步进电机c语言控制程序6,步进电机控制程序(c语言+51单片机)

    步进电机控制程序(c语言+51单片机) #include #define uint  unsigned int #define uchar unsigned char #define ms *77 / ...

最新文章

  1. 原创|一文读懂主成分分析(PCA)
  2. java7 的final真的有坑啊。
  3. KVM中virtio之vring(八)
  4. Re题目------Enm.exe
  5. es过滤html标签,Elasticsearch 分词器
  6. 什么是java四大引用?
  7. java基础69 JavaScript产生伪验证码(网页知识)
  8. 【ARM】ARM流水线技术
  9. word List 06
  10. 【电路原理】学习笔记(1):电路模型的基本变量
  11. 5895. 获取单值网格的最小操作数
  12. Linux软件 github,Linux下使用GitHub记
  13. java stream groupingBy
  14. repeat mysql翻译_MySQL数据库中系统函数repeat有哪些功能呢?
  15. 通过Jersey客户端API调用REST风格的Web服务
  16. CS API 测试3
  17. wince中实现SQLite数据库及二进制文件保存与读取
  18. Atitit 传媒学院专业与课程表艾提拉总结 目录 1. 媒体分为感觉媒体、表示媒体、表现媒体、存储媒体和传输媒体 1 1.1. 1、感觉媒体 如文字、数据、声音、图形、图像等。 1 1.2. 表示
  19. 2021年最佳开源软件榜单出炉!
  20. 企业邮箱邮件在网页版显示正常在Foxmail 显示不全

热门文章

  1. luogu 5561 [Celeste-B]Mirror Magic 后缀数组+RMQ+multiset
  2. keras input 层
  3. 同事篇(12年至今)
  4. C# Activator.CreateInstance()方法使用
  5. 仅仅CSS就实现了轮播图----利用关键帧动画实现轮播图效果
  6. 垂杨柳中学2021年高考成绩查询时间,2021年北京中考各学校分数线,历年北京中考分数线...
  7. python卡路里计算器_python习题20190130
  8. 寄存柜程序模拟(C语言)
  9. 功能安全专题之端到端(E2E) 的通信保护
  10. 第六天 游戏策划学习