找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 6044|回復(fù): 4
打印 上一主題 下一主題
收起左側(cè)

單片機(jī)2408點(diǎn)陣時(shí)鐘電子制作

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:76556 發(fā)表于 2015-4-10 04:08 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
本帖最后由 nius 于 2015-4-10 04:10 編輯

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


                                                
                                                                                               

  1. //單片機(jī)點(diǎn)陣電子鐘C語(yǔ)言程序
  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;            //時(shí)調(diào)整鍵
  8. uchar keymode;          //鍵狀態(tài)
  9. uchar keydate;          //鍵值,
  10. uint  keycount;          //鍵延時(shí)值
  11. unsigned char c=0;       //時(shí)分調(diào)整位置變量,0不調(diào),1時(shí)調(diào)時(shí),2時(shí)調(diào)分
  12. bit D7,D6;              //鍵值有效,長(zhǎng)按標(biāo)志,
  13. bit  SHAN;               //閃爍標(biāo)志位
  14. uchar second,minute,hour;        //定義秒、分、時(shí)寄存器
  15. //以下字模與ASCII對(duì)應(yīng)是,只要將 'A'-0x20就可以得到A的字模了
  16. //高8*5寬 ASCII碼  
  17. //采用"字模提取軟件V2.2"
  18. //提取方式:縱向取模,字節(jié)倒序
  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};//定義緩沖數(shù)組區(qū)
  60. void delay(uchar t);          //延時(shí)函數(shù)
  61. void init();              //初始化函數(shù)
  62. void display();             //顯示函數(shù)

  63. void main()
  64. {   
  65. init();                //調(diào)用初始化函數(shù)
  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;   //測(cè)試點(diǎn)陣屏全亮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;   //測(cè)試點(diǎn)陣屏全滅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;   //測(cè)試點(diǎn)陣屏全亮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;   //測(cè)試點(diǎn)陣屏全滅3秒.
  78.   c=0;
  79. while(1)               //主程序循環(huán)
  80.   {
  81. switch(keymode)        //鍵盤(pán)處理程序
  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.   //以下的鍵值調(diào)時(shí)間處理
  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();              //調(diào)用顯示函數(shù)

  136. }
  137. }

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

  143. void display( )
  144. {
  145.    unsigned char i,j=0;  //j為列位置變量
  146.    
  147.             
  148.                for(i=0;i<5;i++)                                   //時(shí)十位
  149.                      {
  150.                       if(disbuf[5]==0) P0=0x00;             //時(shí)十分為0時(shí)不顯示
  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++)                                 //時(shí)個(gè)位
  160.                      {
  161.                       if(c==1&&SHAN)P0=0x00;
  162.         else P0=ASCII86[disbuf[4]];          //調(diào)時(shí)狀態(tài)時(shí)個(gè)位閃爍
  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++)                                    //分個(gè)位
  184.                      {
  185.                       if(c==2&&SHAN)P0=0x00;
  186.         else P0=ASCII86[disbuf[2]];     //調(diào)分狀態(tài)時(shí)分閃爍
  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(外層循環(huán))
  198.   for(i=124;i>0;i--);         //i等于124,如果i大于0,i減1
  199. }


  200. void timer0() interrupt 1        //定時(shí)器0(中斷1)
  201. {
  202.    uchar tim1,tim2;           //定義臨時(shí)變量
  203. TL0=TL0+0XB0;TH0=0X3C;        //重裝定時(shí)器初值
  204. tim1++;                //每中斷一次tim1加1
  205. if(tim1==10)             //中斷10(0.5秒)
  206. {                  
  207.   SHAN=!SHAN;             //閃爍標(biāo)志取反
  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,時(shí)加1
  218.      if(hour>=24) hour=0;     //如果時(shí)到24,時(shí)變0
  219.     }
  220.    }
  221.   }
  222. }
  223. }
復(fù)制代碼



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

相關(guān)帖子

回復(fù)

使用道具 舉報(bào)

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

使用道具 舉報(bào)

板凳
ID:76554 發(fā)表于 2015-4-11 23:59 | 只看該作者
做得不錯(cuò),不過(guò)就是點(diǎn)陣中,時(shí)間的那兩點(diǎn)看不是清楚
回復(fù)

使用道具 舉報(bào)

地板
ID:166064 發(fā)表于 2017-3-11 20:42 | 只看該作者
做得不錯(cuò),不過(guò)就是點(diǎn)陣中,時(shí)間的那兩點(diǎn)看不是清楚  
回復(fù)

使用道具 舉報(bào)

5#
ID:99130 發(fā)表于 2017-7-2 16:16 | 只看該作者
不錯(cuò) 就是中間的冒號(hào)可以往中間靠一點(diǎn),太靠邊了
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表