找回密码
 注册
关于网站域名变更的通知
查看: 280|回复: 2
打印 上一主题 下一主题

51单片机简易函数信号发生器,四个按钮控制产生正弦波、锯齿波、方波、矩形波四种波型

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2022-9-9 10:15 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x
1、  能够产生方波、锯齿波、三角波、正弦波信号的波形发生器
2、  按键选择波形。按键控制单片机输出方波、锯齿波、三角波或者正弦波信号。按键K1,K2,K3,K4改变波形类型,K5,K6控制频率的加减。
3、  波形参数显示。通过液晶屏显示单片机当前输出波形的频率、幅度。
4、  频率调节。通过外部按键,调节单片机输出波形信号的频率。
+ n* |; u( b/ t9 i: w
功能简介:利用89C51单片机和数模转换器件DAC0832产生所需不同信号的低频信号源,其信号幅度和频率都是可以按要求控制的。设计思路:采用51单片机作为控制器;波形选择通过四个按键来选择,通过四个按钮可选择对应波形,波形通过DAC0832。单片机作为数据处理及控制核心,由单片机完成人机界面、系统控制、信号的采集分析以及信号的处理和变换,采用按键输入,利用虚拟示波器显示波形的方案。D/A转换器简介:
DAC0832是双列直插式8位D/A转换器。能完成数字量输入到模拟量(电流)输出的转换。其主要参数如下:分辨率为8位,转换时间为1μs,满量程误差为±1LSB,参考电压(+10/span>-10)V,供电电源为(+5~+15)V,逻辑电平输入与TTL兼容。在DAC0832中有两级锁存器,第一级锁存器称为输入寄存器,它的允许锁存信号为ILE,第二级锁存器称为DAC寄存器,它的锁存信号也称为通道控制信.
/ H" c; V' p: E2 p
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
1.电路图

# F" O; M' g. A4 x
2.液晶显示电路
3.按钮

& y' h- N: ]2 r6 T* I- Y; K
4.数模转换电路

9 C5 l, r; r, Y. u" K3 W% q, r7 k+ O
5.单片机
; ], q2 I$ t1 g
' t0 ]5 g. P1 T# [* Z1 B! [, z+ m2 {8 y
6.仿真示例

. m- P# d& f, I9 B& u( d

8 d5 E7 W$ X9 m# G/ i  L3 k) ^9 x
部分单片机源程序如下:
  • #include "reg51.h"
  • #include <data.h>
  • #include <LCD1602.h>
  • #define uchar unsigned char
  • #define uint unsigned int
  • #define key P1
  • #define dataout P3
  • uchar fre[5] ="001Hz";                                                        //初始显示
  • uint data THHL=65536-3906;
  • uchar data keyword,n=0;
  • uchar data Signal_chose = 0;
  • uchar data div = 1;
  • void keyscan()                                                                   //键盘扫描函数
  • {
  • keyword=key&0x3f;
  • if(keyword!=0x3f)
  • {
  •   while((key&0x3f)!=0x3f);        //等待按键松开
  •   switch(keyword)
  •   {
  •                 case 62: {
  •                                                         if(div>=100) THHL=65536-39; else {div++;THHL=65536-3906/div;}//频率up
  •                                                         fre[0]=div/100 + '0';fre[1]=div/10%10 + '0';fre[2]=div%10 + '0';
  •                                                         TR1=0;LCD_send(2,11,fre,5);TR1=1; break;
  •                                                         }
  •                 case 61: {
  •                                                         if(div<=1) THHL=65536-3906; else {div--;THHL=65536-3906/div;}//频率down
  •                                                         fre[0]=div/100 + '0';fre[1]=div/10%10 + '0';fre[2]=div%10 + '0';
  •                                                         TR1=0;LCD_send(2,11,fre,5);TR1=1; break;
  •                                                         }
  •                 case 59: {Signal_chose=0;TR1=0;LCD_send(1,5,"Sin       ",10);TR1=1; break;}          //正弦波
  •                 case 55:        {Signal_chose=1;TR1=0;LCD_send(1,5,"Triangular",10);TR1=1; break;}                //三角波
  •                 case 47:        {Signal_chose=2;TR1=0;LCD_send(1,5,"Square    ",10);TR1=1; break;}                //方波
  •                 case 31: {Signal_chose=3;TR1=0;LCD_send(1,5,"Sawtooth  ",10);TR1=1; break;}                //锯齿波
  •                 default:{break;}
  •    }
  • }
  • }
  • void init()        //初始化
  • {
  • key=0x3f2=0x00;dataout=0x00;THHL=65536-3906;  ///初始频率为1Hz
  • TH1=THHL/256;TL1=THHL%256;
  • TMOD=0x11;ET1=1;TR1=1;EA=1;
  • }
  • void main()
  • {
  •         LCD_init();
  •         LCD_send(1,0,"Type:Sin",8);
  •         LCD_send(2,0,"frequency:",10);
  •         LCD_send(2,11,fre,5);
  •         init();
  •         while(1)
  •         {
  •                 keyscan();
  •                 switch(Signal_chose)
  •                         {
  •                                 case 0: {dataout=sin_tab[n]; break;}  //正弦波
  •                                 case 1: {dataout=thr_tab[n]; break;}  //三角波
  •                                 case 2: {dataout=squ_tab[n]; break;}  //方波
  •                                 case 3: {dataout=255-n;break;}                                //锯齿波
  •                                 default:{break;}
  •                          }
  •         }
  • }
  • void time_intt1(void) interrupt 3
  • {
  •         TL1=THHL%256;TH1=THHL/256;
  • //        if(n>=255) {n=0;} else {n++;}
  •         n++;
  • }
  •                 sbit RS = P2^6;
  •     sbit RW = P2^5;
  •     sbit EN = P2^7;
  • void LCD_send(unsigned char i,unsigned char j,unsigned char str[],unsigned char n)
  • {
  •         //输入:显示行数i,列数j,输出字符,输出字符长度n
  •         unsigned char x=0;
  •         if(i==1)
  •         {write_com(0x80+j);}
  •         else
  •         {write_com(0x80+0x40+j);}
  •     for(x=0;x<n;x++)
  •     {
  •          write_date(str[x]);
  •         delay(150);
  •     }
  • }
  • int LCD_init()//初始化函数体
  • {
  •     EN = 0;
  •     write_com(0X38);//设置16*2显示,5*7点阵,8位数据接口
  •     write_com(0X0C);//设置开显示,不显示光标
  •     write_com(0X06);//写一个字符时,整屏右移
  •     write_com(0X01);//显示清零
  •     return 0;
  • }
  • int write_com(unsigned char com)//写命令的函数体
  • {
  •     RS = 0;
  •     RW = 0;
  •     P0 = com;
  •     delay(5);
  •     EN = 1;
  •     delay(5);
  •     EN = 0;
  •     return 0;
  • }; P/ i$ a2 B7 U- R- |3 O

2 ^! W3 Y3 O4 j) K0 u; d复制代码3 ^) ?" y, b2 `, o
以上资料下载:+ |% j+ N8 @. x
# X  L* h! b/ O# @" m. A
/ x0 y' @9 y6 ]5 \. V

波形发生器.rar

95.07 KB, 下载次数: 0, 下载积分: 威望 -5

该用户从未签到

2#
发表于 2022-9-9 11:05 | 只看该作者
清新的思维、活跃的创新。

该用户从未签到

3#
发表于 2022-9-9 14:12 | 只看该作者
$ {3 Z% w; u' M% |3 ^7 W( r
认真学习技术上的知识,维护好这样良好的学习氛围。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-7-5 12:22 , Processed in 0.109375 second(s), 26 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

快速回复 返回顶部 返回列表