当前位置:文档之家› 个人总结的AVR的ATMEGA16L单片机程序

个人总结的AVR的ATMEGA16L单片机程序

ATMAGE 16 的C语言程序ATMAGE 16 的C语言程序 (1)一、PB0 口的PB0.1 LED 发光管闪烁的程序: (3)二、PA0、PB0、PC0口的LED 发光管闪烁的程序: (5)三、I/O口的输入与输出 (6)四、跑马灯 (8)五、数码管计数显示设计 (10)六、控制直流电机正反转 (16)七、单片机的定时器(T/C0)应用 (20)AVR原理图 (24)一、PB0 口的PB0.1 LED 发光管闪烁的程序:#include <avr/io.h>int main( void ){unsigned char i, j, k,led=0;DDRB=0xFF; /* all outputs */while (1){if(led)PORTB|=0X01; /* |使最后一位为1 */elsePORTB&=0XFE; /*&最后一位为0 */ led=!led;//延时for (i=0; i<255; i++)for(j=0; j<255;j++)k++;}}/////////////////////////////////////////////////////////////// #include <avr/io.h>int main( void ){unsigned char i, j, k,led=0;DDRB=0xFF; /* all outputs */while (1){if(led)PORTB=0Xfe;elsePORTB=0Xff;led=!led;for (i=0; i<255; i++) //延时for(j=0; j<255;j++)k++;}}二、PA0、PB0、PC0口的LED 发光管闪烁的程序:#include <avr/io.h>int main( void ){unsigned char i, j, k,led=0;DDRA=0xFF;//为输出DDRB=0xFF;DDRC=0XFF;while (1){if(led){PORTA|=0XFF;PORTB|=0XFF;PORTC|=0XFF;}else{PORTA&=0X00;PORTB&=0X00;PORTC&=0X00;}led=!led;//取反////////////延时////////////////for (i=0; i<255; i++)for(j=0; j<255;j++)k++;}}三、I/O口的输入与输出#include <avr/io.h>///////////////////延时us//////////////////void delay_us(int t){dot--;while(t>1);}///////////////////延时ms///////////////// void delay_ms(unsigned int t){while(t!=0){delay_us(1142);t--;}}///////////////////主程序/////////////////////int main(void){DDRA = 0xff; /* all outputs */ DDRB = 0xff; /* all outputs */ DDRC = 0xff; /* all outputs */PORTA=0XFF;PORTB=0XFF;PORTC=0XFF;while(1){//***IO口输出低电平有效,如:0X01为十六进制数,二进制表示为00000001B,再取反////////A口输出//////PORTA=~0X01; // ~表示取反delay_ms(100);//延时N秒PORTA=~0X02;delay_ms(100);PORTA=~0X04;delay_ms(100);PORTA=~0X08;delay_ms(100);PORTA=~0X10;delay_ms(100);PORTA=~0X20;delay_ms(100);PORTA=~0X40;delay_ms(100);PORTA=~0X80;delay_ms(100);PORTA=0X00;//循环结束全亮////////B口输出//////PORTB=~0X01;delay_ms(100);PORTB=~0X02;delay_ms(100);PORTB=~0X04;delay_ms(100);PORTB=~0X08;delay_ms(100);PORTB=~0X10;delay_ms(100);PORTB=~0X20;delay_ms(100);PORTB=~0X40;delay_ms(100);PORTB=~0X80;delay_ms(100);PORTB=0X00;////////C口输出//////PORTC=~0X01;delay_ms(100);PORTC=~0X02;delay_ms(100);PORTC=~0X04;delay_ms(100);PORTC=~0X08;delay_ms(100);PORTC=~0X10;delay_ms(100);PORTC=~0X20;delay_ms(100);PORTC=~0X40;delay_ms(100);PORTC=~0X80;delay_ms(100);PORTC=0X00;}}四、跑马灯#include <avr/io.h>#define uchar unsigned char#define uint unsigned intvoid delayms(uint i){uint j;for(;i!=0;i--){for(j=8000;j!=0;j--);}}void horse(uchar i){switch (i){case 1:PORTB=0X01;break; case 2:PORTB=0X03;break; case 3:PORTB=0X07;break; case 4:PORTB=0X0f;break; case 5:PORTB=0X1f;break;case 6:PORTB=0X3f;break; case 7:PORTB=0X7f;break; case 8:PORTB=0Xff;break; default:break;}}void main(void){uchar i;DDRB=0XFF;PORTB=0XFF;PORTB=0X00;delayms(10);while(1){for(i=1;i<9;i++){horse(i);delayms(10);}for(i=7;i!=0;i--){horse(i);delayms(10);}}五、数码管计数显示设计1、两个按键PB0和PB1分别控制加减。

2、计数值为0~99993、PA口控制显示,PC口控制选通。

//////////////////////////// 程序(1)///////////////////////////#include <avr/io.h>#define uchar unsigned char#define uint unsigned intuchar table[10]={0xFC,0x60,0xDA,0xF2,0x66,0xB6,0xBE,0xE0,0xFE,0xF6}; uint cnt=1234;//计数初值0uchar key_up;uchar key_down;void delayms(uint i)//延时{uint j;for(;i!=0;i--){for(j=8000;j!=0;j--);}}void delayus(uint i)//延时{uint j;for(;i!=0;i--){for(j=100;j!=0;j--);}}void Led() //显示函数{uchar m=2;//消隐延时PORTC=0xfe; //输出低电平,选通千位数PORTA=table[cnt/1000]; //取出千位数,查表,输出。

delayus(m); //延时PORTA=0x00; //数码销隐PORTC=0xff; //销隐PORTC=0xfd; //输出低电平,选通百位数PORTA=table[cnt%1000/100]; //取出百位数,查表,输出。

delayus(m); //延时PORTA=0x00; //数码销隐PORTC=0xff; //销隐PORTC=0xfb; //输出低电平,选通十位数PORTA=table[cnt%100/10]; //取出十位数,查表,输出。

delayus(m); //延时PORTA=0x00; //数码销隐PORTC=0xff; //销隐PORTC=0xf7;PORTA=table[cnt%10]; //取出个位数,查表,输出。

delayus(m);PORTA=0x00; //数码销隐PORTC=0xff;}void init_io(void)//初始化I/O{//设置A口为输出DDRA=0Xff;PORTA=0xff;//设置B口为输入DDRB=0x00;PORTB=0x00;//设置C口为输出DDRC=0Xff;PORTC=0xff;}void jianyan(void)//检查数码管uchar m=20;//设置延时时间PORTA=0xFC;//0PORTC=0x00;delayms(m);PORTA=0x60;//1PORTC=0x00;delayms(m);PORTA=0xDA;//2PORTC=0x00;delayms(m);PORTA=0xF2;//3PORTC=0x00;delayms(m);PORTA=0x66;//4PORTC=0x00;delayms(m);PORTA=0xB6;//5PORTC=0x00;delayms(m);PORTA=0xBE;//6PORTC=0x00;delayms(m);PORTA=0xE0;//7PORTC=0x00;delayms(m);PORTA=0xFE;//8PORTC=0x00;delayms(m);PORTA=0xF6;//9PORTC=0x00;delayms(m);PORTA=0xFC;//0PORTC=0x00;delayms(m);}void get_key(void)//按键扫描函数{while((PINB&0X01)==0)//按键加计数标志{key_up=1;Led();}while((PINB&0X02)==0)//按键减计数标志{key_down=1;Led();}void main(void){init_io();//初始化I/Ojianyan();//检查数码管PORTA=0xff;//点亮所有数码管PORTC=0x00;delayms(3);//PORTC=0xff;//关闭所有数码管while(1){get_key();//按键扫描if (key_up==1){if(cnt!=9999)//判断是否计数到9999{cnt=cnt+1;//加一key_up=0;}}if (key_down==1){if(cnt!=0)//判断是否计数到0{cnt=cnt-1;//减一key_down=0;}}Led();}}//////////////////////////// 程序(2)///////////////////////////#include <avr/io.h>#define uchar unsigned char#define uint unsigned int//uchar table[10]={0xFC,0x60,0xDA,0xF2,0x66,0xB6,0xBE,0xE0,0xFE,0xF6};//共阴uchar table[10]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};//共阳uint cnt=0;//计数初值uchar key_up;uchar key_down;void delayms(uint i)//延时uint j;for(;i!=0;i--){for(j=8000;j!=0;j--);}}void delayus(uint i)//延时{uint j;for(;i!=0;i--){for(j=100;j!=0;j--);}}void Led(uint i) //显示函数{uchar m=10;//消隐延时PORTB=0x80; //输出低电平,选通百位数PORTC=table[i%1000/100]; //取出百位数,查表,输出。

相关主题