找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3351|回复: 1
收起左侧

DAC0832多波形发生(可调频等)单片机代码+仿真

[复制链接]
ID:237586 发表于 2017-10-7 10:44 | 显示全部楼层 |阅读模式
1、可通过按键随意切换DAC0832输出波形;
2、可通过按键实现频率可调;
3、可通过按键实现占空比可调。
0.png

0.png

51单片机源程序如下:
  1. #ifndef __0832_h__
  2. #define __0832_h__

  3. unsigned char i,sqar_num=128; //最大值100,默认值50
  4. unsigned char cho=0;         //0:正弦波。1:方波。2:三角波。3:锯齿波。
  5. unsigned char num=0;
  6. unsigned char TIME0_H=0xff,TIME0_L=0xd9;      //定时器0的初值设置;全局变量.对应正弦波,锯齿波50HZ
  7. sbit chg=   P1^0;                                                           //三角波100Hz.
  8. sbit freq_u=P1^1;
  9. sbit freq_d=P1^2;
  10. sbit duty_u=P1^3;
  11. sbit duty_d=P1^4;
  12. sbit cs    =P3^7;
  13. bit flag=0;
  14. unsigned int FREQ=50;//初始化频率,50HZ

  15. //调节部分——频率
  16. void freq_ud(void)
  17. {
  18.    unsigned int temp;
  19.    if(freq_d==0)
  20.         {  FREQ--;         }
  21.    else if(freq_u==0)
  22.          { FREQ++;         }
  23.   
  24.    if(cho==1|cho==3) //锯齿波256次中断一周期,特殊处理下。否则他的频率是100(+\-)n*2Hz.
  25.          {
  26.           temp=0xffff-3906/FREQ;  //方波,三角波默认为100hz,切换后频率也为50HZ 65336-10^6/(256*FREQ)
  27.           TIME0_H=temp/256;
  28.       TIME0_L=temp%256;
  29.          }
  30.    else if(cho==0|cho==3){         //正弦波 三角波默认周期50hz  65536-10^6//(512*FREQ)
  31.    temp=0xffff-1953/FREQ;
  32.    TIME0_H=temp/256;
  33.    TIME0_L=temp%256;
  34.    }
  35. }
  36. //调节部分——方波的占空比
  37. void duty_ud(void)  //方波也采用512次中断构成一个周期。
  38. {
  39.    if(duty_d==0&sqar_num>0)
  40.            sqar_num--;
  41.    else if(duty_u==0&sqar_num<255)
  42.           sqar_num++;


  43. }
  44. //波形发生函数
  45. void sint(void)
  46. {
  47.      if(!flag)
  48.      {
  49.         cs=0;P2=sin_num[num++];cs=1;
  50.                 if(num==0){num=255;flag=1;}
  51.             }
  52.     else if(flag)
  53.     {
  54.            cs=0;P2=sin_num[num--];cs=1;
  55.            if(num==255){num=0;flag=0;}
  56.          
  57.          }
  58. }
  59. void square(void)
  60. {
  61.     if(i++<sqar_num)  {cs=0;P2=0XFF;cs=1;}
  62.         else{cs=0;P2=0X00;cs=1;}
  63. }
  64. void triangle(void)
  65. {
  66.   cs=0;P2=num++;cs=1;
  67. }
  68. void stw(void)
  69. {
  70.    if(~flag)
  71.      {
  72.         cs=0;P2=num++;cs=1;
  73.                 if(num==0){num=255;flag=1;}
  74.             }
  75.    else if(flag)
  76.      {
  77.            cs=0;P2=num--;cs=1;
  78.            if(num==255){num=1;flag=0;}
  79.          
  80.          }
  81. }
  82. //按键中断处理程序。
  83. void it0() interrupt 0
  84. {
  85.    if(chg==0) { if(++cho==4) {cho=0;num=0;}        }         //num=0;所有数据从新开始,保证波形的完整性
  86.    else if(freq_u==0|freq_d==0)
  87.      {freq_ud();}
  88.    else if (cho==1&(duty_d==0|duty_u==0))
  89.      {duty_ud();}
  90.    else ;
  91. }
  92. //定时器中断处理程序。
  93. void intt0() interrupt 1
  94. {

  95. //TH0=0x00;TL0=0x00;sinx();

  96.   switch(cho)
  97.   {

  98.           case 0:{TH0=TIME0_H;TL0=TIME0_L;sint()    ;break;}  //正弦波//每半周期256取样。
  99.         case 1:{TH0=TIME0_H;TL0=TIME0_L;square();  break;}        //方波   //为了提高方波的最高频率,只有牺牲占空比的最小可调值。分100份 每次1%。
  100.         case 2:{TH0=TIME0_H;TL0=TIME0_L;triangle();break;}        //三角波
  101.           case 3:{TH0=TIME0_H;TL0=TIME0_L;stw();     break;}        //锯齿波
  102.         default: ;
  103.   
  104.   }

  105. }

  106. #endif



  107. ……………………

  108. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

所有资料51hei提供下载:
多波形发生(可调频等).rar (54.62 KB, 下载次数: 67)

评分

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

查看全部评分

回复

使用道具 举报

ID:294934 发表于 2018-3-22 10:00 | 显示全部楼层
帮了大忙谢谢
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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