久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3884|回復: 0
打印 上一主題 下一主題
收起左側

使用廢舊硬盤做的酷炫電子時鐘,基于51單片機 附程序PCB

[復制鏈接]
跳轉到指定樓層
樓主
早期初學51單片機時做的硬盤時鐘,沒有使用中斷功能(達不到最佳效果)有點遺憾。項目使用的是:視覺暫留原理+共陽三色燈+紅外遙控+光電開關(使用外中斷較好)以及機械硬盤。作品電路是手工焊接,有意者請參照源代碼引腳定義(除了紅外均可更改)。

制作出來的實物圖如下:


Altium Designer畫的原理圖和PCB圖如下:(51hei附件中可下載工程文件)


單片機源程序如下:
  1. #include<reg52.h>
  2. #include "DS1302.h"
  3. #include "main.h"

  4. void main(void)
  5. {       
  6. Init_Set();
  7. //Ds1302_Init();       
  8. EX0init();                 //初始化外部中斷
  9. TIM0init();                //初始化定時器
  10. Init_Timer1();//初始化定時器

  11. while(1)
  12. {
  13.         Judge();
  14.         if(ReadTimeFlag==1)
  15. {
  16.         ReadTimeFlag=0;
  17.   StypeSet();
  18.   ReadTimeFlag=0;
  19.   Ds1302_Read_Time();
  20.   hour=time_buf1[4]%12;        //時               
  21.   minute=time_buf1[5]; //分
  22.   second=time_buf1[6]; //秒
  23. }       
  24.         if(KEY==1)Display();
  25.     if(irok)                        //如果接收好了進行紅外處理
  26.           {   
  27.            Ircordpro();
  28.            irok=0;
  29.           }

  30.     if(irpro_ok)                   //如果處理好后進行工作處理,如按對應的按鍵后顯示對應的數字等
  31.           {
  32.            Ir_work();
  33.             }
  34. }
  35. }
  36. void Init_Set()        //初始化
  37. {
  38.         DB=0;
  39.         Light=40;
  40.         Rev=120;
  41.         Clkhour=8;
  42.         Clkminute=1;
  43.         STY=7;
  44.         ReadTimeFlag=1;
  45. }
  46. //解決因調整而跑飛的數據
  47. void Judge()
  48. {
  49.         if(Light<10){Light=10;STAR=0;}
  50.         if(Light>245)Light=245;
  51.         if(Rev<5){Rev=5;STAR=1;}
  52.         if(Rev>245)Rev=245;
  53.         if(hour>12)hour=1;
  54.         if(hour<1)hour=12;
  55.         if(minute>60)minute=1;
  56.         if(minute<1)minute=60;       
  57.         if(Clkhour>12)Clkhour=1;
  58.         if(Clkhour<1)Clkhour=12;
  59.         if(Clkminute>60)Clkminute=1;
  60.         if(Clkminute<1)Clkminute=60;
  61.         if(hour==Clkhour&&minute==Clkminute){OpenDB=1;if(second>58)OpenDB=0;}////一分鐘鬧鐘
  62. }
  63. void Display()
  64. {
  65.         unsigned char num;
  66.         DataBeing();
  67.         for(num=1;num<61;num++){
  68.   Stype();
  69.         if(num==second1){
  70.            RED=1;       
  71.                 }
  72.         if(num==minute1){
  73.                 GREEN=1;               
  74.                 }
  75.         if(num==hour1){
  76.                         BLUE=1;                        
  77.                 }
  78.                 DelayUs2x(Rev);
  79.                 RED=0;
  80.                 GREEN=0;
  81.                 BLUE=0;       

  82.         if(KEY==1)num=61;//尾部與開頭重合處理
  83.                 /*
  84.         if(num>50){
  85.                 if(STAR==1)Light--;
  86.                 else Rev--;
  87.                 num=62;       
  88.         }*/
  89.         }
  90. }

  91. //指針調整
  92. void DataBeing()
  93. {
  94.         if(SetClock==1){
  95.         second1=1;
  96.         if(Clkminute>53)minute1=Clkminute-53;
  97.         else minute1=Clkminute+7;
  98.         if(Clkhour<11)hour1=Clkhour*5+7;
  99.         if(Clkhour==11)hour1=2;
  100.         if(Clkhour==12)hour1=7;
  101.         }
  102.         else {
  103.         if(second>53)second1=second-53;
  104.         else second1=second+7;
  105.         if(minute>53)minute1=minute-53;
  106.         else minute1=minute+7;
  107.         if(hour<11) hour1=hour*5+7;
  108.         if(hour==11)hour1=2;
  109.         if(hour==12)hour1=7;
  110.   }
  111. }
  112. /*------------------------------------------------
  113.                   鍵值處理
  114. ------------------------------------------------*/
  115. void Ir_work(void)//紅外鍵值散轉程序
  116. {
  117.         switch(IRcord[2])
  118.         {       
  119.     case 0x45:        if(SetClock==1)Clkminute--;
  120.                                                         else time_buf1[5]--;if(time_buf1[5]==255)time_buf1[5]=59;         Ds1302_Write_Time();ReadTimeFlag=1;break; //分減1//CH-                                               
  121.                 case 0x46: SetClock=~SetClock;break;//CH//設置鬧鐘
  122.                 case 0x47: if(SetClock==1)Clkminute++;
  123.                                                         else time_buf1[5]++;if(time_buf1[5]==60)time_buf1[5]=0;     Ds1302_Write_Time();ReadTimeFlag=1;break;//分加1//CH+                                                               
  124.                 case 0x44: if(SetClock==1)Clkhour--;
  125.                                                         else time_buf1[4]--;if(time_buf1[4]==255)time_buf1[4]=23;          Ds1302_Write_Time();ReadTimeFlag=1;break; //正常時間 小時減1//<<                                                       
  126.                 case 0x40:if(SetClock==1)Clkhour++;
  127.                                                         else time_buf1[4]++;if(time_buf1[4]==24)time_buf1[4]=0;    Ds1302_Write_Time();ReadTimeFlag=1;break; //正常時間 小時 加1//>>                                                                       
  128.                 case 0x43:  OpenDB=~OpenDB;Clkminute--;break;//<||        //關閉鬧鐘和蜂鳴器
  129.                 case 0x09:  STAR=~STAR;GetTime=~GetTime;break;//EQ
  130.                 case 0x07: if(STAR==1)Light--;else Rev--;break;//-
  131.                 case 0x15: if(STAR==1)Light++;else Rev++;break;//+
  132.                 case 0x19: break;//100+   
  133.                 case 0x0d: break;//200+
  134.                 case 0x16: STY=0;break;//0
  135.                 case 0x0c: STY=1;break;//1
  136.                 case 0x18: STY=2;break;//2
  137.                 case 0x5e: STY=3;break;//3
  138.                 case 0x08: STY=4;break;//4
  139.                 case 0x1c: STY=5;break;//5
  140.                 case 0x5a: STY=6;break;//6
  141.                 case 0x42: STY=7;break;//7
  142.                 case 0x52: STYKEY1=~STYKEY1;break;//8
  143.                 case 0x4a: STYKEY2=~STYKEY2;break;//9
  144.                 default:break;
  145.         }
  146.         irpro_ok=0;//處理完成標志
  147. }
  148. void Stype()
  149. {
  150.         static unsigned int wait;
  151.         if(STYKEY1==1){
  152.         STYKEY2=0;
  153.         wait++;
  154.         if(wait>6000){
  155.         wait=0;
  156.         STY++;
  157.         }
  158.         if(STY>7)STY=1;
  159. }
  160.         if(STYKEY2==1){
  161.         STYKEY1=0;
  162.         STY++;
  163.         }
  164.         if(STY>7)STY=1;
  165.   StypeSet();
  166.         DelayUs2x(Light);
  167.         RED=0;
  168. ……………………

  169. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼

所有資料51hei附件下載:
程序與PCB文件.7z (11.46 MB, 下載次數: 15)
視頻預覽.mp4 (7.67 MB, 下載次數: 7)


評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 91精品国产一区二区三区蜜臀 | 青青草中文字幕 | 天天操夜夜爽 | 亚洲激情第一页 | 国产综合在线视频 | 精品99久久久久久 | 97热在线 | 亚洲欧美中文日韩在线v日本 | www.日日操| 欧美视频第二页 | 亚洲精品国产综合区久久久久久久 | 日韩成人在线播放 | 国产精品视频在线观看 | 精品网 | 国产精品久久毛片av大全日韩 | 亚洲精品国产电影 | 久久9999久久| 久久久网 | 日韩成人免费在线视频 | 欧美综合国产精品久久丁香 | 日韩欧美在线视频播放 | 激情五月婷婷 | 欧美日韩在线不卡 | 一区二区三区中文字幕 | 精品国产高清一区二区三区 | 欧美色综合一区二区三区 | 亚洲一区二区在线视频 | 午夜视频一区 | 日韩中文字幕免费 | 国产a视频 | 日韩综合在线 | 日韩高清中文字幕 | 97伦理电影网| 91av精品 | 亚洲欧美日韩成人在线 | 国产精品久久久99 | 亚洲永久| 日韩精品视频在线 | 日韩一区在线播放 | 亚洲狠狠 | 免费在线观看成人 |