EDN首页   博客首页

日志档案

发表于 2008-7-2 21:15:54

1

标签: LED  流水灯  Proteus  仿真  

LED流水灯仿真

ATMEGA32第一个学习例子:

学单片机得先弄懂它的IO口,所以第一个例子先以控制IO口的输出。最好的方法就是做个LED流水灯。

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

系统分类: 单片机   |   用户分类: 学习AVR   |   来源: 原创   |   【推荐给朋友】   |   【添加到收藏夹】

    阅读(734)    回复(0)  

投一票您将和博主都有获奖机会!