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

AVR单片机PWM试验程序

作者:佚名   来源:本站原创   点击数:  更新时间:2013年10月30日   【字体:
//本试验输出口为PD5 ,输出电压可以调节0---5V。


 

 

 


 

此图电压输出位0.6V
以下是程序源码可从http://www.51hei.com/f/avrpwmcx.rar 下载源文件.


// ATMEGA16 晶振8MHZ
#include <iom16.h>
#define uchar unsigned char
#define uint unsigned int
#define xtal 8
__flash uchar seg7[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//数码管码表
__flash uchar tab[]={0xfe,0xfd,0xfb,0xf7};//数码管位选
//---------------------------------
void delaynms(uint k)   //延时k毫秒函数
{
  uint i,j;
  for(i=0;i<k;i++)
  {
    for(j=0;j<1140;j++);
  }
}

 
uint wide;             //脉冲宽度

 
void portinit()        //端口初始化
{
  DDRA=0xff;
  PORTA=0xff;
  DDRC=0xff;
  PORTC=0xff;
  DDRB=0xff;
  PORTB=0xff;
  DDRD=0xff;
  PORTD=0xff;
}

 
void time1init()     //定时器设置函数
{
  TCCR1A=0x83;       //升序计数比较匹配清零,降序计数比较匹配置位 
  TCCR1B=0x02;       //设置为相位修正PWM模式,选择8分频
}

 
void initdevice()
{
  portinit();
  time1init();
}

 
void scanint1()      //PD3口按下,脉宽增加
{
  if((PIND&0x08)==0)
  {
    delaynms(10);
    if((PIND&0x08)==0)
    {
      if(wide<1023)wide++;  脉宽最大增加到1023
    delaynms(200);
    }
  }
}

 
void scanint0()     //PD2按下,脉宽减少
{
  if((PIND&0x04)==0)
  {
    delaynms(10);
    if((PIND&0x04)==0)
    {
      if(wide>0)wide--;
    delaynms(200);
    }
  }
}

 

 
void main(void)
{
  long x;
  uint voltage;
  initdevice();
  delaynms(100);
  while(1)
  {
    voltage=wide;
    OCR1AH=(uchar)(wide>>8);  脉宽取低8位
    OCR1AL=(uchar)(wide&0xff);脉宽低8位和高8位组合成比较匹配器A的数值
    scanint1();
    scanint0();
    x=(long)voltage;           设置电压变量
    x=(x*5000)/1023;           电压为5V 分辨率5000设置
    voltage=(uint)x;
    PORTA=seg7[voltage/1000];
    PORTC=tab[3];
    PORTA=seg7[voltage%1000/100];
    PORTC=tab[2];
    PORTA=seg7[voltage%100/10];
    PORTC=tab[1];
    PORTA=seg7[voltage%10];
    PORTC=tab[0];
  }
}

 
 
关闭窗口

相关文章