亚洲春色中文字幕久久久-三上亚,一吻二脱三床四吻胸,国产真实伦对白视频全集,在线毛片观看,精品成品入口黄网,国产毛aⅴ片久久久,亚洲AV色香蕉一区二区三区老师,萧皇后A级艳片,色情日本视频更新,99久久亚洲精品日本无码

標(biāo)題: 一個(gè)簡(jiǎn)單的PWM產(chǎn)生器頻率占空比可調(diào) 單片機(jī)程序及仿真 [打印本頁(yè)]

作者: a89163930    時(shí)間: 2016-11-30 10:59
標(biāo)題: 一個(gè)簡(jiǎn)單的PWM產(chǎn)生器頻率占空比可調(diào) 單片機(jī)程序及仿真
廢話不多說(shuō)直接上程序仿真圖



仿真工程文件下載:
PWM.rar (25.81 KB, 下載次數(shù): 101)

單片機(jī)源程序:
  1. #include <reg52.h>
  2. unsigned char HighRH = 0;  //高電平重載值的高位
  3. unsigned char HighRL = 0;  //高電平重載值的低位
  4. unsigned char LowRH  = 0;  //低電平重載值的高位
  5. unsigned char LowRL  = 0;  //低電平重載值的低位
  6. unsigned int cnt=0;        //記錄T1中斷次數(shù)
  7. unsigned int i=0;

  8. unsigned char dc=0;//PWM占空比
  9. unsigned char fr=0;  //PWM頻率
  10. unsigned char out=0;  //PWM輸出指示
  11. sbit PWMOUT=P3^7;        //PWM輸出端口
  12. void ConfigPWM();
  13. void ClosePWM();


  14. sbit k0=P1^0;                //占空比+5
  15. sbit k1=P1^1;                //占空比-5
  16. sbit k2=P1^2;                //頻率+
  17. sbit k3=P1^3;                // 頻率-
  18. sbit k4=P1^4;                //輸出PWM
  19. sbit k5=P1^5;                //停止輸出PWM
  20. unsigned char code LEDChar[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};
  21. unsigned char code  LEDBuff[]={0xF7,0xFB,0x7F,0xBF};

  22. void delay(int ms)         //延時(shí)函數(shù)用于數(shù)碼管的顯示
  23. {
  24.         unsigned int x,y;
  25.         for(x=ms;x>0;x--)
  26.                 for(y=110;y>0;y--);
  27. }
  28. void LEDstate()
  29. {
  30.         P0=LEDBuff[0];
  31.         P2=LEDChar[dc%10];
  32.         delay(3);
  33.         P0=LEDBuff[1];
  34.         P2=LEDChar[dc/10];
  35.         delay(3);
  36.         P0=LEDBuff[2];
  37.         P2=LEDChar[fr%10];
  38.         delay(3);
  39.         P0=LEDBuff[3];
  40.         P2=LEDChar[fr/10];
  41.         delay(3);
  42.        

  43. }

  44. void Key(void)
  45. {
  46. if(out==0)
  47.                 {
  48.                   if(k0==0)                       //停止輸出波形才能進(jìn)行調(diào)整
  49.                   {
  50.                           if(dc<100)       //占空比+5
  51.                       dc+=5;
  52.                           while(k0==0);
  53.                   }
  54.                   if(k1==0)           //占空比-5
  55.                   {   
  56.                           if(dc=0)
  57.                            dc-=5;
  58.                           while(k1==0);
  59.                   }
  60.        
  61.                   if(k2==0)                       //頻率+1
  62.                   {
  63.                       fr+=10;
  64.                           while(k2==0);
  65.                   }
  66.                   if(k3==0)         //頻率-1
  67.                   {   
  68.                           if(fr!=0)
  69.                       fr-=10;
  70.                           while(k3==0);
  71.                   }
  72.                 }

  73.                   if(k4        == 0)      //輸出波形
  74.                      out =1;

  75.                   if(k5        == 0)      //停止輸出波形
  76.                      out =0;
  77. }

  78. void main()
  79. {  
  80.        
  81.          
  82.          
  83.     while (1)
  84.     {   
  85.                           LEDstate();
  86.                           Key();
  87.         ConfigPWM();    //調(diào)用PWM配置函數(shù)        
  88.                          /* if(out==0)
  89.                                 ClosePWM();
  90.                         */
  91.       
  92.     }
  93. }
  94. /* 配置PWM,fr頻率,dc-占空比 */
  95. void ConfigPWM()
  96. {   
  97.     unsigned int  high, low;
  98.     unsigned long tmp;
  99.    
  100.     tmp  = (11059200/12)/100/fr;  //計(jì)算一個(gè)周期所需要的計(jì)數(shù)值
  101.     high = (tmp*dc)/100;      //計(jì)算高電平所需要的計(jì)數(shù)值
  102.     low  = tmp - high;          //計(jì)算低電平所需要的計(jì)數(shù)值
  103.     high = 65536 - high + 12;   //計(jì)算高電平的重載值并補(bǔ)償中斷延時(shí)
  104.     low  = 65536 - low  + 12;   //計(jì)算低電平的重載值并補(bǔ)償中斷延時(shí)
  105.     HighRH = (unsigned char)(high>>8); //高電平重載值拆分高低字節(jié)
  106.     HighRL = (unsigned char)high;
  107.     LowRH  = (unsigned char)(low>>8);  //低電平重載值拆分高低字節(jié)
  108.     LowRL  = (unsigned char)low;
  109.     TMOD &= 0xF0;   //清除T0的控制段?
  110.     TMOD |= 0x01;   //T0為模式1
  111.     TH0 = HighRH;   //加載T0重載值
  112.     TL0 = HighRL;
  113.     ET0 = 1;        //使能T0中斷
  114.     TR0 = 1;        //啟動(dòng)T0
  115.           EA = 1;     //開(kāi)關(guān)總使能
  116.     PWMOUT=1;     //輸出高電平
  117. }
  118. /*關(guān)閉PWM */
  119. void ClosePWM()
  120. {
  121.     TR0 =0;     //停止定時(shí)器
  122.     ET0 =0;     //禁止中斷
  123.     PWMOUT=1;  //輸出高電平
  124. }
  125. /* T0中斷服務(wù)程序,產(chǎn)生PWM波 */
  126. void InterruptTimer0() interrupt 1
  127. {
  128.     if (PWMOUT==1)  //當(dāng)輸出為高電平,加載低電平值并輸出低電平
  129.     {
  130.         TH0 = LowRH;
  131.         TL0 = LowRL;
  132.         PWMOUT = 0;
  133.     }
  134.     else              //當(dāng)輸出為低電平,加載高電平值并輸出高電平
  135.     {
  136.         TH0 = HighRH;
  137.         TL0 = HighRL;
  138.         PWMOUT = 1;
  139.     }
  140. }
復(fù)制代碼

作者: 關(guān)外秀才    時(shí)間: 2018-8-31 14:01
好東西,謝謝分享,學(xué)習(xí)了~
作者: 關(guān)外秀才    時(shí)間: 2018-9-1 10:19
請(qǐng)問(wèn)樓主使用什么軟件仿真?我用Proteus仿真會(huì)閃退~
作者: asdfgwqe    時(shí)間: 2019-5-23 09:11
這個(gè)是Proteus仿真嘛




歡迎光臨 (http://www.denmoz.com/bbs/) Powered by Discuz! X3.1