找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3403|回复: 0
收起左侧

51单片机的波形发生器Proteus仿真代码

[复制链接]
ID:690646 发表于 2021-4-7 17:01 | 显示全部楼层 |阅读模式
本波形发生器可以改变频率、幅值。有正弦、三角、方波,均可在一定的范围变幅、变频。

仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)

总体布局

总体布局
      8O06]_`@0G}BSV5]551heiUXTT.png

单片机源程序如下:
  1. #include<reg51.h>
  2. #include <math.h>
  3. #define uchar unsigned char
  4. #define uint unsigned int
  5. uchar code tab1[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
  6. uchar code tab2[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef};        //  带小数点的0-9

  7. uchar ds[]={135,145,158,167,176,188,199,209,218,226,234,240,245,249,252,254,254,253,251,247,243,237,230,222,213,204,193,182,170,158,
  8. 146,133,121,108,96,84,72,61,50,41,32,24,17,11,7,3,1,0,0,2,5,9,14,20,28,36,45,55,66,78,90,102,114,128};
  9. uchar code sin_param[64]={135,145,158,167,176,188,199,209,218,226,234,240,245,249,252,254,254,253,251,247,243,237,230,222,213,204,193,182,170,158,
  10. 146,133,121,108,96,84,72,61,50,41,32,24,17,11,7,3,1,0,0,2,5,9,14,20,28,36,45,55,66,78,90,102,114,128};

  11. uchar code Triangle[64]={0,8,16,24,32,40,48,56,64,72,80,88,96,104,112,120,128,136,144,152,160,168,176,184,192,200,208,216,224,232,240,248,
  12. 248,240,232,224,216,208,200,192,184,176,168,160,152,144,136,128,120,112,104,96,88,80,72,64,56,48,40,32,24,16,8,0};

  13. uchar flag=1,time=0,sum=0,timer=0;
  14. unsigned long frequency=10,volt=50,chuzhi=20000;
  15. double acc=1;
  16. uint  SH=0xff,SL=0x38,SQH=0xb1,SQL=0xe0;
  17. sbit key1=P2^0;
  18. sbit key2=P2^1;
  19. sbit key3=P2^2;  //  三种波按钮
  20. sbit key4=P2^3;         //  频率-
  21. sbit key5=P2^4;         //  频率+
  22. sbit key6=P2^5;         //  幅值+
  23. sbit key7=P2^6;         //  幅值-
  24. sbit fsw=P3^4;
  25. sbit fgw=P3^5;
  26. sbit vgw=P3^6;
  27. sbit vxw=P3^7;


  28. void delay()
  29. {
  30.   uchar i;
  31.   for(i=0;i<125;i++)
  32.   ;
  33. }


  34. void init_ST()
  35. {
  36.   uint schuzhi;
  37.   schuzhi=(15625/frequency);
  38.   SH=(65536-schuzhi)/256;
  39.   SL=(65536-schuzhi)%256;
  40.   
  41. }
  42. void init_Sq()
  43. {
  44.   if(frequency>=8)
  45.     chuzhi=500000/frequency;
  46.   else
  47.     chuzhi=50000/frequency;
  48.   SQH=(65536-chuzhi)/256;
  49.   SQL=(65536-chuzhi)%256;

  50. }



  51. void display()
  52. {
  53.   fsw=0;
  54.   P0=tab1[frequency/10];
  55.   delay();
  56.   P0=0x00;
  57.   fsw=1;
  58.   fgw=0;
  59.   P0=tab1[frequency%10];
  60.   delay();
  61.   P0=0x00;
  62.   fgw=1;
  63.   vgw=0;
  64.   P0=tab2[volt/10];
  65.   delay();
  66.   P0=0x00;
  67.   vgw=1;
  68.   vxw=0;
  69.   P0=tab1[volt%10];
  70.   delay();
  71.   P0=0x00;
  72.   vxw=1;

  73. }









  74. void main()
  75. {
  76.   TMOD=0X11;
  77.   EA=1;
  78.   IT0=1;
  79.   ET0=1;
  80.   ET1=1;
  81.   EX0=1;
  82.   TH0=0xff;
  83.   TL0=0x38;  //200us
  84.   TH1=(65536-20000)/256;
  85.   TL1=(65536-20000)%256;
  86.   TR0=1;
  87.   while(1)
  88.   {
  89.    

  90.           display();
  91.    
  92.   }
  93. }

  94. void  zhongduan0() interrupt 1
  95. {
  96.   TH0=SH;
  97.   TL0=SL;
  98.   time++;
  99.   if(time==64)
  100.     time=0;
  101.   if(flag==1)
  102.   {
  103.         sum=ds[time];
  104.         P1=sum;
  105.    
  106.   }
  107.   if(flag==2)
  108.   {
  109.         sum=ds[time];
  110.         P1=sum;
  111.    
  112.   }
  113.   
  114.   if(flag==3)
  115.   {
  116.         TR0=0;
  117.         TR1=1;
  118.   }
  119.   
  120. }

  121. void zhongduan1() interrupt 3
  122. {
  123.   
  124.   TH1=SQH;
  125.   TL1=SQL;
  126.   timer++;
  127.   if(flag==3)
  128.   {        
  129.     if(frequency>=8)
  130.         {
  131.       sum=0xff*acc;
  132.       if(timer%2==0)
  133.         P1=0x00;
  134.       else
  135.         P1=sum;
  136.     }
  137.         else
  138.         {
  139.           sum=0xff*acc;
  140.           if((timer/10)%2==0)
  141.             P1=0x00;
  142.           else
  143.             P1=sum;
  144.          
  145.         }
  146.         

  147.   }
  148.   if(flag==1||flag==2)
  149.   {
  150.     TR1=0;
  151.         TR0=1;
  152.   }
  153.   if(timer==100)
  154.     timer=0;
  155.             
  156.            
  157.    
  158. }
  159.    
  160.    
  161.   

  162.   


  163. void keyscanFV() interrupt 0
  164. {
  165.   uchar i;
  166.   EX0=0;
  167.   delay();
  168.   if(key1==0)
  169.   {
  170.       flag=1;
  171.           for(i=0;i<64;i++)
  172.             ds[i]=sin_param[i];
  173.   }
  174.   if(key2==0)
  175.   {
  176.       flag=2;
  177.           for(i=0;i<64;i++)
  178.             ds[i]= Triangle[i];
  179.   }

  180.   if(key3==0)
  181.       flag=3;


  182.   if (key4==0)
  183.   {
  184.     if(frequency<99)
  185.         {
  186.       frequency++;
  187.           init_ST();
  188.           init_Sq();
  189.         }
  190.   }
  191.   else if(key5==0)
  192.   {
  193.     if(frequency>0)
  194.         {
  195.       frequency--;
  196.           init_ST();
  197.           init_Sq();
  198.         }
  199.   }  
  200.   else if(key6==0)
  201.   {
  202.     if(volt<50)
  203.         {
  204.       volt++;
  205.           acc=(5.1*volt)/255;
  206.           if(flag==1)
  207.           {
  208.             for(i=0;i<64;i++)
  209.               ds[i]=sin_param[i]*acc;
  210.           }
  211.           else if(flag==2)
  212.           {
  213. ……………………

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

所有资料51hei提供下载(仿真程序):
信号发生器.7z (58.14 KB, 下载次数: 32)
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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