ATMAGE16的C语言程序ATMAGE16的C语言程序..........................................................................................................1一、PB0口的PB0.1LED发光管闪烁的程序:...........................................................4二、PA0、PB0、PC0口的LED发光管闪烁的程序:......................................................6三、I/O口的输入与输出........................................................................................................7四、跑马灯...............................................................................................................................9五、数码管计数显示设计.....................................................................................................11六、控制直流电机正反转.....................................................................................................17七、单片机的定时器(T/C0)应用.....................................................................................22AVR原理图...........................................................................................................................26一、PB0口的PB0.1LED发光管闪烁的程序:#includeavr/io.hintmain(void){unsignedchari,j,k,led=0;DDRB=0xFF;/*alloutputs*/while(1){if(led)PORTB|=0X01;/*|使最后一位为1*/elsePORTB&=0XFE;/*&最后一位为0*/led=!led;//延时for(i=0;i255;i++)for(j=0;j255;j++)k++;}}///////////////////////////////////////////////////////////////#includeavr/io.hintmain(void){unsignedchari,j,k,led=0;DDRB=0xFF;/*alloutputs*/while(1){if(led)PORTB=0Xfe;elsePORTB=0Xff;led=!led;//延时for(i=0;i255;i++)for(j=0;j255;j++)k++;}}二、PA0、PB0、PC0口的LED发光管闪烁的程序:#includeavr/io.hintmain(void){unsignedchari,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;i255;i++)for(j=0;j255;j++)k++;}}三、I/O口的输入与输出#includeavr/io.h///////////////////延时us//////////////////voiddelay_us(intt){dot--;while(t1);}///////////////////延时ms/////////////////voiddelay_ms(unsignedintt){while(t!=0){delay_us(1142);t--;}}///////////////////主程序/////////////////////intmain(void){DDRA=0xff;/*alloutputs*/DDRB=0xff;/*alloutputs*/DDRC=0xff;/*alloutputs*/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;}}四、跑马灯#includeavr/io.h#defineucharunsignedchar#defineuintunsignedintvoiddelayms(uinti){uintj;for(;i!=0;i--){for(j=8000;j!=0;j--);}}voidhorse(uchari){switch(i){case1:PORTB=0X01;break;case2:PORTB=0X03;break;case3:PORTB=0X07;break;case4:PORTB=0X0f;break;case5:PORTB=0X1f;break;case6:PORTB=0X3f;break;case7:PORTB=0X7f;break;case8:PORTB=0Xff;break;default:break;}}voidmain(void){uchari;DDRB=0XFF;PORTB=0XFF;PORTB=0X00;delayms(10);while(1){for(i=0;i9;i++){horse(i);delayms(10);}for(i=7;i!=0;i--){horse(i);delayms(10);}}}五、数码管计数显示设计PB0(T0)1PB1(T1)2PB2(AIN0)3PB3(AIN1)4PB4(SS)5PB5(MOSI)6PB6(MISO)7PB7(SCK)8RESET9PD0(RXD)14PD1(TXD)15PD2(INT0)16PD3(INT1)17PD4(OC1B)18PD5(OC1A)19PD6(ICP)20PD7(OC2)21XTAL212XTAL113GND11PC022PC123PC224PC325PC426PC527PC6(TOSC1)28PC7(TOSC2)29AREF32AVCC30AGND31PA7(ADC7)33PA6(ADC6)34PA5(ADC5)35PA4(ADC4)36PA3(ADC3)37PA2(ADC2)38PA1(ADC1)39PA0(ADC0)40VCC10U1ATMEGA16+5V10KR1+5V10UFC5S1S2S310KR210KR3+5v12Y18.00M22pFC122pFC2A1B2C3D4E5F6G7DP8C19C210C311C412*DS1ABCDEFGDPC1C2C3C41、两个按键PB0和PB1分别控制加减。2、计数值为0~99993、PA口控制显示,PC口控制选通。////////////////////////////程序(1)///////////////////////////#includeavr/io.h#defineucharunsignedchar#defineuintunsignedintuchartable[10]={0xFC,0x60,0xDA,0xF2,0x66,0xB6,0xBE,0xE0,0xFE,0xF6};uintcnt=1234;//计数初值0ucharkey_up;ucharkey_down;voiddelayms(uinti)//延时{uintj;for(;i!=0;i--){for(j=8000;j!=0;j--);}}voiddelayus(uinti)//延时{uintj;for(;i!=0;i--){for(j=100;j!=0;j--);}}voidLed()//显示函数{ucharm=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;}voidinit_io(void)//初始化I/O{//设置A口为输出DDRA=0Xff;PORTA=0xff;//设置B口为输入DDRB=0x00;PORTB=0x00;//设置C口为输出DDRC=0Xff;PORTC=0xff;}voidjianyan(void)//检查数码管{ucharm=20;//设置延时时间PORTA=0xFC;//0PORTC=0x00;delayms(m);PORTA=0