欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索

DS1302 8位數碼管時鐘,調時可以連加連減

查看數: 8071 | 評論數: 9 | 收藏 7
關燈 | 提示:支持鍵盤翻頁<-左 右->
    組圖打開中,請稍候......
發布時間: 2017-4-25 14:59

正文摘要:

附件里有完整源碼和仿真圖

回復

ID:658790 發表于 2019-12-8 14:25
仿真為啥打不開。。
ID:127977 發表于 2018-11-17 16:47
學習了 啊 啊
ID:404878 發表于 2018-11-17 15:45
很可以想學習一下
ID:404878 發表于 2018-11-17 15:30
挺好的,正需要這樣的程序,謝謝樓主
ID:74370 發表于 2018-4-30 14:25
感謝分享
ID:231936 發表于 2018-4-21 09:22
很好,可是掉電后就變了。
ID:111376 發表于 2018-1-31 10:43
不錯不錯,感謝分享!
ID:140489 發表于 2018-1-30 16:26
  1. /*********************************************************************************
  2. 8位數碼管顯示實時時鐘
  3. 仿真 實物都通過.  11.0592MHz晶振,兩片74HC573做段選、位選
  4. 調時的時候,key2鍵短按加1,長按連加;key3鍵短按減一,長按連減;按鍵消抖不用delay
  5. **********************************************************************************/
  6. #include<reg52.h>
  7. #include<intrins.h>
  8. #define uchar unsigned char
  9. #define uint unsigned int

  10. /***********寫時分秒地址************/
  11. #define write_shi  0x84
  12. #define write_fen  0x82
  13. #define write_miao 0x80
  14. /***********讀時分秒地址************/
  15. #define read_shi  0x85
  16. #define read_fen  0x83
  17. #define read_miao 0x81

  18. sbit sclk = P1^0;           //控制數據時鐘
  19. sbit dio = P1^1;           //數據口
  20. sbit ce = P1^2;                   //使能端、復位端
  21. sbit wela = P2^7;           //位選
  22. sbit dula = P2^6;           //段選
  23. //sbit IO=P1^1;                                                                          //數據口
  24. //sbit SCLK=P1^0;                                                                 //控制數據時鐘
  25. //sbit RST=P1^2;                                                                  //使能端、復位端

  26. sbit key1=P3^0;                                                                        //按鍵 選擇
  27. sbit key2=P3^1;                                                                        //按鍵 加
  28. sbit key3=P3^2;                                                                        //按鍵 減

  29. uchar knum=0,snum,fnum,ss;
  30. char shi,fen,miao;
  31.                   // 0     1    2    3    4     5    6    7    8   9
  32. uchar code d[]={ 0x3F,0x06,0x5B,0x4F,0x66, 0x6D,0x7D,0x07,0x7F,0x6F}; //共陰不帶小數點
  33. uchar code dd[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef};//        共陰帶小數點

  34. //uchar dd[]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10};                //共陽帶小數點
  35. //uchar d[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xd8,0x80,0x90};                //共陽不帶小數點

  36. void delay(uint z)
  37. {
  38.         uint x,y;
  39.         for(x=z;x>0;x--)
  40.                 for(y=120;y>0;y--);
  41. }


  42. void t0_init()  //定時50ms一個中斷
  43. {
  44.    
  45.   TMOD=0X01;
  46.   TH0=(65536-46080)/256;
  47.   TL0=(65536-46080)%256;
  48. //  TH1=(65536-46080)/256;
  49. //  TL1=(65536-46080)%256;

  50.   EA=1;
  51.   ET0=1;
  52.   TR0=1;
  53. //  ET1=1;
  54. //  TR1=1;

  55. }


  56. void display(uchar shi,uchar fen,uchar miao)                          //顯示函數
  57. {
  58.         if(knum==0)
  59.         {
  60.                 snum=30;
  61.                 fnum=30;
  62.         }
  63.        
  64.         if(knum==1)
  65.         {
  66.                 fnum++;
  67.                 snum=30;
  68.         }
  69.        
  70.         if(knum==2)
  71.         {
  72.                 snum++;
  73.                 fnum=30;
  74.         }
  75.        
  76.        
  77.         if(snum>=30)
  78.         {       
  79.                 if((shi/10)<1)         //如果小時十位小于1,
  80.                 {
  81.                         wela=1;
  82.                         P0=0xfe;                //第1位
  83.                         wela=0;
  84.        
  85.                         dula = 1;
  86.                         P0=0xff;           // 小時十位就不顯示
  87.                         dula = 0;
  88.                 }
  89.                
  90.                 else
  91.                 {
  92.                         wela=1;
  93.                         P0=0xfe;          //第1位
  94.                         wela=0;
  95.        
  96.                         dula=1;
  97.                         P0=d[shi/10];
  98.                         dula=0;
  99.                         P0=0xff;
  100.                         delay(2);
  101.                 }

  102.                 wela=1;
  103.                 P0=0xfd;           //第2位
  104.                 wela=0;

  105.                 dula=1;
  106.                 P0=d[shi%10];                        //時的個位,P0=d[shi%10]時的個位小數點閃爍
  107.                 dula=0;                                        // 時的個位,P0=dd[shi%10]時的個位小數點不閃爍
  108.                 P0=0xff;
  109.                 delay(2);
  110.        
  111.                 if(snum==60)
  112.                         snum=0;
  113.         }               


  114.         //        if(miao%2==0)         //if(miao%2==0) 1秒閃爍1次
  115.                 if(ss>=10)                 //        這里寫為ss>=10,閃爍頻率可調
  116.                 {                                  
  117.                     wela=1;
  118.                         P0=0xfb;                //第3位
  119.                         wela=0;
  120.        
  121.                         dula=1;
  122.                         P0=0x40;          //第三位數碼管顯示“— ”
  123.                        
  124.                 //        P0=0x09;          //第三位數碼管顯示“= ”
  125.                         dula=0;
  126.                         P0=0xff;
  127.                         delay(2);
  128.                 }

  129.                 else
  130.                 {
  131.                         wela=1;
  132.                         P0=0xfb;   //第3位
  133.                         wela=0;
  134.        
  135.                         dula=1;
  136.                         P0=0;          //第三位數碼管不顯示
  137.                         dula=0;
  138.                         P0=0xff;
  139.                         delay(2);       
  140.                 }
  141.        
  142.        
  143.         if(fnum>=30)
  144.         {
  145.                 wela=1;
  146.                 P0=0xf7;         //第4位
  147.                 wela=0;

  148.                 dula=1;
  149.                 P0=d[fen/10];
  150.                 dula=0;
  151.                 P0=0xff;
  152.                 delay(2);
  153.                
  154.                
  155.                 wela=1;
  156.                 P0=0xef;         //第5位
  157.                 wela=0;

  158.                 dula=1;
  159.                 P0=d[fen%10];
  160.                 dula=0;
  161.                 P0=0xff;
  162.                 delay(2);
  163.        
  164.                
  165.                 if(fnum==60)
  166.                         fnum=0;
  167.         }
  168.                
  169.         //        if(miao%2==0)         //if(miao%2==0) 1秒閃爍1次
  170.                 if(ss>=10)                 //if(ss>=10)閃爍頻率可調
  171.                 {
  172.                         wela=1;
  173.                         P0=0xdf;          //第6位
  174.                         wela=0;
  175.                         dula=1;
  176.                         P0=0x40;          //第六位數碼管顯示“— ”
  177.                         dula=0;
  178.                         P0=0xff;
  179.        
  180.                         delay(2);
  181.                 }

  182.                 else
  183.                 {
  184.                         wela=1;
  185.                         P0=0xdf;   //第6位
  186.                         wela=0;
  187.                         dula=1;
  188.                         P0=0;          //第六位數碼管不顯示
  189.                         dula=0;
  190.                         P0=0xff;
  191.        
  192.                         delay(2);
  193.                 }
  194.                
  195.                
  196.                 wela=1;
  197.                 P0=0xbf;                //第7位
  198.                 wela=0;

  199.             dula=1;
  200.                 P0=d[miao/10];                           //秒十位
  201.                 dula=0;
  202.                 P0=0xff;
  203.                 delay(2);
  204.        

  205.                 wela=1;
  206.                 P0=0x7f;                          //第8位
  207.                 wela=0;

  208.                 dula=1;
  209.                 P0=d[miao%10];                         //秒個位
  210.                 dula=0;
  211.                 P0=0xff;
  212.                 delay(2);               
  213. }  



  214. void write_1302(uchar add,dat)                 //寫函數  qx
  215. {
  216.         uchar i,temp;
  217.         temp=add;
  218.         ce=0;
  219.         _nop_();
  220.         sclk=0;
  221.         _nop_();
  222.         ce=1;
  223.         _nop_();
  224.         for(i=0;i<8;i++)
  225.         {
  226.                 sclk=0;
  227.                 _nop_();
  228.                 if((temp&0x01)==0x01)
  229.                         dio=1;
  230.                         else
  231.                         dio=0;
  232.                 temp>>=1;
  233.                 sclk=1;
  234.                 _nop_();
  235.         }
  236.         temp=dat;
  237.         for(i=0;i<8;i++)
  238.         {
  239.                 sclk=0;
  240.                 _nop_();
  241.                 if((temp&0x01)==0x01)
  242.                         dio=1;
  243.                         else
  244.                         dio=0;
  245.                 temp>>=1;
  246.                 sclk=1;
  247.                 _nop_();
  248.         }
  249.         ce=0;
  250.         sclk=0;
  251. }
  252. uchar read_1302(uchar add)                                   //讀函數                qx
  253. {
  254.         uchar dat,dat1,i,temp;
  255.         temp=add;
  256.         ce=0;
  257.         _nop_();
  258.         sclk=0;
  259.         _nop_();
  260.         ce=1;
  261.         for(i=0;i<8;i++)
  262.         {
  263.                 sclk=0;
  264.                 _nop_();
  265.                 if((temp&0x01)==0x01)
  266.                         dio=1;
  267.                         else
  268.                         dio=0;
  269.                 temp>>=1;
  270.                 sclk=1;
  271.                 _nop_();
  272.         }
  273.         for(i=0;i<8;i++)
  274.         {
  275.                 sclk=0;
  276.                 _nop_();
  277.                 if(dio)
  278.                     dat|=0x80;
  279.                 if(i<7)
  280.                         dat>>=1;
  281.                 sclk=1;
  282.         }
  283.         dat1=dat/16;
  284.         dat=dat%16;
  285.         dat=dat1*10+dat;  
  286.         ce=0;
  287.         sclk=0;
  288.         return dat;
  289. }                       

  290. /*
  291. uchar read_1302(uchar add)                                                //讀函數
  292. {
  293.         uchar i,date;
  294.         RST=0;                                                                                 //禁止讀寫數據
  295.         for(i=0;i<8;i++)
  296.         {
  297.                 RST=1;
  298.                 SCLK=0;
  299.                 IO=add&0x01;
  300.                 add>>=1;
  301.                 SCLK=1;
  302.         }
  303.         for(i=0;i<8;i++)
  304.         {
  305.                 if(IO)
  306.                         date=date|0x80;
  307.                 else
  308.                         date=date|0x00;
  309.                 SCLK=1;       
  310.                 date>>=1;
  311.                 SCLK=0;
  312.         }
  313.         RST=0;
  314.         date=date/16*10+date%16;                  //進制轉換 16轉10進制
  315.         IO=0;                                                          //數據讀完后,IO口必須為0,不然小時一直顯示85
  316.         return date;
  317. }
  318. void write_1302(uchar add,uchar dat)                //寫函數
  319. {
  320.         uchar i;
  321.         RST=0;                                                                        //禁止讀寫數據
  322.         SCLK=0;                         
  323.         for(i=0;i<8;i++)                                                 //寫地址
  324.         {
  325.                 RST=1;                                                                 //允許讀寫數據
  326.                 SCLK=0;
  327.                 IO=add&0x01;        
  328.                 add>>=1;
  329.                 SCLK=1;
  330.         }
  331.         for(i=0;i<8;i++)                                                 //寫數據
  332.         {
  333.                 RST=1;                                                                //允許讀寫數據
  334.                 SCLK=0;       
  335.                 IO=dat&0x01;
  336.                 dat>>=1;
  337.                 SCLK=1;
  338.         }
  339.         RST=0;
  340. }         */


  341. void init_1302()                                                        //初始化函數 設置第一次上電時顯示的時間值
  342. {       
  343.         write_1302(0x8e,0x00);                                        //保護取消,可以進行寫操作
  344.         write_1302(write_miao,0x57);                        //寫秒57
  345.         write_1302(write_fen,0x55);                                //寫分55
  346.         write_1302(write_shi,0x15);                                //寫時15
  347.         write_1302(0x8e,0x80);                                        //保護啟動,不能進行寫操作
  348. }         

  349. void read_sf()                           //讀時分秒并顯示
  350. {
  351.         shi=read_1302(read_shi);
  352.         fen=read_1302(read_fen);
  353.         miao=read_1302(read_miao);
  354.         display(shi,fen,miao);
  355. }


  356. void keyscan()                        //按鍵掃描函數
  357. {       
  358.         static uchar count;          //這里要定義為靜態變量
  359.         if(key1==0)                          //按鍵按下
  360.         {
  361.                 count++;                          //消抖,也是連加一次的間隔時間
  362.                 if(key1==0 && count>10)//按鍵按下,計數變量加到12,
  363.                 {

  364.                         while(!key1)           //這里不需要連加,就加一句松手檢測
  365.                         display(shi,fen,miao);
  366.                         count=0;
  367.                         TR0=0;
  368.                         knum++;                          
  369.                         if(knum==1)                                                 
  370.                         {
  371.                                  write_1302(0x8e,0x00);                  //DS1302寫保護取消
  372.                                  write_1302(write_miao,0x80); //寫秒80,時鐘停止走時;
  373.                         }
  374.                        
  375.                         if(knum==3)                                                   //調時完畢,時鐘啟動
  376.                         {
  377.                                 TR0=1;
  378.                                 knum=0;
  379.                                 write_1302(write_miao,0x00); //寫秒0,時鐘啟動走時
  380.                                 write_1302(0x8e,0x80);                 //保護啟動
  381.                         }
  382.                 }
  383.         }


  384.         if(knum==1)                                                                //分鐘調節
  385.         {
  386.                 if(key2==0)                                                        //加
  387.                 {
  388.                         count++;
  389.                         if(key2==0 && count>12)//短按加1,長按連加
  390.                         {
  391.                                 count=0;
  392.                                 fen++;
  393.                                 fen=fen/10*16+fen%10;                //轉為16進制
  394.                                 if(fen==0x60)
  395.                                         fen=0x00;
  396.                                 write_1302(write_fen,fen);        //寫入1302
  397.                         }
  398.                 }
  399.                
  400.                 if(key3==0)                                                   //減
  401.                 {
  402.                         count++;
  403.                         if(key3==0 && count>12)//短按減1,長按連減
  404.                         {
  405.                                 count=0;
  406.                                 fen--;
  407.                                 fen=fen/10*16+fen%10;                //轉為16進制
  408.                                 if(fen==-1)
  409.                                         fen=0x59;
  410.                                 write_1302(write_fen,fen);
  411.                         }
  412.                 }
  413.         }
  414.        
  415.        
  416.         if(knum==2)                                                          //小時調節
  417.         {
  418.                 if(key2==0)
  419.                 {
  420.                         count++;
  421.                         if(key2==0 && count>12 )//短按加1,長按連加
  422.                         {
  423.                                 count=0;
  424.                                 shi++;
  425.                                 shi=shi/10*16+shi%10;                //轉為16進制
  426.                                 if(shi==0x24)
  427.                                         shi=0x00;
  428.                                 write_1302(write_shi,shi);
  429.                         }
  430.                 }
  431.                
  432.                
  433.                 if(key3==0)
  434.                 {
  435.                         count++;
  436.                         if(key3==0 && count>12 )//短按減1,長按連減
  437.                         {       
  438.                                 count=0;
  439.                                 shi--;
  440.                                 shi=shi/10*16+shi%10;                //轉為16進制
  441.                                 if(shi==-1)
  442.                                         shi=0x23;
  443.                                 write_1302(write_shi,shi);
  444.                         }
  445.                 }
  446.         }
  447. }          


  448. void main()
  449. {//        uchar i;
  450.         t0_init();
  451.         init_1302();                          
  452.         while(1)
  453.         {
  454.            //        for(i=0;i<4;i++)       
  455.         //        display(shi,fen,miao);
  456.             read_sf();
  457.             keyscan();
  458.         }
  459. }

  460. void temer1() interrupt 1
  461. {
  462.         TH0=(65536-46080)/256;
  463.         TL0=(65536-46080)%256;
  464.         ss++;
  465.         if(ss==20)
  466.                 ss=0;
  467. }        

  468. //void temer2() interrupt 3
  469. //{
  470. //        TH1=(65536-46080)/256;
  471. //        TL1=(65536-46080)%256;
  472. //        ss1++;
  473. //        if(ss1==20) //1秒
  474. //        {       
  475. //                ss1=0;
  476. ////                zs++;
  477. //                zs1--;
  478. //        }
  479. //}



復制代碼
ID:161033 發表于 2017-7-8 22:25
感謝分享

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表