新闻中心

EEPW首页>嵌入式系统>设计应用> AVR单片机PWM试验程序

AVR单片机PWM试验程序

作者: 时间:2016-11-30 来源:网络 收藏

此图电压输出位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];
}
}

上一页 1 2 下一页

评论


技术专区

关闭