单片机花样流水灯设计实验
- 格式:doc
- 大小:249.36 KB
- 文档页数:13
* * 大学
物理学院
单片机花样流水灯设计实验
课题:花样流水灯设计
班级: 物理 ***
姓名: ***
学号: ……………
当今时代的智能控制电子技术,给人们的生活带来了方便和舒适,而每到晚上五颜六色的霓虹灯则把我们的城市点缀得格外迷人,为人们生活增添了不少色彩。
制作流水灯的方法有很多种,有传统的分立元件,由数字逻辑电路构成的控制系统和单片机智能控制系统等。本设计介绍一种简单实用的单片机花样流水灯设计与制作,采用基于MS-51的单片机AT89C51和发光二极管、晶振、复位、电源等电路以及必要的软件组成的以AT89C51为核心,辅以简单的数码管等设备和必要的电路,设计了一款简易的流水灯电路板,并编写简单的程序,使其能够自动工作。
本设计用AT89C51单片机为核心自制一款简易的花样流水灯,并介绍了其软件编程仿真及电路焊接实现,在实践中体验单片机的自动控制功能。该设计具有实际意义,可以在广告业、媒体宣传、装饰业等领域得到广泛应用。
关键字:AT89C51 单片机流水灯数码管
1. 单片机及其发展概况
单片机又称为单片微计算机,其特点是将微型计算机的基本功能部件(如中央处理器(CPU)、存储器、输入接口、输出接口、定时/计数器及终端系统等)全部集成在一个半导体芯片上。单片机作为一种高集成度微型计算机,已经广泛应用于工业自动化控制、智能仪器仪表、通信设备、汽车电子与航空航天电子系统、智能家居电器等各个领域。
2. Protues仿真软件简介
Protues以其数量众多的元件数据库、标准化的仿真仪器、直观的捕获界面、简洁明了的操作、强大的分析测试、可信的测试结果, 为电子工程设计节约研发时间,节省了工程设计费用。利用Protues软件设计一款通过数码管显示计数时间的流水灯电路及Keil C软件编程后,再将两者关联则可以简单快速的进行仿真。
【实验设计目标】
设计要求以发光二极管作为发光器件,用单片机自动控制,对8个LED 灯设计至少3种流水灯显示方式,每隔20秒变换一次显示花样,计时通过一个二位七段数码管显示。
【设计方案】
1.设计原理
AT89C51单片机内部包括微处理器、存储器(存放程序指令或数据的ROM、RAM等)、输入/输出口(I/O口)及其他功能部件如定时/计数器、中断系统等。它们通过地址总线、数据总线和控制总线连接起来。
要实现流水灯功能,只要将发光二极管Led1~Led8依次点亮、熄灭,8只LED灯便会一亮一暗的做流水灯状,设计花样时可依此类推。此外还应注意的是人眼的视觉暂留效应以及单片机执行每条指令的时间很短,所以控制二极管亮/灭的时候应延时一段时间,否则将无法以肉眼观察到“流水”等花样效果。
2.电路原理图
3.器件配置清单
4.AT89C51简介
AT89C51单片机有多种封装形式,常见的有DIP封装、PLC封装、TQFP 封装,为了使用的方便通常使用DIP封装形式的单片机。外部共有40个引脚,图6为引脚的排列图。40个引脚大致可分为4大类:电源、时钟、控制和I/O引脚,
5.芯片擦除
整个PEROM阵列和三个锁定位的电擦除可通过正确的控制信号组合,并保持ALE管脚处于低电平10ms 来完成。在芯片擦操作中,代码阵列全被写“1”且在任何非空存储字节被重复编程以前,该操作必须被执行。此外,AT89C51设有稳态逻辑,可以在低到零频率的条件下静态逻辑,支持两种软
件可选的掉电模式。在闲置模式下,CPU停止工作。但RAM,定时器,计数器,串口和中断系统仍在工作。在掉电模式下,保存RAM的内容并且冻结振荡器,禁止所用其他芯片功能,直到下一个硬件复位为止。
6.实验流程
【程序编写】
#include"reg51.h"
typedef unsigned char uint8;
typedef unsigned int uint16;
uint8 table[]={0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09}; uint16 count=0,t=0,i=1,m=0,j=0,r=0,t1=0,n=0;
bit ldelay=0,dir=0,run=0,ldelay1=0;
sbit G1=P3^0;
sbit G2=P3^1;
sbit BI=P3^2;
uint8 led0[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
uint8 led1[]={0x80,0xc0,0x60,0x30,0x18,0x0c,0x06,0x03,0x01};
uint8 led2[]={0x18,0x24,0x42,0x81,0x42,0x24,0x18};
void k() interrupt 1
{
TH0=0xd8;
TL0=0xf0;
t++;
t1++;
switch(n){
case 0:BI=0;G1=1;G2=0;BI=1;P2=table[count%10];n++;break;
case 1:BI=0;G1=0;G2=1;BI=1;P2=table[count/10];n=0;break;
}
if(t1==25){
ldelay1=1;
t1=0;
}
if(t==100){
ldelay=1;
t=0;
}
}
void main()
{
TMOD=0x01;
TH0=0xd8;
TL0=0xf0;