单片机:16个发光二极管组成的流水灯实验

单片机:16个发光二极管组成的流水灯实验,第1张

电路图注意:1、P0口里应加上排阻,图里我没画出来。

2、单片机最小系统所需的晶振、复位电路我也没画。

临时帮你做的图,写的程序,细节就不是很完善啦,凑合着看吧!!

下面是程序,_crol_()函数是让temp的值左移一位的即执行一次该函数,temp的值由11111110到11111101,再执行一次是11111011……

_cror_()是右移。

#include<reg51h>

#include<intrinsh>//包含对_crol_(),_cror_()函数的说明的头文件

unsigned char temp,i;

void delay(unsigned int z)//延时子程序,晶振110592M时延时大概1毫秒

{

unsigned int x ,y;

for(x=z;x>0;x--)

for(y=110;y>0;y--);

}

void main()

{

while(1)

{

temp=0xfe;

for(i=0;i<8;i++)//流水灯从P0^0口到P0^7口

{

P0=temp;

temp=_crol_(temp,1);

delay(5);

}

i=0;

temp=0xfe;

for(i=0;i<8;i++)//流水灯从P1^0口到P1^7口

{

P1=temp;

temp=_crol_(temp,1);

delay(5);

}

i=0;

temp=0x7f;

for(i=0;i<8;i++)//流水灯从P1^7口到P1^0口

{

P1=temp;

temp=_cror_(temp,1);

delay(5);

}

i=0;

temp=0x7f;

for(i=0;i<8;i++)//流水灯从P0^7口到P0^0口

{

P0=temp;

temp=_cror_(temp,1);

delay(5);

}

i=0;

}

}

电路图最简单的是 一个IO口驱动一个LED,用灌电流的方式,不加驱动电路。至于3中不同的闪烁方法,就有很多了,30种都有。至于程序,只要给这16个口服不同的值就可以了。很少有人会为一个问题而专门写汇编程序。

流水灯程序是keil的自带例子,你直接跑就是。

void wait (void) { / wait function /

; / only to delay for LED flashes /

}

void main (void) {

unsigned int i; / Delay var /

unsigned char j; / LED var /

while (1) { / Loop forever /

for (j=0x01; j< 0x80; j<<=1) { / Blink LED 0, 1, 2, 3, 4, 5, 6 /

P1 = j; / Output to LED Port /

for (i = 0; i < 10000; i++) { / Delay for 10000 Counts /

wait (); / call wait function /

}

}

for (j=0x80; j> 0x01; j>>=1) { / Blink LED 6, 5, 4, 3, 2, 1 /

P1 = j; / Output to LED Port /

for (i = 0; i < 10000; i++) { / Delay for 10000 Counts /

wait (); / call wait function /

}

}

}

}

闪烁你可以再加几行。

我给你个简单的例子:

#include <AT89X51H> //预处理文件里面定义了特殊寄存器的名称如P1 口定义为P1

void main(void)

{

//定义花样数据

const unsigned char design[32]={0xFF,0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F,

0x7F,0xBF,0xDF,0xEF,0xF7,0xFB,0xFD,0xFE,0xFF,

0xFF,0xFE,0xFC,0xF8,0xF0,0xE0,0xC0,0x80,0x0,

0xE7,0xDB,0xBD,0x7E,0xFF};

unsigned int a; //定义循环用的变量

unsigned char b; //在C51 编程中因内存有限尽可能注意变量类型的使用

//尽可能使用少字节的类型,在大型的程序中很

受用

do{

for (b=0; b<32; b++)

{

for(a=0; a<30000; a++); //延时一段时间

P1 = design[b]; //读已定义的花样数据并写花样数据到P1 口

}

}while(1);

}

程序中的花样数据可以自以去定义,因这里我们的LED 要AT89C51 的P1 引脚为低电平才

会点亮,所以我们要向P1 口的各引脚写数据O 对应连接的LED 才会被点亮,P1 口的八个引

脚刚好对应P1 口特殊寄存器的八个二进位,如向P1 口定数据0xFE,转成二进制就是

11111110,最低位D0 为0 这里P10 引脚输出低电平,LED1 被点亮。如此类推,大家不难算

出自己想要做的效果了。

留个邮箱给你发个入门文档

流水灯就是51单片机控制led灯依次点亮的控制方式。具体程序如下:

ORG 0000H ;复位启动

AJMP START ;

ORG 001BH ;T1中断

AJMP T1INT ;

;定义变量========================

YSJS EQU 30H;延时计数器

LED EQU 31H;LED控制缓冲器

;主程序==========================

START: MOV LED,#0FEH ;初始化数据

MOV YSJS,#0 ;

MOV TMOD,#10H ;定时器1工作于方式1,16位定时器

MOV TL1,#0B0H ;设置定时初值

MOV TH1,#3CH ;定时时间=50mS

SETB ET1 ;使能定时器1中断

SETB TR1 ;启动定时器1

SETB EA ;开总中断

MOV P1,LED ;初始化流水灯

LOOP: JMP LOOP ;循环等待中断

T1INT: PUSH PSW ;定时器1中断程序

PUSH ACC ;保护现场

MOV TH1,#3CH ;定时时间=50mS

MOV TL1,#0B0H ;

INC YSJS ;

PUSH ACC ;保护ACC

MOV A,YSJI ;

CJNE A,#2,QT1 ;50mS2=100mS

MOV P1,LED ;

MOV A,LED ;

RL A ;累加器A的值循环左移1位

MOV LED,A ;

MOV YSJS,#0 ;

QT1: POP ACC ;恢复现场

POP PSW ;

RETI ;返回主程序

END ;汇编程序结束

扩展资料:

实现流水灯的三个方法:

第一种,总线方法实现流水灯。这是一种比较笨但又最易理解的方法,采用顺序程序结构,用位指令控制P1口的每一个位输出高低电平,加上延时函数,即可控制每个LED灯的亮灭。

第二种,移位方法实现流水灯采用循环程序结构编程。首先在程序开始给P10口送一个低电平,其它位为高。然后延时一段时间再让低电平往高位移动,这样就实现“流水”的效果了。

第三种,库函数实现流水灯。利用左移函数进行。

以上就是关于单片机:16个发光二极管组成的流水灯实验全部的内容,包括:单片机:16个发光二极管组成的流水灯实验、求个AT89C51单片机流水灯(16个灯)设计电路图和汇编程序,、61单片机用C语言做一个程序 要求:16个灯从右到左依次点亮,全亮后闪烁三次, 然后从左到右依次熄灭 急求等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/10097252.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-05
下一篇 2023-05-05

发表评论

登录后才能评论

评论列表(0条)

保存