山药233 2023-04-11 20:36 采纳率: 50%
浏览 30
已结题

51单片机c语言PWM用按键怎么实现周期改变呢?

代码本身没有错,但是按键好像没什么用,实现不了改变周期,刚接触,不知道哪里错了😭,该怎么修改呢

#include<reg52.h>
#include<stdio.h>
sbit P0_0=P0^0;//定义输出波形引脚
sbit K1=P1^0;//增加键
sbit K2=P1^1;//减少键
unsigned char i=0;
unsigned char PWM=123;
void time0() interrupt 1 //内部定时器中断周期5ms
{
 TH0=(65536-2500)/256;
 TL0=(65536-2500)%256;
 P0_0=~P0_0;
}


void main()
{
 TR0=1;
 TMOD=0x21;
 ET0=1;//定时器0中断
 EA=1; //开启总中断
 while(1){ 
 if(K1==0){
 while(K1==0);
 if(PWM!=(65536-2500)/256)
 PWM=PWM+10;
 }
 if(K2==0){
 while(K2==0);
 if(PWM!=(65536-2500)%256)
 PWM=PWM-10;
 } 
 }
}

  • 写回答

1条回答 默认 最新

  • Leodong. 2023-04-11 20:44
    关注

    该回答通过自己思路及引用到GPTᴼᴾᴱᴺᴬᴵ搜索,得到内容具体如下:
    根据您提供的代码,按键检测部分是没有问题的,但是您并没有在按键检测部分修改PWM周期的代码,导致按键无法改变周期。

    要实现按键改变PWM周期,您可以在按键检测部分加入修改PWM周期的代码。具体来说,当检测到按下增加按键时,可以将PWM周期加上一个固定的值;当检测到按下减少按键时,可以将PWM周期减去一个固定的值。修改后的代码如下所示:

    #include <reg52.h>
    
    sbit P0_0 = P0^0;  //定义输出波形引脚
    sbit K1 = P1^0;    //增加键
    sbit K2 = P1^1;    //减少键
    
    unsigned char PWM = 123;
    
    void time0() interrupt 1 //内部定时器中断周期5ms
    {
      TH0 = (65536-2500) / 256;
      TL0 = (65536-2500) % 256;
      P0_0 = ~P0_0;
    }
    
    void main()
    {
      TR0 = 1;
      TMOD = 0x21;
      ET0 = 1;  //定时器0中断
      EA = 1;   //开启总中断
    
      while (1) { 
        if (K1 == 0) {
          while (K1 == 0);
          if (PWM < 245) {
            PWM += 10;
          }
        }
        if (K2 == 0) {
          while (K2 == 0);
          if (PWM > 10) {
            PWM -= 10;
          }
        } 
        TH1 = (65536 - PWM) / 256;
        TL1 = (65536 - PWM) % 256;
      }
    }
    

    在修改PWM周期的代码中,您可以使用TH1TL1寄存器设置PWM周期。具体来说,将PWM周期的高8位赋值给TH1寄存器,将PWM周期的低8位赋值给TL1寄存器。在本例中,使用的是定时器1来产生PWM波形,因此修改PWM周期的代码如下所示:

    TH1 = (65536 - PWM) / 256;
    TL1 = (65536 - PWM) % 256;
    

    通过在按键检测部分加入修改PWM周期的代码,您就可以实现按键改变PWM周期的功能了。


    如果以上回答对您有所帮助,点击一下采纳该答案~谢谢

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 4月19日
  • 已采纳回答 4月11日
  • 创建了问题 4月11日

悬赏问题

  • ¥15 Stata链式中介效应代码修改
  • ¥15 latex投稿显示click download
  • ¥15 请问读取环境变量文件失败是什么原因?
  • ¥15 在若依框架下实现人脸识别
  • ¥15 网络科学导论,网络控制
  • ¥100 安卓tv程序连接SQLSERVER2008问题
  • ¥15 利用Sentinel-2和Landsat8做一个水库的长时序NDVI的对比,为什么Snetinel-2计算的结果最小值特别小,而Lansat8就很平均
  • ¥15 metadata提取的PDF元数据,如何转换为一个Excel
  • ¥15 关于arduino编程toCharArray()函数的使用
  • ¥100 vc++混合CEF采用CLR方式编译报错