找回密码
 立即注册

QQ登录

只需一步,快速开始

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

51单片机如何写20khz pwm的频率?

[复制链接]
跳转到指定楼层
楼主
//20kHz PWM 可调,步进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. //显示函数
  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();//显示函数

  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); //此处时间不能太长,否者会的中断产生冲突

  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, 下载次数: 88)

仿真图哥哥们

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

使用道具 举报

沙发
ID:213173 发表于 2020-6-1 07:28 | 只看该作者
这个程序根本不可能产生1KHz PWM,更不可能改成20KHz PWM 可调。楼主仔细看看仿真波形就明白。
回复

使用道具 举报

板凳
ID:765181 发表于 2020-6-1 09:27 来自手机 | 只看该作者
wulin 发表于 2020-6-1 07:28
这个程序根本不可能产生1KHz PWM,更不可能改成20KHz PWM 可调。楼主仔细看看仿真波形就明白。

啊这,要求是占空比可调,频率20khz,占空比开始是70%图片中的是调到50%的。定时了1ms,然后time加100次啊
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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