看到某宝上有无数字手表,就想着仿制一个。
我做的这个包含了时钟和灯光两种模式。时钟可以对时, 灯光分为呼吸灯、9LED游侠灯和爆闪灯三种,均可调速。
电路不是很复杂,因为是初学单片机,编程序搞得我好几天没睡好觉。。。。。。最后还是从网上找来各个程序,修改定义和变量,去除多余部分。。。七拼八凑的搞在了一起
做的时候没有详细拍照,所以照片不多。大家将就一下
自制的排阻
高亮的led打磨成雾状的。告诉你个窍门,用电钻夹住led的底部,在粗砂纸上打磨,很快就变成雾状了。
12M晶振
背面走线。。。很乱。。。
加了电池以后
我用的stc89c52rc,3v时就不工作了,所以不加保护板应该也不会过放。。。
最后完成图
左边按键长按是切换主模式(即时钟和灯光),短按是切换个主模式下的子模式(时钟下是对时子模式,灯光下是呼吸、游侠和爆闪三种效果)
右边按键对时模式下是每按一下,对应的时间加一,灯光模式下是切换各种灯光效果的三种速度。
由于蓝色led数量是9个。写游侠灯的程序时困扰了我很长时间。最后还是在论坛里找到了解决方案。
下面上原理图和视频
下面公开源代码,写的比较乱。要是哪位大侠能给精简一下就好了。
代码比较长,但都是些初级的函数。。。原理图和源代码我都开源了。
- #include <reg52.H>
- #include<INTRINS.H>
- //行
- sbit H1=P1^2;
- sbit H2=P0^0;
- sbit H3=P0^1;
- sbit H4=P0^2;
- sbit H5=P0^3;
- sbit H6=P0^4;
- sbit H7=P0^5;
- sbit H8=P0^6;
- sbit H9=P0^7;
- sbit H10=P1^1;
- sbit H11=P1^0;
- //列
- sbit L1=P1^3;
- sbit L2=P1^4;
- sbit L3=P1^5;
- sbit L4=P1^6;
- //按键
- sbit K1=P3^7;
- sbit K2=P2^0;
- //变量
- unsigned char ms10=0;ss=0;mm=0;mmyu=0;hh=0;hhyu=0;[color=#ff0000]hhjs=0;[/color]a=0;i=0; //定义参数
- unsigned char mode=0;clock=0;light=0; //模式
- unsigned int CYCLE=600;PWM_LOW=0;t=350;s=30000; //定义周期并赋值
- #define W1 L1=0,L2=1,L3=1,L4=1 //列扫描
- #define W2 L1=1,L2=0,L3=1,L4=1
- #define W3 L1=1,L2=1,L3=0,L4=1
- #define W4 L1=1,L2=1,L3=1,L4=0
- #define W0 L1=0,L2=0,L3=0,L4=0
- void delay(unsigned int b) //延时函数
- {
- while(--b);
- }
- void InitTimer0() //定时器0初始化
- {
- TMOD=0x01;
- TH0=(65536-10000)/256;
- TL0=(65536-10000)%256;
- EA=1;
- ET0=1;
- TR0=1;
- }
- /********************************************///时钟列显示
- showL1()
- {
- P1=0;P0=0; //第一列显示
- W1;
- hhyu=hh%10;
- if(hh>9){H10=1;}
- if(hh>19){H11=1;}
- if(hhyu>0) {H1=1;}
- if(hhyu>1) {H2=1;}
- if(hhyu>2) {H3=1;}
- if(hhyu>3) {H4=1;}
- if(hhyu>4) {H5=1;}
- if(hhyu>5) {H6=1;}
- if(hhyu>6) {H7=1;}
- if(hhyu>7) {H8=1;}
- if(hhyu>8) {H9=1;}
- }
- showL2()
- {
- P1=0;P0=0; //第二列显示
- W2;
- if(mm>49) {H10=1;}
- }
- showL3()
- {
- P1=0;P0=0; //第三列显示
- W3;
- if(mm>29) {H10=1;}
- if(mm>39) {H11=1;}
- }
- showL4()
- {
- P1=0;P0=0; //第四列显示
- W4;
- mmyu=mm%10;
- if(mm>9) {H10=1;}
- if(mm>19) {H11=1;}
- if(mmyu>0) {H1=1;}
- if(mmyu>1) {H2=1;}
- if(mmyu>2) {H3=1;}
- if(mmyu>3) {H4=1;}
- if(mmyu>4) {H5=1;}
- if(mmyu>5) {H6=1;}
- if(mmyu>6) {H7=1;}
- if(mmyu>7) {H8=1;}
- if(mmyu>8) {H9=1;}
- }
- /*****************************************///呼吸灯显示
- showHX()
- {
- L1=0;L2=0;L3=0;L4=0;
- H10=1;H11=1;H1=0;P0=0x00;
- for(PWM_LOW=1;PWM_LOW<CYCLE;PWM_LOW++)//PWM_LOW表示低
- {//电平时间,这个循环中低电平时长从1累加到CYCLE(周期)的值,即600次
- H10=0;H11=0; H1=1;P0=0xff;//点亮LED
- delay(PWM_LOW);//延时长度,600次循环中从1加至599
- H10=1;H11=1;H1=0;P0=0x00;//熄灭LED
- delay(CYCLE-PWM_LOW);//延时长度,600次循环中从599减至1
- }
- H10=0;H11=0;H1=1;P0=0xff;
- for(PWM_LOW=CYCLE-1;PWM_LOW>0;PWM_LOW--)
- {//与逐渐变亮相反的过程
- H10=0;H11=0;H1=1;P0=0xff;
- delay(PWM_LOW);
- H10=1;H11=1;H1=0;P0=0x00;
- delay(CYCLE-PWM_LOW);
- }
- }
- /*****************************************///以下为9灯游侠灯显示部分
- yxyy() //走马拖尾右移函数
- {
- P0=0x80;H1=0;
- delay(5000);
- P0=0x40;
- if(H9==0)
- {
- for(a=0;a<t;a++) //调节点亮时间
- {
- H9=1;
- for(i=0;i<15;i++); //调节亮度高低
- H9=0;
- for(i=0;i<50;i++);
- }
- }
- P0=0x20;
- if(H8==0)
- {
- for(a=0;a<t;a++) //调节点亮时间
- {
- H8=1;
- for(i=0;i<15;i++); //调节亮度高低
- H9=1;
- for(i=0;i<1;i++); //调节亮度高低
- H8=0;
- H9=0;
- for(i=0;i<50;i++);
- }
- }
- P0=0x10;
- if(H7==0)
- {
- for(a=0;a<t;a++) //调节点亮时间
- {
- H7=1;
- for(i=0;i<15;i++); //调节亮度高低
- H8=1;
- for(i=0;i<1;i++); //调节亮度高低
- H7=0;
- H8=0;
- for(i=0;i<50;i++);
- }
- }
- P0=0x08;
- if(H6==0)
- {
- for(a=0;a<t;a++) //调节点亮时间
- {
- H6=1;
- for(i=0;i<15;i++); //调节亮度高低
- H7=1;
- for(i=0;i<1;i++); //调节亮度高低
- H6=0;
- H7=0;
- for(i=0;i<50;i++);
- }
- }
- P0=0x04;
- if(H5==0)
- {
- for(a=0;a<t;a++) //调节点亮时间
- {
- H5=1;
- for(i=0;i<15;i++); //调节亮度高低
- H6=1;
- for(i=0;i<1;i++); //调节亮度高低
- H5=0;
- H6=0;
- for(i=0;i<50;i++);
- }
- }
- P0=0x02;
- if(H4==0)
- {
- for(a=0;a<t;a++) //调节点亮时间
- {
- H4=1;
- for(i=0;i<15;i++); //调节亮度高低
- H5=1;
- for(i=0;i<1;i++); //调节亮度高低
- H4=0;
- H5=0;
- for(i=0;i <50;i++);
- }
- }
- P0=0x01;
- if(H3==0)
- {
- for(a=0;a<t;a++) //调节点亮时间
- {
- H3=1;
- for(i=0;i<15;i++); //调节亮度高低
- H4=1;
- for(i=0;i<1;i++); //调节亮度高低
- H3=0;
- H4=0;
- for(i=0;i<50;i++);
- }
- }
- P0=0x00;H1=1;
- if(H2==0)
- {
- for(a=0;a<t;a++) //调节点亮时间
- {
- H2=1;
- for(i=0;i<15;i++); //调节亮度高低
- H3=1;
- for(i=0;i<1;i++); //调节亮度高低
- H2=0;
- H3=0;
- for(i=0;i<50;i++);
- }
- }
- P0=0x00;H1=0;
- }
- /****************************************************************************/
- yxzy() //左移函数
- {
- P0=0x00;H1=1;
- delay(5000);
- P0=0x01;H1=0;
- if(H1==0)
- {
- for(a=0;a<t;a++) //调节点亮时间
- {
- H1=1;
- for(i=0;i<10;i++); //调节亮度高低
- H1=0;
- for(i=0;i<50;i++);
- }
- }
- P0=0x02;H1=0;
- if(H2==0)
- {
- for(a=0;a<t;a++) //调节点亮时间
- {
- H2=1;
- for(i=0;i<15;i++); //调节亮度高低
- H1=1;
- for(i=0;i<1;i++); //调节亮度高低
- H2=0;
- H1=0;
- for(i=0;i<50;i++);
- }
- }
- P0=0x04;H1=0;
- if(H3==0)
- {
- for(a=0;a<t;a++) //调节点亮时间
- {
- H3=1;
- for(i=0;i<15;i++); //调节亮度高低
- H2=1;
- for(i=0;i<1;i++); //调节亮度高低
- H3=0;
- H2=0;
- for(i=0;i<50;i++);
- }
- }
- P0=0x08;
- if(H4==0)
- {
- for(a=0;a<t;a++) //调节点亮时间
- {
- H4=1;
- for(i = 0; i < 15; i++); //调节亮度高低
- H3=1;
- for(i=0;i<1;i++); //调节亮度高低
- H4=0;
- H3=0;
- for(i=0;i<50;i++);
- }
- }
- P0=0x10;
- if(H5==0)
- {
- for(a=0;a<t;a++) //调节点亮时间
- {
- H5=1;
- for(i=0;i<15;i++); //调节亮度高低
- H4=1;
- for(i=0;i<1;i++); //调节亮度高低
- H5=0;
- H4=0;
- for(i=0;i<50;i++);
- }
- }
- P0=0x20;
- if(H6==0)
- {
- for(a=0;a<t;a++) //调节点亮时间
- {
- H6=1;
- for(i=0;i<15;i++); //调节亮度高低
- H5=1;
- for(i=0;i<1;i++); //调节亮度高低
- H6=0;
- H5=0;
- for(i=0;i<50;i++);
- }
- }
- P0=0x40;
- if(H7==0)
- {
- for(a=0;a<t;a++) //调节点亮时间
- {
- H7=1;
- for(i=0;i<15;i++); //调节亮度高低
- H6=1;
- for(i=0;i<1;i++); //调节亮度高低
- H7=0;
- H6=0;
- for(i=0;i<50;i++);
- }
- }
- P0=0x80;
- if(H8==0)
- {
- for(a=0;a<t;a++) //调节点亮时间
- {
- H8=1;
- for(i=0;i<15;i++); //调节亮度高低
- H7=1;
- for(i=0;i<1;i++); //调节亮度高低
- H8=0;
- H7=0;
- for(i=0;i<50;i++);
- }
- }
- P0=0x00;
- }
- /*************************************************************************///主函数
- void main()
- {
- InitTimer0();
- while(1)
- {
- /*****************************************************///时钟模式
- if(mode==0)
- {
- ////////////////////////////////////////正常时钟模式
- if(clock==0)
- {
- showL1();
- delay(300);
- showL2();
- if(ms10<50) {H11=1;} //秒灯闪烁
- delay(300);
- showL3();
- delay(300);
- showL4();
- delay(300);
- }
- ////////////////////////////////////////小时对时模式
- if(clock==1)
- {
- showL1();
- if(ms10>49) {L1=1;} //闪烁显示第一列
- delay(300);
- }
- ////////////////////////////////////////分钟对时模式
- if(clock==2)
- {
- showL2();
- if(ms10>49) {L2=1;} //闪烁显示第二列
- delay(300);
- showL3();
- if(ms10>49) {L3=1;} //闪烁显示第三列
- delay(300);
- showL4();
- if(ms10>49) {L4=1;} //闪烁显示第四列
- delay(300);
- }
- }
- /***************************************************///灯光模式
- if(mode==1)
- {
- //////////////////////////////////////呼吸灯模式
- if(light==0)
- {
- showHX();
- }
- //////////////////////////////////////游侠灯模式
- if(light==1)
- {
- L1=0;L4=0;H10=0;H11=0;
- yxyy(); //游侠右移
- P0=0x00;H1=0;
- yxzy(); //游侠左移
- P0=0x00;H1=0;
- }
- ///////////////////////////////////////闪灯模式
- if(light==2)
- {
- P0=0xff;P1=0xff;
- delay(s);
- W0;
- delay(s);
- }
- }
- /**************************************/
- if(!K1) //模式切换键
- {
- delay(3000);
- if(!K1) //K1消抖
- { a=0;
- while(!K1) //K1按下后开始累加a,直到松开K1
- {
- a++;
- delay(1000);
- }
- if(a>59)
- {
- mode++; //长按切换主模式(时钟模式和灯光模式)
- if(mode>1)
- {mode=0;}
- }
- if(a<60) //短按切换各主模式下的子模式
- {
- if(mode==0)
- {
- clock++;
- if(clock>2)
- {clock=0;}
- }
- if(mode==1)
- {
- light++;
- if(light>2)
- {light=0;}
- }
- }
- }
- }
- /****************************************/
- if(!K2) //clock1和clock2对时
- {
- delay(3000);
- if(!K2) //K2消抖
- {
- if(mode==0)
- {
- if(clock==0)
- {}
- if(clock==1) //调小时
- {hh++;
- if(hh>23)
- {hh=0;}
- delay(26000); //延时以确定短按一次
- }
- if(clock==2) //调分钟
- {mm++;ss=0;ms10=0;
- if(mm>59)
- {mm=0;}
- delay(26000); //延时以确定短按一次
- }
- }
- if(mode==1)
- {
- ////////////////////////////呼吸灯三级调速
- if(light==0)
- {CYCLE=CYCLE-150;
- if(CYCLE<300)
- {CYCLE=600;}
- delay(26000);
- }
- ////////////////////////////游侠灯三级调速
- if(light==1)
- {t=t-125;
- if(t<100)
- {t=350;}
- delay(26000);
- }
- ////////////////////////////闪灯三级调速
- if(light==2)
- {s=s-10000;
- if(s<10000)
- {s=30000;}
- delay(26000);
- }
- }
- }
- }
- }
- }
- void Timer0Interrupt() interrupt 1 //计时中断
- {
- TH0=(65536-9990)/256;
- TL0=(65536-9990)%256;
- ms10++;
- if(ms10>99)
- {ms10=0;ss++;}
- if(ss>59)
- {ss=0;mm++;}
- if(mm>59)
- {mm=0;hh++;hhjs++;}
- if(hh>23)
- {hh=0;}
- if(hhjs>4){ss++;hhjs=0;}//////////////校时程序,每4小时加快1s(只适用于我的单片机,即使同一电路板,不同的单片机此数值也可能不同。)
- }
多定义一个变量“hhjs=0”,在hh++后面加一个hhjs++,代码最后一个“}”前加入if(hhjs>4){ss++;hhjs=0;}//////////////校时程序,每4小时加快1s(只适用于我的单片机,即使同一电路板,不同的单片机此数值也可能不同。)