powtran 发表于 2011-3-7 17:46:14

AVR利用CTC模式输出方波程序

请教马老师:利用AVR单片机CT1,外部晶振7.3728M,PD4脚输出10HZ--320HZ方波,PA0、PA1口接2个按键,按下PA0频率增加,按下PA1频率减少,程序如下,请各位帮忙修改一下。

#include <iom16v.h>
#include <macros.h>
#defineuchar unsigned char
#defineuintunsigned int

void delay(uint ms)
{
      uint i,j;
for(i=0;i<ms;i++)
    {
    for(j=0;j<1141;j++);
       }
}

uchar key_press()            // 检测有没有按键按下
{
    uchar a;
    DDRA|=0X03;            //将PA0、PA1设置为输出
PORTA|=0X03;             //PA0、PA1输出1

DDRA&=0XFC;            //PA0、PA1设置为输入

a=PINA;                  //将PA口的值读入a
a=a&0X03;                //0000 0011,检测PA0、PA1有没有按下
if(a==0X03)
{
   return 0;            //如果PA0、PA1没有变化,表示没有按键按下
}
else
{
return 1;               //表示有按键按下
}

}


void data_change(void)
{
   uint e;uchar key;
   OCR1A=e;
   delay(10);                  //按键消抖
if(key_press())
{
   key=PINA;                //PA口的值读入KEY中
   key&=0X03;               //取PA0、PA1状态
   switch(key)
       {
          case 0X0E:
            key=1;         //频率值增加
   if(key=1;e<=47000);
   {
   e=e-400;
   }
   else
   {
      e=47000;
   }
   break;
          case 0X0D:
            key=2;      //频率值减少
         if(key=2;e>=143);
   {
   e=e+400;
   }
   else
   {
   e=140;
   }
   break;
       default:
       key=0;
      }
    while(key_press());       //等待按键松开
}
    else
   {
      key=0;
   }
   return key;
}

void main()
{
   uchar b,c;
   DDRD|=0X30;          //将PD4、PD5设置为输出
   
   TCCR1A=0X50;         //OC1A,OC1B输出相同波形
   TCCR1B=0X09;         //无预分频
   
   0CR1A=46079;          //设置初始频率10HZ
   
while(1)
{
   b=key_press();
   if(b)
   {
      //c=key_scan();
   data_change();
   }
}
   
   
}

machao 发表于 2011-3-8 11:06:08

还是建议你买本我的教材从基础认真学习。里面都有。
本教材的前2篇在本拦可以下载电子版的,觉的好再买。

powtran 发表于 2011-3-18 11:35:57

马老师,我把程序改了一下,编译没有问题,但是按下按键频率值没有改变,仿真按键部分程序没有问题,就是OCR1A的值不变,请帮忙看看,谢谢!
程序如下:
   #include <iom16v.h>
#include <macros.h>
#defineuchar unsigned char
#defineuintunsigned int

void Delay(uint ms)
{
      uint i,j;
        for(i=0;i<ms;i++)
           {
           for(j=0;j<1141;j++);
       }
}

uchar key_press()            // 检测有没有按键按下
{
    uchar a;
    DDRA|=0X0F;            //将PA0、PA1设置为输出
        PORTA|=0X0F;             //PA0、PA1输出1
       
        DDRA&=0XF0;            //PA0、PA1设置为输入
       
        a=PINA;                  //将PA口的值读入a
        a=a&0X0F;                //0000 0011,检测PA0、PA1有没有按下
        if(a==0X0F)
        {
          return 0;            //如果PA0、PA1没有变化,表示没有按键按下
        }
        else
        {
       return 1;               //表示有按键按下
        }
       
}


void data_change()
{
   uint e;uchar key;
   //e=47000;
   Delay(10);                  //按键消抖
        if(key_press())
        {
          key=PINA;                //PA口的值读入KEY中
          key=key&0X0F;            //取PA0、PA1状态
          
             if(key==0X0E)         //频率值增加
                {            
                       e=e-400;
                           }
             if(key==0X0D)       //频率值减少
                {
                       e=e+400;
                     }
                  if(e>=47000)
                  {
                     e=47000;
                  }       
              if(e<=140)
                  {
                     e=140;
                     }          
           while(key_press());              //等待按键松开
          
       }
       OCR1A=e;   
}

void main()
{
   uint b,f;
   DDRD|=0X30;          //将PD4、PD5设置为输出
   
   TCCR1A=0X50;         //OC1A,OC1B输出相同波形
   TCCR1B=0X0A;         //8分频
   
   OCR1A=47000;          //设置初始频率10HZ
   
while(1)
        {
          b=key_press();
          if(b)
          {
             data_change();
           }
        }
   
   
}

powtran 发表于 2011-3-22 17:37:46

自己已经改好了,谢谢!
页: [1]
查看完整版本: AVR利用CTC模式输出方波程序