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

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

QQ登錄

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

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

發(fā)一個(gè)DS1302的單片機(jī)實(shí)時(shí)時(shí)鐘仿真與源碼,希望能幫到初學(xué)者

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
描述:
1、8位共陰數(shù)碼管顯示實(shí)時(shí)時(shí)鐘88-88-88樣式,兩‘-’1秒閃爍1次
2、STC89C52 @ 11.0592MHz晶振,兩片74HC573做段選、位選
3、調(diào)時(shí)的時(shí)候,key2鍵短按加1,長(zhǎng)按連加;key3鍵短按減一,長(zhǎng)按連減;按鍵消抖不用delay。
4、在調(diào)時(shí)狀態(tài)超過(guò)3秒再?zèng)]有按鍵按下,回到走時(shí)狀態(tài)
5、加備用電池,掉電走時(shí)        ,仿真 實(shí)物都通過(guò)。

仿真圖:


單片機(jī)源程序:
  1. /*********************************************************************************
  2. 描述:
  3. 1、8位共陰數(shù)碼管顯示實(shí)時(shí)時(shí)鐘88-88-88樣式,兩‘-’1秒閃爍1次
  4. 2、STC89C52 @ 11.0592MHz晶振,兩片74HC573做段選、位選
  5. 3、調(diào)時(shí)的時(shí)候,key2鍵短按加1,長(zhǎng)按連加;key3鍵短按減一,長(zhǎng)按連減;按鍵消抖不用delay。
  6. 4、在調(diào)時(shí)狀態(tài)超過(guò)3秒再?zèng)]有按鍵按下,回到走時(shí)狀態(tài)
  7. 5、加備用電池,掉電走時(shí)        ,仿真 實(shí)物都通過(guò)。
  8. **********************************************************************************/
  9. #include<reg52.h>
  10. #include<intrins.h>

  11. #define uchar unsigned char
  12. #define uint unsigned int

  13. /***********寫時(shí)分秒地址************/
  14. #define write_shi  0x84
  15. #define write_fen  0x82
  16. #define write_miao 0x80
  17. #define write_ram  0xc0
  18. /***********讀時(shí)分秒地址************/
  19. #define read_shi  0x85
  20. #define read_fen  0x83
  21. #define read_miao 0x81
  22. #define read_ram  0xc1

  23. sbit sclk = P1^0;           //控制數(shù)據(jù)時(shí)鐘
  24. sbit dio = P1^1;           //數(shù)據(jù)口
  25. sbit ce = P1^2;                   //使能端、復(fù)位端
  26. sbit wela = P2^7;           //位選
  27. sbit dula = P2^6;           //段選

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

  31. uint ms;                                //調(diào)時(shí)自動(dòng)走時(shí)計(jì)時(shí)變量
  32. uchar knum=0,snum,fnum,ss;        //定義 key1按下次數(shù)變量,時(shí)分調(diào)時(shí)閃爍變量,兩‘-’閃爍計(jì)時(shí)變量
  33. char shi,fen,miao;                //定義時(shí)分秒變量

  34. bit f1,f2,f3;                        //定義自動(dòng)走時(shí)標(biāo)志
  35.                                   // 0     1    2    3    4     5    6    7    8   9        不顯  -
  36. uchar code d[]={ 0x3F,0x06,0x5B,0x4F,0x66, 0x6D,0x7D,0x07,0x7F,0x6F,0x00,0x40}; //共陰不帶小數(shù)點(diǎn)段碼

  37. void delay(uint z)          //ms延時(shí)函數(shù)
  38. {
  39.         uint x,y;
  40.         for(x=z;x>0;x--)
  41.                 for(y=120;y>0;y--);
  42. }

  43. void t0_init()  //定時(shí)器初始化函數(shù)
  44. {
  45.    
  46.         TMOD |= 0X11;                         //定時(shí)器0、1都為模式1, 16位計(jì)數(shù)模式
  47.         TH0=(65536-46080)/256;   //50ms初值  @11.0529MHz
  48.         TL0=(65536-46080)%256;
  49.         TH1=(65536-921)/256;         //1ms初值  @11.0529MHz
  50.         TL1=(65536-921)%256;
  51.         
  52.         EA=1;                                         //開(kāi)總中斷
  53.         ET0=1;                                         //開(kāi)定時(shí)器T0中斷
  54.         TR0=1;                                         //啟動(dòng)T0
  55.         ET1=1;                                         //開(kāi)定時(shí)器T1中斷
  56. //  TR1=1;

  57. }


  58. void display(uchar shi,uchar fen,uchar miao) //顯示函數(shù)
  59. {
  60.         if(knum==0)           //正常走時(shí)
  61.         {
  62.                 snum=30;
  63.                 fnum=30;
  64.         }
  65.         
  66.         if(knum==1)           //調(diào)時(shí),分位閃爍
  67.         {
  68.                 fnum++;
  69.                 snum=30;
  70.         }
  71.         
  72.         if(knum==2)          //調(diào)時(shí),時(shí)位閃爍
  73.         {
  74.                 snum++;
  75.                 fnum=30;
  76.         }
  77.         
  78.         
  79.         if(snum>=30)
  80.         {        
  81.                 if((shi/10)<1)         //如果小時(shí)十位小于1,
  82.                 {
  83.                         wela=1;
  84.                         P0=0xfe;                //第1位
  85.                         wela=0;
  86.         
  87.                         dula = 1;
  88.                         P0=d[10];           //共陰數(shù)碼管段碼送全0 小時(shí)十位就不顯示
  89.                         dula = 0;
  90.                 }
  91.                
  92.                 else
  93.                 {
  94.                         wela=1;
  95.                         P0=0xfe;          //第1位
  96.                         wela=0;
  97.         
  98.                         dula=1;
  99.                         P0=d[shi/10];
  100.                         dula=0;
  101.                         P0=0xff;
  102.                         delay(2);
  103.                 }

  104.                 wela=1;
  105.                 P0=0xfd;           //第2位
  106.                 wela=0;

  107.                 dula=1;
  108.                 P0=d[shi%10];                        
  109.                 dula=0;                                       
  110.                 P0=0xff;
  111.                 delay(2);
  112.         
  113.                 if(snum==60)
  114.                         snum=0;
  115.         }               


  116.         //        if(miao%2==0)         //if(miao%2==0) 1秒閃爍1次
  117.         if(ss>=10)                 //        這里寫為ss>=10,閃爍頻率可調(diào)
  118.         {                                 
  119.             wela=1;
  120.                 P0=0xfb;                //第3位
  121.                 wela=0;
  122.         
  123.                 dula=1;
  124.                 P0=d[11];          //第三位數(shù)碼管顯示“— ”
  125.                 dula=0;
  126.                 P0=0xff;
  127.                 delay(2);
  128.         }
  129.         
  130.         else
  131.         {
  132.                 wela=1;
  133.                 P0=0xfb;     //第3位
  134.                 wela=0;
  135.         
  136.                 dula=1;
  137.                 P0=d[10];         //第三位數(shù)碼管不顯示
  138.                 dula=0;
  139.                 P0=0xff;
  140.                 delay(2);        
  141.         }
  142.         
  143.         
  144.         if(fnum>=30)
  145.         {
  146.                 wela=1;
  147.                 P0=0xf7;         //第4位
  148.                 wela=0;

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

  159.                 dula=1;
  160.                 P0=d[fen%10];
  161.                 dula=0;
  162.                 P0=0xff;
  163.                 delay(2);
  164.         
  165.                
  166.                 if(fnum==60)
  167.                         fnum=0;
  168.         }
  169.                
  170.         //        if(miao%2==0)         //if(miao%2==0) 1秒閃爍1次
  171.         if(ss>=10)                 //if(ss>=10)閃爍頻率可調(diào)
  172.         {
  173.                 wela=1;
  174.                 P0=0xdf;          //第6位
  175.                 wela=0;
  176.                 dula=1;
  177.                 P0=d[11];          //第六位數(shù)碼管顯示“— ”
  178.                 dula=0;
  179.                 P0=0xff;
  180.                 delay(2);
  181.         }
  182.         
  183.         else
  184.         {
  185.                 wela=1;
  186.                 P0=0xdf;                   //第6位
  187.                 wela=0;
  188.                 dula=1;
  189.                 P0=d[10];                  //第六位數(shù)碼管不顯示
  190.                 dula=0;
  191.                 P0=0xff;
  192.                 delay(2);
  193.         }
  194.         
  195.         
  196.         wela=1;
  197.         P0=0xbf;                        //第7位
  198.         wela=0;
  199.         
  200.         dula=1;
  201.         P0=d[miao/10];                //秒十位
  202.         dula=0;
  203.         P0=0xff;
  204.         delay(2);
  205.         
  206.         
  207.         wela=1;
  208.         P0=0x7f;                         //第8位
  209.         wela=0;
  210.         
  211.         dula=1;
  212.         P0=d[miao%10];                //秒個(gè)位
  213.         dula=0;
  214.         P0=0xff;
  215.         delay(2);               
  216. }  

  217. void write_1302(uchar add,dat)//寫1302函數(shù)  
  218. {
  219.         uchar i,temp;
  220.         temp=add;
  221.         ce=0;
  222.         _nop_();
  223.         sclk=0;
  224.         _nop_();
  225.         ce=1;
  226.         _nop_();
  227.         for(i=0;i<8;i++)
  228.         {
  229.                 sclk=0;
  230.                 _nop_();
  231.                 if((temp&0x01)==0x01)
  232.                         dio=1;
  233.                         else
  234.                         dio=0;
  235.                 temp>>=1;
  236.                 sclk=1;
  237.                 _nop_();
  238.         }
  239.         temp=dat;
  240.         for(i=0;i<8;i++)
  241.         {
  242.                 sclk=0;
  243.                 _nop_();
  244.                 if((temp&0x01)==0x01)
  245.                         dio=1;
  246.                         else
  247.                         dio=0;
  248.                 temp>>=1;
  249.                 sclk=1;
  250.                 _nop_();
  251.         }
  252.         ce=0;
  253.         sclk=0;
  254. }

  255. uchar read_1302(uchar add)        //讀1302函數(shù)
  256. {
  257.         uchar dat,dat1,i,temp;
  258.         temp=add;
  259.         ce=0;
  260.         _nop_();
  261.         sclk=0;
  262.         _nop_();
  263.         ce=1;
  264.         for(i=0;i<8;i++)
  265.         {
  266.                 sclk=0;
  267.                 _nop_();
  268.                 if((temp&0x01)==0x01)
  269.                         dio=1;
  270.                         else
  271.                         dio=0;
  272.                 temp>>=1;
  273.                 sclk=1;
  274.                 _nop_();
  275.         }
  276.         for(i=0;i<8;i++)
  277.         {
  278.                 sclk=0;
  279.                 _nop_();
  280.                 if(dio)
  281.                     dat|=0x80;
  282.                 if(i<7)
  283.                         dat>>=1;
  284.                 sclk=1;
  285.         }
  286.         dat1=dat/16;
  287.         dat=dat%16;
  288.         dat=dat1*10+dat;  
  289.         ce=0;
  290.         sclk=0;
  291.         return dat;
  292. }                        


  293. void init_1302()                                                        //自動(dòng)初始化函數(shù)
  294. {        
  295.         if(read_1302(read_ram) != 0xaa)                        //如果初始化標(biāo)志RAM的值不是0xaa,才初始化
  296.         {
  297.                 write_1302(0x8e,0x00);                                //保護(hù)取消,可以進(jìn)行寫操作
  298.                 write_1302(write_miao,0x57);                //寫秒57
  299.                 write_1302(write_fen,0x55);                        //寫分55
  300.                 write_1302(write_shi,0x15);                        //寫時(shí)15
  301.                 write_1302(write_ram,0xaa);                        //寫入初始化標(biāo)志RAM(第00個(gè)RAM位置)
  302.                 write_1302(0x8e,0x80);                                //保護(hù)啟動(dòng),不能進(jìn)行寫操作
  303.         }
  304. }         

  305. void read_sf()        //讀時(shí)分秒并顯示
  306. {
  307.         shi=read_1302(read_shi);
  308.         fen=read_1302(read_fen);
  309.         miao=read_1302(read_miao);
  310.         display(shi,fen,miao);
  311. }


  312. void keyscan()                        //按鍵掃描函數(shù)
  313. {        
  314.         static uchar count;          //這里要定義為靜態(tài)變量
  315.         
  316.         if(key1==0)                          //按鍵按下
  317.         {        
  318.                 TR1=1;
  319.                 count++;                          //消抖,也是連加一次的間隔時(shí)間
  320.                 f1=1;
  321.                 if(key1==0 && count>10)//按鍵按下,計(jì)數(shù)變量加到12,
  322.                 {
  323.                         ms=0;                           //自啟動(dòng)計(jì)時(shí)變量清零
  324.                         while(!key1)           //這里不需要連加,就加一句松手檢測(cè)
  325.                         display(shi,fen,miao);
  326.                         count=0;
  327.                         TR0=0;                           //關(guān)閉T0定時(shí)器,數(shù)碼管兩‘-’停止閃爍
  328.                         knum++;                           
  329.                         if(knum==1)                                                  
  330.                         {
  331.                                  write_1302(0x8e,0x00);                  //DS1302寫保護(hù)取消
  332.                                  write_1302(write_miao,0x80); //寫秒80,時(shí)鐘停止走時(shí);
  333.                         }
  334.                         
  335.                         if(knum==3)                                                   //調(diào)時(shí)完畢,時(shí)鐘啟動(dòng)
  336.                         {
  337.                                 TR0=1;                                                //啟動(dòng)T0定時(shí)器,數(shù)碼管兩‘-’開(kāi)始閃爍
  338.                                 knum=0;
  339.                                 write_1302(write_miao,0x00); //寫秒0,時(shí)鐘啟動(dòng)走時(shí)
  340.                                 write_1302(0x8e,0x80);                 //保護(hù)啟動(dòng)
  341.                         }
  342.                 }
  343.         }


  344.         if(knum==1)                                                                //分鐘調(diào)節(jié)
  345.         {
  346.                 if(key2==0)                                                        //加
  347.                 {
  348.                         f2=1;
  349.                         count++;
  350.                         if(key2==0 && count>12)//短按加1,長(zhǎng)按連加
  351.                         {
  352.                                 ms=0;                           //自啟動(dòng)計(jì)時(shí)變量清零
  353.                                 count=0;
  354.                                 fen++;
  355.                                 fen=fen/10*16+fen%10;                //轉(zhuǎn)為16進(jìn)制
  356.                                 if(fen==0x60)
  357.                                         fen=0x00;
  358.                                 write_1302(write_fen,fen);        //寫入1302
  359.                         }
  360.                 }
  361.                
  362.                 if(key3==0)                                                   //減
  363.                 {
  364.                         f3=1;
  365.                         count++;
  366.                         if(key3==0 && count>12)//短按減1,長(zhǎng)按連減
  367.                         {
  368.                                 ms=0;                           //自啟動(dòng)計(jì)時(shí)變量清零
  369.                                 count=0;
  370.                                 fen--;
  371.                                 fen=fen/10*16+fen%10;                //轉(zhuǎn)為16進(jìn)制
  372.                                 if(fen==-1)
  373.                                         fen=0x59;
  374.                                 write_1302(write_fen,fen);
  375.                         }
  376.                 }
  377.         }
  378.         
  379.         
  380.         if(knum==2)                                                          //小時(shí)調(diào)節(jié)
  381.         {
  382.                 if(key2==0)
  383.                 {        
  384.                         f2=1;
  385.                         count++;
  386.                         if(key2==0 && count>12 )//短按加1,長(zhǎng)按連加
  387.                         {
  388.                                 ms=0;                                //自啟動(dòng)計(jì)時(shí)變量清零
  389.                                 count=0;
  390.                                 shi++;
  391.                                 shi=shi/10*16+shi%10;//轉(zhuǎn)為16進(jìn)制
  392.                                 if(shi==0x24)
  393.                                         shi=0x00;
  394.                                 write_1302(write_shi,shi);
  395.                         }
  396.                 }
  397.                
  398.                
  399.                 if(key3==0)
  400.                 {
  401.                         f3=1;
  402.                         count++;
  403.                         if(key3==0 && count>12 )//短按減1,長(zhǎng)按連減
  404.                         {        
  405.                                 ms=0;                                //自啟動(dòng)計(jì)時(shí)變量清零
  406.                                 count=0;
  407.                                 shi--;
  408.                                 shi=shi/10*16+shi%10;//轉(zhuǎn)為16進(jìn)制
  409.                                 if(shi==-1)
  410.                                         shi=0x23;
  411.                                 write_1302(write_shi,shi);
  412.                         }
  413.                 }
  414.         }

  415.         /*按鍵超過(guò)3秒沒(méi)有動(dòng)作,時(shí)鐘回到走時(shí)狀態(tài)*/

  416.         if(f1==1 || f2==1 || f3==1)
  417.         {
  418.                 if(ms>3000)          //時(shí)間超過(guò)3秒
  419.                 {
  420.                         TR1=0;          //關(guān)閉T1
  421.                         ms=0;          //自啟動(dòng)計(jì)時(shí)變量清零
  422.                         knum=0;          //key1按鍵次數(shù)清零
  423.                         TR0=1;          //啟動(dòng)T0,數(shù)碼管兩‘-’開(kāi)始閃爍
  424.                         write_1302(write_miao,0x00); //寫秒0,時(shí)鐘啟動(dòng)走時(shí)
  425.                         write_1302(0x8e,0x80);                 //保護(hù)啟動(dòng)
  426.                 }
  427.         
  428.         }
  429. }           

  430. /*主函數(shù)*/
  431. void main()
  432. {//        uchar i;
  433.         t0_init();
  434.         init_1302();                          
  435.         while(1)
  436.         {
  437.            //        for(i=0;i<4;i++)        
  438.         //        display(shi,fen,miao);
  439.             read_sf();
  440.             keyscan();
  441.         }
  442. }

  443. /*中斷函數(shù)*/
  444. void temer1() interrupt 1
  445. {
  446.         TH0=(65536-46080)/256;
  447.         TL0=(65536-46080)%256;
  448.         ss++;
  449.         if(ss==20)
  450.                 ss=0;
  451. }         

  452. void temer2() interrupt 3
  453. {
  454.         TH1=(65536-921)/256;
  455.         TL1=(65536-921)%256;
  456.         ms++;
  457. }



復(fù)制代碼

附件里面有完整的源碼,仿真文件,hex文件
下載:
DS1302數(shù)碼管時(shí)鐘.rar (122.87 KB, 下載次數(shù): 59)

評(píng)分

參與人數(shù) 4黑幣 +64 收起 理由
linziol + 1 幣少但有價(jià)值!
深藍(lán)遠(yuǎn)景 + 8 共享資料的黑幣獎(jiǎng)勵(lì)!
Gary_yuan + 5
admin + 50 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

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

使用道具 舉報(bào)

沙發(fā)
ID:66429 發(fā)表于 2018-1-31 18:14 | 只看該作者
電路圖分辨率有點(diǎn)低,有些引腳數(shù)字看不清
回復(fù)

使用道具 舉報(bào)

板凳
ID:140489 發(fā)表于 2018-1-31 22:06 | 只看該作者
更正: DS1302初始化函數(shù)要按下面這樣寫,掉電后再上電才不會(huì)初始化時(shí)間

void init_1302()                                                        //自動(dòng)初始化函數(shù)
{        
        if(read_1302(0x81)&0x80)        //讀出秒數(shù)據(jù),再跟80h(0x80)與運(yùn)算看結(jié)果,結(jié)果是0則不需要初始化1302;是80h就要初始化!
                {
                write_1302(0x8e,0x00);                                //保護(hù)取消,可以進(jìn)行寫操作
                write_1302(write_miao,0x57);                //寫秒57
                write_1302(write_fen,0x55);                        //寫分55
                write_1302(write_shi,0x15);                        //寫時(shí)15
                write_1302(0x8e,0x80);                                //保護(hù)啟動(dòng),不能進(jìn)行寫操作
        }
}         
回復(fù)

使用道具 舉報(bào)

地板
ID:140489 發(fā)表于 2018-1-31 22:07 | 只看該作者
xmd1972 發(fā)表于 2018-1-31 18:14
電路圖分辨率有點(diǎn)低,有些引腳數(shù)字看不清

附件里有仿真文件的,仿真里面的電路很清晰的

評(píng)分

參與人數(shù) 1黑幣 +10 收起 理由
xmd1972 + 10 很給力!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

5#
ID:140489 發(fā)表于 2018-2-11 21:43 | 只看該作者
程序重新優(yōu)化了一下,原來(lái)附件里面的程序有bug,就是第一次程序燒進(jìn)去,要按設(shè)置鍵3次時(shí)鐘才會(huì)走時(shí),下面的程序已修改好了
  1. /*********************************************************************************
  2. 描述:
  3. 1、8位共陰數(shù)碼管顯示實(shí)時(shí)時(shí)鐘88-88-88樣式,兩‘-’1秒閃爍1次
  4. 2、STC89C52 @ 11.0592MHz晶振,兩片74HC573做段選、位選
  5. 3、按key1鍵選擇調(diào)節(jié)位,按第一次,分位閃爍,按第2次,時(shí)位閃爍,按第3次,回到正常走時(shí);
  6.    調(diào)時(shí)的時(shí)候,key2鍵短按加1,長(zhǎng)按連加;key3鍵短按減一,長(zhǎng)按連減;按鍵消抖不用delay。
  7. 4、在調(diào)時(shí)狀態(tài)超過(guò)3秒再?zèng)]有按鍵按下,回到正常走時(shí)狀態(tài)(這功能不太實(shí)用,可以取消)
  8. 5、加備用電池,掉電走時(shí)
  9. 6、對(duì)時(shí)的時(shí)候先調(diào)好時(shí)、分,分鐘要比參考時(shí)間的分鐘加1分,
  10.    再看參考時(shí)間的秒數(shù)到了59再按KEY1按鍵的第3次,這樣對(duì)時(shí)可以很準(zhǔn)的。
  11.    仿真 實(shí)物都通過(guò)。
  12. **********************************************************************************/
  13. #include<reg52.h>
  14. #include<intrins.h>

  15. #define uchar unsigned char
  16. #define uint unsigned int

  17. /***********寫時(shí)分秒地址************/
  18. #define write_shi  0x84
  19. #define write_fen  0x82
  20. #define write_miao 0x80
  21. //#define write_ram  0xc0
  22. /***********讀時(shí)分秒地址************/
  23. #define read_shi  0x85
  24. #define read_fen  0x83
  25. #define read_miao 0x81
  26. //#define read_ram  0xc1

  27. sbit TSCLK = P1^0;//時(shí)鐘線 接到P10上用杜邦線
  28. sbit TIO   = P1^1;//數(shù)據(jù)線,接到P11上
  29. sbit TRST  = P1^2;//使能端,接到P12上

  30. sbit wela = P2^7;           //位選
  31. sbit dula = P2^6;           //段選

  32. sbit key1=P3^0;             //按鍵 選擇
  33. sbit key2=P3^1;             //按鍵 加
  34. sbit key3=P3^2;             //按鍵 減

  35. uint ms;                                //調(diào)時(shí)自動(dòng)走時(shí)計(jì)時(shí)變量
  36. uchar knum=0,snum,fnum,ss;        //定義 key1按下次數(shù)變量,時(shí)分調(diào)時(shí)閃爍變量,兩‘-’閃爍計(jì)時(shí)變量
  37. char shi,fen,miao;                //定義時(shí)分秒變量

  38. bit f1,f2,f3;                     //定義自動(dòng)走時(shí)標(biāo)志
  39.                 // 0     1    2    3    4     5    6    7    8   9   不顯  -
  40. uchar code d[]={ 0x3F,0x06,0x5B,0x4F,0x66, 0x6D,0x7D,0x07,0x7F,0x6F,0x00,0x40}; //共陰不帶小數(shù)點(diǎn)段碼

  41. void delay(uint z)          //ms延時(shí)函數(shù)
  42. {
  43.         uint x,y;
  44.         for(x=z;x>0;x--)
  45.                 for(y=120;y>0;y--);
  46. }

  47. void t0_init()  //定時(shí)器初始化函數(shù)
  48. {
  49.    
  50.         TMOD |= 0X11;            //定時(shí)器0、1都為模式1, 16位計(jì)數(shù)模式
  51.         TH0=(65536-46080)/256;   //50ms初值  @11.0529MHz
  52.         TL0=(65536-46080)%256;
  53.         TH1=(65536-921)/256;         //1ms初值  @11.0529MHz
  54.         TL1=(65536-921)%256;
  55.         
  56.         EA=1;                   //開(kāi)總中斷
  57.         ET0=1;                  //開(kāi)定時(shí)器T0中斷
  58.         TR0=1;                  //啟動(dòng)T0
  59.         ET1=1;                  //開(kāi)定時(shí)器T1中斷
  60. //  TR1=1;

  61. }


  62. void display(uchar shi,uchar fen,uchar miao) //顯示函數(shù)
  63. {
  64.         if(knum==0)           //正常走時(shí)
  65.         {
  66.                 snum=30;
  67.                 fnum=30;
  68.         }
  69.         
  70.         if(knum==1)           //調(diào)時(shí),分位閃爍
  71.         {
  72.                 fnum++;
  73.                 snum=30;
  74.         }
  75.         
  76.         if(knum==2)          //調(diào)時(shí),時(shí)位閃爍
  77.         {
  78.                 snum++;
  79.                 fnum=30;
  80.         }
  81.         
  82.         
  83.         if(snum>=30)
  84.         {        
  85.                 if((shi/10)<1)         //如果小時(shí)十位小于1,
  86.                 {
  87.                     wela=1;
  88.                     P0=0xfe;                //第1位
  89.                     wela=0;
  90.                                     P0=0x00;
  91.                     dula = 1;
  92.                     P0=d[10];           //共陰數(shù)碼管段碼送全0 小時(shí)十位就不顯示
  93.                     dula = 0;
  94.                 }
  95.                
  96.                 else
  97.                
  98.                                 if((shi/10)>0)
  99.                                 {
  100.                     wela=1;
  101.                     P0=0xfe;          //第1位
  102.                     wela=0;
  103.                                     P0=0x00;
  104.                     dula=1;
  105.                     P0=d[shi/10];
  106.                     dula=0;
  107.                                         P0=0xff;
  108.                     delay(3);
  109.                 }

  110.                 wela=1;
  111.                 P0=0xfd;           //第2位
  112.                 wela=0;
  113.                                 P0=0x00;
  114.                 dula=1;
  115.                 P0=d[shi%10];                        
  116.                 dula=0;
  117.                                 P0=0xff;                                       
  118.                 delay(3);
  119.         
  120.                 if(snum==60)
  121.                         snum=0;
  122.         }               


  123.         //        if(miao%2==0)         //if(miao%2==0) 1秒閃爍1次
  124.         if(ss>=10)                 //        這里寫為ss>=10,閃爍頻率可調(diào)
  125.         {                                 
  126.             wela=1;
  127.             P0=0xfb;                //第3位
  128.             wela=0;
  129.                     P0=0x00;
  130.             dula=1;
  131.             P0=d[11];          //第三位數(shù)碼管顯示“— ”
  132.             dula=0;
  133.                         P0=0xff;
  134.             delay(3);
  135.         }
  136.         
  137.         else
  138.         {
  139.             wela=1;
  140.             P0=0xfb;     //第3位
  141.             wela=0;
  142.                     P0=0x00;
  143.             dula=1;
  144.             P0=d[10];         //第三位數(shù)碼管不顯示
  145.             dula=0;
  146.                         P0=0xff;
  147.             delay(3);        
  148.         }
  149.         
  150.         
  151.         if(fnum>=30)
  152.         {
  153.             wela=1;
  154.             P0=0xf7;         //第4位
  155.             wela=0;
  156.                         P0=0x00;
  157.             dula=1;
  158.             P0=d[fen/10];
  159.             dula=0;
  160.                         P0=0xff;
  161.             delay(3);
  162.             
  163.             
  164.             wela=1;
  165.             P0=0xef;         //第5位
  166.             wela=0;
  167.                         P0=0x00;
  168.             dula=1;
  169.             P0=d[fen%10];
  170.             dula=0;
  171.                         P0=0xff;
  172.             delay(3);
  173.    
  174.             
  175.             if(fnum==60)
  176.                     fnum=0;
  177.         }
  178.                
  179.         //        if(miao%2==0)         //if(miao%2==0) 1秒閃爍1次
  180.         if(ss>=10)                 //if(ss>=10)閃爍頻率可調(diào)
  181.         {
  182.                 wela=1;
  183.                 P0=0xdf;          //第6位
  184.                 wela=0;
  185.                                 P0=0x00;
  186.                 dula=1;
  187.                 P0=d[11];          //第六位數(shù)碼管顯示“— ”
  188.                 dula=0;
  189.                                 P0=0xff;
  190.                 delay(3);
  191.         }
  192.         
  193.         else
  194.         {
  195.             wela=1;
  196.             P0=0xdf;                   //第6位
  197.             wela=0;
  198.                         P0=0x00;
  199.             dula=1;
  200.             P0=d[10];                  //第六位數(shù)碼管不顯示
  201.             dula=0;
  202.             delay(3);
  203.         }
  204.         
  205.         
  206.         wela=1;
  207.         P0=0xbf;                        //第7位
  208.         wela=0;
  209.         P0=0x00;
  210.         dula=1;
  211.         P0=d[miao/10];                //秒十位
  212.         dula=0;
  213.                 P0=0xff;
  214.         delay(3);
  215.         
  216.         
  217.         wela=1;
  218.         P0=0x7f;                         //第8位
  219.         wela=0;
  220.         P0=0x00;
  221.         dula=1;
  222.         P0=d[miao%10];                //秒個(gè)位
  223.         dula=0;
  224.                 P0=0xff;
  225.         delay(3);               
  226. }  


  227. //寫DS1302數(shù)據(jù)
  228. void Write_DS1302_DAT(uchar cmd, uchar dat)
  229. {
  230.         uchar i;
  231.         TRST = 0; //拉低使能端
  232.         TSCLK = 0;//拉低數(shù)據(jù)總線
  233.         TRST = 1; //拉高使能端,產(chǎn)生上升沿開(kāi)始寫數(shù)據(jù)
  234.         for(i = 0; i < 8; i++)//每次寫1位,寫8次
  235.         {
  236.                 TSCLK = 0;                  //拉低時(shí)鐘總線
  237.                 TIO = cmd & 0x01; //寫1位數(shù)據(jù),從最低位開(kāi)始寫
  238.                 TSCLK = 1;                  //拉高時(shí)鐘總線,產(chǎn)生上升沿?cái)?shù)據(jù)被DS1302讀走
  239.                 cmd >>=1;                  //右移一位
  240.         }
  241.         for(i = 0; i < 8; i++)//每次寫1位,寫8次
  242.         {
  243.                 TSCLK = 0;                  //拉低時(shí)鐘總線
  244.                 TIO = dat & 0x01; //寫1位數(shù)據(jù),從最低位開(kāi)始寫
  245.                 TSCLK = 1;                  //拉高時(shí)鐘總線,產(chǎn)生上升沿?cái)?shù)據(jù)被DS1302讀走
  246.                 dat >>= 1;                  //右移一位
  247.         }
  248. }
  249. //讀DS1302數(shù)據(jù)
  250. uchar Read_DS1302_DAT(uchar cmd)
  251. {
  252.         uchar i, dat;
  253.         TRST = 0;  //拉低使能端
  254.         TSCLK = 0; //拉低數(shù)據(jù)總線
  255.         TRST = 1;  //拉高使能端,產(chǎn)生上升沿開(kāi)始寫數(shù)據(jù)
  256.         for(i = 0; i < 8; i++)//每次寫1位,寫8次
  257.         {
  258.                 TSCLK = 0;                 //拉低時(shí)鐘總線
  259.                 TIO = cmd & 0x01;//寫1位數(shù)據(jù),從最低位開(kāi)始寫
  260.                 TSCLK = 1;                 //拉高時(shí)鐘總線,產(chǎn)生上升沿?cái)?shù)據(jù)被DS1302讀走
  261.                 cmd >>=1;                 //右移一位
  262.         }
  263.         for(i = 0; i < 8; i++)//每次讀1位,讀8次
  264.         {
  265.                 TSCLK = 0;                  //拉低時(shí)鐘總線,產(chǎn)生下降沿,DS1302把數(shù)據(jù)放到TIO上
  266.                 dat >>= 1;                  //右移一位
  267.                 if(TIO)        dat |= 0x80;//讀取數(shù)據(jù),從最低位開(kāi)始
  268.                 TSCLK = 1;                        //拉高時(shí)鐘總線,以備下一次產(chǎn)生下降沿
  269.         }
  270.         return dat;        //返回讀出數(shù)據(jù)
  271. }

  272. //數(shù)據(jù)轉(zhuǎn)BCD碼
  273. uchar Dat_Chg_BCD(uchar dat)
  274. {
  275.         uchar dat1, dat2;
  276.         dat1 = dat / 10;
  277.         dat2 = dat % 10;
  278.         dat2 = dat2 + dat1 * 16;
  279.         return dat2;
  280. }

  281. //BCD碼轉(zhuǎn)換為數(shù)據(jù)
  282. uchar BCD_Chg_Dat(uchar dat)
  283. {
  284.         uchar dat1, dat2;
  285.         dat1 = dat / 16;
  286.         dat2 = dat % 16;
  287.         dat2 = dat2 + dat1 * 10;
  288.         return dat2;
  289. }



  290. void init_1302()                //初始化函數(shù) 設(shè)置時(shí)間
  291. {                                                //加備用電池,掉電走時(shí)

  292.         if((Read_DS1302_DAT(0x81)& 0x80) != 0)        //讀出秒數(shù)據(jù),再跟80h(0x80)與運(yùn)算看結(jié)果,結(jié)果是0則不需要初始化1302;是80h就要初始化!
  293.         {
  294.                 Write_DS1302_DAT(0x8e, 0);//清除寫保護(hù)
  295.                 Write_DS1302_DAT(write_miao, Dat_Chg_BCD(58));//58秒(并且進(jìn)行BCD碼轉(zhuǎn)換)
  296.                 Write_DS1302_DAT(write_fen, Dat_Chg_BCD(10));//10分
  297.                 Write_DS1302_DAT(write_shi, Dat_Chg_BCD(9));//9時(shí)
  298.                 Write_DS1302_DAT(0x8e, 0x80);//開(kāi)寫保護(hù)
  299.         }

  300. }         


  301. void read_sf()
  302. {

  303.         miao = BCD_Chg_Dat(Read_DS1302_DAT(read_miao));//讀秒寄存器(并且進(jìn)行BCD碼轉(zhuǎn)換)
  304.         fen        = BCD_Chg_Dat(Read_DS1302_DAT(read_fen));//讀分寄存器
  305.         shi = BCD_Chg_Dat(Read_DS1302_DAT(read_shi));//讀時(shí)寄存器
  306.         display(shi,fen,miao);
  307. }


  308. void keyscan()                        //按鍵掃描函數(shù)
  309. {        
  310.         static uchar count;          //這里要定義為靜態(tài)變量
  311.         
  312.         if(key1==0)                          //按鍵按下
  313.         {        
  314.                 TR1=1;
  315.                 count++;                          //消抖,也是連加一次的間隔時(shí)間
  316.                 f1=1;
  317.                 if(key1==0 && count>10)//按鍵按下,計(jì)數(shù)變量加到12,
  318.                 {
  319.                         ms=0;                           //自啟動(dòng)計(jì)時(shí)變量清零
  320.                         while(!key1)           //這里不需要連加,就加一句松手檢測(cè)
  321.                         display(shi,fen,miao);
  322.                         count=0;
  323.                         TR0=0;                           //關(guān)閉T0定時(shí)器,數(shù)碼管兩‘-’停止閃爍
  324.                         knum++;                           
  325.                         if(knum==1)                                                  
  326.                         {
  327.                              Write_DS1302_DAT(0x8e,0x00);                  //DS1302寫保護(hù)取消
  328.                              Write_DS1302_DAT(write_miao,0x80); //寫秒80,時(shí)鐘停止走時(shí);
  329.                         }
  330.                         
  331.                         if(knum==3)                                                   //調(diào)時(shí)完畢,時(shí)鐘啟動(dòng)
  332.                         {
  333.                             TR0=1;                                                //啟動(dòng)T0定時(shí)器,數(shù)碼管兩‘-’開(kāi)始閃爍
  334.                             knum=0;
  335.                             Write_DS1302_DAT(write_miao,0x00); //寫秒0,時(shí)鐘啟動(dòng)走時(shí)
  336.                             Write_DS1302_DAT(0x8e,0x80);                 //保護(hù)啟動(dòng)
  337.                         }
  338.                 }
  339.         }


  340.         if(knum==1)                                                                //分鐘調(diào)節(jié)
  341.         {
  342.                 if(key2==0)                                                        //加
  343.                 {
  344.                         f2=1;
  345.                         count++;
  346.                         if(key2==0 && count>12)//短按加1,長(zhǎng)按連加
  347.                         {
  348.                             ms=0;                           //自啟動(dòng)計(jì)時(shí)變量清零
  349.                             count=0;
  350.                             fen++;
  351.                             fen=fen/10*16+fen%10;                //轉(zhuǎn)為16進(jìn)制
  352.                             if(fen==0x60)
  353.                                     fen=0x00;
  354.                             Write_DS1302_DAT(write_fen,fen);        //寫入1302
  355.                         }
  356.                 }
  357.                
  358.                 if(key3==0)                                                   //減
  359.                 {
  360.                         f3=1;
  361.                         count++;
  362.                         if(key3==0 && count>12)//短按減1,長(zhǎng)按連減
  363.                         {
  364.                             ms=0;                           //自啟動(dòng)計(jì)時(shí)變量清零
  365.                             count=0;
  366.                             fen--;
  367.                             fen=fen/10*16+fen%10;                //轉(zhuǎn)為16進(jìn)制
  368.                             if(fen==-1)
  369.                                     fen=0x59;
  370.                             Write_DS1302_DAT(write_fen,fen);
  371.                         }
  372.                 }
  373.         }
  374.         
  375.         
  376.         if(knum==2)                                                          //小時(shí)調(diào)節(jié)
  377.         {
  378.                 if(key2==0)
  379.                 {        
  380.                         f2=1;
  381.                         count++;
  382.                         if(key2==0 && count>12 )//短按加1,長(zhǎng)按連加
  383.                         {
  384.                             ms=0;                                //自啟動(dòng)計(jì)時(shí)變量清零
  385.                             count=0;
  386.                             shi++;
  387.                             shi=shi/10*16+shi%10;//轉(zhuǎn)為16進(jìn)制
  388.                             if(shi==0x24)
  389.                                     shi=0x00;
  390.                             Write_DS1302_DAT(write_shi,shi);
  391.                         }
  392.                 }
  393.                
  394.                
  395.                 if(key3==0)
  396.                 {
  397.                         f3=1;
  398.                         count++;
  399.                         if(key3==0 && count>12 )//短按減1,長(zhǎng)按連減
  400.                         {        
  401.                             ms=0;                                //自啟動(dòng)計(jì)時(shí)變量清零
  402.                             count=0;
  403.                             shi--;
  404.                             shi=shi/10*16+shi%10;//轉(zhuǎn)為16進(jìn)制
  405.                             if(shi==-1)
  406.                                     shi=0x23;
  407.                             Write_DS1302_DAT(write_shi,shi);
  408.                         }
  409.                 }
  410.         }

  411. /*按鍵超過(guò)3秒沒(méi)有動(dòng)作,時(shí)鐘回到走時(shí)狀態(tài)*///這段加上,秒調(diào)不精確,因?yàn)槌^(guò)3秒沒(méi)有按鍵按下,秒就清0開(kāi)始走時(shí)了。

  412. /*        if(f1==1 || f2==1 || f3==1)
  413.         {
  414.                 if(ms>3000)          //時(shí)間超過(guò)3秒
  415.                 {
  416.                     TR1=0;          //關(guān)閉T1
  417.                     ms=0;          //自啟動(dòng)計(jì)時(shí)變量清零
  418.                     knum=0;          //key1按鍵次數(shù)清零
  419.                     TR0=1;          //啟動(dòng)T0,數(shù)碼管兩‘-’開(kāi)始閃爍
  420.                     Write_DS1302_DAT(write_miao,0x00); //寫秒0,時(shí)鐘啟動(dòng)走時(shí)
  421.                     Write_DS1302_DAT(0x8e,0x80);                 //保護(hù)啟動(dòng)
  422.                 }
  423.         
  424.         }  */
  425. }           

  426. /*主函數(shù)*/
  427. void main()
  428. {
  429.         t0_init();
  430.         init_1302();                          
  431.         while(1)
  432.         {
  433.             read_sf();
  434.             keyscan();
  435.         }
  436. }

  437. /*中斷函數(shù)*/
  438. void temer1() interrupt 1
  439. {
  440.         TH0=(65536-46080)/256;
  441.         TL0=(65536-46080)%256;
  442.         ss++;
  443.         if(ss==20)
  444.                 ss=0;
  445. }         

  446. void temer2() interrupt 3
  447. {
  448.         TH1=(65536-921)/256;
  449.         TL1=(65536-921)%256;
  450.         ms++;
  451. }
復(fù)制代碼
回復(fù)

使用道具 舉報(bào)

6#
ID:288444 發(fā)表于 2018-4-15 11:36 來(lái)自觸屏版 | 只看該作者
照你改的怎么編譯說(shuō)write_miao.fen.shi未定義
回復(fù)

使用道具 舉報(bào)

7#
ID:437276 發(fā)表于 2018-12-3 17:14 | 只看該作者
write_miao.fen.shi未定義求樓主回復(fù)
回復(fù)

使用道具 舉報(bào)

8#
ID:140489 發(fā)表于 2019-3-6 09:52 | 只看該作者
上面的代碼全部復(fù)制,編譯通過(guò)的,
compiling 111.c...
linking...
Program Size: data=19.3 xdata=0 code=1236
creating hex file from "111"...
"111" - 0 Error(s), 0 Warning(s).
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 一片毛片 | 成人精品一区 | 国产视频不卡一区 | 作爱视频免费看 | 国产美女在线播放 | 草久在线 | 日韩有码一区 | 国产一区二区三区四区在线观看 | 黄页网址在线观看 | 视频一区在线观看 | 免费观看一级特黄欧美大片 | 国产日韩一区二区 | 99视频在线免费观看 | 成人精品一区亚洲午夜久久久 | 91成人免费电影 | 久久综合成人精品亚洲另类欧美 | av电影手机在线看 | 日韩精品无码一区二区三区 | 在线视频a | 国产一区二 | 久久精品国产清自在天天线 | 国内精品在线视频 | 天天拍天天操 | 中文字幕成人免费视频 | 欧美中文字幕在线观看 | 一区二区三区在线观看视频 | 精品久久久久久久久久久久久久 | 国产精品一区二区欧美 | 欧美激情国产日韩精品一区18 | 99爱在线观看 | 亚洲xx在线| 久久久久国产视频 | 国产免费拔擦拔擦8x高清 | 亚洲最色视频 | 午夜影视免费片在线观看 | 亚洲另类视频 | 国产高清免费视频 | 91婷婷韩国欧美一区二区 | 91视视频在线观看入口直接观看 | 日韩毛片中文字幕 | 久久国 |