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

QQ登錄

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

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

DS1302數(shù)碼管時(shí)鐘仿真和源代碼

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:140489 發(fā)表于 2016-10-26 16:58 | 只看該作者 |只看大圖 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
這個(gè)只是讀取出時(shí)間,其它功能沒(méi)有寫(xiě)出來(lái),用了四位共陰數(shù)碼管顯示。
小數(shù)點(diǎn)閃爍  第3位數(shù)碼管倒置顯示小數(shù)點(diǎn)與第二位數(shù)碼管一起顯示“:”,1秒閃爍一次

仿真用了4個(gè)一位的數(shù)碼管和一個(gè)四位的數(shù)碼管,如果用一個(gè)四位的數(shù)碼管,可以修改程序把第三位的

小數(shù)點(diǎn)去掉


附件里面有源代碼與仿真文件: 時(shí)鐘.rar (114.65 KB, 下載次數(shù): 89)



  1. //這個(gè)只是讀取出時(shí)間,其它功能沒(méi)有寫(xiě)出來(lái),用了四位共陰數(shù)碼管顯示。
  2. // 小數(shù)點(diǎn)閃爍  第3位數(shù)碼管倒置顯示小數(shù)點(diǎn)
  3. //  與第二位數(shù)碼管一起顯示“:”,1秒閃爍一次

  4. //仿真用了4個(gè)一位的數(shù)碼管和一個(gè)四位的數(shù)碼管
  5. /**********************************
  6. *                DS1302簡(jiǎn)單時(shí)間顯示                  *
  7. *                        數(shù)碼管顯示                          *
  8. ***********************************/
  9. #include <reg52.h>
  10. #include<intrins.h>
  11. #define uchar unsigned char
  12. #define uint unsigned int
  13. #define W P2                                                                          //位選
  14. #define D P0                                                                        //段選
  15. sbit dio=P1^1;                                                                          //數(shù)據(jù)口
  16. sbit sclk=P1^0;                                                                         //控制數(shù)據(jù)時(shí)鐘
  17. sbit RST=P1^2;                                                                          //使能端、復(fù)位端
  18. /************按鍵引腳定義***********/
  19. sbit s1=P3^0;                                                                        //按鍵 加
  20. sbit s2=P3^1;                                                                        //按鍵 減
  21. sbit s3=P3^2;                                                                        //按鍵 選擇
  22. char knum=0,snum,fnum;

  23. /***********寫(xiě)時(shí)分秒地址************/
  24. #define write_shi  0x84
  25. #define write_fen  0x82
  26. #define write_miao 0x80
  27. /***********讀時(shí)分秒地址************/
  28. #define read_shi  0x85
  29. #define read_fen  0x83
  30. #define read_miao 0x81

  31. char shi,fen,miao;                                                                 //讀出數(shù)據(jù)存儲(chǔ)變量
  32. //uchar d[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xd8,0x80,0x90};                //不帶小數(shù)點(diǎn)
  33. //uchar dd[]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10};                //帶小數(shù)點(diǎn)


  34.                            // 0     1         2          3           4    5    6    7   8     9    10   11        
  35. uchar code d[]={ 0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x40,0x00};                //共陰不帶小數(shù)點(diǎn)  

  36. uchar code dd[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef};//        共陰帶小數(shù)點(diǎn)

  37. void delay(uint z)                                                          //延時(shí)函數(shù),z的取值為這個(gè)函數(shù)的延時(shí)ms數(shù),如delay(200);大約延時(shí)200ms.
  38. {                                                                                                //delay(500);大約延時(shí)500ms.
  39.         uint x,y;
  40.         for(x=z;x>0;x--)
  41.                 for(y=110;y>0;y--);        
  42. }

  43. void write_1302(uchar add,dat)                 //寫(xiě)函數(shù)  qx
  44. {
  45.         uchar i,temp;
  46.         temp=add;
  47.         RST=0;
  48.         _nop_();
  49.         sclk=0;
  50.         _nop_();
  51.         RST=1;
  52.         _nop_();
  53.         for(i=0;i<8;i++)
  54.         {
  55.                 sclk=0;
  56.                 _nop_();
  57.                 if((temp&0x01)==0x01)
  58.                         dio=1;
  59.                         else
  60.                         dio=0;
  61.                 temp>>=1;
  62.                 sclk=1;
  63.                 _nop_();
  64.         }
  65.         temp=dat;
  66.         for(i=0;i<8;i++)
  67.         {
  68.                 sclk=0;
  69.                 _nop_();
  70.                 if((temp&0x01)==0x01)
  71.                         dio=1;
  72.                         else
  73.                         dio=0;
  74.                 temp>>=1;
  75.                 sclk=1;
  76.                 _nop_();
  77.         }
  78.         RST=0;
  79.         sclk=0;
  80. }
  81. uchar read_1302(uchar add)                                   //讀函數(shù)                qx
  82. {
  83.         uchar dat,dat1,i,temp;
  84.         temp=add;
  85.         RST=0;
  86.         _nop_();
  87.         sclk=0;
  88.         _nop_();
  89.         RST=1;
  90.         for(i=0;i<8;i++)
  91.         {
  92.                 sclk=0;
  93.                 _nop_();
  94.                 if((temp&0x01)==0x01)
  95.                         dio=1;
  96.                         else
  97.                         dio=0;
  98.                 temp>>=1;
  99.                 sclk=1;
  100.                 _nop_();
  101.         }
  102.         for(i=0;i<8;i++)
  103.         {
  104.                 sclk=0;
  105.                 _nop_();
  106.                 if(dio)
  107.                     dat|=0x80;
  108.                 if(i<7)
  109.                         dat>>=1;
  110.                 sclk=1;
  111.         }
  112.         dat1=dat/16;
  113.         dat=dat%16;
  114.         dat=dat1*10+dat;  
  115.         RST=0;
  116.         sclk=0;
  117.         return dat;
  118. }                                 




  119. void init_1302()                                                        //初始化函數(shù) 設(shè)置時(shí)間
  120. {
  121.         write_1302(0x8e,0x00);                                        //保護(hù)取消,可以進(jìn)行讀寫(xiě)操作
  122.         write_1302(write_miao,0x56);        
  123.         write_1302(write_fen,0x49);
  124.         write_1302(write_shi,0x14);
  125.         write_1302(0x8e,0x80);                                        //保護(hù)啟動(dòng),不能進(jìn)行讀寫(xiě)操作
  126. }

  127. void display(uchar shi,uchar fen,uchar miao)                          //顯示函數(shù)
  128. {
  129.         if(knum==0)
  130.         {
  131.                 snum=30;
  132.                 fnum=30;
  133.         }
  134.         if(knum==1)
  135.         {
  136.                 fnum++;
  137.                 snum=30;
  138.         }
  139.         if(knum==2)
  140.         {
  141.                 snum++;
  142.                 fnum=30;
  143.         }
  144.         
  145.         if(snum>=30)
  146.         {
  147.                 P2=0x01;                                                                        //位選
  148.                 P0=d[shi/10];                                                        //段選
  149.                 delay(5);
  150.                 P0=0X00;
  151.                                                                                 //位選
  152.                                                                         //消隱
  153.                 if(miao%2==0)                                                        //小數(shù)點(diǎn)閃爍
  154.                 {
  155.                         P2=0x02;
  156.                         P0=dd[shi%10];
  157.                         delay(5);
  158.                         P0=0X00;
  159.                                                                                 //消隱
  160.                 }
  161.                 else
  162.                 {
  163.                     P2=0x02;
  164.                         P0=d[shi%10];
  165.                         delay(5);
  166.                         P0=0X00;
  167.                                                                                                 //消?
  168.                 }
  169.             if(snum==60)
  170.                         snum=0;
  171.         }               
  172.         if(fnum>=30)
  173.         {
  174.                
  175.                 if(miao%2==0)                                                        //小數(shù)點(diǎn)閃爍  第3位數(shù)碼管倒置顯示小數(shù)點(diǎn)
  176.                                                                                                  //與第二位數(shù)碼管一起顯示“:”,1秒閃爍一次
  177.                 {
  178.                 P2=0x04;
  179.                 P0=dd[fen/10];
  180.                 delay(5);
  181.                 P0=0X00;
  182.                 }                                                                //消隱


  183.            else
  184.            {
  185.                    P2=0x04;
  186.                 P0=d[fen/10];
  187.                 delay(5);
  188.                 P0=0X00;
  189.            
  190.            }
  191.                 P2=0x08;
  192.                 P0=d[fen%10];
  193.                 delay(5);
  194.                 P0=0X00;
  195.                                                                                         //消隱
  196.                 if(fnum==60)
  197.                         fnum=0;
  198.         }
  199. }
  200. void read_sf()
  201. {
  202.         shi=read_1302(read_shi);
  203.         fen=read_1302(read_fen);
  204.         miao=read_1302(read_miao);
  205.         display(shi,fen,miao);
  206. }
  207. void keyscan()                                                                   //按鍵掃描函數(shù)
  208. {                                                                                   
  209.         if(s3==0)                                                                   //選擇按鍵按下
  210.         {
  211.                 delay(10);
  212.                 if(s3==0)
  213.                 {
  214.                         while(!s3)
  215.                                 display(shi,fen,miao);        //加上這句,按鍵按下就不會(huì)閃
  216.                         knum++;
  217.                         if(knum==1)                                                  //分閃爍
  218.                         {
  219.                                  write_1302(0x8e,0x00);                //保護(hù)取消
  220.                                  write_1302(write_miao,0x80);
  221.                         }
  222.                         if(knum==3)                                                   //時(shí)鐘啟動(dòng)
  223.                         {
  224.                                 knum=0;
  225.                                 write_1302(write_miao,0x00);
  226.                                 write_1302(0x8e,0x80);                //保護(hù)啟動(dòng)
  227.                         }
  228.                 }
  229.         }
  230.         if(knum==1)                                                                //分鐘調(diào)節(jié)
  231.         {
  232.                 if(s1==0)                                                        //加
  233.                 {
  234.                         delay(10);
  235.                         if(s1==0)
  236.                         {        
  237.                                 while(!s1)
  238.                                         display(shi,fen,miao);        //加上這句,按鍵按下就不會(huì)閃
  239.                                 fen++;
  240.                                 fen=fen/10*16+fen%10;                //轉(zhuǎn)為16進(jìn)制
  241.                                 if(fen==0x60)
  242.                                         fen=0x00;
  243.                                 write_1302(write_fen,fen);        //寫(xiě)入1302
  244.                                 read_sf();                                        //讀出時(shí)間,然后顯示
  245.                         }
  246.                 }
  247.                 if(s2==0)
  248.                 {
  249.                         delay(10);
  250.                         if(s2==0)
  251.                         {        
  252.                                 while(!s2)
  253.                                         display(shi,fen,miao);        //加上這句,按鍵按下就不會(huì)閃
  254.                                 fen--;
  255.                                 fen=fen/10*16+fen%10;                //轉(zhuǎn)為16進(jìn)制
  256.                                 if(fen==-1)
  257.                                         fen=0x59;
  258.                                 write_1302(write_fen,fen);
  259.                                 read_sf();
  260.                         }
  261.                 }
  262.         }
  263.         if(knum==2)
  264.         {
  265.                 if(s1==0)
  266.                 {
  267.                         delay(10);
  268.                         if(s1==0)
  269.                         {        
  270.                                 while(!s1)
  271.                                         display(shi,fen,miao);        //加上這句,按鍵按下就不會(huì)閃
  272.                                 shi++;
  273.                                 shi=shi/10*16+shi%10;                //轉(zhuǎn)為16進(jìn)制
  274.                                 if(shi==0x24)
  275.                                         shi=0x00;
  276.                                 write_1302(write_shi,shi);
  277.                                 read_sf();
  278.                         }
  279.                 }
  280.                 if(s2==0)
  281.                 {
  282.                         delay(10);
  283.                         if(s2==0)
  284.                         {        
  285.                                 while(!s2)
  286.                                           display(shi,fen,miao);        //加上這句,按鍵按下就不會(huì)閃
  287.                                 shi--;
  288.                                 shi=shi/10*16+shi%10;                //轉(zhuǎn)為16進(jìn)制
  289.                                 if(shi==-1)
  290.                                         shi=0x23;
  291.                                 write_1302(write_shi,shi);
  292.                                 read_sf();
  293.                         }
  294.                 }
  295.         }
  296. }
  297. void main()
  298. {
  299.         init_1302();
  300.         while(1)
  301.         {
  302.                 read_sf();
  303.                 keyscan();

  304.                 display(shi,fen,miao);
  305.         }
  306. }
復(fù)制代碼


評(píng)分

參與人數(shù) 1黑幣 +100 收起 理由
admin + 100 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

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

相關(guān)帖子

回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:140489 發(fā)表于 2016-10-26 16:59
怎么把那個(gè)售價(jià)5黑幣去掉

板凳
ID:60515 發(fā)表于 2016-12-28 16:53 來(lái)自觸屏版 | 只看該作者
為什么在實(shí)物圖上不能正常顯示??
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

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