专注电子技术学习与研究
当前位置:单片机教程网 >> MCU设计实例 >> 浏览文章

AVR CTC模式波形输出实验

作者:佚名   来源:本站原创   点击数:  更新时间:2013年10月30日   【字体:

注:频率为488HZ  既 64分频 8us计数一次 256次即2048ns  ==2.048ms   所以频率488HZ

      CTC模式   比较匹配我设置为置位  当定时器值==OCR0  输出口为高电平,然后定时器自动清零重新计数开始如此反复。

       输出电压为占空比值。一下是源码:
#include <iom16.h>
#include <intrinsics.h>
#define uchar unsigned char
#define uint unsigned int
__flash uchar seg[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,  //段码
  0x7f,0x6f};
__flash uchar tab[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};   //位选码
int wide=0;     //比较匹配设置变量

void delay(uint k)           //延时k ms子程序
{
 uint i,j;
 for(i=0;i<k;i++)
 for(j=0;j<1140;j++);
}
void show_dat(uint dat)
{
  uchar i=0;
  do
  {
    PORTA=seg[dat%10];
    PORTC=tab[i];
    delay(1);
    PORTA=0xff;
    PORTC=0xff;
    dat=dat/10;
    i++;
  }
  while(dat);
}
void port_init()
{
  PORTA=0xff;
  DDRA=0xff;
  PORTC=0xff;
  DDRC=0xff;
  PORTD=0xff;
  DDRD=0x00;
  PORTB=0xff;
  DDRB=0xff;
}
void time_init()
{
  TCCR0=0x7b;     //CTC模式设置  比较匹配置位
  TCNT0=0x00;     //定时器初值
  OCR0=0x00;      //比较匹配初值
}
void init()
{
  MCUCR=0x0a;
  GICR=0xc0;
  SREG=0x80;
}
void main()
{
  port_init();
 
  init();
  time_init();
  while(1)
  {
    OCR0=wide;
    show_dat(wide);
  }
}
#pragma vector = 0x04
__interrupt void int0()
{
  delay(100);
  wide=wide+10;
  if(wide>255)wide=0;
}
#pragma vector = 0x08
__interrupt void int1()
{
  delay(100);
  wide=wide-10;
  if(wide<0) wide=0;
}
 
  

 

关闭窗口

相关文章