久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 6137|回復(fù): 3
收起左側(cè)

一個簡單的PWM產(chǎn)生器頻率占空比可調(diào) 單片機程序及仿真

[復(fù)制鏈接]
ID:151171 發(fā)表于 2016-11-30 10:59 | 顯示全部樓層 |閱讀模式
廢話不多說直接上程序仿真圖
0.png

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

單片機源程序:
  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ù)碼管的顯示
  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)                       //停止輸出波形才能進行調(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;  //計算一個周期所需要的計數(shù)值
  101.     high = (tmp*dc)/100;      //計算高電平所需要的計數(shù)值
  102.     low  = tmp - high;          //計算低電平所需要的計數(shù)值
  103.     high = 65536 - high + 12;   //計算高電平的重載值并補償中斷延時
  104.     low  = 65536 - low  + 12;   //計算低電平的重載值并補償中斷延時
  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;        //啟動T0
  115.           EA = 1;     //開關(guān)總使能
  116.     PWMOUT=1;     //輸出高電平
  117. }
  118. /*關(guān)閉PWM */
  119. void ClosePWM()
  120. {
  121.     TR0 =0;     //停止定時器
  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ù)制代碼

評分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

回復(fù)

使用道具 舉報

ID:372402 發(fā)表于 2018-8-31 14:01 | 顯示全部樓層
好東西,謝謝分享,學(xué)習(xí)了~
回復(fù)

使用道具 舉報

ID:372402 發(fā)表于 2018-9-1 10:19 | 顯示全部樓層
請問樓主使用什么軟件仿真?我用Proteus仿真會閃退~
回復(fù)

使用道具 舉報

ID:521024 發(fā)表于 2019-5-23 09:11 | 顯示全部樓層
這個是Proteus仿真嘛
回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 久久久久国色av免费观看性色 | 国产精品欧美一区二区三区 | 成人亚洲精品久久久久软件 | 国产999精品久久久久久 | 综合久久av| 色综合一区二区三区 | 久久精品免费看 | 一区二区三区成人 | 欧美在线综合 | av中文字幕在线观看 | 午夜视频网站 | 在线视频亚洲 | 国产精品久久av | 日韩精品免费一区二区在线观看 | 欧美一级片a | 精品久久精品 | 99精品欧美一区二区三区 | www.成人免费视频 | 欧美一区二区二区 | 日韩高清中文字幕 | 亚洲激情一区二区 | 久久国产精品视频免费看 | 欧美日韩视频在线播放 | 亚洲国产精品va在线看黑人 | 夜夜爽99久久国产综合精品女不卡 | 九九九精品视频 | 99精品九九| 欧美九九 | 欧美成人一区二区三区片免费 | 国内精品视频在线观看 | 国产精品日韩欧美一区二区三区 | 欧美日韩久| 欧美激情精品久久久久久 | 亚洲成人一区二区三区 | 你懂的av| 日本精品免费 | 免费看欧美一级片 | 国产精品视频偷伦精品视频 | 亚洲免费观看视频 | 波多野结衣精品在线 | 午夜免费视频 |