单片机流水灯设计报告

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

1.摘要:

近年来,随着电子技术和微型计算机的发展,单片机的档次不断提高,起应用领域也在不断的扩大,已在工业控制、尖端科学、智能仪器仪表、日用家电、汽车电子系统、办公自动化设备、个人信息终端及通信产品中得到广泛的应用、成为现代电子系统中最重要的智能化的核心部件。而AT89C51就是其中一种,它是一种带4K字节闪烁可编程可擦除只读存储器的低电压,高性能CMO8位微处理器,为很多嵌入式控制系统提供了一种灵活性高且价廉的方案。

2.关键字:单片机、流水灯

3.需求分析:

随着现代社会的发展,人们越来越追求审美和新颖,而流水灯就是其中一种,以前简单的照明工具变得越来越多样化,流水灯的千姿百态恰能给人一种视觉冲击,现在不管大街小巷我们都可以随处可见这种变幻万千的流水灯,而这种流水灯我们可以产用电子电路去设计,我们主要可以用装套控制器和状态译码器来实现灯光的流水效果,但是现在我们可以用单片机AT89C51来实现,因为其相对于电子电路有明显的优越性,控制硬件电路比较简单,软件方面程序也不复杂,因此制作的远离简单,但功能作用并不低于电子电路设计的,由于它的小巧方便、通俗易懂,所以我们往往采用单片机来做流水灯。

4.系统设计

1.硬件框图

2.总设计图

3.选用AT89C51的引脚功能

XTAL1:单芯片系统时钟的反向放大器输入端。 STC

89C51 复

路 键盘

震荡电路 流水灯电路

XTAL2:系统时钟的反向放大器输出端,一般在设计上只要在XTAL1和XTAL2上接上一只石英震荡晶体系统就可以工作了,此外可以在两引脚与地之间加入20PF的小电容,可以使系统更稳定,避免噪音干扰而死机。

RESET:重置引脚,高电平动作,当要对晶体重置时,只要对此引脚电平提升至高电平并保持两个及其周期以上的时间便能完成系统重置的各项动作,使得内部特殊功能寄存器内容均被设成已知状态。

P0:端口0是一个8位宽的开路汲汲双向输出入端口,共有8个位,P0.0表示0,P0.1表示1,以此类推。

P2:端口2是具有内部提升电路的双向I/O端口,每一个引脚可以推动4个LS的TTL负载,若将端口2的输出设为高电平时,此端口便能当成输入端口来使用。

4.说明

如图所示,S1为复位开关,S2、S3、S4分别为切换不同流水效果的开关,P2口控制LED灯D1~D7的显示,P0口作为LED的输出控制。当按下S2后能实现D1和D7同时亮其他不亮,然后D2和D6亮,依此类推。当按下复位S1,然后按下S2实现LED灯从D7到D1循环亮,按下S1然后按下S3实现LED从D1到D7的循环亮。硬件详细设计

1.复位电路部分

如图所示,当要对晶片重置时,只要按此开关就能完成LED和开

关的重置。

2.晶振部分

产生时钟信号

3.开关部分

S2、S3、S4 分别控制3种LED显示效果,这里就不用详细说明了。

4.LED显示部分

限流电阻为470欧姆,经过的电流大概为10mA。软件详细设计

1.软件框图

开始

检查是否有键按下

读取键值

根据键盘指令执行流水灯显示效果

执行结束

2.详细程序清单

#include // 头文件

sbit k1=P0^0; //定义按键k1

sbit k2=P0^1; //定义按键k2

sbit k3=P0^2; //定义按键k3

code unsigned char num[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f,//左移

0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe,//右移

0x7e,0xbd,0xdb,0xe7,0xe7,0xdb,0xbd,0x7e}

;//两边到中间

unsigned char k; //数组的移动指针

void delay10ms(void) //延时10ms

{

unsigned char i,j;

for(i=20;i>0;i--)

for(j=248;j>0;j--);

}

void delay02s(void)//延时0.2s {

unsigned char i;

for(i=20;i>0;i--)

{delay10ms();

}

}

void KEY(void) //按键扫描程序{

if(k1==0)

{

delay10ms();

if(k1==0)

{

k=0;

}

}

if(k2==0)

{

delay10ms();

if(k2==0)

{

k=8;

}

}

if(k3==0)

{

delay10ms();

if(k3==0)

{

k=16;

}

}

}

void main(void) //主程序

{

unsigned char i;

while(1)//死循环

{

if(P0!=0xff)//判断是否有按键按下

{

KEY();//执行按键扫描程序

for(i=0;i<8;i++)//循环8次的出8个亮的状态

{

相关文档
最新文档