这是我自己设计的一个花样霓虹灯设计,及8个led先一次亮灭,然后奇数和偶数灯闪烁,闪烁三次厚,8个灯又开始一次亮,依次循环。
用用单片机实物和proteus都试过,效果很好。
电路原理图如下:
单片机源程序:
- //霓虹灯实验: P0口接了8个灯,晶振为11.0592MHZ;
- //从D1到D8开始8个灯循环点亮一次,即D1点亮1s熄灭,依次是D8;
- //然后是间隔闪烁3次,即D1,3,5,7点亮1S熄灭,紧接着2,4,6,8点亮1s熄灭,
- //这为一次,然后循环3次。
- /*********主程序*******/
- #include <reg52.h>
- #define uchar unsigned char
- uchar i20,i8,i6; //定义三个正char:-128~127,unsigned char:0~127)
- uchar mod1,mod2 ; //定义两种模式,没中模式是8位,所以前面用char
- bit F; //循环标志位,用bit定义是为了节省空间
- void main ()
- {
- i20=20; //20x50ms=1s
- i8=8; //模式1有8次
- i6=6; //模式2有6次
- mod1=0x01; //0000 0001,模式1初始状态D1灭,其他亮
- mod2=0xAA; //1010 1010,模式2初始状态D1,3,5,7亮,其他灭
- F=0;//设置循环点亮阶段标志;=0为循环点亮阶段
- TMOD=0x10;//定时,T1,方式1
-
- TH1=0x4C; //11.0592*1000000/12*50*0.001=46080 ,
- //(65536-46080)/256=76...0 商是76(ox4C),余数是0(ox00)
- TL1=0x00;
- IE=0x88; //打开总中断与T1中断
- TR1=1;//打开T1控制位开关,在TCON寄存器中
- P1=0xF0; //针对这个实验板子,led灯一端连着锁存器和数码管,
- //为了防止锁存器数码管干扰,首先就要先关闭位选 ,
- //因为使能在硬件始终是开着的,所以关闭位选
- while(1);
- }
- /*****T1中断程序*********/
- void time0() interrupt 3 using 1
- {
-
- TH1=0x4C; //50ms到,中断跳出,此时继续装初值,直到20次,累计到1s
- TL1=0x00;
- i20--;
- if(i20==0)
- {
- i20=20;
- if(F==0)
- {
- P0=~mod1;
- mod1=mod1<<1;
- i8-- ;
- if(i8==0)
- {
- i8=8;
- F=1;
- mod1=0x01;
- }
- }
-
- else
- {
- P0=mod2;
- mod2=~mod2;
- i6--;
- if(i6==0)
- {
- i6=6;
- F=0;
- }
- }
- }
- }
复制代码
|