1.硬件组成
按照单片机系统扩展与系统配置状况,单片机应用系统可分为最小系统、最小功耗系统及典型系统等。AT89C51单片机是美国ATMEL公司生产的低电压、高性能CMOS
8位单片机,具有丰富的内部资源:4kB闪存、128BRAM、32根I/O口线、2个16位定时/计数器、5个向量两级中断结构、2个全双工的串行口,具有4.25~5.50V的电压工作范围和0~24MHz工作频率,使用AT89C51单片机时无须外扩存储器。因此,本流水灯实际上就是一个带有八个发光二极管的单片机最小应用系统,即为由发光二极管、晶振、复位、电源等电路和必要的软件组成的单个单片机。
2.软件编程
单片机的应用系统由硬件和软件组成,上述硬件原理图搭建完成上电之后,我们还不能看到流水灯循环点亮的现象,我们还需要告诉单片机怎么来进行工作,即编写程序控制单片机管脚电平的高低变化,来实现发光二极管的一亮一灭。软件编程是单片机应用系统中的一个重要的组成部分,是单片机学习的重点和难点。下面我们以最简单的流水灯控制功能即实现8个LED灯的循环点亮,来介绍实现流水灯控制的几种软件编程方法。
2.1位控法
这是一种比较笨但又最易理解的方法,采用顺序程序结构,用位指令控制P1口的每一个位输出高低电平,从而来控制相应LED灯的亮灭。程序如下:
ORG
0000H
;单片机上电后从0000H地址执行
AJMP
START
;跳转到主程序存放地址处
ORG
0030H
;设置主程序开始地址
START:MOV
SP,#60H
;设置堆栈起始地址为60H
CLR
P1.0
;P1.0输出低电平,使LED1点亮
ACALL DELAY
;调用延时子程序
SETB P1.0
;P1.0输出高电平,使LED1熄灭
CLR
P1.1
;P1.1输出低电平,使LED2点亮
ACALL DELAY
;调用延时子程序
SETB P1.1
;P1.1输出高电平,使LED2熄灭
CLR
P1.2
;P1.2输出低电平,使LED3点亮
ACALL DELAY
;调用延时子程序
SETB P1.2
;P1.2输出高电平,使LED3熄灭
CLR
P1.3
;P1.3输出低电平,使LED4点亮
ACALL DELAY
;调用延时子程序
SETB P1.3
;P1.3输出高电平,使LED4熄灭
CLR
P1.4
;P1.4输出低电平,使LED5点亮
ACALL DELAY
;调用延时子程序
SETB P1.4
;P1.4输出高电平,使LED5熄灭
CLR
P1.5
;P1.5输出低电平,使LED6点亮
ACALL DELAY
;调用延时子程序
SETB P1.5
;P1.5输出高电平,使LED6熄灭
CLR
P1.6
;P1.6输出低电平,使LED7点亮
ACALL DELAY
;调用延时子程序
SETB P1.6
;P1.6输出高电平,使LED7熄灭
CLR
P1.7
;P1.7输出低电平,使LED8点亮
ACALL DELAY
;调用延时子程序
SETB P1.7
;P1.7输出高电平,使LED8熄灭
ACALL DELAY
;调用延时子程序
AJMP
START
;8个LED流了一遍后返回到标号START处再循环
DELAY:
;延时子程序
MOV
R0,#255 ;延时一段时间
D1: MOV
R1,#255
DJNZ
R1,$
DJNZ
R0,D1
RET
;子程序返回
END
;程序结束
假设八盏灯接在P1口上,简单到不能再简单。
ORG 0000H ;复位启动地址
MOV P1,#01H
;
WORK:
MOV R5,#6 ;准备延时,实际时间可根据时钟频率调整
MOV R6,#0 ;
MOV R7,#0 ;
;
KJYS:
DJNZ R7,KJYS ;延时
DJNZ R6,KJYS ;
DJNZ R5,KJYS ;
;
MOV A,P1
RL A ;(D0←D7←...←D0)
MOV P1,A
LJMP WORK
END ;
参考我以前的回答:
http://zhidao.baidu.com/question/122464208
//环境:AVRSTUDIO+Winavr
//硬件:PB0、PB1、 PB2、 PB3连LED
#define F_CPU 1000000
#include
#include
#define SET0 PORTB|=_BV(0)
#define CLR0 PORTB&=~_BV(0)
#define SET1 PORTB|=_BV(1)
#define CLR1 PORTB&=~_BV(1)
#define SET2 PORTB|=_BV(2)
#define CLR2 PORTB&=~_BV(2)
#define SET3 PORTB|=_BV(3)
#define CLR3 PORTB&=~_BV(3)
int main()
{
while(1)
{
CLR3;
SET0;
_delay_ms(500);
CLR0;
SET1;
_delay_ms(500);
CLR1;
SET2;
_delay_ms(500);
CLR2;
SET3;
_delay_ms(500);
}
}