单片机: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;

}

}

这个你得清楚C51的基本框架,这种很容易的,当按键按下去之后,你就进行一个循环,0000 0001 ~~ 1000 0000 循环赋值给对应的二极管的端口,并且最还有一个延时函数,效果会明显写,要不然看不到理想的效果,并且最好消抖一下,免得有干扰,还有当按钮再按一次的时候你就在的全部赋值0000 0000就可以了,自己在大学里面最好还是多学点东西吧

;实验目的:本程序主要实现一个简单的流水灯程序
;即轮流点亮C口的8个灯(先点亮RC0,再熄灭RCO点亮RC1。。。。)
;硬件要求:拨码开关S2全部置ON。
#include<p16f877Ainc> ;调用头文件
__CONFIG _DEBUG_OFF&_CP_ALL&_WRT_HALF&_CPD_ON&_LVP_OFF&_BODEN_OFF&_PWRTE_ON&_WDT_OFF&_HS_OSC
;芯片配置字,看门狗关,上电延时开,掉电检测关,低压编程关,加密,4M晶体HS振荡
;用户寄存器定义
count equ 20h ;移位次数寄存器
del_va1 equ 0ffh ;外层延时参数
del_va2 equ 0ffh ;内层延时参数
org 00h ;程序人口地址
; addlw 0ffh
;主程序开始
main
nop ;ICD所需要的一条空指令
clrf PORTC ;先清楚C口所有显示
banksel TRISC ;选择I/O口方向寄存器所在的体
clrf TRISC ;设置C口全为输出
clrf STATUS ;返回体0
movlw 8
movwf count ;装载循环次数8(C口共8位)
bsf STATUS,C ;置进位标志位为1,因循环移位是带进位循环的
loop
rlf PORTC,1 ;C口左移1位
call delay
call delay
CALL delay ;调用三次延时程序(保证亮度,以及流水灯闪烁速度)
bcf STATUS,C ;清0进位标志位(永远只有一只LED亮)
DECFSZ count,1 ;判断是否一轮循环结束
goto loop ;否,继续循环移位
GOTO main ;是,程序重头开始
;延时程序
delay
movlw del_va1 ;延时程序外层参数
movwf 30h
movlw del_va2 ;延时程序内层参数
movwf 31h
decfsz 31h,1
goto $-1
decfsz 30h,1
goto $-4
return
;程序结束
end

利用实验室提供的单片机实验开发板的最小系统电路模块、流水灯电路模块,以及Protues仿真软件搭建电路,实现I/O口循环流水灯演示效果。
LED流水灯控制电路如图2-1所示,八个LED灯D0-D7(可选择LED-RED)阳极接到+5V,阴极通过300欧姆电阻分别接到单片机的P10-P17八个IO口上。I/O口循环流水灯效果实现流程如图2-2所示,依次从第一盏灯开始,分别点亮每一盏灯,中间调用延时子函数便可使得流水灯的效果清晰可见。点亮LED灯的具体实现方法与上节相同,只需让相应的IO口输出低电平即可,程序实现代码已给出。按照上节给出的项目开发流程,从仿真电路搭建到程序编写,再到仿真调试以及最后的实物调试完成循环流水灯的实现。

延时函数就不用解释里吧,代码中控制的是arm板子0X16到0X24到8个GPIO。
IO0SET=(0x01<<j);
说到是给0X16GPIO设置高,就是亮。
IO0CLR=(0x01<<j);
这是把相应到GPIO置低。
其他设置中断到你就记住用法就可以了。应该有 *** 作手册。

ORG OOOOH
LJMP MAIN
ORG 1000H
MAIN:MOV A,#OFEH
AGAIN:MOV P1,A
RL A
LCALL DELAY
JNB P17,TWO//这里判断P17是否为低电平,如果是就转到TWO
SJMP AGAIN
TWO:MOV A,#OFFH
MOV P1,A
PP:MOV A,#OFEH
MOV P2,A
RL A
LCALL DELAY
JNB P27,MAIN//同理判断P27
SJMP PP
DELAY:MOV R6,#OFFH
L1: MOV R7,#OFFH
DJNZ R7,$
DJNZ R6,L1
RET
END没有执行过,应该可行讲下思路,P1,P2是接16个LED就在P1最高位的灯亮时,这时转到TWO中执行,从P2的最低位开始,到最高位即P27为低电平时,等挻时完后又转回P1,如此循环(这里一开始P2端口不用都置1是因为单片机上电时P2端口都为高电平)


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

原文地址: http://outofmemory.cn/yw/13368882.html

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

发表评论

登录后才能评论

评论列表(0条)

保存