找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4755|回复: 8
收起左侧

基于51单片机制作的波形发生器Proteus仿真程序

[复制链接]
ID:644560 发表于 2019-12-1 22:16 | 显示全部楼层 |阅读模式
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
51hei.png

单片机源程序如下:
  1. #include<reg51.h>

  2. sbit wr=P3^6;
  3. sbit rd=P3^2;

  4. sbit key0=P1^0;
  5. sbit key1=P1^1;
  6. sbit key2=P1^2;
  7. sbit key3=P1^3;
  8. sbit key4=P1^4;

  9. unsigned char flag;//flag为0、1、2、3、4时分别为正弦波、方波、三角波、梯形波、锯齿波

  10. unsigned char const code ZXB_code[256]={
  11. 0x80,0x83,0x86,0x89,0x8c,0x8f,0x92,0x95,0x98,0x9c,0x9f,0xa2,
  12. 0xa5,0xa8,0xab,0xae,0xb0,0xb3,0xb6,0xb9,0xbc,0xbf,0xc1,0xc4,
  13. 0xc7,0xc9,0xcc,0xce,0xd1,0xd3,0xd5,0xd8,0xda,0xdc,0xde,0xe0,
  14. 0xe2,0xe4,0xe6,0xe8,0xea,0xec,0xed,0xef,0xf0,0xf2,0xf3,0xf4,
  15. 0xf6,0xf7,0xf8,0xf9,0xfa,0xfb,0xfc,0xfc,0xfd,0xfe,0xfe,0xff,
  16. 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0xfe,
  17. 0xfd,0xfc,0xfc,0xfb,0xfa,0xf9,0xf8,0xf7,0xf6,0xf5,0xf3,0xf2,
  18. 0xf0,0xef,0xed,0xec,0xea,0xe8,0xe6,0xe4,0xe3,0xe1,0xde,0xdc,
  19. 0xda,0xd8,0xd6,0xd3,0xd1,0xce,0xcc,0xc9,0xc7,0xc4,0xc1,0xbf,
  20. 0xbc,0xb9,0xb6,0xb4,0xb1,0xae,0xab,0xa8,0xa5,0xa2,0x9f,0x9c,
  21. 0x99,0x96,0x92,0x8f,0x8c,0x89,0x86,0x83,0x80,0x7d,0x79,0x76,
  22. 0x73,0x70,0x6d,0x6a,0x67,0x64,0x61,0x5e,0x5b,0x58,0x55,0x52,
  23. 0x4f,0x4c,0x49,0x46,0x43,0x41,0x3e,0x3b,0x39,0x36,0x33,0x31,
  24. 0x2e,0x2c,0x2a,0x27,0x25,0x23,0x21,0x1f,0x1d,0x1b,0x19,0x17,
  25. 0x15,0x14,0x12,0x10,0xf,0xd,0xc,0xb,0x9,0x8,0x7,0x6,0x5,0x4,
  26. 0x3,0x3,0x2,0x1,0x1,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
  27. 0x0,0x1,0x1,0x2,0x3,0x3,0x4,0x5,0x6,0x7,0x8,0x9,0xa,0xc,0xd,
  28. 0xe,0x10,0x12,0x13,0x15,0x17,0x18,0x1a,0x1c,0x1e,0x20,0x23,
  29. 0x25,0x27,0x29,0x2c,0x2e,0x30,0x33,0x35,0x38,0x3b,0x3d,0x40,
  30. 0x43,0x46,0x48,0x4b,0x4e,0x51,0x54,0x57,0x5a,0x5d,0x60,0x63,
  31. 0x66,0x69,0x6c,0x6f,0x73,0x76,0x79,0x7c
  32. };        //用于生成正弦


  33. unsigned char keyscan()          //键盘扫描函数
  34. {
  35.   unsigned char keyscan_num,temp;

  36.   P1=0xff;
  37.   temp=P1;
  38.   if(~(temp&0xff))
  39.   {
  40.     if(key0==0)
  41.         {
  42.           keyscan_num=1;
  43.         }
  44.         else if(key1==0)
  45.         {
  46.           keyscan_num=2;
  47.         }
  48.         else if(key2==0)
  49.         {
  50.           keyscan_num=3;
  51.         }
  52.         else if(key3==0)
  53.         {
  54.           keyscan_num=4;
  55.         }
  56.         else if(key4==0)
  57.         {
  58.           keyscan_num=5;
  59.         }
  60.         else
  61.         {
  62.           keyscan_num=0;
  63.         }

  64.         return keyscan_num;
  65.   }
  66. }

  67. void init_DA0832()//DA芯片准备函数
  68. {
  69.   rd=0;
  70.   wr=0;
  71. }

  72. void ZXB()//正弦波函数
  73. {
  74.   unsigned int i;
  75.   
  76.   do{
  77.     P2=ZXB_code[i];
  78.         i=i+1;
  79.         }while(i<256);
  80. }

  81. void FB()//方波
  82. {
  83.   EA=1;
  84.   ET0=1;
  85.   TMOD=1;
  86.   TR0=1;
  87.   TH0=0xff;
  88.   TL0=0x83;
  89. }

  90. void SJB()//三角波
  91. {
  92.   P2=0x00;
  93.   do{
  94.     P2=P2+1;
  95.   }while(P2<0xff);
  96.   P2=0xff;
  97.   do{
  98.     P2=P2-1;
  99.   }while(P2>0x00);
  100.   P2=0x00;
  101. }

  102. void JCB()//锯齿波
  103. {
  104.   P2=0x00;
  105.   do{
  106.     P2=P2+1;
  107.   }while(P2<=0xff);
  108. }

  109. void TXB()//梯形波
  110. {
  111.   unsigned char i;

  112.   P2=0x00;
  113.   do{
  114.     P2=P2+1;
  115.   }while(P2<0xff);
  116.   P2=0xff;
  117.   for(i=255;i>0;i--)
  118.   {
  119.     P2=0xff;
  120.   }
  121.   do{
  122.     P2=P2-1;
  123.   }while(P2>0x00);
  124.   P2=0x00;
  125. }

  126. void main()
  127. {
  128.   init_DA0832();
  129.   do
  130.     {
  131.       flag=keyscan();
  132.     }while(!flag);//等待按键按下
  133.   while(1)
  134.   {
  135.     switch(flag)
  136.     {
  137.       case 1:
  138.             do{
  139.               flag=keyscan();
  140.               ZXB();
  141.              }while(flag==1);
  142.             break;
  143.           case 2:
  144.             FB();
  145.             do{
  146.               flag=keyscan();
  147.                   }while(flag==2);
  148.                   TR0=0;
  149.             break;
  150.           case 3:
  151.             do{
  152.               flag=keyscan();
  153.               SJB();
  154.                   }while(flag==3);
  155.             break;
  156.           case 4:
  157.             do{
  158.               flag=keyscan();
  159.               TXB();
  160.                   }while(flag==4);
  161.             break;
  162.           case 5:
  163.             do{
  164.               flag=keyscan();
  165.               JCB();
  166.                   }while(flag==5);
  167.             break;
  168.           default:
  169.             flag=keyscan();
  170.             break;
  171.     }       
  172.   }
  173. }

  174. void timer0(void) interrupt 1
  175. {
  176.   P2=~P2;
  177.   TH0=0xff;
  178.   TL0=0x83;
  179.   TR0=1;
  180. }
复制代码
51hei.png
所有资料51hei提供下载:
波形发生器.zip (93.28 KB, 下载次数: 141)

评分

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

查看全部评分

回复

使用道具 举报

ID:538348 发表于 2019-12-2 17:48 | 显示全部楼层
这个proteus仿真是吧!
回复

使用道具 举报

ID:661291 发表于 2019-12-11 10:10 来自手机 | 显示全部楼层
楼主你的程序能调幅度吗
回复

使用道具 举报

ID:210017 发表于 2019-12-15 23:14 | 显示全部楼层
感谢楼主分享,我下载下来学习学习
回复

使用道具 举报

ID:664813 发表于 2019-12-16 10:31 来自手机 | 显示全部楼层
非常感谢
回复

使用道具 举报

ID:645920 发表于 2020-4-29 21:27 | 显示全部楼层
万分感谢
回复

使用道具 举报

ID:741818 发表于 2020-5-2 12:30 | 显示全部楼层
怎么下载啊楼主
回复

使用道具 举报

ID:763249 发表于 2020-5-28 12:03 来自手机 | 显示全部楼层
马梦圆 发表于 2020-5-2 12:30
怎么下载啊楼主

用黑币下载
回复

使用道具 举报

ID:763249 发表于 2020-5-28 12:04 来自手机 | 显示全部楼层
李胜起 发表于 2019-12-2 17:48
这个proteus仿真是吧!

对的,这个是波形发生器的仿真
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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