搜档网
当前位置:搜档网 › AVR单片机ATmega128程序参考

AVR单片机ATmega128程序参考

ATmege128单片机初学者奋战一星期成果~~纪念一哈~~

ATmega128 晶振频率 16MHz 使用TS8900-M128学习板

1)IO输入输出

LED亮灯

1.#include

void Delay(unsigned int T)
{
unsigned int i,j;
for (i=0;ifor (j=0;j<100;j++)
asm volatile ("nop"); //汇编指令,让单片机运行空指令
}

void main()
{
DDRA=0XFF;
//DDRA=0B11111111; //定义PA端口全为输出

DDRE = 0x04;
PORTE= 0X04;//开发板控制LED时需要PE2使能端置1
while (1)
{
PORTA=0X00;
Delay(1000);
PORTA=0XFF;
Delay(1000);
}
}附LED游戏5个:1.#include
#include

void delay(unsigned int T)
{
unsigned int i,j;
for (i=0;ifor (j=0;j<100;j++)
asm volatile("nop");
}

unsigned long exptwo(unsigned int n)
{
unsigned int j;
unsigned long t=1;
if (n==0) {return 1;}
else
for (j=1;j<=n;j++) t*=2;

return t;
}

void main()
{
int i;

DDRA=0XFF;
DDRE=0X04;
PORTE=0X04;

PORTA=0XFF;

while(1)
{
for (i=0;i<=7;i++)
{
delay(1000);
PORTA=0XFF-exptwo(i);
delay(1000);
}
for (i=7;i>=0;i--)
{
delay(1000);
PORTA=0XFF-exptwo(i);
delay(1000);
}
}

}2.#include

void Delay(unsigned int T)
{
unsigned int i,j;
for (i=0;ifor (j=0;j<1000;j++)
asm volatile ("nop");
}

void main()
{
unsigned int k;
DDRA=0B11111111;
DDRE = 0X04;
PORTE= 0X04;
PORTA= 0X00;
k=0x00;
while (1)
{
Delay(1000);
if (k!=0xff)
{k++;
PORTA=k;
}
else k=0x00;
Delay(1000);
}
}3.#include
#include
void delay(unsigned int T)
{
unsigned int i,j;
for (i=0;ifor (j=0;j<100;j++)
asm volatile("nop");
}

void main()
{
DDRA=0XFF;

DDRE=0X04;
PORTE=0X04;
PORTA=0X00;
int k=0x00;
int i=0;
while(1)
{
if (i<=7)
{
if (i==0)
{
k+=1;
delay(1000);
PORTA=k;
delay(1000);
}
else
{
int j;
long t=1;
for (j=1;j<=i;j++) t*=2;
k+=t;
delay(1000);
PORTA=k;
delay(1000);
}
i++;
}
else
{
i=0;
delay(1000);
PORTA=0x00;
delay(1000);
k=0x00;
}
}
}4.#include
#include

void delay(unsigned int T)
{
unsigned int i,j;
for (i=0;ifor (j=0;j<100;j++)
asm volatile("nop");
}

unsigned long exptwo(unsigned int n)
{
unsigned int j;
unsigned long t=1;
if (n==0) {return 1;}
else
for (j=1;j<=n;j++) t*=2;

return t;
}

void main()
{
int i,j,k,t;

DDRA=0XFF;
DDRE=0X04;
PORTE=0X04;

PORTA=0XFF;
while(1)
{
for (t=1;t<=8;t++)
{
k=0X00;
for (i=0;i<=6+t;i++)
{
k=0X00;
for (j=i;j>=i-t+1;j--)
if ((j<=7)&&(j>=0)) k=k+exptwo(j);
delay(1000);
PORTA=0XFF-k;
delay(1000);
}
}

PORTA=0XFF;

for (t=7;t>=1;t--)
{
k=0X00;
for (i=0;i<=6+t;i++)
{
k=0X00;
for (j=i;j>=i-t+1;j--)
if ((j<=7)&&(j>=0)) k=k+exptwo(j);
delay(1000);
PORTA=0XFF-k;
delay(1000);
}
}
}
}5.#include
#include

void delay(unsigned int T)
{
unsigned int i,j;
for (i=0;ifor (j=0;j<100;j++)
asm volatile("nop");
}

unsigned long exptwo(unsigned int n)


{
unsigned int j;
unsigned long t=1;
if (n==0) {return 1;}
else
for (j=1;j<=n;j++) t*=2;

return t;
}

void main()
{
int i,j,k,t;

DDRA=0XFF;
DDRE=0X04;
PORTE=0X04;

PORTA=0XFF;
while(1)
{
for (t=1;t<=8;t++)
{
k=0X00;
for (i=0;i<=6+t;i++)
{
k=0X00;
for (j=i;j>=i-t+1;j--)
if ((j<=7)&&(j>=0)) k=k+exptwo(j);
delay(1000);
PORTA=0XFF-k;
delay(1000);
}
for (i=6+t;i>=0;i--)
{
k=0X00;
for (j=i;j>=i-t+1;j--)
if ((j<=7)&&(j>=0)) k=k+exptwo(j);
delay(1000);
PORTA=0XFF-k;
delay(1000);
}
}

PORTA=0XFF;

for (t=7;t>=2;t--)
{
k=0X00;
for (i=0;i<=6+t;i++)
{
k=0X00;
for (j=i;j>=i-t+1;j--)
if ((j<=7)&&(j>=0)) k=k+exptwo(j);
delay(1000);
PORTA=0XFF-k;
delay(1000);
}
for (i=6+t;i>=0;i--)
{
k=0X00;
for (j=i;j>=i-t+1;j--)
if ((j<=7)&&(j>=0)) k=k+exptwo(j);
delay(1000);
PORTA=0XFF-k;
delay(1000);
}
}
}
}蜂鸣器#include

void delay(unsigned int t)
{
unsigned int i,j;

for (i=1;ifor (j=1;j<100;j++)
asm volatile ("nop");
}

int main()
{
DDRG=0XFF;
PORTG=0X00;

while (1)
{
unsigned int i,j;
for (i=1;i<=3;i++)
{
for (j=1;j<=i;j++)
{
delay(1000);
PORTG=0X10;
delay(1000);
PORTG=0X00;
delay(1000);
}
delay(10000);
}
}

return 0;

} 键盘输入 1.#include

void delay(unsigned int t)
{
unsigned int i,j;

for (i=1;ifor (j=1;j<10;j++)
asm volatile ("nop");
}

int main()
{

DDRE=0X04;
PORTE=0X04;

DDRA=0XFF;
delay(100);
PORTA=0XFF;
delay(100);

DDRD=0X00;

while(1)
{
unsigned char a;
a=PIND;
delay(100);
PORTA=0XFF;
delay(100);
PORTA=a;
delay(100);
PORTA=0XFF;
delay(100);
}

return 0;
}#include

void delay(unsigned int t)
{
unsigned int i,j;

for (i=1;ifor (j=1;j<10;j++)
asm volatile ("nop");
}

int main()
{

DDRE=0X04;
PORTE=0X04;

DDRA=0XFF;
delay(100);
PORTA=0XFF;
delay(100);

DDRD=0X00;

while(1)
{
unsigned char a;
a=PIND;

delay(1000);
if (0xff-a==0b10010001)//之所以为0b10010001与学习板电路有关,不同的外设可能不同 {
delay(100);
PORTA=0X00;
delay(100);
}
if (0xff-a==0b10010010)
{
delay(100);
PORTA=0XFF;
delay(100);
}
}

return 0;
}2)溢出中断 1.#include
#include//中断头文件

volatile int ovf_flag=0;//加volatile后变量才可以在中断服务函数中赋值;

int main()
{
DDRA|=0X01;//DDRA=DDRA|0X01 好处是可以只给A0引脚赋值为输出状态;
PORTA|=0X01;

TCCR1B|=0x04;//设置16位寄存器1为内置256分频,意思是晶振频率乘以1000除以256;
//TCCR1B指的是定时器/寄存器1的控制寄存器B,bit0~bit2为控制定时器/寄存器1的始终选择;
//见ATmage128使用手册P122;

TCNT1=31250;//TCNT1为定时器/寄存器1;
//TCNT1H=0X7A;TCNT1L=0X12同理,为对定时器/寄存器1进行初始化设定;
//7A12是16进制的31250;
//见ATmage128使用手册P125;

TIMSK|=0x04;//bit2=1;
//TIMSK为定时器/计

数器中断屏蔽寄存器;
//bit2=1是为允许溢出中断;

sei();//开中断函数;

while(1)
{
if (ovf_flag)
{
TCNT1=31250;//溢出中断后,TCNT1置数为0;
PORTA^=0X01;//^=位异或,PA口求反;
ovf_flag=0;
}
}

return 0;
}

ISR(TIMER1_OVF_vect)//中断服务函数,TIMER1_OVF是中断服务名称
{
ovf_flag=1;
}2.#include
#include

volatile int ovf_flag=0;

unsigned long exptwo(unsigned int n)
{
unsigned int j;
unsigned long t=1;
if (n==0) {return 1;}
else
for (j=1;j<=n;j++) t*=2;

return t;
}

int main()
{
DDRA=0XFF;
PORTA=0XFF;

TCCR1B|=0x04;

TCNT1=34285;

TIMSK|=0x04;

sei();

unsigned int i=0;
unsigned int a=0;
while(1)
{
if (ovf_flag)
{
TCNT1=34285;
a+=exptwo(i);
PORTA=0XFF-a;
ovf_flag=0;
i++;
if (i>7)
{
i=0;
a=0;
}
}
}

return 0;
}

ISR(TIMER1_OVF_vect)
{
ovf_flag=1;
}3.#include
#include

volatile int ovf_flag=0;

unsigned long exptwo(unsigned int n)
{
unsigned int j;
unsigned long t=1;
if (n==0) {return 1;}
else
for (j=1;j<=n;j++) t*=2;

return t;
}

int main()
{
DDRA=0XFF;
PORTA=0XFF;

TCCR1B|=0x04;

TCNT1=34285;

TIMSK|=0x04;

sei();

unsigned int i=0;
while(1)
{
if (ovf_flag)
{
TCNT1=34285;
PORTA=0XFF-exptwo(i);
ovf_flag=0;
i++;
if (i>7) i=0;
}
}

return 0;
}

ISR(TIMER1_OVF_vect)
{
ovf_flag=1;
}3)PWM设置 快速PWM#include
#include

int main()
{
DDRB|=0X20;//设置PWM波形输出,与PB5口相连,详见OCR1A=15625一句的注释

DDRE=0X04;
PORTE=0X04;

DDRA=0XFF;
PORTA=0XFF;

TCCR1A|=0X82;//定时器/计数器1的控制寄存器A
//0x82中8是指COM1A1 COM1A0置为10,即比较匹配时OCn置0;
//0x82中2是指WGM11 WGM10置为10与下方控制寄存器A一同控制选择快速PWM模式

TCCR1B|=0X1C;//定时器/计数器1的控制寄存器B;
//0x1c中1c是指将WGM13 WGM12置为11,CS12 CS11 CS10置为100
//WGM13 WGM12 WGM11 WGM10为1110时,选择快速PWM格式;
//CS12 CS11 CS10置为100表示选择256分频模式;

ICR1=62499;//设置TOP值,指当计数器1计数到62499(即256分频后一秒内最大计数量为62500,
//因需1个计数时间为OCn置1,所以TOP值应计到62499,如此,PWM波形的周期为1秒)
OCR1A=15625;//设置匹配值,当达到15625时OCn置0,以此调节占空比,15625即为只有1/4的时间为高电平
//这里选用的是A比较匹配寄存器,所以此时OCn与PB5相接,若为OCR1B则OCn与PB6相接
sei();

return 0;
}相位与频率修正PWM #include

int main()
{
DDRB|=0X20;//设置PWM波形输出,与PB5口相连,详见OCR1A=15625一句的注释

DDRE=0X04;
PORTE=0X04;

DDRA=0XFF;
PORTA=0XFF;

TCCR1A|=0X80;//定时器/计数器1的控制寄存器A
//0x82中8是指COM1A1 COM1A0置为10,即比较匹配时OCn置0;
//0x82中0是指WGM11 WGM10置为00与下方控制寄存

器A一同控制选择相位与频率修正PWM模式

TCCR1B|=0X14;//定时器/计数器1的控制寄存器B;
//0x1c中14是指将WGM13 WGM12置为10,CS12 CS11 CS10置为100
//WGM13 WGM12 WGM11 WGM10为0010时,选择相位与频率修正PWM格式;
//CS12 CS11 CS10置为100表示选择256分频模式;

ICR1=31249;//设置TOP值,指当计数器1计数到62499(即256分频后一秒内最大计数量为62500,
//因需1个计数时间为OCn置1,所以TOP值应计到62499,如此,PWM波形的周期为1秒)
OCR1A=15625;//设置匹配值,当达到15625时OCn置0,以此调节占空比,15625即为只有1/4的时间为高电平
//这里选用的是A比较匹配寄存器,所以此时OCn与PB5相接,若为OCR1B则OCn与PB6相接
sei();

return 0;
}下面这个程序,以为实验室设备有限,不能验证是否正确,如果发现错误,请指正~#include
#include

volatile int i=1;

int main()
{
DDRB|=0X20;

DDRE=0X04;
PORTE=0X04;

DDRA=0XFF;
PORTA=0XFF;

TCCR1A|=0X82;

TCCR1B|=0X1B;

TIMSK|=0X10;

ICR1=624;

OCR1A=i*125;

sei();

return 0;
}

ISR(TIMER1_COMPA_vect)
{
if (i<4) i++;
else i=1;
}4)ADC数模转换 1.#include
#include

void delay(unsigned int t)
{
unsigned int i,j;

for (i=1;ifor (j=1;j<1000;j++)
asm volatile ("nop");
}

void Ready()
{
PORTA=0X00;
DDRA|=(1<SFIOR|=(1<//路复用器为模拟比较器选择负极输入。当此位为"0” 时, AIN1 连接到比较器的负极输入端。
//上意为当 SFIOR 为1时模拟信号由PF0输入
//之所以为PF0输入,是因为ADC多路复用器由寄存器ADMUX控制,且当其设定MUX4..0为0000时
//为单端PF0输入
ACSR|=(1<ADCSRA|=(0<ADMUX|=(0<DDRE=0X04;
PORTE=0X04;
}

int main()
{
int i=0;
Ready();
while(1)
{
i++;
PORTA=0XFF;
if (i==1) PORTA|=(1<else
{
PORTA|=(0<i=0;
}
if (ACSR&(1<//与时若为0则说明ACO位不为1,若大于0,则为1;
{
PORTA|=(1<}
else PORTA|=(1<delay(1000);
}

return 0;
}2.#include
#include

void delay(unsigned int t)
{
unsigned int i,j;

for (i=1;ifor (j=1;j<1000;j++)
asm volatile ("nop");
}

void Ready()
{
PORTA=0X00;
DDRA|=(1<SFIOR|=(1<ACSR|=(1<DDRE=0X04;
PORTE=0X04;
ADCSRA|=(0<ADMUX|=(1<DDRF=0XFF;
}

int main()
{
Ready();
while(1)
{
PORTA=0X00;
if (ACSR&(1<{
PORTA|=(1<}
else PORTA|=(1<d

elay(1000);
}

return 0;
}5)USART(RS232串口数据通信) 1.#include
#include //延时头文件
#include

void ADCready()
{
PORTF=0X00;
DDRF=0X00;//设置划变的输出电压输入进ADC
ADMUX|=(1<ADMUX|=(0<ADCSRA|=(1<ADCSRA|=(1<
}

void RSready()
{
//DDRE=0B00000010;
UCSR0A=0X00;//RXCn TXCn接收/发送结束不置位,即此时不接收/发送结束中断
//此端,非接收/发送结束中断使能,而是当置1时,进行接收/发送结束中断的意思;
//是否可以进行接收/发送结束中断取决于UCSRnB中的RXCIEn TXCIEn位(接收/发送结束中断使能);
//UDREn数据寄存器空标志初始值为1;U2Xn置0;
UCSR0C|=(0<//USBSn置0,停止位的位数置为1位;UCSZn2..0设置字符长度,为011时为8位
UBRR0H=0;
UBRR0L =103;//波特率设置为103,H为高4位,L为低8位
//UBRR的大小取决于晶振频率和所需的波特率以及UCSR0A中U2Xn位的设置有关
//本例中晶振频率为16M,设置波特率为9600,U2Xn设为0,所以可通过查表知为103(见P180)
UCSR0B|=(1<//RXENn TXENn设置接收/发送使能
}

void Getchar(unsigned char chr)
{
while(!(UCSR0A&(1<UDR0=chr;//将数据输入至UDRnI/O数据寄存器(即为,USART接收/发送数据缓冲寄存器)
//当UDRn为空时,即UDREn为1时可以接受数据,在主从机接收数据时使用;
}


void Getstring(unsigned char *s)
{
while (*s)
{
Getchar(*s++);
}
Getchar(0x0D);
Getchar(0x0A);
}

unsigned long ADrunning()
{
ADCSRA|=(1<while(!(ADCSRA&(1<ADCSRA&=~(1<
return ADCH*256+ADCL;
}

int main(void)
{
ADCready();
RSready();

Getstring("ADC to RS232 Program");
Getstring("The voltage that get from ADC0 is :");

sei();

int Delay3s;

while(1)
{
long ADData=ADrunning()*5010/1024;

Getchar(ADData/1000+0x30);
Getchar('.');
Getchar(ADData%1000/100+0x30); //加0x30为在高4位加上0011,再加上后四位,及数字大小即为对应的ASCII码
Getchar(ADData%100/10+0x30);
Getchar(ADData%10+0x30);
Getchar('V');

Getchar(0x0d);
Getchar(0x0a);//输出回车

for(Delay3s=0;Delay3s<30;Delay3s++)
{
_delay_ms(90);//延时函数
}

}

return 0;
}

ISR(USART0_RX_vect)//接收中断的标志
{
unsigned char Rev;
Rev=UDR0;
Getchar(Rev);
}
下面这是一个综合实例: #include

.h>
#include

volatile unsigned char Rev=0;

void delay(unsigned int T)
{
unsigned int i,j;
for (i=0;ifor (j=0;j<100;j++)
asm volatile("nop");
}

unsigned long exptwo(unsigned int n)
{
unsigned int j;
unsigned long t=1;
if (n==0) {return 1;}
else
for (j=1;j<=n;j++) t*=2;

return t;
}

void ADCready()
{
PORTF=0X00;
DDRF=0X00;
ADMUX|=(1<ADMUX|=(0<ADCSRA|=(1<ADCSRA|=(1<
}

void RSready()
{
UCSR0A=0X00;
UCSR0C|=(0<UBRR0H=0;
UBRR0L =103;
UCSR0B|=(1<}

void Getchar(unsigned char chr)
{
while(!(UCSR0A&(1<UDR0=chr;
}


void Getstring(unsigned char *s)
{
while (*s)
{
Getchar(*s++);
}
Getchar(0x0D);
Getchar(0x0A);
}

unsigned long ADrunning()
{
ADCSRA|=(1<while(!(ADCSRA&(1<ADCSRA&=~(1<
return (ADCL+ADCH*256);
}

void LightLED()
{
int i,j,k,t;

DDRA=0XFF;
DDRE=0X04;
PORTE=0X04;

PORTA=0XFF;
while(Rev!=8)
{
for (t=1;t<=8;t++)
{
k=0X00;
for (i=0;i<=6+t;i++)
{
k=0X00;
for (j=i;j>=i-t+1;j--)
if ((j<=7)&&(j>=0)) k=k+exptwo(j);
delay(1000);
PORTA=0XFF-k;
delay(1000);
}
for (i=6+t;i>=0;i--)
{
k=0X00;
for (j=i;j>=i-t+1;j--)
if ((j<=7)&&(j>=0)) k=k+exptwo(j);
delay(1000);
PORTA=0XFF-k;
delay(1000);
}
}

PORTA=0XFF;

for (t=7;t>=2;t--)
{
k=0X00;
for (i=0;i<=6+t;i++)
{
k=0X00;
for (j=i;j>=i-t+1;j--)
if ((j<=7)&&(j>=0)) k=k+exptwo(j);
delay(1000);
PORTA=0XFF-k;
delay(1000);
}
for (i=6+t;i>=0;i--)
{
k=0X00;
for (j=i;j>=i-t+1;j--)
if ((j<=7)&&(j>=0)) k=k+exptwo(j);
delay(1000);
PORTA=0XFF-k;
delay(1000);
}
}
}
}

void Sound()
{
DDRG=0XFF;
PORTG=0X00;

while (Rev!=8)
{
unsigned int i,j;
for (i=1;i<=3;i++)
{
for (j=1;j<=i;j++)
{
delay(1000);
PORTG=0X10;
delay(1000);
PORTG=0X00;
delay(1000);
}
delay(10000);
}
}
}

void ADCmain()
{
ADCready();

while(Rev!=8)
{
long ADData=0;

long t=ADrunning()*5010/1024;
if (ADData!=t)
{
ADData=t;
Getchar(ADData/1000+0x30);
Getchar('.');
Getchar(ADData%1000/100+0x30);
Getchar(ADData%100/10+0x30);
Getchar(ADData%10+0x30);
Getchar('V');

Getchar(0x0d);
Getchar(0x0a);
}
}
}

int main(void)
{
RSready();
DDRE=0X04;
PORTE=0X04;
DDRA=0XFF;
PORTA=0XFF;

sei();

Getstring("Welcome!");
Getstring("Please choose Orders:");
Getstring("1- Get ADC date");
Getstring("2- Light LED");
Getstring("3- Sound");
Getchar(0x0D);
Getchar(0x0A);
Getstring("8- Break");
Getstring("9- Stop");
Getchar(0x0D);
Getchar(0x0A);

while(1)
{
if (Rev-0x30==1)
{
ADCmain();
}
if (Rev-0x30==2)
{
LightLED();
}
if (Rev-0x30==3)
{
Sound();
}
}

return 0;
}

ISR(USART0_RX_vect)
{
Rev=UDR0;
Getchar(Rev);
Getchar(0x0D);
Getchar(0x0A);

if (Rev-0x30==9)
{
DDRA=0XFF;
PORTA=0XFF;
ADCSRA|=(1<Getstring("Good Bye!");
UCSR0B|=(0<

}
}

相关主题