极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 29624|回复: 15

模拟指针式时钟

[复制链接]
发表于 2013-1-15 17:07:57 | 显示全部楼层 |阅读模式
本帖最后由 迷你强 于 2013-1-31 22:43 编辑



由132个双LED(围成三个圆圈,外面两圈分别是60个,最里面一圈是12个,从内到外分别表示时针、分针、秒针 )
当年提供给女友的毕业设计,后经过几次翻转思索查询下制作完成。
嘻嘻,具体不介绍了,看附件把。




重新整理原理图附近

程序在此。。。出自他人。


  1. #include <avr/io.h>  
  2. #include <avr/interrupt.h>  
  3. volatile unsigned char seconds= 0, minutes = 0, hour = 12;  
  4. const unsigned char ORING[62] = {12, 1, 9, 11, 8, 1, 2, 10, 12, 9, 2, 3, 11, 1, 10, 3, 4, 12, 2, 11, 4, 5, 1, 3, 12, 5, 6, 2, 4, 1, 6, 7, 3, 5, 2, 7, 8, 4, 6, 3, 8, 9, 5, 7, 4, 9, 10, 6, 8, 5, 10, 11, 7, 9, 6, 11, 12, 8, 10, 7, 12, 1};  
  5. const unsigned char IRING[14] = {7, 8, 9, 10, 11, 12, 1, 2, 3, 4, 5, 6, 7, 8};  

  6. unsigned char MODE_D;
  7. unsigned char we_D;

  8. /*                                微秒级延时程序                          */
  9. void delay_us(int time)//245*time 微秒
  10. {     
  11.         do
  12.                 {
  13.                         time--;
  14.                 }       
  15.         while (time>1);
  16. }          
  17. void t1_init(void)  
  18. {  
  19.         TCCR1B|=(1<<CS10)|(1<<WGM12);
  20.         TIMSK|=(1<< OCIE1A);  
  21.         OCR1A = 32768;  
  22. }  
  23. void port_init(void)  
  24. {
  25.         PORTB |=~0xc7;  
  26.         PORTC &= 0xc0;  
  27.         PORTD &= 0xc0;  
  28.         DDRB  &= 0xc7;  
  29.         DDRC  &= 0xc0;  
  30.         DDRD  &= 0xc0;  
  31. }  



  32. //=================== sub ====================//  
  33. void disp_seconds(void)  
  34. {  
  35.         DDRD  &= 0xc0;  
  36.         DDRC  &= 0xc0;  
  37.         PORTD &= 0xc0;  
  38.         PORTC &= 0xc0;  

  39.         if (ORING[seconds] <= 6)  
  40.                 {      
  41.                         PORTD |= (1 << (6 - ORING[seconds]));  
  42.                         DDRD  |= (1 << (6 - ORING[seconds]));  
  43.                 }  
  44.         else  
  45.                 {      
  46.                         PORTC |= (1 << (12 - ORING[seconds]));  
  47.                         DDRC  |= (1 << (12 - ORING[seconds]));  
  48.                 }   

  49.         if (ORING[seconds+ 1] <= 6)  
  50.                 {      
  51.                         DDRD  |= (1 << (6 - ORING[seconds+ 1]));  
  52.                 }  
  53.         else  
  54.                 {      
  55.                         DDRC  |= (1 << (12 - ORING[seconds+ 1]));  
  56.                 }   
  57. }  


  58. void disp_minutes(void)  
  59. {  
  60.         DDRD  &= 0xc0;  
  61.         DDRC  &= 0xc0;  
  62.         PORTD &= 0xc0;  
  63.         PORTC &= 0xc0;  

  64.         if (ORING[minutes] <= 6)  
  65.                 {      
  66.                         DDRD  |= (1 << (6 - ORING[minutes]));  
  67.                 }  
  68.         else  
  69.                 {      
  70.                         DDRC  |= (1 << (12 - ORING[minutes]));  
  71.                 }   

  72.         if (ORING[minutes + 1] <= 6)  
  73.                 {  
  74.                         PORTD |= (1 << (6 - ORING[minutes + 1]));  
  75.                         DDRD  |= (1 << (6 - ORING[minutes + 1]));  
  76.                 }  
  77.         else  
  78.                 {  
  79.                         PORTC |= (1 << (12 - ORING[minutes + 1]));  
  80.                         DDRC  |= (1 << (12 - ORING[minutes + 1]));  
  81.                 }   
  82. }  

  83. void disp_hour(void)  
  84. {  
  85.         DDRD  &= 0xc0;  
  86.         DDRC  &= 0xc0;  
  87.         PORTD &= 0xc0;  
  88.         PORTC &= 0xc0;  

  89.         if (IRING[hour] <= 6)  
  90.                 {   
  91.                         PORTC |= (1 << (6 - IRING[hour]));  
  92.                         DDRC  |= (1 << (6 - IRING[hour]));     
  93.                         DDRD  |= (1 << (6 - IRING[hour]));  
  94.                 }  
  95.         else  
  96.                 {      
  97.                         PORTD |= (1 << (12 - IRING[hour]));  
  98.                         DDRC  |= (1 << (12 - IRING[hour]));     
  99.                         DDRD  |= (1 << (12 - IRING[hour]));  
  100.                 }   
  101. }  

  102. void display(void)
  103. {
  104.         we_D++;
  105.         if((we_D>15)&&(MODE_D==1))
  106.                 {
  107.                         if(we_D>30)
  108.                                 we_D=0;
  109.                 }
  110.         else
  111.                 {
  112.                         disp_seconds();
  113.                 }
  114.         delay_us(5);

  115.         if((we_D>15)&&(MODE_D==2))
  116.                 {
  117.                         if(we_D>30)
  118.                                 we_D=0;
  119.                 }
  120.         else
  121.                 {
  122.                         disp_minutes();
  123.                 }
  124.         delay_us(5);
  125.         if((we_D>15)&&(MODE_D==3))
  126.                 {
  127.                         if(we_D>30)
  128.                                 we_D=0;
  129.                 }
  130.         else
  131.                 {
  132.                         disp_hour();
  133.                 }
  134.         delay_us(5);
  135. }


  136. //定时器1中断
  137. SIGNAL(SIG_OUTPUT_COMPARE1A)
  138. {  
  139.         seconds++;  
  140.         if (seconds>= 60)  
  141.                 {  
  142.                         seconds= 0;  
  143.                         minutes++;  
  144.                 }  
  145.         if (minutes >=60)  
  146.                 {  
  147.                         minutes = 0;  
  148.                         hour++;  
  149.                 }  
  150.         if (hour >12)  
  151.                 {  
  152.                         hour = 1;  
  153.                 }
  154. }  

  155. int main(void)   
  156. {   
  157.         port_init();  
  158.         t1_init();  
  159.         sei ();  

  160.         while(1)  
  161.                 {   
  162.                         display();
  163.                         if((PINB&0x08)!=0x08)
  164.                                 {
  165.                                         display();
  166.                                         if((PINB&0x08)!=0x08)
  167.                                                 {
  168.                                                         while((PINB&0x08)!=0x08) display();
  169.                                                         MODE_D++;
  170.                                                         if(MODE_D>3)
  171.                                                                 MODE_D=0;
  172.                                                 }
  173.                                 }
  174.                         if((PINB&0x10)!=0x10)//+
  175.                                 {
  176.                                         display();
  177.                                         if((PINB&0x10)!=0x10)
  178.                                                 {
  179.                                                         while((PINB&0x10)!=0x10) display();
  180.                                                         switch(MODE_D)
  181.                                                                 {
  182.                                                                         case 1:
  183.                                                                                 {
  184.                                                                                         hour++;
  185.                                                                                         if (hour >12)  
  186.                                                                                                 {  
  187.                                                                                                         hour = 1;  
  188.                                                                                                 }
  189.                                                                                 }
  190.                                                                         break;
  191.                                                                         case 2:
  192.                                                                                 {
  193.                                                                                         minutes++;  
  194.                                                                                         if (minutes >=60)  
  195.                                                                                                 {  
  196.                                                                                                         minutes = 0;  
  197.                                                                                                 }  
  198.                                                                                 }
  199.                                                                         break;
  200.                                                                         case 3:
  201.                                                                                 {
  202.                                                                                         seconds++;  
  203.                                                                                         if (seconds>=60)  
  204.                                                                                                 {  
  205.                                                                                                         seconds= 0;  
  206.                                                                                                 }  
  207.                                                                                 }
  208.                                                                         break;
  209.                                                                 }
  210.                                                 }
  211.                                 }
  212.                         if((PINB&0x20)!=0x20)//-
  213.                                 {
  214.                                         display();
  215.                                         if((PINB&0x20)!=0x20)
  216.                                                 {
  217.                                                        
  218.                                                 }
  219.                                 }
  220.                 }  
  221. }
复制代码

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复

使用道具 举报

发表于 2013-1-15 18:12:31 | 显示全部楼层
呵呵,很帅
不过电路图没怎么看明白,求高手解释一下
回复 支持 反对

使用道具 举报

发表于 2013-1-15 19:39:21 | 显示全部楼层
嗯,不错  嗯,不错
回复 支持 反对

使用道具 举报

发表于 2013-1-15 20:43:13 | 显示全部楼层
看的有点恐怖,132个LED{:soso_e127:},,能焊个5*5*5的光立方了
回复 支持 反对

使用道具 举报

发表于 2013-1-16 00:16:36 | 显示全部楼层
是在看不懂原理图,mcu是啥也看不出来
回复 支持 反对

使用道具 举报

发表于 2013-1-16 12:21:49 | 显示全部楼层
挺像八卦阵的
回复 支持 反对

使用道具 举报

发表于 2013-1-16 13:06:50 | 显示全部楼层
最害怕的就是画图~\(≧▽≦)/~啦啦啦
回复 支持 反对

使用道具 举报

发表于 2013-1-16 14:24:19 | 显示全部楼层
这个电路是什么原理,,看不懂?
回复 支持 反对

使用道具 举报

发表于 2013-1-16 15:15:48 | 显示全部楼层
楼主这个电路图好像不行,我模拟了一下,不行,是不是图发错了还是没画完整?
回复 支持 反对

使用道具 举报

发表于 2013-1-16 15:17:09 | 显示全部楼层
而且你这个图不管怎样解释都不对,不会是在逗我们吧!!!!!
回复 支持 反对

使用道具 举报

发表于 2013-1-16 15:17:48 | 显示全部楼层
还请楼主给个正确的原理图
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-1-16 16:09:44 | 显示全部楼层
chizhouwlb2008 发表于 2013-1-16 15:17
而且你这个图不管怎样解释都不对,不会是在逗我们吧!!!!!

没有错的,网络标号是否对,重新上传了,自己对下。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-1-16 16:10:36 | 显示全部楼层
chizhouwlb2008 发表于 2013-1-16 15:17
而且你这个图不管怎样解释都不对,不会是在逗我们吧!!!!!

原理图没有错误,食物已经正常运行了。。
回复 支持 反对

使用道具 举报

发表于 2013-1-26 10:30:34 | 显示全部楼层
很强  也很创意  啊   
回复 支持 反对

使用道具 举报

发表于 2013-3-3 16:44:10 | 显示全部楼层
好东西,顶一个。
回复 支持 反对

使用道具 举报

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

本版积分规则 需要先绑定手机号

Archiver|联系我们|极客工坊

GMT+8, 2024-5-10 14:25 , Processed in 0.046784 second(s), 29 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

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