找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 16375|回复: 25
收起左侧

51单片机+12864做的简易波形发生器 含源码 已制作出实物(DAC0832+UA741运放)

  [复制链接]
ID:150346 发表于 2017-4-24 15:05 | 显示全部楼层 |阅读模式
最近用51单片机+DAC0832+UA741运放 做了个简易的波形发生器
LCD12864 显示 ,可以产生正弦波 三角波 方波 按键切换波形 调整频率和步进值(按键可长按)
有24C02掉电储存设置的数据
频率不高 10HZ~600HZ(频率高了有点误差)
由单片机定时器中断产生数字信号 DAC0832转换 运放调幅
能力有限 和大家分享一下~ ~

注意原理图 DA转换电路的芯片是DAC0832 画图的人写错了!!!
实物图:

实物图

实物图


原理图:

原理图

原理图


部分单片机源程序预览:

  1. /****************************************************************************************************************/
  2. /*                                           简易波形发生器 程序                                                */
  3. /*                                            编写者 :FHX                                                      */
  4. /*                                  可输出 正弦波 三角波 方波  按键控制波形、频率、步进值                       */
  5. /*                            由于是单片机定时器控制频率   经测试频率只能在10HZ ~ 700HZ 之间                    */
  6. /*                            有掉电储存功能 再次上电时 显示掉电前设置好的波形 频率 步进值                      */               
  7. /****************************************************************************************************************/

  8. #include "lcd12864.h"
  9. #include "key.h"
  10. #include "24c02.h"
  11. #include "function.h"

  12. uchar T1RH = 0;                                //定时器1重载值高位
  13. uchar T1RL = 0;                                //定时器1重载值低位

  14. uchar T0RH = 0;                                //定时器0重载值高位
  15. uchar T0RL = 0;                                //定时器0重载值低位
  16. uchar mode = 0;

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

  18. uchar code sin[32]={                                             //此数组内的数据为,DA输出对应电压值对应的数字量,0是0V,255是5V
  19.         127, 152, 176, 198, 217, 233, 245, 252,
  20.   255, 252, 245, 233, 217, 198, 176, 152,
  21.   127, 102, 78, 56, 37, 21, 9, 2,
  22.   0, 2, 9, 21, 37, 56, 78, 102

  23. };                                          //正弦波取码
  24. uchar code juxing[32]={                                                 //一个周期是采样32个点, 所以数组内是32个数据
  25.         255,255,255,255,255,255,255,255,255,255,
  26.   255,255,255,255,255,255,0,0,0,0,0,0,0,0,
  27.         0,0,0,0,0,0,0,0
  28. };                                          //矩形波取码

  29. uchar code sanjiao[32]={
  30.         0, 16, 32, 48, 64, 80, 96, 112,
  31.   128, 144, 160, 176, 192, 208, 224, 240,
  32.   255, 240, 224, 208, 192, 176, 160, 144,
  33.   128, 112, 96, 80, 64, 48, 32, 16

  34. };                                                //三角波取码


  35. /*****************子函数声明*****************/
  36. void Timer1Init(uint ms);
  37. void SetWaveRate(uint num_2);
  38. void Control_Key();
  39. void Refresh_Out();
  40. /*****************************************************************************/
  41. /*                                 主函数                                    */
  42. /*****************************************************************************/
  43. void main()
  44. {
  45.         Timer1Init(1);                          //初始化定时器1 定时1ms
  46.         LcdInit();                              //初始化12864
  47.         Init_Display();                         //显示固定内容
  48.         Init_OutPut();                          //初始化输出数据和显示

  49.         while(1)
  50.         {
  51.                 Refresh_Out();                        //更新输出 mode=0:输出波形 独立按键关闭 mode!=0 :关闭波形输出 可用独立按键调整
  52.                 Control_Key();                        //控制独立按键 调整模式mode
  53.                 KeyDrive();                      //调整波形、频率及步进值
  54.         }
  55. }

  56. /*****************************************************************************/
  57. /*                             按键控制函数                                  */
  58. /*               按键KEY_1 :用延时函数判断按下 控制模式变换                  */
  59. /*****************************************************************************/
  60. void Control_Key()
  61. {
  62.         if(KEY_1==0)                            //按下按键1  mode+1
  63.         {
  64.                 DelayMs(2);
  65.                 if(KEY_1==0)
  66.                 {
  67.                         while(!KEY_1);
  68.                         mode++;                              
  69.                         if(mode > 3)mode = 1;
  70.                 }
  71.         }
  72. }

  73. /*****************************************************************************/
  74. /*                            更新输出函数                                   */
  75. /*                      根据不同的模式变量 打开或关闭波形输出                */
  76. /*****************************************************************************/
  77. void Refresh_Out()
  78. {
  79.                         if(mode == 0)                                    //不显示箭头   输出波形 独立按键关闭
  80.                   {
  81.                                 ET1=0;
  82.                           TR1=0;
  83.                           ET0=1;        
  84.               TR0=1;
  85.                     EA=1;
  86.                           Display_Arr(0);
  87.                   }
  88.                
  89.                   else if(mode == 1)                               //箭头指向 "波形"   说明是在切换波形
  90.                   {
  91.                                 ET1=1;
  92.               TR1=1;
  93.                           ET0=0;        
  94.               TR0=0;
  95.                           EA=1;
  96.                           Display_Arr(1);
  97.                   }
  98.                
  99.                   else if(mode == 2)                               //箭头指向 "频率"   说明是在加减频率
  100.                   {
  101.                                 ET1=1;
  102.                           TR1=1;
  103.                           ET0=0;        
  104.               TR0=0;
  105.                     EA=1;
  106.                           Display_Arr(2);
  107.                   }
  108.                
  109.                   else if(mode == 3)                               //箭头指向 "步进值" 说明在加减步进值
  110.                   {
  111.                                 ET1=1;
  112.                           TR1=1;
  113.                           ET0=0;        
  114.               TR0=0;
  115.                     EA=1;
  116.                           Display_Arr(3);
  117.                   }
  118. }


  119. /*****************************************************************************/
  120. /*                             按键动作函数                                  */
  121. /*          按键  KEY_2 ~ KEY_4 三个按键由定时器1中断扫描 有长按功能         */
  122. /*****************************************************************************/
  123. void KeyDown(uchar keycode)
  124. {
  125.         /*********************************/
  126.         /*            "+"键              */
  127.         /*********************************/        
  128.         if(keycode == 0x26)                          
  129.         {
  130.                 if(mode == 1)                                    //模式1 向右切换波形
  131.                 {
  132.                         Convert_Wave(1);
  133.                 }
  134.                
  135.                 else if(mode == 2)                               //模式2 增加频率
  136.                 {
  137.                         Change_Rate(1);
  138.                 }
  139.                
  140.                 else if(mode == 3)                               //模式3 增加步进值
  141.                 {
  142.                         Change_Step(1);
  143.                 }
  144.   }
  145.         /*********************************/
  146.         /*            "-"键              */
  147.         /*********************************/
  148.         else if(keycode == 0x28)                           
  149.         {
  150.                 if(mode == 1)                                    //模式1 向左切换波形
  151.                 {
  152.                         Convert_Wave(0);
  153.                 }
  154.                
  155.                 else if(mode == 2)                               //模式2 减小频率
  156.                 {
  157.                         Change_Rate(0);
  158.                 }
  159.                
  160.                 else if(mode == 3)                               //模式3 减小步进值
  161.                 {
  162.                         Change_Step(0);     
  163.                 }
  164.         }
  165.         /*********************************/
  166.         /*          模式清零键           */
  167.         /*********************************/        
  168.         else if(keycode == 0x0D)
  169.         {
  170.                 mode = 0;
  171.         }
  172. }



  173. /**********频率设置函数****************/
  174. /************定时器0控制***************/
  175. void SetWaveRate(uint num_2)
  176. {
  177.         ulong tmp;                                             
  178.         tmp=(12000000/12)/(num_2*32);                            //定时器计数频率 是波形频率的32倍                                                                        
  179.         tmp=65536-tmp;                                           //计算定时器重载值                        
  180.   tmp=tmp+18;                                              //补偿
  181.         T0RH=(uchar)(tmp>>8);                                    
  182.         T0RL=(uchar)tmp;
  183.         TMOD&=0xF0;                                          
  184.         TMOD|=0x01;                                          
  185.         TH0=T0RH;                                             
  186.         TL0=T0RL;
  187. }

  188. /**********定时器1初始化函数***********/
  189. /**********用于三个独立按键扫

  190. …………限于本文篇幅 余下代码请从51hei下载附件…………
复制代码
0.png

所有制作资料下载:
15.12864简易波形发生器.rar (86.24 KB, 下载次数: 318)

评分

参与人数 3黑币 +115 收起 理由
swap1 + 5
练氏 + 10
admin + 100 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:192253 发表于 2017-4-27 10:40 | 显示全部楼层
请问这个波形取码是用MATLAB得到的吗?
回复

使用道具 举报

ID:150346 发表于 2017-4-27 16:00 | 显示全部楼层
逞强 发表于 2017-4-27 10:40
请问这个波形取码是用MATLAB得到的吗?

对 可以用MATLAB取得
回复

使用道具 举报

ID:192253 发表于 2017-4-27 22:53 | 显示全部楼层
fhx97 发表于 2017-4-27 16:00
对 可以用MATLAB取得

我是初学者。。。谢谢的,得到这个波形取码之后是不是根据液晶对电压的控制,然后就可以显示出波形了?
回复

使用道具 举报

ID:150346 发表于 2017-4-28 13:04 | 显示全部楼层
逞强 发表于 2017-4-27 22:53
我是初学者。。。谢谢的,得到这个波形取码之后是不是根据液晶对电压的控制,然后就可以显示出波形了?

通过单片机发数字信号 再经过DAC0832和运放UA741 输出波形 液晶只是显示作用
回复

使用道具 举报

ID:196178 发表于 2017-5-3 20:01 | 显示全部楼层
兄弟真的能用吗
回复

使用道具 举报

ID:150346 发表于 2017-5-3 20:21 | 显示全部楼层

你可以试着做一下
回复

使用道具 举报

ID:196178 发表于 2017-5-5 10:22 来自手机 | 显示全部楼层
fhx97 发表于 2017-5-3 20:21
你可以试着做一下

我现在波形能做出来了,可是12864的显示有点问题
回复

使用道具 举报

ID:150346 发表于 2017-5-6 08:27 | 显示全部楼层
微凉深处 发表于 2017-5-5 10:22
我现在波形能做出来了,可是12864的显示有点问题

先看看硬件电路连接有没有问题,再检查一下程序
回复

使用道具 举报

ID:138990 发表于 2017-5-16 11:49 来自手机 | 显示全部楼层
刚好用到,真的谢谢啦,我们年级赛题目跟这个相似,我自己先做出来再改吧,谢谢啦!
回复

使用道具 举报

ID:138990 发表于 2017-5-18 14:28 来自手机 | 显示全部楼层
微凉深处 发表于 2017-5-3 20:01
兄弟真的能用吗

你的现在成功了吗?
回复

使用道具 举报

ID:203640 发表于 2017-5-25 22:42 | 显示全部楼层
很好,多谢分享
回复

使用道具 举报

ID:237672 发表于 2017-10-7 20:21 | 显示全部楼层
能控制电压的幅值吗
回复

使用道具 举报

ID:165330 发表于 2017-10-8 20:13 | 显示全部楼层
安逸,,,
回复

使用道具 举报

ID:134692 发表于 2017-10-8 20:33 | 显示全部楼层
学习学习,谢谢分享
回复

使用道具 举报

ID:266345 发表于 2017-12-25 10:03 | 显示全部楼层
好东西,正好有用
回复

使用道具 举报

ID:266345 发表于 2017-12-27 19:40 | 显示全部楼层
你好,有没有这个的电子原理图啊
回复

使用道具 举报

ID:166341 发表于 2017-12-28 15:40 | 显示全部楼层
多谢分享,有空山寨看看
回复

使用道具 举报

ID:269211 发表于 2018-1-26 20:55 | 显示全部楼层
很好,多谢分享#在这里快速回复#
回复

使用道具 举报

ID:295205 发表于 2018-3-25 12:27 | 显示全部楼层
元器件的封装库没有啊
回复

使用道具 举报

ID:351420 发表于 2018-6-18 11:47 | 显示全部楼层
您好,下载程序后,我不能生成hex文件,您知道是什么原因吗
回复

使用道具 举报

ID:445996 发表于 2019-4-22 21:32 | 显示全部楼层
哪个运放我有点不懂 能给我讲解一下吗
回复

使用道具 举报

ID:87000 发表于 2019-4-23 12:43 | 显示全部楼层
做着好玩。有时间做做看
回复

使用道具 举报

ID:421805 发表于 2019-11-13 06:10 来自手机 | 显示全部楼层
能改变设计的频率范围吗?
回复

使用道具 举报

ID:755152 发表于 2020-5-20 19:47 | 显示全部楼层
你好,请问你这个原理图上面的LCD12864在Proteus中叫什么呀?你上传附件里的Proteus在我的电脑里面打不开
回复

使用道具 举报

ID:770821 发表于 2020-9-6 10:06 | 显示全部楼层
可以直接拿来用吗?怎么我波形显示为乱码。。。。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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