基于51单片机的流水灯设计
一. 基本功能
利用ATc51作为主控器组成一个LED流水灯系统,实现8个LED灯的左、右循环显示。
二. 硬件设计
C2U133pF191P0.0/AD0P0.1/AD1P0.2/AD2P0.3/AD3P0.4/AD4P0.5/AD5P0.6/AD6P0.7/AD7P2.0/A8P2.1/A9P2.2/A10P2.3/A11P2.4/A12P2.5/A13P2.6/A14P2.7/A15P3.0/RXDP3.1/TXDP3.2/INT0P3.3/INT1P3.4/T0P3.5/T1P3.6/WRP3.7/RD39383736353433322122232425262728234567XTAL1RP1X1CRYSTAL18C333pFXTAL29RSTRESPACK-8C110u293031PSENALEEABUS[0..7]R2BUS01kD1LED-REDD2R3BUS11kBUS2R110k12345678P1.0/T2P1.1/T2EXP1.2P1.3P1.4P1.5P1.6P1.7ATC5210BUS011BUS112BUS213BUS314BUS415BUS516BUS617BUS7R410kLED-REDD3R5BUS310kLED-REDD4R6BUS410kLED-REDD5R7BUS510kBUS6LED-REDD7R810kLED-REDD6R9BUS710kLED-REDD8LED-RED 图1.总设计图
1. 单片机最小系统
1.1选用ATC51的引脚功能
U219XTAL1P0.0/AD0P0.1/AD1P0.2/AD2P0.3/AD3P0.4/AD4P0.5/AD5P0.6/AD6P0.7/AD7P2.0/A8P2.1/A9P2.2/A10P2.3/A11P2.4/A12P2.5/A13P2.6/A14P2.7/A15P3.0/RXDP3.1/TXDP3.2/INT0P3.3/INT1P3.4/T0P3.5/T1P3.6/WRP3.7/RD39383736353433322122232425262728101112131415161718XTAL29RST293031PSENALEEA12345678P1.0/T2P1.1/T2EXP1.2P1.3P1.4P1.5P1.6P1.7ATC52 图2. ATC51
XTAL1:单芯片系统时钟的反向放大器输入端。
XTAL2:系统时钟的反向放大器输出端,一般在设计上只要在XTAL1和XTAL2上接上一只石英震荡晶体系统就可以工作了,此外可以在两引脚与地之间加入20PF的小电容,可以使系统更稳定,避免噪音干扰而死机。
RESET:重置引脚,高电平动作,当要对晶体重置时,只要对此引脚电平提升至高电平并保持两个及其周期以上的时间便能完成系统重置的各项动作,使得内部特殊功能寄存
器内容均被设成已知状态。
P3:端口3是具有内部提升电路的双向I/O端口,通过控制各个端口的高低电平了实现LED流水灯的控制。
1.2复位电路
如图所示,当按下按键时,就能完成整个系统的复位,使得程序从新运行。
C410uRSTR1010k 图3.复位电路
1.3时钟电路
时钟电路用于产生单片机工作所需要的时钟信号,单片机本身就是一个复杂的同步时序电路,为了保证同步工作方式的实现,电路应在唯一的时钟信号控制下严格地按时序进行工作。
在ATC51芯片内部有一个高增益反相放大器,其输入端为芯片引脚X1,输出端为引脚X2,在芯片的外部跨接晶体振荡器和微调电容,形成反馈电路,就构成了一个稳定的自激振荡器。 此电路采用12MHz的石英晶体。
C4XTAL133pFX2CRYSTALXTAL2C533pF 图4.时钟电路
2. 流水灯部分
R2BUS01kD1LED-REDD2R3BUS11kBUS2R410kLED-REDD3R5BUS310kBUS4LED-REDD4R610kLED-REDD5R7BUS510kBUS6LED-REDD7R810kLED-REDD6R910kLED-REDD8LED-RED
图5.流水灯电路
三. 软件设计
3.1编程语言及编程软件的选择
本设计选择C语言作为编程语言。C语言虽然执行效率没有汇编语言高,但语言简洁,使用方便,灵活,运算丰富,表达化类型多样化,数据结构类型丰富,具有结构化的控制语句,程序设计自由度大,有很好的可重用性,可移植性等特点。 而汇编语言使用起来并没有这么方便。
本设计选用了Keil作为编程软件,.Keil C51生成的目标代码效率非常之高,多数语句生成的汇编代码很紧凑,容易理解。在开发大型软件时更能体现高级语言的优势。
3.2 LED灯的显示
LED灯在低电平,即I/O口置‘0’时,会亮,相反就灭。此设计就是通过程序来控制I/O口的电平变化来实现流水灯左右循环闪烁。
四. 程序
#include#include#define uint unsigned int
#define uchar unsigned char
#define kou P3
uchar code dp1[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
uchar code dp2[]={0x80,0x40,0x20} void delayms(uint z) {
uint i,j;
for(i=z;i>0;i--)
for(j=110;j>0;j--);
}
void main()
{
int i;
;
//延时函数
for(i=0;i<8;i++)
{
kou=dp1[i];
delayms(500);
}
for(i=0;i<7;i++)
{
kou=dp1[i]+0x80;
delayms(500);
}
for(i=0;i<6;i++)
{
kou=dp1[i]+0x40;
delayms(500);
}
for(i=0;i<5;i++)
{
kou=dp1[i]+0x20;
delayms(500);
}
for(i=0;i<4;i++)
{
kou=dp1[i]+0x10;
delayms(500);
}
for(i=0;i<3;i++)
{
kou=dp1[i]+0x08;
delayms(500);
}
for(i=0;i<2;i++)
{
kou=dp1[i]+0x04;
delayms(500);
}
for(i=0;i<1;i++)
{
kou=dp1[i]+0x02;
delayms(500);
}
for(i=0;i<3;i++)
{
kou=0x00;
delayms(500);
kou=0xff;
delayms(500);
}
}