找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4287|回复: 0
收起左侧

基于51单片机的辉光钟开源资料(pcb+外壳CAD+程序)

[复制链接]
ID:490512 发表于 2019-3-14 10:36 | 显示全部楼层 |阅读模式
IN14辉光钟 PCB文件及程序源码说明(转自舸轮综合船舶)

版本V1.1

除了右边有一个8550外,PCB中几乎所有的三极管型号均为13001

7805最好加一个微型的散热器,实测发热较大

NE555只是拿来闪烁冒号的,不是升压的,需另外配升压板

NE555右上方那个R 500k阻值具体是多少需要试,这个阻值决定了冒号的闪烁频率

闪烁的冒号(氖泡)从板子左下角的两个2pin分别接入,切记不可并联后接入

PowerRealy是一个继电器,是用来控制升压模块通断的,封装是典型黄色的HK信号继电器

继电器左边的两个接口,标有- S +的是红外热释探头的接入口,实现人来自动开,可在-和S之间再并联一个自锁开关可实现手动开关,另一个是-IN+是电源输入,参考电压12v,电流约0.2A

单片机左边的2pin接口是升压模块电源接口

调时按钮是KEY1 KEY2

R4 R2 R7 R1是四个8路排阻,排阻有小白点的一端对准焊盘正方形的一端

板子下方中间的+HV-是升压模块输出接入点

其左边的Out+分别接4个辉光管的阳极

为了节省板子(偷懒)没有采用常规的74HC573锁存器一组一组扫描着输出,而是采用每个引脚专门控制一位,但引脚刚好又差了一个,无奈就加了一个573,把变化最小的第一位数字和调时按钮接在上面
左上角的2032BAT是接纽扣电池的,能够实现掉电走时,但我不知为何没成功
现在程序还不是很完善,有一些bug,已知的有:在整点时小时位会延时1分钟,比如从20:59到21:00时会先跳到20:00然后一分钟后才会变为21:01,调时时有时候小时那边会一直在十内循环,不管他直接多按几轮一般能出来,调分时有时会只有个位动,好像这时候只能重启了。

焊接时一定要注意三极管引脚之间别短路了!
焊接时一定要注意三极管引脚之间别短路了!
焊接时一定要注意三极管引脚之间别短路了!

即使看着没短路也要用万用表打一下以防万一,Protel自带的三极管封装为什么引脚焊盘之间距离如此感人我也不知道

四组Out-(注意最右边那三个是一组,最左边从Q25和Q26中间引脚引出的两个引脚也是一组)各自接什么参照网上的51单片机引脚定义再对照下表:(左边第一位代表从左往右第几个辉光管,第二位表示此辉光管对应引脚的数字,右边表示单片机的对应引脚)
11 P22
12 P23
20 P34
21 P06
22 P07
23 P21
24 P20
25 P17
26 P30
27 P31
28 P32
29 P33
30 P03
31 P04
32 P02
33 P01
34 P05
35 P00
40 P16
41 P35
42 P36
43 P37
44 P10
45 P11
46 P12
47 P13
48 P14
49 P15


成品内构照片.JPG 成品照片1.JPG
成品照片2.JPG
辉光管引脚(看清方向).jpg
装盒前电路.jpg

Altium Designer画的原理图和PCB图如下:(51hei附件中可下载工程文件)
0.png 0.png

单片机源程序如下:
  1. #include<reg51.h>
  2. #define uchar unsigned char
  3. #define uint unsigned int
  4. sbit  DS1302_CLK = P2^4;        
  5. sbit  DS1302_IO  = P2^5;                     
  6. sbit  DS1302_RST = P2^6;            
  7. sbit dSW=P2^7;
  8. sbit mode=P2^2;
  9. sbit inc=P2^3;
  10. sbit d11=P2^2;
  11. sbit d12=P2^3;
  12. sbit d20=P3^4;
  13. sbit d21=P0^6;
  14. sbit d22=P0^7;
  15. sbit d23=P2^1;
  16. sbit d24=P2^0;
  17. sbit d25=P1^7;
  18. sbit d26=P3^0;
  19. sbit d27=P3^1;
  20. sbit d28=P3^2;
  21. sbit d29=P3^3;
  22. sbit d30=P0^3;
  23. sbit d31=P0^4;
  24. sbit d32=P0^2;
  25. sbit d33=P0^1;
  26. sbit d34=P0^5;
  27. sbit d35=P0^0;
  28. sbit d40=P1^6;
  29. sbit d41=P3^7;
  30. sbit d42=P3^6;
  31. sbit d43=P3^5;
  32. sbit d44=P1^0;
  33. sbit d45=P1^1;
  34. sbit d46=P1^2;
  35. sbit d47=P1^3;
  36. sbit d48=P1^4;
  37. sbit d49=P1^5;
  38. sbit  ACC0 = ACC^0;  
  39. sbit  ACC7 = ACC^7;
  40. uchar temp,date,hour,minute,second,position;
  41. void delay(uint z)
  42. {
  43. uint x,y;
  44. for(x=z;x>0;x--)
  45.   for(y=112;y>0;y--);
  46. }
  47. void DS1302InputByte(unsigned char d)
  48. {
  49.     unsigned char i;
  50.     ACC = d;
  51.     for(i=8; i>0; i--)
  52.     {
  53.         DS1302_IO = ACC0;            
  54.         DS1302_CLK = 1;
  55.         DS1302_CLK = 0;
  56.         ACC = ACC >> 1;
  57.     }
  58. }
  59. unsigned char DS1302OutputByte(void)
  60. {
  61.     unsigned char i;
  62.     for(i=8; i>0; i--)
  63.     {
  64.         ACC = ACC >>1;            
  65.         ACC7 = DS1302_IO;
  66.         DS1302_CLK = 1;
  67.         DS1302_CLK = 0;
  68.     }
  69.     return(ACC);
  70. }
  71. void Write1302(unsigned char ucAddr, unsigned char ucDa)
  72. {
  73.     DS1302_RST = 0;
  74.     DS1302_CLK = 0;
  75.     DS1302_RST = 1;
  76.     DS1302InputByte(ucAddr);      
  77.     DS1302InputByte(ucDa);     
  78.     DS1302_CLK = 1;
  79.     DS1302_RST = 0;
  80. }

  81. unsigned char Read1302(unsigned char ucAddr)
  82. {
  83.     unsigned char ucData;
  84.     DS1302_RST = 0;
  85.     DS1302_CLK = 0;
  86.     DS1302_RST = 1;
  87.     DS1302InputByte(ucAddr|0x01);      
  88.     ucData = DS1302OutputByte();      
  89.     DS1302_CLK = 1;
  90.     DS1302_RST = 0;
  91.     return(ucData);
  92. }
  93. void DS1302_init()
  94. {
  95.   if(Read1302(0xc1) != 0xf0)
  96.   {
  97.    Write1302(0x8e,0x00) ;
  98.    Write1302(0xc0,0xf0) ;
  99.    Write1302(0x8c,0x10) ;
  100.    Write1302(0x88,0x04) ;
  101.    Write1302(0x86,0x06) ;
  102.    Write1302(0x84,0x23) ;
  103.    Write1302(0x82,0x59) ;
  104.    Write1302(0x80,0x55) ;
  105.    Write1302(0x90,0xa4) ;      
  106.    Write1302(0x8e,0x80) ;  
  107.   }
  108. }
  109. #define uchar unsigned char
  110. #define uint unsigned int
  111. unsigned char ly_dis[4];
  112.         unsigned int i=0;
  113.         float tt;
  114.         int ltemp;
  115. void display()
  116. {
  117. uchar D1,D2,D3,D4;
  118. D1=hour/16;
  119. D2=hour%16;
  120. D3=minute/16;
  121. D4=minute%16;
  122. if (D1==0)
  123.         {dSW=1;d11=0;d12=0;dSW=0;delay(1);d11=1;d12=1;}
  124. else if (D1==1)
  125.         {dSW=1;d11=1;d12=0;dSW=0;delay(1);d11=1;d12=1;}
  126. else if (D1==2)
  127.         {dSW=1;d11=0;d12=1;dSW=0;delay(1);d11=1;d12=1;}
  128. if (D2==0)
  129.         {d20=1;d21=0;d22=0;d23=0;d24=0;d25=0;d26=0;d27=0;d28=0;d29=0;}
  130. else if (D2==1)
  131.         {d20=0;d21=1;d22=0;d23=0;d24=0;d25=0;d26=0;d27=0;d28=0;d29=0;}
  132. else if (D2==2)
  133.         {d20=0;d21=0;d22=1;d23=0;d24=0;d25=0;d26=0;d27=0;d28=0;d29=0;}
  134. else if (D2==3)
  135.         {d20=0;d21=0;d22=0;d23=1;d24=0;d25=0;d26=0;d27=0;d28=0;d29=0;}
  136. else if (D2==4)
  137.         {d20=0;d21=0;d22=0;d23=0;d24=1;d25=0;d26=0;d27=0;d28=0;d29=0;}
  138. else if (D2==5)
  139.         {d20=0;d21=0;d22=0;d23=0;d24=0;d25=1;d26=0;d27=0;d28=0;d29=0;}
  140. else if (D2==6)
  141.         {d20=0;d21=0;d22=0;d23=0;d24=0;d25=0;d26=1;d27=0;d28=0;d29=0;}
  142. else if (D2==7)
  143.         {d20=0;d21=0;d22=0;d23=0;d24=0;d25=0;d26=0;d27=1;d28=0;d29=0;}
  144. else if (D2==8)
  145.         {d20=0;d21=0;d22=0;d23=0;d24=0;d25=0;d26=0;d27=0;d28=1;d29=0;}       
  146. else if (D2==9)
  147.         {d20=0;d21=0;d22=0;d23=0;d24=0;d25=0;d26=0;d27=0;d28=0;d29=1;}

  148. if (D3==0)
  149.         {d30=1;d31=0;d32=0;d33=0;d34=0;d35=0;}
  150. else if (D3==1)
  151.         {d30=0;d31=1;d32=0;d33=0;d34=0;d35=0;}
  152. else if (D3==2)
  153.         {d30=0;d31=0;d32=1;d33=0;d34=0;d35=0;}
  154. else if (D3==3)
  155.         {d30=0;d31=0;d32=0;d33=1;d34=0;d35=0;}
  156. else if (D3==4)
  157.         {d30=0;d31=0;d32=0;d33=0;d34=1;d35=0;}
  158. else if (D3==5)
  159.         {d30=0;d31=0;d32=0;d33=0;d34=0;d35=1;}

  160. if (D4==0)
  161.         {d40=1;d41=0;d42=0;d43=0;d44=0;d45=0;d46=0;d47=0;d48=0;d49=0;}
  162. else if (D4==1)
  163.         {d40=0;d41=1;d42=0;d43=0;d44=0;d45=0;d46=0;d47=0;d48=0;d49=0;}
  164. else if (D4==2)
  165.         {d40=0;d41=0;d42=1;d43=0;d44=0;d45=0;d46=0;d47=0;d48=0;d49=0;}
  166. else if (D4==3)
  167.         {d40=0;d41=0;d42=0;d43=1;d44=0;d45=0;d46=0;d47=0;d48=0;d49=0;}
  168. else if (D4==4)
  169.         {d40=0;d41=0;d42=0;d43=0;d44=1;d45=0;d46=0;d47=0;d48=0;d49=0;}
  170. else if (D4==5)
  171.         {d40=0;d41=0;d42=0;d43=0;d44=0;d45=1;d46=0;d47=0;d48=0;d49=0;}
  172. else if (D4==6)
  173.         {d40=0;d41=0;d42=0;d43=0;d44=0;d45=0;d46=1;d47=0;d48=0;d49=0;}
  174. else if (D4==7)
  175.         {d40=0;d41=0;d42=0;d43=0;d44=0;d45=0;d46=0;d47=1;d48=0;d49=0;}
  176. else if (D4==8)
  177.         {d40=0;d41=0;d42=0;d43=0;d44=0;d45=0;d46=0;d47=0;d48=1;d49=0;}       
  178. else if (D4==9)
  179.         {d40=0;d41=0;d42=0;d43=0;d44=0;d45=0;d46=0;d47=0;d48=0;d49=1;}
  180.        
  181. }
  182. void set()
  183. {
  184.        
  185.   if(mode==0)
  186.     {
  187.     delay(5);
  188.     if(mode==0)
  189.       {
  190.                                  while(!mode);
  191.                                 hour=Read1302(0x85);
  192.                                 minute=Read1302(0x83);
  193.                                 while(1)
  194.                                 {
  195.                                                         if(inc==0)
  196.                                                         { delay(5);
  197.                                                                 if(inc==0)
  198.                                                          {
  199.                                                                  while(!inc);
  200.                                                                        
  201.                                                                         hour=(hour/16)*10+hour%16;
  202.                                                                         hour++;
  203.                                                                  if(hour==24) hour=0;
  204.                                                                  hour=(hour/10)*16+hour%10;
  205.                                                        
  206.                                                                 }  
  207.                                                         }
  208.                                                          if(mode==0)
  209.                                                          {
  210.                                                                  while(!mode);
  211.                                                                  while(1)
  212.                                                                         {
  213.                                                                               if(inc==0)
  214.                                                                                                 { delay(5);
  215.                                                                                                         if(inc==0)
  216.                                                                                                          {
  217.                                                                                                                  while(!inc);
  218.                                                                                                         minute=(minute/16)*10+minute%16;
  219.                                                                                                         minute++;
  220.                                                                                                         if(minute==60) minute=0;
  221.                                                                                                                  minute=(minute/10)*16+minute%10;
  222.                                                                                                                 display();  
  223.                                                                                                                 }  
  224.                                                                                                 }
  225.                                                                                                 if(mode==0)
  226.                                                                                                 {
  227.                                                                                                         while(!mode);
  228.                                                                                                        
  229.                                                                                                        
  230.                                                                                                          Write1302(0x8e,0x00) ;
  231.                                                                                                          Write1302(0x84,hour) ;
  232.                                                                                                                 Write1302(0x8e,0x80) ;
  233.                                                                                                                 hour=Read1302(0x85);
  234.                                                                                                                        
  235.                                                                                                                  Write1302(0x8e,0x00) ;
  236.                                                                                                                  Write1302(0x82,minute) ;
  237.                                                                                                                         Write1302(0x8e,0x80) ;
  238.                                                                                                                  minute=Read1302(0x83);
  239.                                                                                                         display();
  240.                                                                                                         return;
  241.                                                                                                        
  242.                                                                                                 }
  243.                                                                         }
  244.                                                         }
  245.                                                         display();  
  246.                                 }
  247.       }
  248.      }  
  249. }
  250. void main()
  251. {
  252.         delay(10);
  253. DS1302_init();
  254.         delay(80);
  255. while(1)
  256. {
  257.   date=Read1302(0x87);
  258.   hour=Read1302(0x85);
  259.   minute=Read1302(0x83);
  260.   second=Read1302(0x81);
  261.         if  (hour==0x23&&minute==0x59&&second==0x59)
  262.         {
  263.                 delay(100);
  264.                 Write1302(0x8e,0x00) ;
  265.          Write1302(0x84,0x00) ;
  266.         hour=0;
  267. second=0;       
  268.                 Write1302(0x80,0x00) ;               
  269.          Write1302(0x82,0x00) ;
  270.                 Write1302(0x8e,0x80) ;
  271.          minute=0;
  272.         }
  273.                
  274.   display();  
  275.                         set();
  276.         }

  277. }
复制代码
0.png
所有资料51hei提供下载:
程序.zip (40.73 KB, 下载次数: 37)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表