新聞中心

EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > AVR單片機(jī)PWM試驗(yàn)程序

AVR單片機(jī)PWM試驗(yàn)程序

作者: 時(shí)間:2016-11-30 來(lái)源:網(wǎng)絡(luò) 收藏

此圖電壓輸出位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};//數(shù)碼管碼表
__flash uchar tab[]={0xfe,0xfd,0xfb,0xf7};//數(shù)碼管位選
//---------------------------------
void delaynms(uint k) //延時(shí)k毫秒函數(shù)
{
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() //定時(shí)器設(shè)置函數(shù)
{
TCCR1A=0x83; //升序計(jì)數(shù)比較匹配清零,降序計(jì)數(shù)比較匹配置位
TCCR1B=0x02; //設(shè)置為相位修正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的數(shù)值
scanint1();
scanint0();
x=(long)voltage; 設(shè)置電壓變量
x=(x*5000)/1023; 電壓為5V 分辨率5000設(shè)置
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];
}
}

上一頁(yè) 1 2 下一頁(yè)

評(píng)論


技術(shù)專區(qū)

關(guān)閉