⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 五个按键四个数码管输出pwm的程序.txt

📁 这是一个控制电机的小项目
💻 TXT
字号:
这是我前阵子做的一个控制电机的小项目,功能:

1、通过五个按键控制PWM的输出,同时在四位数码管的后三位上显示占空比。

2、S1为调整—正常转换键,在正常工作时,按S1能进入调整状态,其余键无效。

3、进行调整模式后,S2、S3为左、右移键,使闪烁显示的数码管移动,按位调整。

4、S4、S5为减、加键,使闪烁显示的位上数据变化。

5、最后按S1回到正常工作模式,并存入调整后的数据。

程序文件如下:

//---------------主函数-----------------
void main(void)
    {
 uchar a;
 uchar key;
 
 uint pwm_sj;
 
 DDRA=0xE0;
 PORTA=0x1F;
 DDRB=0xFF;
 PORTB=0xFF;
 DDRC=0xFF;
 PORTC=0x00;
 DDRD=0xF0;
 PORTD=0x0F;
 
 CLI();              //先关闭所有中断
 timer0_init();      //设定定时器
 timer1_init();
 timer2_init();

 MCUCR = 0x00;
 GICR  = 0x00;
 TIMSK = 0x41;        //允许定时器0、定时器1/2中断
 SEI();         //开总中断
 
 led2_on;
 
 eprom_read();      //读出存储的数据
 OCR1A=pwm_zh();      //转换并输出PWM
 
 delay_ms(3000);      //延时3秒
 pow_on;        //开电机电源
 
 while(1)
     {
  if(rdkey!=0)     //如果读按键不为0,有键按下
      {
   key=rdkey;     //先保存按键值
   delay_ms(20);    //延时消抖
   if(rdkey==key)    //如果键值相等:有效按键
       {
    switch(key)    //分别处理
        {
     case 0x01:     //键值为01,S3按下
         if(set_flag==1)  //如果调整标志为1,可调整
          {
       spk(10,1);  //响1短声
          xs_sel--;  //调整闪烁位右移
       if(xs_sel>2)xs_sel=0;//如果已经右移到第一位,不再移
       xs_zh();  //显示数据转换
       }
      break;
      
     case 0x04:     //键值为04,S2按下
         if(set_flag==1)  //如果调整标志为1,可调整
          {
       spk(10,1);  //响1短声
       xs_sel++;  //调整闪烁左移
       if(xs_sel>2)xs_sel=2;//如果已经左移到第四位,不再移
       xs_zh();  //显示数据转换
       }
      break;
      
     case 0x08:     //键值为08,S1按下
         spk(10,1);    //响1短声
      if(set_flag==0)
          {
       set_flag=1;  //置调整标志
       led1_on;  //开LED1
       led2_off;  //关LED2
       xs_zh();  //显示数据转换
       }
      else
          {
       set_flag=0;  //清调整标志:回正常工作状态
       led1_off;  //关LED1
       led2_on;  //开LED2
       xs_zh();  //显示数据转换
       eprom_write();   //将调整后的数据存入
       OCR1A=pwm_zh();  //PWM输出转换
       }
      break;
      
     case 0x20:     //键值为20,S5按下:加调整
         if(set_flag==1)  //如果调整标志为1,可调整
          {
       spk(10,1);  //响1短声
       switch(xs_sel)
           {
        case 0:
            xs[0]++;  //个位调整:加
         if(xs[0]>=10)xs[0]=0;//0-9之间循环
         break;
        case 1:
            xs[1]++;  //十位调整:加
         if(xs[1]>=10)xs[1]=0;//0-9之间循环
         break;
        case 2:
            if(xs[2]==0)  //百位调整:在100%与50%之间转换
             {
          xs[2]=1;
          xs[1]=0;
          xs[0]=0;
          }
         else
             {
          xs[2]=0;
          xs[1]=5;
          xs[0]=0;
          }
         break;
        default:break;
        }
       xs_zh();
       }
      break;
      
     case 0x80:     //键值为80,S4按下:减调整
         if(set_flag==1)  //如果调整标志为1,可调整
          {
       spk(10,1);  //响1短声
       switch(xs_sel)
           {
        case 0:
            xs[0]--;  //个位调整:减
         if(xs[0]>=10)xs[0]=9;//9-0之间循环
         break;
        case 1:
            xs[1]--;  //十位调整:减
         if(xs[1]>=10)xs[1]=9;//9-0之间循环
         break;
        case 2:
            if(xs[2]==0)  //百位调整:在100%与50%之间转换
             {
          xs[2]=1;
          xs[1]=0;
          xs[0]=0;
          }
         else
             {
          xs[2]=0;
          xs[1]=5;
          xs[0]=0;
          }
         break;
        default:break;
        }
       xs_zh();
       }
      break;
      
     default:break;
     }
    }
   while(rdkey!=0)delay_ms(10); //等待按键释放
   }
  }
 }
 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -