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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

單片機時鐘另類調(diào)時法 個十位分開調(diào)節(jié)

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:140489 發(fā)表于 2019-6-24 15:00 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
仿真 實物都通過.stc89c52  11.0592MHz晶振 ;具體電路見仿真圖;仿真用5位數(shù)碼管顯示88-88的樣式

一個按鍵調(diào)節(jié)時間:

1.長按key1,進入調(diào)時狀態(tài),小時十位開始閃爍,此時再短按key1,小時十位加加,
  小時十位在0-2之間變化;(key1可以是按鈕,也可以用觸摸開關(guān))
2.調(diào)好后,過5秒自動跳到小時個位閃爍,此時再短按key1,小時個位加加,如果十位是0、1,
  小時個位再0-9之間變化;如果十位是2,小時個位在0-3之間變化;
3.小時個位調(diào)好后,過5秒,分鐘十位開始閃爍,此時再短按key1,分鐘十位加加,分鐘十位在0-5
  之間變化;
4.分鐘十位調(diào)好后,過5秒,分鐘個位開始閃爍,此時再短按key1,分鐘個位加加,分鐘個位在0-9
  之間變化;
5.分鐘個位調(diào)好后,過5秒,退出調(diào)時狀態(tài),時鐘正常走時。

在非調(diào)時狀態(tài),短按key1,開關(guān)LED燈;

小時 、分鐘的個位、十位分開調(diào)節(jié),這樣比常規(guī)的個位、十位在一起調(diào)時快;


單片機源程序如下:
  1. /*********************************************************************************

  2. 仿真 實物都通過.stc89c52  11.0592MHz晶振 ;具體電路見仿真圖;仿真用5位數(shù)碼管顯示88-88的樣式

  3. 一個按鍵調(diào)節(jié)時間:

  4. 1.長按key1,進入調(diào)時狀態(tài),小時十位開始閃爍,此時再短按key1,小時十位加加,
  5.   小時十位在0-2之間變化;(key1可以是按鈕,也可以用觸摸開關(guān))
  6. 2.調(diào)好后,過5秒自動跳到小時個位閃爍,此時再短按key1,小時個位加加,如果十位是0、1,
  7.   小時個位再0-9之間變化;如果十位是2,小時個位在0-3之間變化;
  8. 3.小時個位調(diào)好后,過5秒,分鐘十位開始閃爍,此時再短按key1,分鐘十位加加,分鐘十位在0-5
  9.   之間變化;
  10. 4.分鐘十位調(diào)好后,過5秒,分鐘個位開始閃爍,此時再短按key1,分鐘個位加加,分鐘個位在0-9
  11.   之間變化;
  12. 5.分鐘個位調(diào)好后,過5秒,退出調(diào)時狀態(tài),時鐘正常走時。

  13. 在非調(diào)時狀態(tài),短按key1,開關(guān)LED燈;

  14. 小時 、分鐘的個位、十位分開調(diào)節(jié),這樣比常規(guī)的個位、十位在一起調(diào)時快;
  15. **********************************************************************************/
  16. #include<reg52.h>
  17. #include<intrins.h>
  18. #define uchar unsigned char
  19. #define uint unsigned int

  20. sbit sclk = P1^0;
  21. sbit dio = P1^1;
  22. sbit ce = P1^2;
  23. sbit wela = P2^7;
  24. sbit dula = P2^6;
  25. sbit led = P1^7;

  26. sbit key1=P3^0;                                                        //按鍵 多功能

  27. uchar knum=0,ssnum,fsnum,sgnum,fgnum;  //調(diào)時 位 閃爍變量

  28. uchar shi,fen,miao;

  29. uchar ss;        //秒點閃爍變量

  30. bit zdyw; //自動移位標(biāo)志

  31. uchar count;//自動移位時間計數(shù)變量
  32. /***********寫時分秒地址************/
  33. #define write_shi  0x84
  34. #define write_fen  0x82
  35. #define write_miao 0x80
  36. #define write_ram  0xc0
  37. /***********讀時分秒地址************/
  38. #define read_shi  0x85
  39. #define read_fen  0x83
  40. #define read_miao 0x81
  41. #define read_ram  0xc1
  42.                   // 0     1    2    3    4     5    6    7    8   9
  43. uchar code d[]={ 0x3F,0x06,0x5B,0x4F,0x66, 0x6D,0x7D,0x07,0x7F,0x6F}; //共陰不帶小數(shù)點
  44. uchar code dd[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef};//        共陰帶小數(shù)點

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

  47. void delay(uint z)
  48. {
  49.         uint x,y;
  50.         for(x=z;x>0;x--)
  51.                 for(y=120;y>0;y--);
  52. }


  53. void t0_init()  //定時50ms中斷
  54. {
  55.    
  56.   TMOD=0X01;
  57.   TH0=(65536-46080)/256;
  58.   TL0=(65536-46080)%256;
  59.   EA=1;
  60.   ET0=1;
  61.   TR0=1;
  62.   ET1=1;

  63. }


  64. void display(uchar shi,uchar fen)                          //顯示函數(shù)
  65. {
  66.         if(knum==0)
  67.         {
  68.                 ssnum=30;
  69.                 fsnum=30;
  70.                 sgnum=30;
  71.                 fgnum=30;
  72.         }
  73.         
  74.         if(knum==3)
  75.         {
  76.                 fsnum++;
  77.                 ssnum=30;
  78.                 fgnum=30;
  79.                 sgnum=30;
  80.         }
  81.         
  82.         if(knum==4)
  83.         {
  84.                 fgnum++;
  85.                 ssnum=30;
  86.                 fsnum=30;
  87.                 sgnum=30;
  88.         }

  89.         if(knum==1)
  90.         {
  91.                 ssnum++;
  92.                 sgnum=30;
  93.                 fgnum=30;
  94.                 fsnum=30;
  95.         }
  96.         
  97.         if(knum==2)
  98.         {
  99.                 sgnum++;
  100.                 ssnum=30;
  101.                 fsnum=30;
  102.                 fgnum=30;
  103.         }
  104.         
  105.         
  106.         if(ssnum>=30)
  107.         {        
  108. //                if((shi/10)<1)         //如果小時十位小于1,
  109. //                {
  110. //                        wela=1;
  111. //                        P0=0xfe;                //第1位
  112. //                        wela=0;
  113. //        
  114. //                        dula = 1;
  115. //                        P0=0xff;           // 小時十位就不顯示
  116. //                        dula = 0;
  117. //                }
  118. //               
  119. //                else
  120.                 {
  121.                         wela=1;
  122.                         P0=0xfe;          //第1位
  123.                         wela=0;
  124.         
  125.                         dula=1;
  126.                         P0=d[shi/10];
  127.                         dula=0;
  128.                         P0=0xff;
  129.                         delay(2);
  130.                 }

  131.                 if(ssnum==60)
  132.                         ssnum=0;

  133.          }

  134.          if(sgnum>=30)
  135.          {
  136.                 wela=1;
  137.                 P0=0xfd;           //第2位
  138.                 wela=0;

  139.                 dula=1;
  140.                 P0=d[shi%10];                        //時的個位,P0=d[shi%10]時的個位小數(shù)點閃爍
  141.                 dula=0;                                        // 時的個位,P0=dd[shi%10]時的個位小數(shù)點不閃爍
  142.                 P0=0xff;
  143.                 delay(2);
  144.                
  145.         
  146.         
  147.                 if(sgnum==60)
  148.                         sgnum=0;
  149.         }               


  150.         //        if(miao%2==0)         //if(miao%2==0) 1秒閃爍1次
  151.                 if(ss>=10)                 //        這里寫為ss>=10,閃爍頻率可調(diào)
  152.                 {                                 
  153.                     wela=1;
  154.                         P0=0xfb;                //第3位
  155.                         wela=0;
  156.         
  157.                         dula=1;
  158.                         P0=0x40;          //第三位數(shù)碼管顯示“— ”
  159.                         
  160.                 //        P0=0x09;          //第三位數(shù)碼管顯示“= ”
  161.                         dula=0;
  162.                         P0=0xff;
  163.                         delay(2);
  164.         
  165.                 }

  166.                 else
  167.                 {
  168.                         wela=1;
  169.                         P0=0xfb;   //第3位
  170.                         wela=0;
  171.         
  172.                         dula=1;
  173.                         P0=0;          //第三位數(shù)碼管不顯示
  174.                         dula=0;
  175.                         P0=0xff;
  176.                         delay(2);        
  177.                 }
  178.         
  179.         
  180.         if(fsnum>=30)
  181.         {
  182.                 wela=1;
  183.                 P0=0xf7;         //第4位
  184.                 wela=0;

  185.                 dula=1;
  186.                 P0=d[fen/10];
  187.                 dula=0;
  188.                 P0=0xff;
  189.                 delay(2);
  190.                
  191.                
  192. //                wela=1;
  193. //                P0=0xef;         //第5位
  194. //                wela=0;
  195. //
  196. //                dula=1;
  197. //                P0=d[fen%10];
  198. //                dula=0;
  199. //                P0=0xff;
  200. //                delay(2);
  201.         
  202.                
  203.                 if(fsnum==60)
  204.                         fsnum=0;
  205.         }

  206.         if(fgnum>=30)
  207.         {
  208.                 wela=1;
  209.                 P0=0xef;         //第5位
  210.                 wela=0;

  211.                 dula=1;
  212.                 P0=d[fen%10];
  213.                 dula=0;
  214.                 P0=0xff;
  215.                 delay(2);

  216.                 if(fgnum==60)
  217.                         fgnum=0;

  218.          }
  219.                
  220.         //        if(miao%2==0)         //if(miao%2==0) 1秒閃爍1次
  221. //                if(ss>=10)                 //if(ss>=10)閃爍頻率可調(diào)
  222. //                {
  223. //                        wela=1;
  224. //                        P0=0xdf;          //第6位
  225. //                        wela=0;
  226. //                        dula=1;
  227. //                        P0=0x40;          //第六位數(shù)碼管顯示“— ”
  228. //                        dula=0;
  229. //                        P0=0xff;
  230. //        
  231. //                        delay(2);
  232. //                }
  233. //
  234. //                else
  235. //                {
  236. //                        wela=1;
  237. //                        P0=0xdf;   //第6位
  238. //                        wela=0;
  239. //                        dula=1;
  240. //                        P0=0;          //第六位數(shù)碼管不顯示
  241. //                        dula=0;
  242. //                        P0=0xff;
  243. //        
  244. //                        delay(2);
  245. //                }
  246. //               
  247. //               
  248. //                wela=1;
  249. //                P0=0xbf;                //第7位
  250. //                wela=0;
  251. //
  252. //            dula=1;
  253. //                P0=d[miao/10];                           //秒十位
  254. //                dula=0;
  255. //                P0=0xff;
  256. //                delay(2);
  257. //        
  258. //
  259. //                wela=1;
  260. //                P0=0x7f;                          //第8位
  261. //                wela=0;
  262. //
  263. //                dula=1;
  264. //                P0=d[miao%10];                         //秒個位
  265. //                dula=0;
  266. //                P0=0xff;
  267. //                delay(2);               
  268.         
  269. }  



  270. void write_1302(uchar add,dat)                 //寫1302函數(shù)  qx
  271. {
  272.         uchar i,temp;
  273.         temp=add;
  274.         ce=0;
  275.         _nop_();
  276.         sclk=0;
  277.         _nop_();
  278.         ce=1;
  279.         _nop_();
  280.         for(i=0;i<8;i++)
  281.         {
  282.                 sclk=0;
  283.                 _nop_();
  284.                 if((temp&0x01)==0x01)
  285.                         dio=1;
  286.                         else
  287.                         dio=0;
  288.                 temp>>=1;
  289.                 sclk=1;
  290.                 _nop_();
  291.         }
  292.         temp=dat;
  293.         for(i=0;i<8;i++)
  294.         {
  295.                 sclk=0;
  296.                 _nop_();
  297.                 if((temp&0x01)==0x01)
  298.                         dio=1;
  299.                         else
  300.                         dio=0;
  301.                 temp>>=1;
  302.                 sclk=1;
  303.                 _nop_();
  304.         }
  305.         ce=0;
  306.         sclk=0;
  307. }
  308. uchar read_1302(uchar add)                                   //讀1302函數(shù)                qx
  309. {
  310.         uchar dat,dat1,i,temp;
  311.         temp=add;
  312.         ce=0;
  313.         _nop_();
  314.         sclk=0;
  315.         _nop_();
  316.         ce=1;
  317.         for(i=0;i<8;i++)
  318.         {
  319.                 sclk=0;
  320.                 _nop_();
  321.                 if((temp&0x01)==0x01)
  322.                         dio=1;
  323.                         else
  324.                         dio=0;
  325.                 temp>>=1;
  326.                 sclk=1;
  327.                 _nop_();
  328.         }
  329.         for(i=0;i<8;i++)
  330.         {
  331.                 sclk=0;
  332.                 _nop_();
  333.                 if(dio)
  334.                     dat|=0x80;
  335.                 if(i<7)
  336.                         dat>>=1;
  337.                 sclk=1;
  338.         }
  339.         dat1=dat/16;         //讀出的數(shù)值轉(zhuǎn)為10進制
  340.         dat=dat%16;
  341.         dat=dat1*10+dat;  
  342.         ce=0;
  343.         sclk=0;
  344.         return dat;
  345. }                        


  346. void init_1302()                                                        //初始化函數(shù) 設(shè)置第一次上電時顯示的時間值
  347. {        
  348.         write_1302(0x8e,0x00);                                        //保護取消,可以進行寫操作
  349.         write_1302(write_miao,0x57);                        //寫秒57
  350.         write_1302(write_fen,0x30);                                //寫分30
  351.         write_1302(write_shi,0x12);                                //寫時12
  352.         write_1302(0x8e,0x80);                                        //保護啟動,不能進行寫操作
  353. }         

  354. void read_sf()                           //讀時分秒
  355. {
  356.         shi=read_1302(read_shi);
  357.         fen=read_1302(read_fen);
  358.         miao=read_1302(read_miao);
  359.         display(shi,fen);

  360. }



  361. void keyscan()                                                                   //按鍵掃描函數(shù)
  362. {        
  363.         uchar fs,fg,shs,shg;                                   //分鐘十位、個位 ,小時十位、個位
  364.         static uint a;                                                   //按鍵延時變量
  365.         fs = fen/10; fg=fen%10;                                   //分鐘十位、個位
  366.         shs = shi/10; shg=shi%10;                       //小時十位、個位

  367.         if(key1==0)
  368.         {
  369.                 a++;
  370.                 if(a>50)
  371.                 while(!key1)
  372.                 {
  373.                         display(shi,fen);
  374.                         a=0;
  375.                         zdyw=1;
  376.                 }
  377.         }

  378.         else
  379.         {
  380.                 if(a>10 && a<50)
  381.                 {
  382.                         count=0;                //每次按下,count都要清零,松手后,count都是從0開始計數(shù),這句很重要
  383.                         a=0;

  384.                         if(knum==1)                                                //小時十位調(diào)節(jié)
  385.                         {
  386.                                 shs++;
  387.                                 if(shs>2) shs=0;
  388.                                 shi=shs*16+shg;
  389.                                 write_1302(write_shi,shi);        //寫入1302
  390.                                 read_sf();                                        //讀出時間,然后顯示
  391.                         }
  392.         /*********************/
  393.                         if(knum==2)                                                //小時個位調(diào)節(jié)
  394.                         {
  395.                
  396.                                 shg++;
  397.                                 if(shs==0 || shs==1)   //如果小時十位為0、1
  398.                                 {
  399.                                         if(shg>9) shg=0;   //小時個位可以在0-9變化
  400.                                 }
  401.                                 else                                   //否則,小時個位可以在0-3變化
  402.                                 {
  403.                                         if(shg>3) shg=0;   
  404.                                 }
  405.                                 shi=shs*16+shg;                   //10進制轉(zhuǎn)為16進制
  406.                                 write_1302(write_shi,shi);        //寫入1302
  407.                                 read_sf();                                        //讀出時間,然后顯示
  408.                         }
  409. /************************/

  410.                         if(knum==3)                                                //分鐘十位調(diào)節(jié)
  411.                         {
  412.                                 fs++;
  413.                                 if(fs>5) fs=0;
  414.                                 fen=fs*16+fg;
  415.                                 write_1302(write_fen,fen);        //寫入1302
  416.                                 read_sf();                                        //讀出時間,然后顯示
  417.                         }
  418.         /*******************/
  419.                          if(knum==4)                                        //分鐘個位調(diào)節(jié)
  420.                          {
  421.                                 fg++;
  422.                                 if(fg>9) fg=0;
  423.                                 fen=fs*16+fg;
  424.                                 write_1302(write_fen,fen);        //寫入1302
  425.                                 read_sf();                                        //讀出時間,然后顯示
  426.                          }
  427.         
  428.         /***********************/

  429.                         if(knum==0)                                                //非調(diào)時狀態(tài),短按key1,開關(guān)LED
  430.                         {
  431.                                 led=~led;
  432.                         }
  433.                 }
  434.         }           
  435. }

  436. /************************/

  437. void main()
  438. {
  439.         t0_init();
  440.         init_1302();                          
  441.         while(1)
  442.         {
  443.             read_sf();
  444.             keyscan();
  445.         }
  446. }

  447. void temer1() interrupt 1
  448. {
  449.         TH0=(65536-46080)/256;
  450.         TL0=(65536-46080)%256;
  451.         ss++;
  452.         if(ss==20)          //1秒時間到
  453.         {
  454.                 ss=0;
  455.                 if(zdyw)
  456.                 {
  457.                         count++;
  458.                         if(count==5) //調(diào)時的時候,自動移位快慢調(diào)這里,要快就把count的值減小,反之亦然。
  459.                         {
  460.                                 count=0;
  461.                                 knum++;
  462.                                 if(knum==1)
  463.                                 {
  464.                                          write_1302(0x8e,0x00);                //寫保護取消
  465. //                                        write_1302(write_miao,0x80); //  寫秒80,時鐘停止走時;                        
  466.                                 }
  467.                                 if(knum>4)
  468.                                 {
  469.                                         knum=0;
  470.                                         zdyw=0;
  471.                                         write_1302(write_miao,0x00);
  472.                                         write_1302(0x8e,0x80);                //寫保護啟動
  473.                                 }
  474.                         }        
  475.                 }                        
  476.         }
  477. }         
復(fù)制代碼
全部資料51hei下載地址:
時鐘個十位分開調(diào)節(jié) -1鍵調(diào)節(jié).rar (181.79 KB, 下載次數(shù): 15)

評分

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

查看全部評分

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

使用道具 舉報

沙發(fā)
ID:768299 發(fā)表于 2020-6-3 12:12 | 只看該作者
膜拜大佬
回復(fù)

使用道具 舉報

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

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 国产成人精品久久二区二区 | 亚洲一在线 | 国产成人精品免费视频大全最热 | 日韩免费视频一区二区 | 久久精品99国产精品日本 | 久久久久久久久综合 | 草草视频在线观看 | 毛片免费在线观看 | 久久av一区二区 | 国产一区二区精品在线 | 久久综合一区 | 天天爱综合| 亚洲福利一区 | 视频一区二区中文字幕日韩 | 亚洲国产aⅴ成人精品无吗 综合国产在线 | 99亚洲精品 | 国产性色视频 | 国产一区二区中文字幕 | av入口| 久久久亚洲精品视频 | 日韩久久精品 | 欧美一级在线免费 | 国产精品久久久久久影院8一贰佰 | 正在播放国产精品 | 性福视频在线观看 | 午夜免费精品视频 | 日本羞羞影院 | 视频一二三区 | 国产精品久久久久久久久久 | 国产一区二区三区在线看 | 中文字幕日韩一区 | 日批的视频 | 999热视频 | 久久久国产亚洲精品 | 久久国内精品 | 亚洲精品视频网站在线观看 | 日韩成人免费视频 | 精品二 | 男女污污动态图 | 日韩高清国产一区在线 | 黄色片免费看 |