标题: 占空比,频率可调PWM波发生器程序 [打印本页]

作者: asmaxwell    时间: 2018-12-26 13:09
标题: 占空比,频率可调PWM波发生器程序
占空比和频率都可调的两对互补的pwm波,其中由四个按钮来分别控制占空比和频率的加减

  1. #include<reg52.h>
  2. #define uint unsigned int
  3. #define uchar unsigned char
  4.   uint shiwan,wan,qian,bai,shi,ge;
  5. //uint D[]={shiwan,wan,qian,bai,shi,ge};
  6. uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x80}; //共阴极数码管段码表
  7. //uchar code wei[]={0xdf,0xef,0xf7,0xfb,0xfd,0xfe};
  8. uint a, b,f=500;
  9.         sbit P1_0=P1^0;
  10.         sbit P1_1=P1^1;
  11.         sbit SegSel=P2^6;                                                        //段选
  12.     sbit BitSel=P2^7;
  13.         sbit P3_6=P3^6;
  14.         sbit P3_7=P3^7;
  15.         void delay_ms(uint x)
  16. {
  17.         uint i,j;
  18.         for(i=x;i>0;i--)
  19.         for(j=240;j>0;j--)
  20.         ;
  21. }
  22. /*void show()
  23. {
  24.         uint i;
  25.         for(i=0;i<6;i++)
  26.         {
  27.                 BitSel=1;P0=wei[i];BitSel=0;SegSel=1;P0=table[D[i]];SegSel=0;delay_ms(1);
  28.         }
  29. }  */
  30. void display(uint a,uint b,uint c,uint d,uint e,uint f) //数码管显示函数
  31.          {
  32.          P2=0xfe;
  33.          P0=table[f];
  34.          delay_ms(2);
  35.          P2=0xfd;
  36.          P0=table[e];
  37.          delay_ms(2);
  38.          P2=0xfb;
  39.          P0=table[d];
  40.          delay_ms(2);
  41.          P2=0xf7;
  42.          P0=table[c];
  43.          delay_ms(2);
  44.          P2=0xef;
  45.          P0=table[b];
  46.          delay_ms(2);
  47.          P2=0xdf;
  48.          P0=table[a];
  49.          delay_ms(2);
  50.          }
  51.     //------------------------------------------
  52.     void main()
  53.     {
  54.              TMOD = 0x01;                 //T0定时方式1
  55.              TH0 = (65536-100000/f) / 256;   //50ms@12MHz
  56.              TL0 = (65536-100000/f) % 256;
  57.              TR0 = 1;

  58.              ET0 = 1;
  59.              EX0 = 1; EX1 = 1;
  60.              IT0 = 1; IT1 = 1;
  61.              EA = 1;

  62.              a = 0;
  63.              b = 5;
  64.                          if(P3_6==1)
  65.                          f=f-500;
  66.                         
  67.                          if(P3_7==1)
  68.                          f=f+500;
  69.                          if(f<500)
  70.                          f=500;
  71.                          if(f>9500)
  72.                      f=9500;
  73.                          shiwan=b/10;
  74.                          wan=table[9];
  75.                          qian=b%10;
  76.                          bai=f/1000;
  77.                          shi=table[9];
  78.                          ge=f%1000/100;
  79.              display(ge,shi,bai,qian,wan,shiwan);
  80.              while(1);
  81.     }
  82.     //------------------------------------------
  83.     void time0() interrupt 1
  84.     {
  85.              TL0 = (65536-100000/f) % 256;
  86.              TH0 = (65536-100000/f) / 256;   //50ms@12MHz
  87.              a++;
  88.              if(a == 10) a = 0;           //在这里调整周期.
  89.              if(a < b)
  90.                          {P1_0 = 0xff;        //在这里调整占空比.
  91.                                    P1_1 =~P1_0;
  92.                                            }
  93.              else   {
  94.                                 P1_0 = 0x00;
  95.                                 P1_1 =~P1_0;}

  96.     }
  97.     //------------------------------------------
  98.     void X0_INT() interrupt 0
  99.     {
  100.              b++;
  101.              if(b > 10) b = 10;           //占空比等级最大为19
  102.     }
  103.     //------------------------------------------
  104.     void X1_INT() interrupt 2
  105.     {
  106.              b--;
  107.              if(b < 1) b = 1;             //占空比等级最小为1.
  108.     }
复制代码

20181226164105.png (14.04 KB, 下载次数: 92)

原理图

原理图

作者: admin    时间: 2018-12-26 15:41
补全原理图或者详细说明一下电路连接即可获得100+黑币




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1