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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

單片機2408點陣時鐘電子制作

[復制鏈接]
跳轉到指定樓層
樓主
ID:76556 發表于 2015-4-10 04:08 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
本帖最后由 nius 于 2015-4-10 04:10 編輯

    這是一款由單片機TC89C52RD為控制核必的2408點陣時鐘電子制作點陣的驅動是用單片機直驅,圖中是用STC89C52單片機,直驅三個8*8的共陽點陣屏,亮度還基本可以,白天看都很清楚!驅動能力不是很好,有條件的話用STC12C5A60S,驅動能力已經比較好,屏的亮度會比較高。白天看都很清楚!P0口需要接上1K的上拉電阻,P1-P3口分別接三個8*8屏的陰極,用去了單片機的全部32個I/O口。為了能調時間,P2口的P2.0-P2.6接屏的1-7列,P2.7口接一個按扭作于調時間,調整方法: 長按一次是進入調時狀態,短按是加1,長按二次是調分,短按是加1,長按3次回復正常狀態! 感興趣的愛好者可以動手實踐一下,體驗一下電子制作點陣時鐘的樂趣。


                                                
                                                                                               

  1. //單片機點陣電子鐘C語言程序
  2. //MCU:STC89C52RD  晶振頻率:12MHZ
  3. #include <reg52.H>
  4. #include<stdio.h>
  5. #define uchar unsigned char       //宏定義
  6. #define uint  unsigned int

  7. sbit KEY=P2^7;            //時調整鍵
  8. uchar keymode;          //鍵狀態
  9. uchar keydate;          //鍵值,
  10. uint  keycount;          //鍵延時值
  11. unsigned char c=0;       //時分調整位置變量,0不調,1時調時,2時調分
  12. bit D7,D6;              //鍵值有效,長按標志,
  13. bit  SHAN;               //閃爍標志位
  14. uchar second,minute,hour;        //定義秒、分、時寄存器
  15. //以下字模與ASCII對應是,只要將 'A'-0x20就可以得到A的字模了
  16. //高8*5寬 ASCII碼  
  17. //采用"字模提取軟件V2.2"
  18. //提取方式:縱向取模,字節倒序
  19. uchar code ASCII86[10][5]=
  20. {
  21. {0x3E,0x41,0x49,0x41,0x3E},//0
  22. {0x00,0x42,0x7F,0x40,0x00},//1
  23. {0x72,0x49,0x49,0x49,0x46},//2
  24. {0x21,0x41,0x49,0x4D,0x32},//3
  25. {0x18,0x14,0x12,0x7F,0x10},//4
  26. {0x27,0x45,0x45,0x45,0x38},//5
  27. {0x3C,0x4A,0x49,0x49,0x31},//6
  28. {0x41,0x21,0x11,0x09,0x07},//7
  29. {0x36,0x49,0x49,0x49,0x36},//8
  30. {0x46,0x49,0x49,0x29,0x16},//9
  31. };
  32. uchar code seg[24][3]=
  33. {
  34. {0xfe,0xff,0xff},
  35. {0xfd,0xff,0xff},
  36. {0xfb,0xff,0xff},
  37. {0xf7,0xff,0xff},
  38. {0xef,0xff,0xff},
  39. {0xdf,0xff,0xff},
  40. {0xbf,0xff,0xff},
  41. {0x7f,0xff,0xff},
  42. {0xff,0xfe,0xff},
  43. {0xff,0xfd,0xff},
  44. {0xff,0xfb,0xff},
  45. {0xff,0xf7,0xff},
  46. {0xff,0xef,0xff},
  47. {0xff,0xdf,0xff},
  48. {0xff,0xbf,0xff},
  49. {0xff,0x7f,0xff},
  50. {0xff,0xff,0xfe},
  51. {0xff,0xff,0xfd},
  52. {0xff,0xff,0xfb},
  53. {0xff,0xff,0xf7},
  54. {0xff,0xff,0xef},
  55. {0xff,0xff,0xdf},
  56. {0xff,0xff,0xbf},
  57. {0xff,0xff,0x7f}
  58. };  //P1,P3,P2掃描列選碼
  59. uchar disbuf[]={0,0,0,0,0,0};//定義緩沖數組區
  60. void delay(uchar t);          //延時函數
  61. void init();              //初始化函數
  62. void display();             //顯示函數

  63. void main()
  64. {   
  65. init();                //調用初始化函數
  66. P0=0xff; P1=0x00; P3=0x00; P2=0x00;
  67. for(c=0;c<10;c++) delay(255);
  68.   P1=0xff; P3=0xff; P2=0xff;   //測試點陣屏全亮3秒.
  69.   P0=0x00; P1=0x00; P3=0x00; P2=0x00;
  70. for(c=0;c<10;c++) delay(255);
  71.   P1=0xff; P3=0xff; P2=0xff;   //測試點陣屏全滅3秒.
  72.   P0=0xff; P1=0x00; P3=0x00; P2=0x00;
  73. for(c=0;c<10;c++) delay(255);
  74.   P1=0xff; P3=0xff; P2=0xff;   //測試點陣屏全亮3秒.
  75.     P0=0x00; P1=0x00; P3=0x00; P2=0x00;
  76. for(c=0;c<10;c++) delay(255);
  77.   P1=0xff; P3=0xff; P2=0xff;   //測試點陣屏全滅3秒.
  78.   c=0;
  79. while(1)               //主程序循環
  80.   {
  81. switch(keymode)        //鍵盤處理程序
  82.    {
  83.    case 0x00:
  84.     if(KEY==0)  { keymode=1; keycount=2;}
  85.           break;
  86.    case 0x01:
  87.       if(keycount==0)
  88.     { if(KEY==0)
  89.         { keymode=2; keydate=1;D7=0;} else {keymode=0; break;}
  90.     }
  91.     else
  92.     {
  93.     keycount--;
  94.     break;}
  95.    case 0x02:
  96.         if(KEY==1)
  97.        { keymode=0; D7=1; break;}
  98.      else
  99.      {keymode=3; keycount=50;  break; }
  100.    case 0x03:
  101.         if(KEY==1)
  102.      { keymode=0; D7=1; break;}
  103.     else
  104.      if(keycount==0)
  105.       { keymode=4; D6=1; break; }
  106.     else
  107.     { keycount--; break;}
  108.    case 0x04:
  109.      if(KEY==1)
  110.      {keymode=0; D7=1; break;}
  111.    else
  112.      break;
  113.   
  114.    default: break;
  115.    }  
  116.   //以下的鍵值調時間處理
  117.    if(D7==1)
  118. {
  119.     if(D6==0) {
  120.   if(c==1) hour++;
  121.     if(hour==24) hour=0;
  122.   if(c==2) minute++;
  123.   if(minute==60) minute=0;
  124.   D7=0; }
  125.     else
  126.   {c++; if(c>2) c=0; D6=0; D7=0;}
  127.   }
  128.   

  129.   disbuf[0]=(second);
  130.   disbuf[1]=(second/10);
  131.   disbuf[2]=(minute);
  132.   disbuf[3]=(minute/10);
  133.   disbuf[4]=(hour);
  134.   disbuf[5]=(hour/10);
  135.   display();              //調用顯示函數

  136. }
  137. }

  138. void init()
  139. {
  140. TMOD=1;TH0=0X3C;TL0=0XB0;       //定時器0模式1,50毫秒
  141. ET0=1;TR0=1;EA=1;           //開定時器0中斷、啟動定時器0、開總中斷
  142. }

  143. void display( )
  144. {
  145.    unsigned char i,j=0;  //j為列位置變量
  146.    
  147.             
  148.                for(i=0;i<5;i++)                                   //時十位
  149.                      {
  150.                       if(disbuf[5]==0) P0=0x00;             //時十分為0時不顯示
  151.                               else P0=ASCII86[disbuf[5]];
  152.         P1=seg[j][0]; P3=seg[j][1]; P2=seg[j][2];
  153.                         delay(1);
  154.              P1=0xff; P3=0xff; P2=0xff;
  155.                         j++;      
  156.                       }
  157.         j++;                          //隔一列            
  158.                  
  159.      for(i=0;i<5;i++)                                 //時個位
  160.                      {
  161.                       if(c==1&&SHAN)P0=0x00;
  162.         else P0=ASCII86[disbuf[4]];          //調時狀態時個位閃爍
  163.              P1=seg[j][0]; P3=seg[j][1]; P2=seg[j][2];
  164.                         delay(1);
  165.              P1=0xff; P3=0xff; P2=0xff;
  166.                         j++;      
  167.                       }
  168.    if(!SHAN) {P0=0x81;} else P0=0x00;          //秒閃
  169.            
  170.                  P1=seg[j][0]; P3=seg[j][1]; P2=seg[j][2];              
  171.                         delay(1);
  172.        P1=0xff; P3=0xff; P2=0xff;
  173.                         j++;      
  174.                 for(i=0;i<5;i++)                                    //分十位
  175.                      {
  176.                       P0=ASCII86[disbuf[3]];
  177.              P1=seg[j][0]; P3=seg[j][1]; P2=seg[j][2];
  178.                         delay(1);
  179.              P1=0xff; P3=0xff; P2=0xff;
  180.                         j++;      
  181.                       }
  182.         j++;
  183.      for(i=0;i<5;i++)                                    //分個位
  184.                      {
  185.                       if(c==2&&SHAN)P0=0x00;
  186.         else P0=ASCII86[disbuf[2]];     //調分狀態時分閃爍
  187.              P1=seg[j][0]; P3=seg[j][1]; P2=seg[j][2];
  188.                         delay(1);
  189.              P1=0xff; P3=0xff; P2=0xff;
  190.                         j++;      
  191.                       }
  192.    

  193. }

  194. void delay(uchar t)
  195. {
  196. uchar i;               //定義變量
  197. for(;t>0;t--)             //如果t大于0,t減1(外層循環)
  198.   for(i=124;i>0;i--);         //i等于124,如果i大于0,i減1
  199. }


  200. void timer0() interrupt 1        //定時器0(中斷1)
  201. {
  202.    uchar tim1,tim2;           //定義臨時變量
  203. TL0=TL0+0XB0;TH0=0X3C;        //重裝定時器初值
  204. tim1++;                //每中斷一次tim1加1
  205. if(tim1==10)             //中斷10(0.5秒)
  206. {                  
  207.   SHAN=!SHAN;             //閃爍標志取反
  208.   tim1=0;tim2++;           //tim1清零,tim2加1
  209.   if(tim2==2)             //到了1秒
  210.   {
  211.    tim2=0;second++;         //tim2清零,秒加1
  212.    if(second>=60)          //如果秒到60
  213.    {               
  214.     second=0;minute++;       //秒變0,分加1
  215.     if(minute>=60)         //如果分到60
  216.     {
  217.      minute=0;hour++;       //分變0,時加1
  218.      if(hour>=24) hour=0;     //如果時到24,時變0
  219.     }
  220.    }
  221.   }
  222. }
  223. }
復制代碼



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

使用道具 舉報

沙發
ID:74992 發表于 2015-4-10 12:41 | 只看該作者
做得不錯,淺顯易懂。
回復

使用道具 舉報

板凳
ID:76554 發表于 2015-4-11 23:59 | 只看該作者
做得不錯,不過就是點陣中,時間的那兩點看不是清楚
回復

使用道具 舉報

地板
ID:166064 發表于 2017-3-11 20:42 | 只看該作者
做得不錯,不過就是點陣中,時間的那兩點看不是清楚  
回復

使用道具 舉報

5#
ID:99130 發表于 2017-7-2 16:16 | 只看該作者
不錯 就是中間的冒號可以往中間靠一點,太靠邊了
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产日产精品一区二区三区四区 | 在线视频a | 精品国产一区二区三区久久狼黑人 | 日韩精品在线播放 | 午夜精品导航 | 欧美一级高清片 | 国产精品区二区三区日本 | 福利av在线 | 九九九久久国产免费 | 亚洲国产精品一区 | 亚洲精品www久久久 www.蜜桃av | 一区二区高清不卡 | 亚洲美女av网站 | 亚洲精品www| 国产精品久久久久久久久免费丝袜 | 成人h视频在线观看 | 男女精品网站 | 国产激情小视频 | 欧美激情精品久久久久久 | 中文字幕一区二区三区乱码在线 | 人人玩人人添人人澡欧美 | 91欧美| 久久精品欧美一区二区三区不卡 | 亚洲va在线va天堂va狼色在线 | 美女黄色在线观看 | 天天操天天干天天透 | 男女网站免费 | 综合久久综合久久 | 日韩午夜精品 | 51ⅴ精品国产91久久久久久 | 亚洲国产精品视频一区 | av午夜电影 | 中文字幕日韩专区 | 久久精品久久久 | 国产美女黄色 | 一级在线免费观看 | 黑人巨大精品欧美黑白配亚洲 | 黄色视频a级毛片 | 国产97久久 | 成人激情视频网 | 国产黄色小视频在线观看 |