找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 15422|回复: 16
收起左侧

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

  [复制链接]
ID:649951 发表于 2021-3-15 20:58 | 显示全部楼层 |阅读模式
本帖最后由 格格巫0 于 2021-3-16 15:02 编辑

1、  能够产生方波、锯齿波、三角波、正弦波信号的波形发生器
2、  按键选择波形。按键控制单片机输出方波、锯齿波、三角波或者正弦波信号。按键K1,K2,K3,K4改变波形类型,K5,K6控制频率的加减。
3、  波形参数显示。通过液晶屏显示单片机当前输出波形的频率、幅度。
4、  频率调节。通过外部按键,调节单片机输出波形信号的频率。

功能简介:利用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寄存器,它的锁存信号也称为通道控制信.

仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
1.电路图
电路图.png
2.液晶显示电路
液晶显示电路.png
3.按钮
按钮.png
4.数模转换电路
数模转换电路.png
5.单片机
单片机.png

6.仿真示例
仿真图.png

部分单片机源程序如下:
  1. #include "reg51.h"
  2. #include <data.h>
  3. #include <LCD1602.h>
  4. #define uchar unsigned char   
  5. #define uint unsigned int   
  6. #define key P1   
  7. #define dataout P3   
  8. uchar fre[5] ="001Hz";                                                        //初始显示
  9. uint data THHL=65536-3906;
  10. uchar data keyword,n=0;   
  11. uchar data Signal_chose = 0;
  12. uchar data div = 1;

  13. void keyscan()                                                                   //键盘扫描函数
  14. {   
  15. keyword=key&0x3f;   
  16. if(keyword!=0x3f)   
  17. {   
  18.   while((key&0x3f)!=0x3f);        //等待按键松开   
  19.   switch(keyword)   
  20.   {   
  21.                 case 62: {
  22.                                                         if(div>=100) THHL=65536-39; else {div++;THHL=65536-3906/div;}//频率up
  23.                                                         fre[0]=div/100 + '0';fre[1]=div/10%10 + '0';fre[2]=div%10 + '0';
  24.                                                         TR1=0;LCD_send(2,11,fre,5);TR1=1; break;
  25.                                                         }   
  26.                 case 61: {
  27.                                                         if(div<=1) THHL=65536-3906; else {div--;THHL=65536-3906/div;}//频率down
  28.                                                         fre[0]=div/100 + '0';fre[1]=div/10%10 + '0';fre[2]=div%10 + '0';
  29.                                                         TR1=0;LCD_send(2,11,fre,5);TR1=1; break;
  30.                                                         }                           
  31.                

  32.                 case 59: {Signal_chose=0;TR1=0;LCD_send(1,5,"Sin       ",10);TR1=1; break;}          //正弦波
  33.                 case 55:        {Signal_chose=1;TR1=0;LCD_send(1,5,"Triangular",10);TR1=1; break;}                //三角波        
  34.                 case 47:        {Signal_chose=2;TR1=0;LCD_send(1,5,"Square    ",10);TR1=1; break;}                //方波
  35.                 case 31: {Signal_chose=3;TR1=0;LCD_send(1,5,"Sawtooth  ",10);TR1=1; break;}                //锯齿波
  36.                 default:{break;}   
  37.    }   
  38. }   
  39. }   
  40.    
  41. void init()        //初始化
  42. {   
  43. key=0x3f;P2=0x00;dataout=0x00;THHL=65536-3906;  ///初始频率为1Hz
  44. TH1=THHL/256;TL1=THHL%256;   
  45. TMOD=0x11;ET1=1;TR1=1;EA=1;   
  46. }   
  47.    
  48. void main()   
  49. {   
  50.         LCD_init();
  51.         LCD_send(1,0,"Type:Sin",8);
  52.         LCD_send(2,0,"frequency:",10);
  53.         LCD_send(2,11,fre,5);
  54.         init();
  55.         while(1)   
  56.         {   
  57.                 keyscan();
  58.                 switch(Signal_chose)   
  59.                         {   
  60.                                 case 0: {dataout=sin_tab[n]; break;}  //正弦波
  61.                                 case 1: {dataout=thr_tab[n]; break;}  //三角波
  62.                                 case 2: {dataout=squ_tab[n]; break;}  //方波
  63.                                 case 3: {dataout=255-n;break;}                                //锯齿波
  64.                                 default:{break;}   
  65.                          }                  
  66.         }   
  67. }   
  68.    
  69. void time_intt1(void) interrupt 3   
  70. {   
  71.         TL1=THHL%256;TH1=THHL/256;  
  72. //        if(n>=255) {n=0;} else {n++;}   
  73.         n++;
  74. }   
  75.                 sbit RS = P2^6;
  76.     sbit RW = P2^5;
  77.     sbit EN = P2^7;
  78.                
  79. void LCD_send(unsigned char i,unsigned char j,unsigned char str[],unsigned char n)
  80. {
  81.         //输入:显示行数i,列数j,输出字符,输出字符长度n
  82.         unsigned char x=0;
  83.         if(i==1)
  84.         {write_com(0x80+j);}
  85.         else
  86.         {write_com(0x80+0x40+j);}
  87.     for(x=0;x<n;x++)
  88.     {
  89.          write_date(str[x]);
  90.         delay(150);
  91.     }
  92. }
  93.                
  94. int LCD_init()//初始化函数体
  95. {
  96.     EN = 0;
  97.     write_com(0X38);//设置16*2显示,5*7点阵,8位数据接口
  98.     write_com(0X0C);//设置开显示,不显示光标
  99.     write_com(0X06);//写一个字符时,整屏右移
  100.     write_com(0X01);//显示清零
  101.     return 0;
  102. }

  103. int write_com(unsigned char com)//写命令的函数体
  104. {
  105.     RS = 0;
  106.     RW = 0;
  107.     P0 = com;
  108.     delay(5);
  109.     EN = 1;
  110.     delay(5);
  111.     EN = 0;
  112.     return 0;
  113. }
复制代码
51hei.png
以上资料51hei下载地址:
51黑论坛-波形发生器.rar (95.07 KB, 下载次数: 412)

评分

参与人数 1黑币 +20 收起 理由
admin + 20 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:892717 发表于 2021-3-16 18:29 | 显示全部楼层
求问频率范围上限是多少呀
回复

使用道具 举报

ID:649951 发表于 2021-3-18 22:31 | 显示全部楼层
1113462835 发表于 2021-3-16 18:29
求问频率范围上限是多少呀

上限100
回复

使用道具 举报

ID:100826 发表于 2021-3-19 16:00 | 显示全部楼层
偶然看到  谢谢分享
回复

使用道具 举报

ID:250213 发表于 2021-3-31 20:21 | 显示全部楼层
下载用了出错如图,请指教。谢谢!
C.png

回复

使用道具 举报

ID:328014 发表于 2021-3-31 22:08 | 显示全部楼层
阿海哥 发表于 2021-3-31 20:21
下载用了出错如图,请指教。谢谢!

你看倒数第2行,这个错误的原因是因为你存放hex的路径和楼主的不同,你只要双击单片机修改为正确的hex文件路径就可以了,你看这个是我做出来的效果图
51hei.png
回复

使用道具 举报

ID:250213 发表于 2021-4-2 16:30 | 显示全部楼层
51hei团团 发表于 2021-3-31 22:08
你看倒数第2行,这个错误的原因是因为你存放hex的路径和楼主的不同,你只要双击单片机修改为正确的hex文件 ...

原来是路径问题。谢谢您!祝你一切顺利!
回复

使用道具 举报

ID:97838 发表于 2021-4-3 08:31 | 显示全部楼层
很好的教学工具
回复

使用道具 举报

ID:889750 发表于 2021-4-8 10:22 来自手机 | 显示全部楼层
我想问一下,c3为什么会那么小,并且改成10uf后不能复位
回复

使用道具 举报

ID:889750 发表于 2021-4-8 10:25 来自手机 | 显示全部楼层
楼主看一下,我改成这样有问题吗?c3那里改成手动服务后为什么10uf,不能复位。
ND2PYO]7L)20AX9X%SWA}@X.png
回复

使用道具 举报

ID:221964 发表于 2021-5-28 14:03 | 显示全部楼层
很好的教学工具
回复

使用道具 举报

ID:938666 发表于 2021-6-16 15:07 | 显示全部楼层
1113462835 发表于 2021-3-16 18:29
求问频率范围上限是多少呀

应该是100
回复

使用道具 举报

ID:938676 发表于 2021-6-17 08:08 | 显示全部楼层
很好的教学工具很好的教学工具
回复

使用道具 举报

ID:918728 发表于 2021-7-8 23:03 来自手机 | 显示全部楼层
初始频率50hz,程序里应该怎么改啊,大佬们
回复

使用道具 举报

ID:579406 发表于 2021-12-22 13:50 | 显示全部楼层
资料不错,谢谢楼主分享,看这个不是为了别的什么目的,主要是学习一下思维和文笔,提升一下创作水平和阅读视野。
回复

使用道具 举报

ID:987329 发表于 2023-6-2 11:58 | 显示全部楼层
请问楼主这个能不能把频率改到100到2mhz
回复

使用道具 举报

ID:433219 发表于 2023-6-2 16:04 | 显示全部楼层
DAC0832倒是教科书古董了,现在常见常用的dac是哪些型号?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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