原创 LED流水灯仿真

2008-7-2 21:15 4552 8 8 分类: MCU/ 嵌入式

ATMEGA32第一个学习例子:


学单片机得先弄懂它的IO口,所以第一个例子先以控制IO口的输出。最好的方法就是做个LED流水灯。<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />


LED灯的连接定义如下:


led1---PORTD.5,       led2--PORTD.4,     


led3---PORTD.3,       Led4---PORTD.2,      


led5---PORTB.7,       led6---PORTB.6,


Led7---PORTB.5,       led8---PORTB.4,    


led9---PORTB.3,       led10---PORTB.2,   


led11---PORTB.1,      led12---PORTB.0.


程序如下:


//ICC-AVR application builder : 2008-07-02 下午 03:28:23
// Target : M32
// Crystal: 8.0000Mhz


#include
#include
#define  uchar unsigned char 


void port_init(void) //端口定义
{
 PORTA = 0x00;       //低电平
 DDRA  = 0xFF;       //输出
 PORTB = 0x00;       //低电平
 DDRB  = 0xFF;       //输出
 PORTC = 0x00;
 DDRC  = 0x00;
 PORTD = 0x00;
 DDRD  = 0x3C;
}


void init_devices(void)
{
 //stop errant interrupts until set up
 CLI(); //disable all interrupts
 port_init();


 MCUCR = 0x00;
 GICR  = 0x00;
 TIMSK = 0x00; //timer interrupt sources
 SEI(); //re-enable interrupts
 //all peripherals are now initialized
}


//1微秒延时
void delay_1us(void)
{      uchar i="8";
       asm("nop");
        i--;
}
//长微秒延时
void delay_nus(uchar t)
{ while(t--)
  delay_1us();
}
//1毫秒延时
void delay_1ms(void)
{
  delay_nus(1000);
}
//长毫秒延时
void delay_nms(uchar t)
{ while(t--)
  delay_1ms();
}
//定义LED等
void led_out(void)
{  uchar i;
   for(i=1;i<5;i++)
   {PORTD|=BIT(6-i);
   delay_nms(500);}
   for(i=5;i<13;i++)
   {PORTB|=BIT(12-i);
   delay_nms(500);}
   for(i=12;i>4;i--)
   {
    PORTB&=~BIT(12-i);
    delay_nms(500);
 }
 for(i=4;i!=0;i--)
 {
 PORTD&=~BIT(6-i);
 delay_nms(500);
 }
   }
//主程序开始
void main(void)
{
 init_devices();
 while(1)
 {
  led_out();
 }
 //insert your functional code here...
}


仿真包rar

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
EE直播间
更多
我要评论
0
8
关闭 站长推荐上一条 /3 下一条