標題: 51單片機如何寫20khz pwm的頻率? [打印本頁]

作者: BilibiliGiao    時間: 2020-5-31 21:17
標題: 51單片機如何寫20khz pwm的頻率?
//20kHz PWM 可調(diào),步進2%。帶顯示,樓主小菜菜上課溜號了頻率不會寫,下面代碼應該是1khz的,該怎么改呢???還請諸位不吝賜教,先行謝過了
  1. /* Main.c file generated by New Project wizard
  2. *
  3. * Created:   周六 5月 30 2020
  4. * Processor: AT89C51
  5. * Compiler:  Keil for 8051
  6. */

  7. #include<reg51.h>


  8. #define uint unsigned int

  9. #define uchar unsigned char

  10. unsigned char num1;

  11. unsigned char dis;

  12. unsigned char code nondis[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//0-9
  13. uchar time;

  14. double count=70; //定義占空比,并初始占空比為70%

  15. sbit PWM=P0^0; //P0^0口輸出PWM

  16. sbit key_add=P3^4; //加的按鍵

  17. sbit key_dec=P3^5; //減的按鍵





  18. void delayxms(uint z); //延時

  19. void Motor_add(); //增加占空比

  20. void Motor_dec(); //減少占空比

  21. void timer0_init(); //定時器0初始化

  22. //顯示函數(shù)
  23.         void display()
  24.         {
  25.         
  26.         
  27.         unsigned char gewei,shiwei,baiwei;
  28.         baiwei=num1/100;
  29.         gewei=num1%10;
  30.         shiwei=(num1/10)%10;
  31.         P2=nondis[gewei];//個位
  32.         P0=0x80;
  33.         delayxms(1);
  34.         P2=0xff;
  35.         P2=nondis[shiwei];//十位
  36.         P0=0x40;
  37.         delayxms(1);
  38.         P2=0xff;
  39.         P2=nondis[baiwei];//百位
  40.         P0=0x20;
  41.         delayxms(1);
  42.         P2=0xff;
  43.         
  44.         }




  45. void main()

  46. {

  47. timer0_init();

  48. delayxms(5);

  49. while(1)

  50. {

  51. Motor_add();

  52. Motor_dec();

  53. num1 = count;
  54. display();//顯示函數(shù)

  55. }

  56. }



  57. //延時xms程序
  58. void delayxms(uint z) //延時xms程序

  59. {

  60. uint x,y;

  61. for(y=z;x>0;x--)

  62. for(y=110;y>0;y--);

  63. }


  64. //加
  65. void Motor_add()

  66. {

  67. if(key_add==0)

  68. {

  69. delayxms(2); //此處時間不能太長,否者會的中斷產(chǎn)生沖突

  70. if(key_add==0)

  71. {

  72. count+=2; //每按一次加速按鍵占空比加2

  73. if(count>=98) //限定占空比上限

  74. {

  75. count=98;

  76. }

  77. }

  78. while(!key_add);

  79. }

  80. }

  81. //減
  82. void Motor_dec()

  83. {

  84. if(key_dec==0)

  85. {

  86. delayxms(2);//此處時間不能太長

  87. if(key_dec==0)

  88. {

  89. count-=2; //每按一次減速按鍵占空比減2

  90. if(count<=25) //限定占空比下限

  91. {

  92. count=25;

  93. }

  94. }

  95. while(!key_dec);

  96. }

  97. }


  98. /***********定時器0初始化***********/

  99. void timer0_init()

  100. {

  101. TMOD=0x01; //定時器0工作于方式1

  102. TH0=(65536-10)/256;

  103. TL0=(65536-10)%256;

  104. TR0=1;

  105. ET0=1;

  106. EA=1;

  107. }


  108. /**************定時0中斷處理******************/

  109. void timer0_int() interrupt 1

  110. {


  111. TR0=0; //設置定時器初值期間,關閉定時器

  112. TH0=(65536-10)/256;

  113. TL0=(65536-10)%256;

  114. TR0=1;


  115. time++;

  116. if(time<count) //count為占空比

  117. {

  118. PWM=1; //輸出高電平

  119. }

  120. else

  121. PWM=0;

  122. if(time>=100)//20khz

  123. {

  124. time=0;

  125. }

  126. }
復制代碼

888.png (180.25 KB, 下載次數(shù): 89)

仿真圖哥哥們

仿真圖哥哥們

作者: wulin    時間: 2020-6-1 07:28
這個程序根本不可能產(chǎn)生1KHz PWM,更不可能改成20KHz PWM 可調(diào)。樓主仔細看看仿真波形就明白。
作者: BilibiliGiao    時間: 2020-6-1 09:27
wulin 發(fā)表于 2020-6-1 07:28
這個程序根本不可能產(chǎn)生1KHz PWM,更不可能改成20KHz PWM 可調(diào)。樓主仔細看看仿真波形就明白。

啊這,要求是占空比可調(diào),頻率20khz,占空比開始是70%圖片中的是調(diào)到50%的。定時了1ms,然后time加100次啊




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