迅维网

标题: [原创][winavr单片机教程(2)]用AVR制作的多功能彩灯(流水灯) [打印本页]

作者: yzz163    时间: 2009-11-14 12:02
标题: [原创][winavr单片机教程(2)]用AVR制作的多功能彩灯(流水灯)
(建议没调试过单片机的朋友,先看第1课)
[原创][winavr单片机教程(1)]用WinAVR和AVR Studio搭建AVR开发环境
http://www.chinafix.com.cn/thread-152960-1-1.html

  现在使用WINAVR+AVR Studio做为开发平台的人越来越多,一是方便的移植(几乎不需要修改代码),二是强大的调试、仿真功能,极大的缩短了开发周期。下面是我用M16做一个流水灯的过程。可以看到只要编写几句代码,就可实现流水灯“花样”的变化,这比普通的模拟电路强大的多,并且控制路数没有限制。你也做个好看的图案(比如用一笔一画写几个字)送给自己喜欢的朋友。欢迎大家共同讨论、交流,写出更多的流水灯代码。

  一、电路图
  (1)M16电路图


  (2)控制220V彩灯电路


  二、代码
  (1)C源码
--------------main.c---------------
#include <avr/io.h>
#include <util/delay.h>

int main(void)
{
    PORTA=0xFF;                                        // PA口输出全1,LED全灭
    DDRA=0xFF;                                        // PA口工作为输出方式

    while (1)
    {
                signed char i,j;        //有符号字符取值范围:-128—127,占用一个字节。

                //间隔点亮16次
                PORTA=0xAA;         //0xAA=10101010
                for (i=0;i<16;i++) {
                        PORTA=~PORTA;  //0xAA取反后=1010101
                        _delay_ms(500);  //延时500ms,WINAVR库函数
                }

                //左循环2次
                for (i=0; i<2; i++) {
                        for (j=0; j<8; j++) {        //8个LED(0-7位)从右向左依次点亮
                                PORTA = ~(1<<j);    //1左移动j位,再取反(因为是高电平灯灭)。
                                _delay_ms(500);
                        }       
                }
                               

                PORTA=0xFF;
                //_delay_ms(1000);

                //右循环2次
                for (i=0;i<2;i++){
                        for (j=7; j>=0; j-- ) {  //最后一次循环,j=-1。(因此变量j必须取signed char)
                                PORTA = ~(1<<j);               
                                _delay_ms(500);
                        }
                }


        }
---------------------------------------------------------------------------
  (2)HEX文件:
  M16  lamp lamp.hex (815 Bytes, 下载次数: 4)