
希望大家帮我看一下AVR单片机的一段程序,主控是ATmega16
用的是ICCVA这是我编的程序:可是使用ATmega16主控使八个流水灯以一秒闪一次,我不知道怎样编才能使八个流水灯按照顺序接到PD0~PD7引脚上#include<io...
用的是ICCVA
这是我编的程序:可是使用ATmega16主控使八个流水灯以一秒闪一次,我不知道怎样编才能使八个流水灯按照顺序接到PD0~PD7引脚上
#include<iom16v.h>
const unsigned char dis[]={0x01,0x03,0x07,0x0f,0x1f,0x3f,0x7f,0xff};
void delay(unsigned char x)//延迟函数
{unsigned char i,j;
for(i=0;i<x;i++)
for(j=0;j<1140;j++);
}
void main(void)
{unsigned char n;
DDRA=0xff;
while(1)
{
for(n=0;n<8;n++)
{PORTA=dis[n];
delay(1000);
}
for(n=7;n>1;n--)
{PORTA=dis[n];
delay(1000);
}
}
}
怎样改啊?谢谢大家 展开
这是我编的程序:可是使用ATmega16主控使八个流水灯以一秒闪一次,我不知道怎样编才能使八个流水灯按照顺序接到PD0~PD7引脚上
#include<iom16v.h>
const unsigned char dis[]={0x01,0x03,0x07,0x0f,0x1f,0x3f,0x7f,0xff};
void delay(unsigned char x)//延迟函数
{unsigned char i,j;
for(i=0;i<x;i++)
for(j=0;j<1140;j++);
}
void main(void)
{unsigned char n;
DDRA=0xff;
while(1)
{
for(n=0;n<8;n++)
{PORTA=dis[n];
delay(1000);
}
for(n=7;n>1;n--)
{PORTA=dis[n];
delay(1000);
}
}
}
怎样改啊?谢谢大家 展开
展开全部
如果是高电平点亮:
const unsigned char dis[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
如果是低电平:
const unsigned char dis[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
const unsigned char dis[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
如果是低电平:
const unsigned char dis[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
展开全部
;
void main(void)
{
PORTB=0x00;
DDRB=0x0E;
// T/C1 初始化
TCCR1A=0xA1;
TCCR1B=0x09; //匹配时清零,TOP:255,频率:8M/256=31.25K
OCR1A=85; //占空比:1/3
OCR1B=128; //占空比:1/2
// T/C2 初始化
TCCR2=0x69; //匹配时清零,TOP:255,频率:31.25K
OCR2=170; //占空比:2/3
while (1);
}
使用M16产生三路PWM的程序,参考一下基本OK
还有个是可调节的PWM程序,我做过仿真了,需要全部留下邮箱传给你;
/*****************************************************
#define KEY PINC.0
#define PWMA PORTB.3 //17号脚
#define PWMB PORTB.4 //18号脚
#include <mega8.h>
#include <delay.h>
#include <math.h>
unsigned int m=0;
unsigned char xiangxian=0;
bit INIT2=0; //判断是否象限2已经初始化;
bit INIT3=0;
bit INIT4=0;
/*下面为四个象限中处理函数,参数为45度平分为255段角度*/
inline panduan()
{
if(m<=255)
{
xiangxian=1;
}
else if((m>255)&&(m<511))
{
xiangxian=2;
if(m==256)
{
INIT2=1;
PWMA=0;
OCR1A=0x00;
OCR1B=0xff;
PWMB=1;
}
}
else if((m>=511)&&(m<767))
{
xiangxian=3;
}
else if((m>=767)&&(m<1024))
{
xiangxian=4;
}
else if(m>1024)
{
m=0;
}
}
void xiangxian1(unsigned char degree)
{
PWMA=0;
PWMB=0;
OCR1BL=m;
OCR1AL=255-m;
}
void xiangxian2(unsigned char degree)
{ unsigned char temp;
temp=m-255;
OCR1AL=temp;
OCR1BL=temp;
}
void xiangxian3(unsigned char degree)
{
unsigned char temp;
temp=m-511;
PWMA=1;
PWMB=1;
OCR1BL=255-temp;
OCR1AL=temp;
}
void xiangxian4(unsigned char degree)
{unsigned char temp=0;
temp=m-767;
PWMA=1;
PWMB=0;
OCR1BL=255-temp;
OCR1AL=255-temp;
}
/*角度计算函数,负责计算在各个象限中角度对应的PWM输出*/
void SET_ANGLE( unsigned char degree)
{
switch (xiangxian)
{
case 1: xiangxian1(degree);break;
case 2: xiangxian2(degree);break;
case 3: xiangxian3(degree);break;
case 4: xiangxian4(degree);break;
default:break;
}
}
void main(void)
{
unsigned char temp;
unsigned char xiangxian=0;
// Declare your local variables here
PORTB=0x187;
DDRB=0x1e;
// Port C initialization
// Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State6=T State5=T State4=T State3=T State2=T State1=T State0=P
PORTC=0x01;
DDRC=0x00;
// Port D initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=Out Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=0 State1=T State0=T
PORTD=0x00;
DDRD=0x04;
// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: Timer 0 Stopped
TCCR0=0x00;
TCNT0=0x00;
// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: 1000.000 kHz
// Mode: Fast PWM top=01FFh
// OC1A output: Inverted
// OC1B output: Inverted
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer 1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
TCCR1A=0xF1;
TCCR1B=0x01;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;
// Timer/Counter 2 initialization
// Clock source: System Clock
// Clock value: Timer 2 Stopped
// Mode: Normal top=FFh
// OC2 output: Disconnected
ASSR=0x00;
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;
// External Interrupt(s) initialization
// INT0: Off
// INT1: Off
MCUCR=0x00;
// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x00;
// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;
SFIOR=0x00;
PWMA=0;
PWMB=0;
OCR1AL=0xff;
OCR1BL=0x00;
while (1)
{
if(KEY==0)
{
delay_ms(20);
if(KEY==0)
{
m=m+1;
panduan();
SET_ANGLE(m);
PORTD.2=!PORTD.2;
}
}
};
}
void main(void)
{
PORTB=0x00;
DDRB=0x0E;
// T/C1 初始化
TCCR1A=0xA1;
TCCR1B=0x09; //匹配时清零,TOP:255,频率:8M/256=31.25K
OCR1A=85; //占空比:1/3
OCR1B=128; //占空比:1/2
// T/C2 初始化
TCCR2=0x69; //匹配时清零,TOP:255,频率:31.25K
OCR2=170; //占空比:2/3
while (1);
}
使用M16产生三路PWM的程序,参考一下基本OK
还有个是可调节的PWM程序,我做过仿真了,需要全部留下邮箱传给你;
/*****************************************************
#define KEY PINC.0
#define PWMA PORTB.3 //17号脚
#define PWMB PORTB.4 //18号脚
#include <mega8.h>
#include <delay.h>
#include <math.h>
unsigned int m=0;
unsigned char xiangxian=0;
bit INIT2=0; //判断是否象限2已经初始化;
bit INIT3=0;
bit INIT4=0;
/*下面为四个象限中处理函数,参数为45度平分为255段角度*/
inline panduan()
{
if(m<=255)
{
xiangxian=1;
}
else if((m>255)&&(m<511))
{
xiangxian=2;
if(m==256)
{
INIT2=1;
PWMA=0;
OCR1A=0x00;
OCR1B=0xff;
PWMB=1;
}
}
else if((m>=511)&&(m<767))
{
xiangxian=3;
}
else if((m>=767)&&(m<1024))
{
xiangxian=4;
}
else if(m>1024)
{
m=0;
}
}
void xiangxian1(unsigned char degree)
{
PWMA=0;
PWMB=0;
OCR1BL=m;
OCR1AL=255-m;
}
void xiangxian2(unsigned char degree)
{ unsigned char temp;
temp=m-255;
OCR1AL=temp;
OCR1BL=temp;
}
void xiangxian3(unsigned char degree)
{
unsigned char temp;
temp=m-511;
PWMA=1;
PWMB=1;
OCR1BL=255-temp;
OCR1AL=temp;
}
void xiangxian4(unsigned char degree)
{unsigned char temp=0;
temp=m-767;
PWMA=1;
PWMB=0;
OCR1BL=255-temp;
OCR1AL=255-temp;
}
/*角度计算函数,负责计算在各个象限中角度对应的PWM输出*/
void SET_ANGLE( unsigned char degree)
{
switch (xiangxian)
{
case 1: xiangxian1(degree);break;
case 2: xiangxian2(degree);break;
case 3: xiangxian3(degree);break;
case 4: xiangxian4(degree);break;
default:break;
}
}
void main(void)
{
unsigned char temp;
unsigned char xiangxian=0;
// Declare your local variables here
PORTB=0x187;
DDRB=0x1e;
// Port C initialization
// Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State6=T State5=T State4=T State3=T State2=T State1=T State0=P
PORTC=0x01;
DDRC=0x00;
// Port D initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=Out Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=0 State1=T State0=T
PORTD=0x00;
DDRD=0x04;
// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: Timer 0 Stopped
TCCR0=0x00;
TCNT0=0x00;
// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: 1000.000 kHz
// Mode: Fast PWM top=01FFh
// OC1A output: Inverted
// OC1B output: Inverted
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer 1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
TCCR1A=0xF1;
TCCR1B=0x01;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;
// Timer/Counter 2 initialization
// Clock source: System Clock
// Clock value: Timer 2 Stopped
// Mode: Normal top=FFh
// OC2 output: Disconnected
ASSR=0x00;
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;
// External Interrupt(s) initialization
// INT0: Off
// INT1: Off
MCUCR=0x00;
// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x00;
// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;
SFIOR=0x00;
PWMA=0;
PWMB=0;
OCR1AL=0xff;
OCR1BL=0x00;
while (1)
{
if(KEY==0)
{
delay_ms(20);
if(KEY==0)
{
m=m+1;
panduan();
SET_ANGLE(m);
PORTD.2=!PORTD.2;
}
}
};
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询
广告 您可能关注的内容 |