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

📄 putpwm.c~

📁 ATmega16单片机可变脉冲发生器C语言范例
💻 C~
字号:
#include <mega16.h> 

int zkb;
int zq;          
int t1,t2;


// Timer 2 overflow interrupt service routine
interrupt [TIM2_OVF] void timer2_ovf_isr(void)
{
// Reinitialize Timer 2 value
//每次触发为20微秒
TCNT2=0xEC;           //反转值,理论值为0xEC 但是实测值为0xEF  有点没搞懂  ??

  if((--zq)==0)
  {      
    PORTB^=0B00000001;    //PORTB.0 反转  
    if(PORTB.0==1){
      zq=t1; 
    }else
    {
      zq=t2;
    }          
  }
}

// Declare your global variables here
void delay_1ms(void); //函数声明,本实验中会用到这两个函数
void delay_nms(unsigned int n);   


void main(void)
{             
int aa=20;     

/*初始化参数*/
zkb=1500;    
t1=zkb/20;        
t2=(20000-zkb)/20; 
zq=t1;

/********************************************/
 
PORTB=0x00;
DDRB=0x00;
DDRB.0=1;      //置为输出

PORTB.0=1;

// Timer/Counter 2 initialization
// Clock source: System Clock
// Clock value: 1000.000 kHz
// Mode: Normal top=FFh
// OC2 output: Disconnected
ASSR=0x00;
TCCR2=0x02;
TCNT2=0xEF;
OCR2=0x00;

// Timer(s)/Counter(s) Interrrupt(s) initialization
TIMSK=0x40;

// Global enable interrupts
#asm("sei")

while (1)
      { 
        //下面是测试代码
        delay_nms(150); 
        zkb+=aa;
        if(zkb==500||zkb==2500){    //标准应该是1000至2000
          aa=-aa;          
          delay_nms(500);
        }
        t1=zkb/20;        
        t2=(20000-zkb)/20;
        
      }
}     

void delay_1ms(void)//1ms延时函数
{
  unsigned int i;
  for (i=0;i<150;i++)
  {
  } 
}   

void delay_nms(unsigned int n)//延时n毫秒
{
  unsigned int i;
  for (i=0;i<n;i++)//执行n次1毫秒延时
  delay_1ms(); 
}

⌨️ 快捷键说明

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