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

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

QQ登錄

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

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

60個(gè)LED旋轉(zhuǎn)顯示的實(shí)時(shí)時(shí)鐘程序調(diào)試還有有一點(diǎn)問(wèn)題,大家一起來(lái)看看怎么解決吧

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:87316 發(fā)表于 2016-1-16 00:26 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
定時(shí)二極管的循環(huán)顯示間隔快于1S,無(wú)法使其保持和秒數(shù)同步,定時(shí)器中斷設(shè)置不好。。程序如下,也有工程文件,一起來(lái)看看吧

test5.zip

65.92 KB, 下載次數(shù): 20

程序

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

使用道具 舉報(bào)

沙發(fā)
ID:87316 發(fā)表于 2016-1-16 00:27 | 只看該作者
  1. #include<reg52.h>
  2. #include "ds18b20.h"
  3. #define uchar unsigned char
  4. #define uint unsigned int//蜂鳴器位定義
  5. sbit beep = P3^3 ;//DS1302相關(guān)操作線定義
  6. sbit RST = P1^1 ;
  7. sbit SCK = P1^2 ;
  8. sbit SDA = P1^3 ;  //按鍵定義,key1切換鍵,key2加,key3減,key4鬧鐘,年月日周
  9. sbit key1 = P1^4 ;
  10. sbit key2 = P1^5 ;
  11. sbit key3 = P1^6 ;
  12. sbit key4 = P1^7 ;
  13. sbit key5=P1^0;
  14. sbit rs=P3^6;
  15. sbit clk=P3^7;
  16. uchar i,j,mod,ledzz,flag,dot=3;flag1=1 ;//控制定時(shí)器動(dòng)態(tài)掃描數(shù)碼管的第幾位,j是定時(shí)讀取時(shí)間。mod是對(duì)key1按下次數(shù)計(jì)數(shù)。flag切換鬧鐘,日期,和周.flag1為鬧鐘標(biāo)志位
  17. //uchar code write_addr[7]={0x80,0x82,0x84,0x86,0x88,0x8a,0x8c}; //秒分時(shí)日月周年 寫地址
  18. //uchar code read_addr[7]={0x81,0x83,0x85,0x87,0x89,0x8b,0x8d};  //秒分時(shí)日月周年 讀地址
  19. //共陽(yáng)數(shù)碼管碼表,表示0-9和-。-表示時(shí)分秒的間隔.
  20. uchar bit_code[]={
  21.   0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};//數(shù)碼管位選
  22. uchar code LED[11] =
  23. {
  24.     0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,
  25. };
  26. uchar disbuf[8] =
  27. {
  28.     0x62,0xa2,0xf7,0x7a,0x28,0xf7,0x7e,0x7e
  29. };//定義時(shí)間日期的結(jié)構(gòu)類型
  30. struct time
  31. {
  32.     uchar second ;
  33.     uchar minute ;
  34.     uchar hour ;
  35.    // uchar week ;
  36.     uchar day ;
  37.     uchar month ;
  38.     uchar year ;
  39. }
  40. current_time ;
  41. #define ctime current_time//定義鬧鐘的時(shí)分秒變量
  42. uchar asec,amin,ahour ;
  43. void delay(uint ms)
  44. {
  45.     uchar i ;
  46.     while(ms--)
  47.     for(i=135;i>0;i--);
  48. }//滴一聲,用來(lái)按鍵伴音
  49. void di()
  50. {
  51.     uchar i ;
  52.     for(i=0;i<40;i++)
  53.     {
  54.         beep = 0 ;
  55.         delay(1) ;
  56.         beep = 1 ;
  57.         delay(1) ;
  58.     }
  59. }
  60. //滴滴,連續(xù)響兩下。用來(lái)鬧鐘提醒。
  61. void didi()
  62. {
  63.     uchar i ;
  64.     for(i = 2; i>0; i--)
  65.     {
  66.         di();
  67.         delay(140);
  68.     }
  69. }//DS1302的寫驅(qū)動(dòng),傳入?yún)?shù)為一個(gè)地址和數(shù)據(jù)
  70. void write(uchar addr,uchar dat)
  71. {
  72.     uchar i ;
  73.     RST = 0 ;
  74.     SCK = 0 ;
  75.     RST = 1 ;
  76.     for(i=0;i<8;i++)
  77.     {
  78.         SCK = 0 ;
  79.         SDA = (bit)(addr&0x01) ;
  80.         addr >>=1 ;
  81.         SCK = 1 ;
  82.     }
  83.     for(i=0;i<8;i++)
  84.     {
  85.         SCK = 0 ;
  86.         SDA = (bit)(dat&0x01);           //下降沿寫入,上升沿讀入
  87.         dat >>= 1 ;
  88.         SCK = 1 ;
  89.     }
  90.     RST = 0 ;
  91. }

  92. //DS1302的讀驅(qū)動(dòng),傳入?yún)?shù)為一個(gè)地址,返回參數(shù)為讀到的數(shù)據(jù)
  93. uchar read(uchar addr)
  94. {
  95.     uchar i,dat ;
  96.     RST = 0 ;
  97.     SCK = 0 ;
  98.     RST = 1 ;
  99.     for(i=0;i<8;i++)
  100.     {
  101.         SCK = 0 ;
  102.         SDA =(bit)(addr&0x01);
  103.         addr>>=1 ;
  104.         SCK = 1 ;
  105.     }
  106.     for(i=0;i<8;i++)
  107.     {
  108.         SCK=0 ;
  109.         dat>>=1 ;
  110.         if(SDA)
  111.         dat|=0x80 ;
  112.         SCK=1 ;
  113.     }
  114.    
  115.     RST=0 ;
  116.     dat=(dat/16*10)+(dat&0x0f);
  117.     return dat ;
  118. }
  119. //讀取DS1302的時(shí)間和日期
  120. void read_time()
  121. {
  122.     ctime.second = read(0x81);
  123.     ctime.minute = read(0x83);
  124.     ctime.hour   = read(0x85);
  125.     ctime.day    = read(0x87);
  126.     ctime.month  = read(0x89);
  127.     //ctime.week   = read(0x8b);
  128.     ctime.year   = read(0x8d);
  129. }
  130. //設(shè)定時(shí)間和日期
  131. void set_time()
  132. {
  133.     if(!flag)
  134.     {
  135.         write(0x8e,0x00);
  136.         write(0x80,((ctime.second/10)<<4|(ctime.second%10)));
  137.         write(0x82,((ctime.minute/10)<<4|(ctime.minute%10)));
  138.         write(0x84,((ctime.hour/10)<<4|(ctime.hour%10)));
  139.         write(0x8e,0x80);
  140.     }
  141.     else
  142.     {
  143.         write(0x8e,0x00);
  144.         write(0x86,((ctime.day/10)<<4|(ctime.day%10)));
  145.         write(0x88,((ctime.month/10)<<4|(ctime.month%10)));
  146.         //write(0x8a,((ctime.week/10)<<4|(ctime.week%10)));
  147.         write(0x8c,((ctime.year/10)<<4|(ctime.year%10)));
  148.         write(0x8e,0x80);
  149.     }
  150.     flag1=1 ;
  151. }
  152. //刷新顯示緩沖區(qū)
  153. void refbuf()
  154. {
  155.     switch(flag)
  156.     {
  157.         case 1 :
  158.         disbuf[0] = LED[ctime.day%10];
  159.         disbuf[1] = LED[ctime.day/10];
  160.         disbuf[2] = 0xbf ;                 //10111111 -
  161.         disbuf[3] = LED[ctime.month%10];
  162.         disbuf[4] = LED[ctime.month/10];
  163.         disbuf[5] = 0xbf ;
  164.         disbuf[6] = LED[ctime.year%10];
  165.         disbuf[7] = LED[ctime.year/10];
  166.         break ;
  167.         /*case 2 :
  168.         disbuf[0] = 0xbf ;
  169.         disbuf[1] = 0xbf ;
  170.         disbuf[2] = 0xbf ;
  171.         disbuf[3] = 0xbf ;
  172.         disbuf[4] = LED[ctime.week] ;
  173.         disbuf[5] = 0xbf ;
  174.         disbuf[6] = 0xbf ;
  175.         disbuf[7] = 0xbf ;
  176.         break ;*/
  177.         case 2 :
  178.         disbuf[0] = LED[asec%10];
  179.         disbuf[1] = LED[asec/10];
  180.         disbuf[2] = 0xbf;
  181.         disbuf[3] = LED[amin%10];
  182.         disbuf[4] = LED[amin/10];
  183.         disbuf[5] = 0xbf;
  184.         disbuf[6] = LED[ahour%10];
  185.         disbuf[7] = LED[ahour/10];
  186.         break ;
  187.         default :
  188.         disbuf[0] = LED[ctime.second%10];
  189.         disbuf[1] = LED[ctime.second/10];
  190.         disbuf[2] = 0xbf;
  191.         disbuf[3] = LED[ctime.minute%10];
  192.         disbuf[4] = LED[ctime.minute/10];
  193.         disbuf[5] = 0xbf;
  194.         disbuf[6] = LED[ctime.hour%10];
  195.         disbuf[7] = LED[ctime.hour/10];
  196.     }
  197. }
  198. //鍵盤掃描
  199. void keyscan()
  200. {
  201.     if(key1 == 0)
  202.     {
  203.         delay(5);
  204.         if(key1 == 0)
  205.         {
  206.             while(!key1); //key1用來(lái)調(diào)節(jié)時(shí)間和日期、鬧鐘
  207.             mod++;//mod標(biāo)示調(diào)節(jié)時(shí)間的時(shí)候?qū)?yīng)的閃爍位,mod=1秒位或天或鬧鐘的秒,mod=2是分位,mod=3是小時(shí)位
  208.             di();//退出調(diào)節(jié)功能,返回正常顯示
  209.             if(mod == 4)
  210.             {
  211.                 set_time();
  212.                 mod = 0 ;
  213.             }
  214.         }
  215.     } //調(diào)節(jié)加1
  216.     if(key2==0)
  217.     {
  218.         delay(5);
  219.         if(key2==0)
  220.         {
  221.             while(!key2);
  222.             di();
  223.             switch(mod)
  224.             {
  225.                 case 1 :
  226.                 ctime.second++;
  227.                 if(ctime.second==60)
  228.                 ctime.second=0 ;
  229.                 break ;
  230.                 case 2 :
  231.                 ctime.minute++;
  232.                 if(ctime.minute==60)
  233.                 ctime.minute=0 ;
  234.                 break ;
  235.                 case 3 :
  236.                 ctime.hour++;
  237.                 if(ctime.hour==24)
  238.                 ctime.hour=0 ;
  239.                 break ;
  240.             } //flag=0時(shí)默認(rèn)調(diào)節(jié)時(shí)分秒,=1時(shí)調(diào)節(jié)年月日,=2時(shí)調(diào)節(jié)周,=3時(shí)調(diào)節(jié)鬧鐘,=4時(shí)就返回正常顯示,flag又key4來(lái)控制。
  241.             if(flag==1)
  242.             {
  243.                 switch(mod)
  244.                 {
  245.                     case 1 :
  246.                     ctime.day++;
  247.                     if(ctime.day==32)
  248.                     ctime.day=0 ;
  249.                     break ;
  250.                     case 2 :
  251.                     ctime.month++;
  252.                     if(ctime.month==13)
  253.                     ctime.month=0 ;
  254.                     break ;
  255.                     case 3 :
  256.                     ctime.year++;
  257.                     if(ctime.year==100)
  258.                     ctime.year=0 ;
  259.                     break ;
  260.                 }
  261.             }
  262.            /* if(flag==2)
  263.             {
  264.                 if(mod==1)
  265.                 {
  266.                     ctime.week++;
  267.                     if(ctime.week==8)
  268.                     ctime.week=1 ;
  269.                 }
  270.             }*/
  271.             if(flag==2)
  272.             {
  273.                 switch(mod)
  274.                 {
  275.                     case 1 :
  276.                     asec++;
  277.                     if(asec==60)
  278.                     asec=0 ;
  279.                     break ;
  280.                     case 2 :
  281.                     amin++;
  282.                     if(amin==60)
  283.                     amin=0 ;
  284.                     break ;
  285.                     case 3 :
  286.                     ahour++;
  287.                     if(ahour==24)
  288.                     ahour=0 ;
  289.                     break ;
  290.                 }
  291.             }
  292.         }
  293.     }//調(diào)節(jié)減1,功能與key2相似。
  294.     if(key3==0)
  295.     {
  296.         delay(5);
  297.         if(key3==0)
  298.         {
  299.             while(!key3);
  300.             di();
  301.             switch(mod)
  302.             {
  303.                 case 1 :
  304.                 if(ctime.second==0)
  305.                 ctime.second=60 ;
  306.                 ctime.second--;
  307.                 break ;
  308.                 case 2 :
  309.                 if(ctime.minute==0)
  310.                 ctime.minute=60 ;
  311.                 ctime.minute--;
  312.                 break ;
  313.                 case 3 :
  314.                 if(ctime.hour==0)
  315.                 ctime.hour=24 ;
  316.                 ctime.hour--;
  317.                 break ;
  318.             }
  319.             if(flag==1)
  320.             {
  321.                 switch(mod)
  322.                 {
  323.                     case 1 :
  324.                     if(ctime.day==0)
  325.                     ctime.day=32 ;
  326.                     ctime.day--;
  327.                     break ;
  328.                     case 2 :
  329.                     if(ctime.month==0)
  330.                     ctime.month=13 ;
  331.                     ctime.month--;
  332.                     break ;
  333.                     case 3 :
  334.                     if(ctime.year==0)
  335.                     ctime.year=100 ;
  336.                     ctime.year--;
  337.                     break ;
  338.                 }
  339.             }
  340.            /* if(flag==2)
  341.             {
  342.                 if(mod==1)
  343.                 {
  344.                     if(ctime.week==1)
  345.                     ctime.week=8 ;
  346.                     ctime.week--;
  347.                 }
  348.             }  */
  349.             if(flag==2)
  350.             {
  351.                 switch(mod)
  352.                 {
  353.                     case 1 :
  354.                     if(asec==0)
  355.                     asec=60 ;
  356.                     asec--;
  357.                     break ;
  358.                     case 2 :
  359.                     if(amin==0)
  360.                     amin=60 ;
  361.                     amin--;
  362.                     break ;
  363.                     case 3 :
  364.                     if(ahour==0)
  365.                     ahour=24 ;
  366.                     ahour--;
  367.                     break ;
  368.                 }
  369.             }
  370.         }
  371.     }
  372.     if(key4==0)
  373.     {
  374.         delay(5);
  375.         if(key4==0)
  376.         {
  377.             while(!key4);
  378.             di();
  379.             flag++;
  380.             if(flag==3)
  381.             {
  382.                 flag=0 ;
  383.                 flag1=1 ;                                           //KEY4按一次顯示日期,按2次顯示鬧鐘
  384.             }
  385.         }
  386.     }
  387.         if(key5==0)
  388.     {
  389.         delay(5);
  390.         if(key5==0)
  391.         {
  392.             while(!key5);
  393.             di();
  394.                         TR0=0;
  395.                         //TR1=1;
  396.                         ds1820rst();
  397.                         while(key5)
  398.                         {      //初始化顯示
  399.                             read_temp();    //讀取溫度
  400.                             ds1820disp();
  401.                        
  402.                         }   //顯示
  403.                         //if(k==2)
  404.                         while(!key5);
  405.                         TR0=1;
  406.                        
  407.         //                EA=1;               
  408.        
  409.                 }
  410.         }
  411. }
  412. //初始化,定時(shí)器定時(shí)3ms用來(lái)動(dòng)態(tài)掃描數(shù)碼管顯示
  413. void init()
  414. {
  415.     TMOD = 0X11 ;
  416.           EA   = 1 ;
  417.     TH0=(65536-3000)/256 ;
  418.     TL0=(65536-3000)%256 ;
  419.         TL1=0X18;
  420.         TH1=0XFC;
  421.         ET1=1;
  422.         PT0=1;

  423.         ET0  = 1 ;
  424.     TR0  = 1 ;
  425.   

  426.    
  427. /* write(0x8e,0x00);   //第一次寫DS1302芯片,不然開(kāi)始顯示亂碼,只需要初始化一次就行了,以后就屏蔽掉
  428.      write(0x80,0X10);
  429.      write(0x82,0X10);
  430.      write(0x84,0X10);
  431.      write(0x86,0x23);
  432.      write(0x88,0x07);
  433.      write(0x8a,0x06);
  434.      write(0x8c,0x11);
  435.      write(0x8e,0x80); */
  436.     read_time();
  437.     //每次初始化的時(shí)候都讀取時(shí)鐘芯片的時(shí)間,用來(lái)顯示。
  438. }

  439. void main()
  440. {  
  441.     init();
  442.     while(1)
  443.     {
  444.         keyscan();
  445.         //鬧鐘判斷,默認(rèn)響1min,同時(shí)按下key2和key3關(guān)掉鬧鐘
  446.         if(amin==ctime.minute&&ahour==ctime.hour&&flag1)
  447.         {
  448.             didi();
  449.             if((key2==0)&&(key3==0))
  450.             {
  451.                 delay(5);
  452.                 if((key2==0)&&(key3==0))
  453.                 flag1=0 ;
  454.             }
  455.         }
  456.     }
  457. }
  458. void time0() interrupt 1
  459. {
  460.         static unsigned char count;
  461.     TH0=(65536-3000)/256 ;
  462.     TL0=(65536-3000)%256 ;
  463.     if(i==8)
  464.     {
  465.         i=0 ;
  466.         j++;
  467.     }
  468.         /****************************/
  469.          count++;
  470.         switch(dot)
  471.         {case 3:
  472.                 dot=2;
  473.                 ledzz=0;
  474.                 rs=1;
  475.                 rs=0;
  476.                 for(;ledzz!=ctime.second;)
  477.                 {
  478.                         clk=0;
  479.                         clk=1;
  480.                         ledzz++;
  481.                 }
  482.                 ET1=1;break;
  483.         //case 2:
  484.                 default:;
  485.         }

  486.         /**************************/
  487.     //實(shí)現(xiàn)調(diào)節(jié)是閃爍的效果
  488.     if(mod|flag)
  489.     {
  490.         if(j==10)
  491.         {
  492.             switch(mod)
  493.             {
  494.                 case 1 :
  495.                 disbuf[0]=0xff ;
  496.                 disbuf[1]=0xff ;
  497.                 break ;
  498.                 case 2 :
  499.                 disbuf[3]=0xff ;
  500.                 disbuf[4]=0xff ;
  501.                 break ;
  502.                 case 3 :
  503.                 disbuf[6]=0xff ;
  504.                 disbuf[7]=0xff ;
  505.                 break ;
  506.             }
  507.         }
  508.     }
  509.         if(count==10)  //到了0.5秒
  510.         {  

  511. /**************************/
  512.           ledzz++;
  513.           if(ledzz==60)  //點(diǎn)完第59個(gè)后,復(fù)位下一個(gè)則第60個(gè)被點(diǎn)亮
  514.                 {
  515.                         ledzz=0;
  516.                         rs=1;
  517.                         rs=0;
  518.                 }
  519.           if(ledzz!=ctime.second)
  520.           {           ledzz=0;
  521.                         rs=1;
  522.                         rs=0;
  523.                     while(ledzz!=ctime.second)
  524.                 {
  525.                         clk=0;
  526.                         clk=1;
  527.                         ledzz++;
  528.                 }
  529.           }
  530. /*****************************/


  531.                 clk=1;  //LED亮
  532.                 di();
  533.                 clk=0;//LED滅,下一個(gè)點(diǎn)亮
  534.                                
  535.                        
  536.         }
  537.         /*if(count==20)  //到了一步
  538.         {
  539.                 count=0; //秒指針清零
  540.                 //ctime.second++;
  541.                 di();
  542.         /* for(i=0;i<8;i++)                              //對(duì)數(shù)碼管進(jìn)行動(dòng)態(tài)掃描
  543.    {
  544.     P2=(0x80>>i);
  545.         P0=disbuf[i];
  546.         delay(5);
  547.    }   */
  548.     P2=(0x80>>i);                       
  549.     P0=disbuf[i];
  550.     i++;
  551.     //3msx8x20,大約480ms從DS1302芯片讀取一下時(shí)間
  552.     if(j==20)
  553.     {
  554.         j=0 ;
  555.         refbuf();
  556.         if(mod==0)
  557.         read_time();
  558.                
  559.     }
  560.         //TR1=1;
  561.         }
  562. //}
  563. /********************T1*****/
  564. void Timer1ISR(void) interrupt 3                //定時(shí)器1中斷 定時(shí)1ms用于捉個(gè)點(diǎn)亮的時(shí)間間隔
  565. {
  566.         static unsigned char count;
  567.          
  568.          TL1=0X18;
  569.          TH1=0XFC;
  570.          count++;
  571.          if(count<62)
  572.          {       
  573.                  clk=0;
  574.                 clk=1;
  575.                 ledzz++;
  576.                 if(ledzz==60)  //點(diǎn)完第59個(gè)后,復(fù)位下一個(gè)則第60個(gè)被點(diǎn)亮
  577.                 {
  578.                         ledzz=0;
  579.                         rs=1;
  580.                         rs=0;
  581.                 }

  582.          }
  583.          else
  584.          {
  585.                  count=0;
  586.                 TR1=0;
  587.          }
  588. }

  589. /***************************/
復(fù)制代碼
回復(fù)

使用道具 舉報(bào)

板凳
ID:87316 發(fā)表于 2016-1-16 00:28 | 只看該作者
還有溫度的代碼沒(méi)復(fù)制上來(lái),,有沒(méi)有大神幫忙看一下
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 免费三级网 | aaaaaaa片毛片免费观看 | 欧美国产日韩在线观看 | 色www精品视频在线观看 | 超碰成人在线观看 | 中文字幕二区三区 | 断背山在线观看 | 蜜桃视频在线观看免费视频网站www | 香蕉久久av | 丁香一区二区 | 成人国产精品久久久 | 久草福利 | 视频在线观看一区 | 国产精品久久久久久久久久久久 | 国产成人精品一区二三区在线观看 | 国产一区二区 | 国产亚洲一区二区精品 | 久久精品亚洲成在人线av网址 | 99久久婷婷国产综合精品首页 | a a毛片 | 成人国产精品久久久 | 欧美 日韩 国产 成人 在线 | 亚洲高清视频一区二区 | 国产免费观看一级国产 | 99免费视频 | 欧美成人一区二区 | 国产精品久久久久久久久久妞妞 | 成人高清视频在线观看 | 亚洲成人午夜在线 | 日韩一区二区三区在线播放 | 亚洲三区在线观看 | 国产精品视频入口 | 日韩精品一区二区三区在线播放 | 91影院| h片在线免费看 | 国产精品久久久久久一区二区三区 | 日本91av视频| 成人做爰69片免费观看 | 99福利在线观看 | www日韩欧美| 欧美 日韩 综合 |