找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4418|回复: 1
打印 上一主题 下一主题
收起左侧

单片机产生方波锯齿波三角波程序

[复制链接]
跳转到指定楼层
楼主
ID:200833 发表于 2017-5-15 09:42 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
单片机产生方波锯齿波三角波程序
基于单片机产生方波、锯齿波、三角波程序.doc (34 KB, 下载次数: 8)

  1. #include<reg51.h>

  2. #define uchar unsigned char
  3. #define uint unsigned int

  4. unsigned char x=0,m=0,y=128;

  5. sbit WR_DA=P2^1;
  6. sbit CS_DA=P2^0;//DA与单片机的接口
  7. sbit S0=P3^0; //波形选择,每次按下将产生不同的波形
  8. sbit S1=P3^1; //频率减
  9. sbit S2=P3^2; //频率加
  10. sbit S3=P3^3; //调节方波的占空比

  11. uchar code SinTab[256]={0x80,0x83,0x86,0x89,0x8d,0x90,0x93,0x96,0x99,0x9c,0x9f,0xa2,0xa5,0xa8,0xab,0xae,0xb1,0xb4,0xb7,0xba,0xbc,0xbf,0xc2,0xc5

  12. ,0xc7,0xca,0xcc,0xcf,0xd1,0xd4,0xd6,0xd8,0xda,0xdd,0xdf,0xe1,0xe3,0xe5,0xe7,0xe9,0xea,0xec,0xee,0xef,0xf1,0xf2,0xf4,0xf5

  13. ,0xf6,0xf7,0xf8,0xf9,0xfa,0xfb,0xfc,0xfd,0xfd,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0xfd

  14. ,0xfd,0xfc,0xfb,0xfa,0xf9,0xf8,0xf7,0xf6,0xf5,0xf4,0xf2,0xf1,0xef,0xee,0xec,0xea,0xe9,0xe7,0xe5,0xe3,0xe1,0xde,0xdd,0xda

  15. ,0xd8,0xd6,0xd4,0xd1,0xcf,0xcc,0xca,0xc7,0xc5,0xc2,0xbf,0xbc,0xba,0xb7,0xb4,0xb1,0xae,0xab,0xa8,0xa5,0xa2,0x9f,0x9c,0x99

  16. ,0x96,0x93,0x90,0x8d,0x89,0x86,0x83,0x80,0x80,0x7c,0x79,0x76,0x72,0x6f,0x6c,0x69,0x66,0x63,0x60,0x5d,0x5a,0x57,0x55,0x51

  17. ,0x4e,0x4c,0x48,0x45,0x43,0x40,0x3d,0x3a,0x38,0x35,0x33,0x30,0x2e,0x2b,0x29,0x27,0x25,0x22,0x20,0x1e,0x1c,0x1a,0x18,0x16

  18. ,0x15,0x13,0x11,0x10,0x0e,0x0d,0x0b,0x0a,0x09,0x08,0x07,0x06,0x05,0x04,0x03,0x02,0x02,0x01,0x00,0x00,0x00,0x00,0x00,0x00

  19. ,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x02 ,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0d,0x0e,0x10,0x11,0x13,0x15

  20. ,0x16,0x18,0x1a,0x1c,0x1e,0x20,0x22,0x25,0x27,0x29,0x2b,0x2e,0x30,0x33,0x35,0x38,0x3a,0x3d,0x40,0x43,0x45,0x48,0x4c,0x4e

  21. ,0x51,0x55,0x57,0x5a,0x5d,0x60,0x63,0x66 ,0x69,0x6c,0x6f,0x72,0x76,0x79,0x7c,0x80 };

  22. void delayms(uint t)
  23. {
  24.     uint i;
  25.     while(t--)
  26.     {
  27.        for (i=0;i<125;i++);//对于11.0592M时钟,约延时1ms
  28.     }
  29. }

  30. void delay(uint t)
  31. {
  32.     uint i;
  33.     for (i=t;i>0;i--);
  34. }


  35. void time0_init()
  36. {
  37.     TMOD|=0x01;   //定时器设置 16位
  38.     TH0=-50000/256;
  39.     TL0=-50000%256;//初始化值
  40.     ET0=1;
  41.     TR0=1;
  42.     EA=1;
  43. }

  44. void time0_int(void) interrupt 1
  45. {  
  46.     TR0=0;//关闭定时器
  47.     TH0=-50000/256;
  48.     TL0=-50000%256;//重装初值

  49. if(S0==0)
  50. {
  51.      delayms(10);//按键消抖
  52.      if(S0==0) m++;
  53.    while(!S0);//松手检测
  54. }

  55. if(S1==0)
  56. {
  57.      delayms(10);
  58.      if(S1==0) x=x+1;
  59.    while(!S1);//松手检测
  60. }

  61. if(S2==0)
  62. {
  63.      delayms(10);
  64.      if(S2==0) x=x-1;
  65.    while(!S2);//松手检测
  66. }

  67. if(S3==0)
  68. {
  69.      delayms(10);
  70.      if(S3==0) y=y+5;
  71.    while(!S3);//松手检测
  72. }

  73. if(y>254) y=0;
  74. if(m>5) m=0;
  75. if(x>50) x=0;
  76. TR0=1;//启动定时器
  77. }

  78. void fangbo()    //方波
  79. {  
  80.    uchar i,j;
  81.    j=255-y;
  82.    CS_DA=0;
  83.    WR_DA=0;
  84. for(i=y;i>0;i--)
  85. {
  86.     P0=0;
  87.     delay(x);
  88. }

  89. while(j--)
  90. {
  91.     P0=255;
  92.     delay(x);
  93. }   
  94. }

  95. void juchi()    //锯齿波
  96. {
  97.     uchar i;
  98.     CS_DA=0;
  99.     WR_DA=0;
  100. for(i=255;i>0;i--)
  101. {   
  102.      P0=i;
  103.      delay(x);
  104. }

  105. }
  106. void sanjiao()      //三角波
  107. {
  108. uchar i;
  109.     CS_DA=0;
  110.     WR_DA=0;
  111. for(i=0;i<255;i++)
  112. {
  113.      P0=i;
  114.      delay(x);
  115. }
  116. while(i--)
  117. {
  118.     P0=i;
  119.     delay(x);
  120. }
  121. }

  122. void tixing()         //梯形波
  123. {
  124. uchar i=255,j,k;
  125. CS_DA=0;
  126. WR_DA=0;
  127. while(i--)
  128. {
  129.    P0=i;
  130.    delay(x);
  131. }

  132. for(j=0;j<100;j++)
  133. {
  134.    P0=0;
  135.    delay(x);
  136. }

  137. for(k=0;k<255;k++)
  138. {
  139.    P0=k;
  140.    delay(x);
  141. }
  142. }

  143. void sin()      //正弦波
  144. {  
  145. uchar a;  
  146. CS_DA=0;
  147. WR_DA=0;
  148. for(a=0;a<255;a++)
  149. {
  150.    P0=SinTab[a];
  151.    delay(x);
  152. }
  153. }

  154. main()
  155. {
  156. time0_init();
  157. while(1)
  158. {
  159.    switch(m)
  160.    {
  161.      case 0:
  162.      fangbo();    //方波
  163.      break;
  164.      case 1:
  165.      juchi();    //锯齿波
  166.      break;
  167.      case 2:
  168.      sanjiao();   //三角波
  169.      break;
  170.      case 3:
  171.      sin();    //正弦波
  172.      break;
  173.      case 4:
  174.      tixing();    //梯形波
  175.      break;
  176.      default: fangbo();
  177.    }
  178. }
  179. }

复制代码


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:266164 发表于 2018-6-20 22:45 | 只看该作者
此程序我试验了。不可用啊
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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