- 1、本文档共11页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
简述:
近年来,随着电子技术和微型计算机的发展,单片机的档次不断提高,应用领域也在不断地扩大,已在工业控制、尖端科学、智能仪器仪表、日用家电、汽车电子系统、办公自动化设备、个人信息终端及通信产品中得到广泛的应用,成为现代电子系统中最重要的智能化的核心部件。而 AT89C51 就是其中一种,它是一种带 4K 字节闪烁可编程可擦除只读存储器的低电压、高性能 CMOS 8 位微处理器,为很多嵌入式控制系统提供了一种灵活性高且价廉的方案。
关键词:单片机;流水灯
引言
随着现代社会的发展,人们越来越追求审美和新颖,而流水灯就是其中一种,以前简单的照明工具变得越来越多样化,流水灯的千姿百态恰能给人一种视觉冲击,现在不管大街小巷我们都可以随处可见这种变幻万千的流水灯,而这种流水灯我们可以产用电子电路去设 计,我们主要可以用装套控制器和状态译码器来实现灯光的流水效 果,但是现在我们可以用单片机 AT89C51 来实现,因为其相对于电子电路有明显的优越性,控制硬件电路比较简单,软件方面程序也不复杂,因此制作的远离简单,但功能作用并不低于电子电路设计的, 由于它的小巧方便、通俗易懂,所以我们往往采用单片机来做流水灯。
系统设计
硬件框图
复位电
复位电
路
STC 89C51
键
盘
震荡电
路
流水灯电
路
总设计图
选用AT89C51 的引脚功能
XTAL1:单芯片系统时钟的反向放大器输入端。
XTAL2:系统时钟的反向放大器输出端,一般在设计上只要在XTAL1 和XTAL2 上接上一只石英震荡晶体系统就可以工作了,此外可以在两引脚与地之间加入 20PF 的小电容,可以使系统更稳定,避免噪音干扰而死机。
RESET:重置引脚,高电平动作,当要对晶体重置时,只要对此引脚电平提升至高电平并保持两个及其周期以上的时间便能完成系 统重置的各项动作,使得内部特殊功能寄存器内容均被设成已知状 态。
P0:端口 0 是一个 8 位宽的开路汲汲双向输出入端口,共有 8 个位,P0.0 表示 0,P0.1 表示 1,以此类推。
说明
如图所示,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 的循环亮。4.硬件详细设计
复位电路部分
如图所示,当要对晶片重置时,只要按此开关就能完成 LED 和开关的重置。
晶振部分 产生时钟信号
开关部分
S2、S3、S4 分别控制 3 种LED 显示效果,这里就不用详细说明了。
LED 显示部分
限流电阻为 470 欧姆,经过的电流大概为 10mA。
软件详细设计
软件框图
开始
开始
检查是否有键按下
读取键值
根据键盘指令执行流水灯显示效果
执行结束
详细程序清单
#includereg51.h // 头文件
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;i0;i--)
for(j=248;j0;j--);
}
void delay02s(void)//延时 0.2s
{
unsigned char i; for(i=20;i0;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;i8;
文档评论(0)