一、设计题目
花样流水灯
要求:
在单片机控制下,当拨动开关S28发出低电平(S28=0)时,发光二极管DS35-DS42从两头向中间逐个点亮(时间间隔由电位器W1来控制),当DS35-DS42全部点亮后延时2秒钟全部熄灭,如此往复循环。当拨动开关S28发出高电平(S28=1)时,DS39、DS40点亮,然后点亮的灯向两边扩展,直到DS35~DS42全部点亮后延时2秒钟全部熄灭,如此往复循环。
控制功能:
利用89C51的P1口控制DS35~DS42,单片机内部定时器产生定时中断用来控制整个亮灯的时序。利用电位器W1产生的0-5V电压经A/D采样后的数据大小来决定逐个点亮LED灯的时间间隔。A/D输入0V表示时间间隔为10mS,输入5V表示时间间隔为1280mS。利用74HC4040对8MHz晶振产生的脉冲信号进行十六分频做为A/D的时钟信号。
使用的主要元器件:
89C51、11.0592MHz晶振、74LS373、74LS138、ADC0809、8MHz晶振、74HC04、74HC4040、拨动开关S28、发光二极管DS35~DS42、10k电位器W1等。
结果验证:
运行程序后,拨动S28查看DS35~DS42的点亮是否符合要求,同时旋动电位器W1,查看发光二极管的点亮速度是否有变化并满足题目要求。思考是否可以利用查表的办法编写出各种花色的流水灯,这在实际工作中有何作用。
二、原理图
仿真原理图
实物原理图
三、程序框图
四、部分程序清单
c语言
#include<reg51.h>
#include<absacc.h>
#define uchar unsigned char
#define AD0809 XBYTE[0x8000]
uchar adval,cnt,spd;
uchar pos=0;
bit flag,dir,step;
sbit zk=P3^4;
uchar tab0[4]={0x7e,0x3c,0x18,0x00};
uchar tab1[4]={0xe7,0xc3,0x81,0x00};
main()
{
TMOD=0x01;
TH0=0x4c;
TL0=0x00;
TR0=1;
ET0=1;
EX0=1;
IT0=1;
EA=1;
AD0809=0;
pos=0;
spd=1;
flag=zk;
P1=tab0[0];
while(1)
{
if(flag!=zk)
{
flag=zk;
pos=0;
step=0;
}
}
}
汇编语言
UP BIT 00H ;正反向查表标志位
K1 BIT P3.4 ;拨动开关K1控制发光二极管的点亮方向
T2S BIT 01H ;2秒标志位
ADC0 EQU 0000H ;ADC0808的0通道地址
ORG 0000H
LJMP START
ORG 000BH ;T0中断地址
LJMP DISP
ORG 0100H
;---------------------------------------------------------------------------
START:
MOV SP,#60H ;设置堆栈
MOV TMOD,#01H
MOV TH0,#0ECH ;10ms定时初值
MOV TL0,#78H
SETB TR0 ;启动T0
SETB ET0 ;允许T0中断
SETB EA ;开总中断
CLR T2S ;清2秒标志
MOV R1,#0 ;R1存延时时间间隔
MOV R2,#0 ;R2存放查发光二极管表的位置
MOV R3,#0 ;R3存放查发光二极管表的P1结果
MOV R5,#0 ;R5用于软件延时
MOV R7,#5 ;发光二极管的4种状态
CLR A
MAIN:
MOV DPTR,#ADC0;
MOVX @DPTR,A;
ACALL DELAY
MOVX A,@DPTR
MOV B,#2
DIV AB
INC A ;采样值/2+1
MOV R1,A ;R1存延时时间间隔
SETB K1 ;P3.4设置为输入端
JNB K1,NEXT ;K1=0,转移到NEXT
CLR UP ;清正向查表标志
SJMP WAIT
五、参考资料
[1]张毅刚 单片机原理及应用 高等教育出版社
[2]吴炳胜80C51 单片机原理与应用技术 冶金工业出版社
[3]邹久明80C51 单片机实用技术 北京航空航天大学出版社
[4]孙俊逸 单片机原理及应用 清华大学出版社
[5]张大明 单片微机控制应用技术实操指导书 机械工业出版社
[6]胡汉才 单片机原理及其接口技术 清华大学出版社
六、资源获取
微信公众号:而为若的宇宙
微信号:lazyjualay