摘要在许多场合都可以看到彩色霓虹灯,LED彩灯由于其彩色丰富,造价低廉,控制简单等特点受到了广泛的应用。
本系统是以51系列单片机AT89C51为主控器,附有LED发光二极管,用51系列单片机AT89C51来控制LED发光二极管亮灭,系统运行稳定,花样多多。
关键词彩色霓虹灯AT89C51 LED一方案设计与论证1.1单片机方案一STC89C52STC89C52是STC公司生产的一种低功耗、高性能CMOS8位微控制器,具有8K在系统可编程Flash存储器。
能为许多嵌入式控制引用系统提供高灵活、超有效的解决方案。
方案二AT89C51AT89C51是一种带4K字节Flash存储器的低电压、高性能COMS 8位微处理器。
AT89C51单片机能为很多嵌入式系统提供一种灵活性高且价廉的方案。
虽然STC89C52具有51单片机不具备的功能,单本系统操作简单,且51单片机价格低廉,所以我们选择方案二。
二硬件电路设计2.1 主控模块2.1.1 AT89C51引脚图图2.1.1 AT89C51引脚图2.1.2AT89C51引脚功能介绍Vss:接地端。
Vcc:电源端。
XTAL1:接外部晶体的一个引脚。
CHMOS单片机采用外部时钟信号时,时钟信号由此脚引入。
XTAL2:接外部晶振的一个引脚。
HMOS单片机采用外部时钟信号时,外部时钟信号由此脚接入。
RST:(1)复位信号输入;(2)Vcc掉电后,此引脚可接备用电源,低功耗条件下保持内部RAM中的数据。
ALE//PROG:地址锁存允许。
/PSEN:程序锁存允许。
/EA/Vpp:EA=0,单片机只访问外部程序存储器。
EA=1,单片机访问内部程序存储器。
P0口----P0口可以作为输入/输出口,在实际应用中,常作为地址/数据总线口,即低8位地址与数据线分时使用P0口。
低8位地址由ALE信号的下跳沿锁存到外部地址锁存器中,而高8位地址由P2口输出。
P1口----P1口每一位都能作为可编程的输入或输出口线。
P1.0:T2引脚,定时/计数器2外部计数脉冲。
P1.1:T2EX引脚,定时/计数器2触发和方向控制。
P1.5:MOSI引脚,在系统编程数据输入。
P1.6:MISO引脚,在系统编程数据输出。
P1.7:SCK引脚,在系统编程时钟输入。
P2口----P2口可以作为输入口或输出口使用,外接存储器和I/O接口时,又作为扩展系统的地址总线,输出高8位地址,与P0口一起组成16位地址总线。
对于内部无程序存储器的单片机来说,P2口一般只作为地址总线使用,而不作为I/O 口线直接与外设相连接。
P3口----P3口为双功能口。
作为第一功能使用时,其功能与P1口相同。
当作为第二功能使用时,每一位功能定义见表2.2.2。
端口引脚 第二功能 P3.0 RXD (串行输入线) P3.1 TXD (串行输出线) P3.2 /INT0(外部中断0输入线) P3.3 /INT1(外部中断1输入线)P3.4 T0(定时器0外部计数脉冲输入) P3.5 T1(定时器1外部计数脉冲输入) P3.6 /WR (外部数据存储器写选通信号输出) P3.7/RD (外部数据存储器读选通信号输出)2.1.3复位电路单片机的第9脚RST 为硬件复位端,开关复位要求在电源接通的条件下,在单片机运行期间,如果发生死机,用按钮开关操作使单片机复位。
复位电路如图2.1.3所示。
2.1.4 时钟电路在单片机XTAL1和XTAL2外接晶振,由于单片机内部有一个高增益反向放大器,外接晶振后,就构成了自激振荡器,产生时钟脉冲。
晶振使用12MHz 。
表2.1.2 P3口的第二功能图2.1.3 复位部分电路图电容C1、C2起稳定振荡频率、快速起振的作用,电容使用22pF 。
时钟电路如图2.2.4所示。
2.2 LED 模块LED 是半导体二极管的一种,可以将电能转化为光能,系统设计中我们用红、黄、绿三种颜色的灯,由单片机的P2脚控制。
LED 发光二极管采用共阳接法,由于单片机I/O 口输出功率小。
如果把发光二极管阳极接在I/O 口的话,会导致二极管亮度不够。
共阳接法使得发光二极管获得比较大的功率。
系统用到8个1K 电阻,起到限流作用,保护LED 发光二极管。
LED 部分如下图2.2.1所示。
图2.1.4 时钟部分电路图图2.2.1 LED 模块电路图2.3电源模块系统是由单片机直接控制处理,其稳定的电压十分重要,所以设计了一个稳压电源,如图2.3.1所示,C1、C2、C3、C4滤波,LM7805稳压,使循环彩灯能在各种特殊的环境下都能工作。
图2.3.1 电源模块电路图3 总结实践是检验真理的唯一标准,当然也是检验学习的唯一标准。
再经过几天的学习后,我了解自己的所学应如何应用在实践中,应为任何知识够源于实践,归于实践,所以要将所学的知识在实践中来检查。
我希望通过此次学习,能够将来把这些设计运用到工作中去,能够为我们找工作取得一定的基础,理论联系实际。
在设计期间,在老师同学的指导下,通过自身的努力完成了此次的设计,还学到了书上无法学到的经验,对电子元件有了进一步的认识。
此设计一AT89C51单片机为核心控制的花样彩灯,最后按设计要求在单片机上试验成功。
附录附录A 系统原理图附录B 元件清单元件名标号封装数量标称值Cap C1 CAP 1 1uF Cap Pol2 C2 10UF 1 10uF Cap Pol2 C3 10UF 1 0.1uF Cap C4 CAP 1 0.01uF Cap Pol2 C5 10UF 1 1uF 22pF C6, C7 CAP 2LED红D1, D6, D9 灯LED 3LED0 D2 10UF 11N4007 D3 DIO7.1-3.9x1.9 1LED黄D4, D7, D10 灯5MM 3LED绿D5, D8 灯LED 2Header 2H P1 sip02 1Res2 R1 res 1 200R2, R3, R4, R5,AXIAL-0.4 8 1K Res2R7, R8, R9, R10Res2 R6 res 1 10K SW-PB S1 ZISUO 1SW-PB S2 SPST-2 1LM7805 U1 sip3 1AT89C51 U2 DIP40 1XTAL Y1 XTAL-H 1附录C 源程序#include <reg52.h> //头文件sbit P2_0=P2^0;sbit P2_1=P2^1;sbit P2_2=P2^2;sbit P2_3=P2^3;sbit P2_4=P2^4;sbit P2_5=P2^5;sbit P2_6=P2^6;sbit P2_7=P2^7;rzmzy(); //红色走马左移声明rlszy(); //红色流水左移声明rlsyy(); //红色流水右移声明rzmyy(); //红色走马右移声明rzmnwyd(); //红色走马内外移动声明rlsnwyd(); //红色流水内外移动声明rtbyd(); //红色跳变移动声明rsdzmyy(); //红色3灯走马右移声明rsdzmzy(); //红色3灯走马左移声明rjl(); //红色渐亮声明rja(); //红色渐暗声明rdlszy(); //倒流水左移函数//rdlsyy(); //倒流水右移函数,还未加入zkb(unsigned char d);void ys1ms(unsigned int s); //延时声明,修改s的数值,就可以改变时间main() //主函数,由于模块化设计,只要修改下面各模块的排列顺序和时间,就可以实现各种变化模式{EA=1;//打开中断,使用中断方便调试查看模式EX0=1; //允许外部中断0中断EX1=1; //允许外部中断1中断PX0=1; // 外部中断0位高优先级while(1) //无限循环{rdlszy(); //倒流水左移rja(); //渐暗P2=0xff;ys1ms(300); //延时0.3秒//rdlsyy(); // 倒流水右移//P0=0xff;//ys1ms(300);rzmyy(); //走马右移P2=0xff;ys1ms(300);rzmzy(); //走马左移P2=0xff;ys1ms(300);rjl(); //渐亮rja(); //渐暗P2=0xff;ys1ms(300);rzmnwyd(); //走马内外移动P2=0xff;ys1ms(300);rlszy(); //流水左移rja(); //渐暗ys1ms(300);rlsyy(); //流水右移rja(); //渐暗ys1ms(300);rsdzmyy(); //3灯走马右移P2=0xff;ys1ms(300);rsdzmzy(); //3灯走马右移P2=0xff;ys1ms(300);rlsnwyd(); //流水内外移动P2=0xff;ys1ms(300);rtbyd(); //跳变7种模式P2=0xff;ys1ms(300);}}rzmyy() //走马拖尾右移函数{P2=0x7f;ys1ms(60);P2=0xbf;if(P2_7==1){unsigned int a;for(a=0;a<350;a++) //调节点亮时间{unsigned char i;P2_7 = 0;P2_7 = 1;for(i = 0; i < 50; i++);}}P2=0xdf;if(P2_6==1){unsigned int a;for(a=0;a<350;a++) //调节点亮时间{unsigned char i;P2_6 = 0;for(i = 0; i < 15; i++); //调节亮度高低P2_7 = 0;for(i = 0; i < 1; i++); //调节亮度高低P2_6 = 1;P2_7 = 1;for(i = 0; i < 50; i++);}}P2=0xef;if(P2_5==1){unsigned int a;for(a=0;a<350;a++) //调节点亮时间{unsigned char i;P2_5 = 0;P2_6 = 0;for(i = 0; i < 1; i++); //调节亮度高低P2_5 = 1;P2_6 = 1;for(i = 0; i < 50; i++);}}P2=0xf7;if(P2_4==1){unsigned int a;for(a=0;a<350;a++) //调节点亮时间{unsigned char i;P2_4 = 0;for(i = 0; i < 15; i++); //调节亮度高低P2_5 = 0;for(i = 0; i < 1; i++); //调节亮度高低P2_4 = 1;P2_5 = 1;for(i = 0; i < 50; i++);}}P2=0xfb;if(P2_3==1){unsigned int a;for(a=0;a<350;a++) //调节点亮时间{unsigned char i;P2_3 = 0;for(i = 0; i < 15; i++); //调节亮度高低P2_4 = 0;for(i = 0; i < 1; i++); //调节亮度高低P2_3 = 1;P2_4 = 1;for(i = 0; i < 50; i++);}}P2=0xfd;if(P2_2==1){unsigned int a;for(a=0;a<350;a++) //调节点亮时间{unsigned char i;P2_2 = 0;for(i = 0; i < 15; i++); //调节亮度高低P2_3 = 0;for(i = 0; i < 1; i++); //调节亮度高低P2_2 = 1;P2_3 = 1;for(i = 0; i < 50; i++);}}P2=0xfe;if(P2_1==1){unsigned int a;for(a=0;a<350;a++) //调节点亮时间{unsigned char i;P2_1 = 0;for(i = 0; i < 15; i++); //调节亮度高低P2_2 = 0;for(i = 0; i < 1; i++); //调节亮度高低P2_1 = 1;P2_2 = 1;for(i = 0; i < 50; i++);}}P2=0xff;if(P2_0==1){unsigned int a;for(a=0;a<350;a++) //调节点亮时间{unsigned char i;P2_0 = 0;for(i = 0; i < 15; i++); //调节亮度高低P2_1 = 0;for(i = 0; i < 1; i++); //调节亮度高低P2_0 = 1;P2_1 = 1;for(i = 0; i < 50; i++);}}if(P2_7==1){unsigned int a;for(a=0;a<350;a++) //调节点亮时间{unsigned char i;P2_0 = 0;for(i = 0; i < 1; i++); //调节亮度高低P2_0 = 1;for(i = 0; i < 50; i++);}}}/******************************************************************** ********/rzmzy() //走马拖尾左移函数{P2=0xfe;ys1ms(60);P2=0xfd;if(P2_0==1){unsigned int a;for(a=0;a<350;a++) //调节点亮时间{unsigned char i;P2_0 = 0;for(i = 0; i < 10; i++); //调节亮度高低P2_0 = 1;for(i = 0; i < 50; i++);}}P2=0xfb;if(P2_1==1){unsigned int a;for(a=0;a<350;a++) //调节点亮时间{unsigned char i;P2_1 = 0;for(i = 0; i < 15; i++); //调节亮度高低P2_0 = 0;for(i = 0; i < 1; i++); //调节亮度高低P2_1 = 1;P2_0 = 1;for(i = 0; i < 50; i++);}}P2=0xf7;if(P2_2==1){unsigned int a;for(a=0;a<350;a++) //调节点亮时间{unsigned char i;P2_2 = 0;for(i = 0; i < 15; i++); //调节亮度高低P2_1 = 0;for(i = 0; i < 1; i++); //调节亮度高低P2_2 = 1;P2_1 = 1;for(i = 0; i < 50; i++);}}P2=0xef;if(P2_3==1){unsigned int a;for(a=0;a<350;a++) //调节点亮时间{unsigned char i;P2_3 = 0;for(i = 0; i < 15; i++); //调节亮度高低P2_2 = 0;for(i = 0; i < 1; i++); //调节亮度高低P2_3 = 1;P2_2 = 1;for(i = 0; i < 50; i++);}}P2=0xdf;if(P2_4==1){unsigned int a;for(a=0;a<350;a++) //调节点亮时间{unsigned char i;P2_4 = 0;for(i = 0; i < 15; i++); //调节亮度高低P2_3 = 0;for(i = 0; i < 1; i++); //调节亮度高低P2_4 = 1;P2_3 = 1;for(i = 0; i < 50; i++);}}P2=0xbf;if(P2_5==1){unsigned int a;for(a=0;a<350;a++) //调节点亮时间{unsigned char i;P2_5 = 0;for(i = 0; i < 15; i++); //调节亮度高低P2_4 = 0;for(i = 0; i < 1; i++); //调节亮度高低P2_5 = 1;P2_4 = 1;for(i = 0; i < 50; i++);}}P2=0x7f;if(P2_6==1){unsigned int a;for(a=0;a<350;a++) //调节点亮时间{unsigned char i;P2_6 = 0;for(i = 0; i < 15; i++); //调节亮度高低P2_5 = 0;P2_6 = 1;P2_5 = 1;for(i = 0; i < 50; i++);}}P2=0xff;if(P2_7==1){unsigned int a;for(a=0;a<350;a++) //调节点亮时间{unsigned char i;P2_7 = 0;for(i = 0; i < 15; i++); //调节亮度高低P2_6 = 0;for(i = 0; i < 1; i++); //调节亮度高低P2_7 = 1;P2_6 = 1;for(i = 0; i < 50; i++);}}if(P2_0==1){unsigned int a;for(a=0;a<350;a++) //调节点亮时间{unsigned char i;P2_7 = 0;P2_7 = 1;for(i = 0; i < 50; i++);}}}/******************************************************************** ********/rlszy() //流水左移函数{unsigned char a,i,led; //声明无字符整形变量a,i,ledled=0xfe; //左移初始值定位P2=led; //输出ys1ms(120); //延时for(i=1;i<8;i++) //设置移动7次{a=led<<i;//灯左移i位P2=a; //依次点亮ys1ms(120);}}/******************************************************************** *******/rlsyy() //流水右移函数{unsigned char a,i,led; //声明无字符整形变量a,i,ledled=0x7f; //左移初始值定位P2=led; //输出ys1ms(120); //延时for(i=1;i<8;i++) //设置移动7次{a=led>>i;//灯右移i位P2=a; //依次点亮ys1ms(120);}}/******************************************************************** *******/rdlszy() //倒流水左移函数{P2=0xfe;ys1ms(60);P2=0xfd;ys1ms(60);P2=0xfb;ys1ms(60);P2=0xf7;ys1ms(60);P2=0xef;ys1ms(60);P2=0xdf;ys1ms(60);P2=0xbf;ys1ms(60);P2=0x7f;ys1ms(60);P2=0x7e;ys1ms(60);ys1ms(60); P2=0x7b; ys1ms(60); P2=0x6f; ys1ms(60); P2=0x5f; ys1ms(60); P2=0x3f; ys1ms(60);P2=0x3d; ys1ms(60); P2=0x3b; ys1ms(60); P2=0x37; ys1ms(60); P2=0x2f; ys1ms(60); P2=0x1f; ys1ms(60);P2=0x1e; ys1ms(60); P2=0x1d; ys1ms(60); P2=0x1b; ys1ms(60); P2=0x17; ys1ms(60);ys1ms(60);P2=0x0e;ys1ms(60);P2=0x0d;ys1ms(60);P2=0x0b;ys1ms(60);P2=0x07;ys1ms(60);P2=0x06;ys1ms(60);P2=0x05;ys1ms(60);P2=0x04;ys1ms(60);P2=0x03;ys1ms(60);P2=0x02;ys1ms(60);P2=0x01;ys1ms(60);P2=0x00;}/******************************************************************** *******rdlsyy() //倒流水右移函数,参考上面左移{}/******************************************************************** *******/rsdzmyy() //3灯走马右移函数,可以参考单灯走马加入拖尾{P2=0x1f;ys1ms(60);P2=0x8f;ys1ms(60);P2=0xc7;ys1ms(60);P2=0xe3;ys1ms(60);P2=0xf1;ys1ms(60);P2=0xf8;ys1ms(60);P2=0xfc;ys1ms(60);P2=0xfe;ys1ms(60);P2=0xff;}/******************************************************************** ********/rsdzmzy() //3灯走马左移函数,可以参考单灯走马加入拖尾{ys1ms(60);P2=0xf1;ys1ms(60);P2=0xe3;ys1ms(60);P2=0xc7;ys1ms(60);P2=0x8f;ys1ms(60);P2=0x1f;ys1ms(60);P2=0x3f;ys1ms(60);P2=0x7f;ys1ms(60);P2=0xff;}/******************************************************************** ********/rzmnwyd() //走马内外移动函数{P2=0x7e;//ys1ms(90);P2=0xbd;ys1ms(90);P2=0xdb;ys1ms(90);P2=0xe7;ys1ms(90);ys1ms(300);P2=0xe7;ys1ms(90);P2=0xdb;ys1ms(90);P2=0xbd;ys1ms(90);P2=0x7e;ys1ms(90);P2=0xff;}/******************************************************************** ********/rlsnwyd() //红色流水内外移动函数{P2=0xe7;//ys1ms(90);P2=0xc3;ys1ms(90);P2=0x81;ys1ms(90);P2=0x00;rja();ys1ms(300);P2=0x7e;ys1ms(90);P2=0x3c;ys1ms(90);P2=0x18;ys1ms(90);P2=0x00;rja();}/******************************************************************** ********/rtbyd() //红色跳变8模式移动函数{P2=0x1f;ys1ms(180);P2=0xff;ys1ms(120);P2=0xf8;ys1ms(180);P2=0xff;ys1ms(120);P2=0xe7;ys1ms(180);P2=0xff;ys1ms(300);/******************************************************************** ********/P2=0xfc;ys1ms(180);P2=0xff;ys1ms(120);P2=0x3f;ys1ms(180);P2=0xff;ys1ms(300);********/P2=0x3c;ys1ms(180);P2=0xff;ys1ms(120);P2=0x3c;ys1ms(180);P2=0xff;ys1ms(300);/******************************************************************** ********/P2=0xc3;ys1ms(120);P2=0xff;ys1ms(120);P2=0xc3;ys1ms(120);P2=0xff;ys1ms(120);/******************************************************************** ********/P2=0xf0;ys1ms(180);P2=0xff;ys1ms(120);P2=0xf0;ys1ms(180);P2=0xff;ys1ms(300);********/P2=0xc3;ys1ms(180);P2=0xff;ys1ms(120);P2=0xc3;ys1ms(300);/******************************************************************** ********/P2=0x0f;ys1ms(180);P2=0xff;ys1ms(120);P2=0x0f;ys1ms(180);P2=0xff;ys1ms(300);/******************************************************************** ********/rjl();P2=0x00;ys1ms(100);P2=0xff;ys1ms(35);P2=0x00;ys1ms(100);P2=0xff;ys1ms(35);P2=0x00;ys1ms(100);P2=0xff;ys1ms(35);P2=0x00;ys1ms(100);P2=0xff;ys1ms(35);P2=0x00;ys1ms(100);P2=0xff;ys1ms(35);rja();ys1ms(180);P2=0xff;}/**************单片机晶振为11.0592兆的1毫秒延时*************************/void ys1ms(unsigned int s) //定时器精确延时1毫秒函数,改变S数值即改变时间{TR0=1;while(s!=0){TH0=-(7629/256);TL0=-(7629%256);while(TF0!=1);TF0=0;s--;}TR0=0;}/******************************************************************** *********int0_srv() interrupt 0 using 2 //外中断函数{unsigned char n,m; //声明无字符整形变量a和bunsigned int i; //声明无字符整形变量ifor(i=0;i<5000;i++); //延时50毫秒,防抖动if (INT0==0) //暂停{n=P0; //保留状态m=P2;P3=0xfb; //保持暂停状态}if(INT1==0) //继续运行{P3=0xff; //释放暂停状态P0=n; //恢复运行P2=m;}}/******************************************************************** ********/rjl() //渐亮函数{unsigned char a, b;//a控制延时长度b控制循环周期P2 = 0xff;a = 0;for (b=250; b>0; b--) //循环周期设置{a++;zkb (a); //延时长度随a而改变P2 = 0xff;a = ~a; //a值取反,决定灯灭时的占空比zkb (a);P2 = 0x00;a = ~a; //a值取反使a回到原值继续循环}}/******************************************************************** ********/rja() //渐暗函数{unsigned char a, b;//a控制延时长度b控制循环周期P2 = 0x00; //亮起LEDa = 0;for (b=250; b>0; b--){a++;zkb (a);P2 = 0x00;a = ~a;zkb (a);P2 = 0xff;a = ~a;}}/****************************************************************************/zkb(unsigned char d) //占空比函数,由d决定延时长度{unsigned char i;while( --d != 0){for(i = 0; i < 1; i++); //占空比时间设置}}/******************************************************************** ********/。