微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > AVR单片机PWM试验程序

AVR单片机PWM试验程序

时间:11-30 来源:互联网 点击:
//本试验输出口为PD5 ,输出电压可以调节0---5V。



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

#include

#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

{

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];

}

}

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top