找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 15339|回復(fù): 18
收起左側(cè)

學(xué)了十多天51單片機(jī),會寫時鐘程序了,走的不準(zhǔn)怎么調(diào)啊,

  [復(fù)制鏈接]
ID:73080 發(fā)表于 2015-2-20 23:48 | 顯示全部樓層 |閱讀模式
程序?qū)懥舜蟀胩彀,終于搞定了,雖然在 大俠們看來, 實(shí)在是小兒科。,但是對于我一個業(yè)余愛好者,程序的設(shè)計(jì)沒參照任何人的結(jié)構(gòu),就能寫出來 對于0基礎(chǔ)學(xué)員來說還是很興奮的哈,請求 共同愛好單片機(jī)的朋友給我指點(diǎn)指點(diǎn),,



  #include<reg52.h>
  
#define smg P0   //數(shù)碼管顯示 段
sbit LSA=P2^2; //數(shù)碼管位選
sbit LSB=P2^3;//數(shù)碼管位選
sbit LSC=P2^4; //數(shù)碼管位選
   void csh(); //初始化聲明
    unsigned int a, b,c,d,e,f,js,j,o;      
  #define ke P1 //鍵盤接口
unsigned char kee; //存放鍵盤 鍵值
    void ys(unsigned int c)  ;//延時聲明
    void kep (void);   //鍵盤聲明
    unsigned char kk;  //檢測按鍵是否按下
     void xsss();  //數(shù)碼管顯示聲明
unsigned char code sz[]={
0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x40,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00};//按鍵1 調(diào) 分的個位 按鍵2調(diào)分的十位,按鍵3調(diào)時的個位 按鍵4調(diào)時的十位;
unsigned char u[17];
    void main(void)
   
    {    csh();
   
  while(1){ kep(); xsss();  
         
         
       if(o==10){b++;o=0;}
       if(b==6) {c++;b=0;}
       if(c==10){d++;c=0;}
       if(d==6){e++;d=0;}
       if(e==10){f++;e=0;}
       if(f==2&&e==4){o=0;b=0;c=0;d=o;e=0;f=0;}
       if(kk==1)                                                              
       {  TR0=0;
         switch(kee)
        { case(1):d++;break;   
      case(2):c++;if(c==9){c=0;} break;
      case(3):e++; break;
      case(4):f++;if(f==2){f=0;}break;     
      
      
      
      } }  kk=0;TR0=1;
            
       }
        
   }
  

void csh()        //初始化函數(shù)
  {   f=0;e=0;d=0;c=6;b=0;o=0;   
TMOD=0x01;
TH0=(65536-50000)/256;
    TL0=(65536-50000)%256;
EA=1;
ET0=1;
TR0=1;   

  }      
  
void zd() interrupt  1    //定時ET0的中斷函數(shù)
{
    TH0=(65536-49972)/256;
    TL0=(65536-49972)%256;

      js++;    if(js==20){o++;js=0;} //如果此條 不放在中斷里,有可能因?yàn)槌绦蛟趫?zhí)行其他程序而超過20,if語句就檢測不到j(luò)s=20了也就不執(zhí)行此語句;無法為js置0了,js有可能持續(xù)增加,
   
}
  void ys(unsigned int c)   
{
    unsigned char a,b;
        for(b=c;b>0;b--)
            for(a=60;a>0;a--);
}

void kep(void)    //鍵盤函數(shù)
{
     char a=0;
      ke=0x0f;
    if(ke!=0x0f){
    ys(30);

     if(ke!=0x0f){   kk=1;
     switch(ke)
     {
       case(0x07):kee=0;break;
    case(0x0b):kee=1;break;
    case(0x0d):kee=2;break;
    case(0x0e):kee=3;break;     
     }
     ke=0xf0;
       switch(ke)
     {      
       case(0x70):kee=kee;break;
    case(0xb0):kee=kee+4;break;
    case(0xd0):kee=kee+8;break;
    case(0xe0):kee=kee+12;break;     
     }
    while((a<50)&&(ke!=0xf0))
   {   ys(50);
   
    a++;
   }
         }
    }  
   
   
   
      
}




void xsss() //數(shù)碼管 動態(tài)顯示函數(shù)
{  switch(0)  
  {
     
   
   case(0):
     LSA=0;LSB=1;LSC=0; smg=sz[10]; // -
      j=10;      
     while(j--);
    smg=0x00;
   
    LSA=1;LSB=0;LSC=1;smg =sz[10]; // -
      j=10;      
     while(j--);
     smg  =0x00;   
   LSA=0;LSB=0;LSC=0;smg =sz[o]; // 秒
    ys(1);      
     
          smg=0x00;  
     
    LSA=1;LSB=0;LSC=0; smg=sz[b]; //秒的十位
    ys(1);
           smg =0x00;
      
   LSA=1;LSB=1;LSC=0;smg =sz[c];//分的個位
        ys(1);
       smg =0x00;
  LSA=0;LSB=0;LSC=1; smg=sz[d]; // 分的十位
     ys(1);
   smg =0x00;
     LSA=0;LSB=1;LSC=1; smg=sz[e]; // 小時的個位
      ys(1);
   smg=0x00;
      
  LSA=1;LSB=1;LSC=1; smg=sz[f]; // 小時的十位
     ys(1);
    smg =0x00;
         
  }         
      }


相關(guān)帖子

回復(fù)

使用道具 舉報

ID:262 發(fā)表于 2015-2-21 00:04 來自觸屏版 | 顯示全部樓層
電路圖呢
回復(fù)

使用道具 舉報

ID:73080 發(fā)表于 2015-2-21 00:12 | 顯示全部樓層
電路圖剛才忘記了,現(xiàn)在上傳

HC6800-ES V2.0.pdf

759.08 KB, 下載次數(shù): 51, 下載積分: 黑幣 -5

電路圖

回復(fù)

使用道具 舉報

ID:73080 發(fā)表于 2015-2-21 00:12 | 顯示全部樓層

恩,已經(jīng)上傳了,剛才忘記了
回復(fù)

使用道具 舉報

ID:7485 發(fā)表于 2015-2-21 12:54 | 顯示全部樓層
你的晶振是多少呢?
誤差了多少呢?
也可以修改下面式子里面的減數(shù)。不知道你的式子里面的“49972”是不是仿真時調(diào)的?這個數(shù)越小走時越慢。


void zd() interrupt  1    //定時ET0的中斷函數(shù)
{
    TH0=(65536-49972)/256;
    TL0=(65536-49972)%256;
回復(fù)

使用道具 舉報

ID:73509 發(fā)表于 2015-2-22 21:00 | 顯示全部樓層
好羨慕啊,我也是0開始的初學(xué)者啊,剛看了第1課,正在進(jìn)行第2課啊
回復(fù)

使用道具 舉報

ID:73030 發(fā)表于 2015-2-22 23:46 來自觸屏版 | 顯示全部樓層
樓主進(jìn)步好快啊
回復(fù)

使用道具 舉報

ID:73080 發(fā)表于 2015-2-23 17:02 | 顯示全部樓層
ahshmj 發(fā)表于 2015-2-21 12:54
你的晶振是多少呢?
誤差了多少呢?
也可以修改下面式子里面的減數(shù)。不知道你的式子里面的“49972”是不 ...

TH0=(65536-49972)/256;
    TL0=(65536-49972)%256; 里面的數(shù) 是越小越快啊, 我怎么調(diào) 都不行 走 一兩個小時 不是 快 幾秒 就是慢幾秒,我就怕 讓他運(yùn)行久了 就偏離的更多,謝謝
回復(fù)

使用道具 舉報

ID:73080 發(fā)表于 2015-2-23 17:04 | 顯示全部樓層
1420079051 發(fā)表于 2015-2-22 21:00
好羨慕啊,我也是0開始的初學(xué)者啊,剛看了第1課,正在進(jìn)行第2課啊

共同進(jìn)步啊,剛開始用學(xué) 邊學(xué) 邊寫,只要用心 我感覺很快的我們
回復(fù)

使用道具 舉報

ID:73080 發(fā)表于 2015-2-23 17:06 | 顯示全部樓層
zrb5688 發(fā)表于 2015-2-22 23:46
樓主進(jìn)步好快啊

放假 不用上班了,有時間啊,
回復(fù)

使用道具 舉報

ID:73711 發(fā)表于 2015-2-25 11:46 | 顯示全部樓層
用  單片機(jī)精靈  算初值  要用12MMHz的才沒有誤差的
回復(fù)

使用道具 舉報

ID:29438 發(fā)表于 2015-2-25 11:55 | 顯示全部樓層
好羨慕,好妒忌!
回復(fù)

使用道具 舉報

ID:74064 發(fā)表于 2015-3-3 00:36 | 顯示全部樓層
樓主QQ多少啊 我的:2715860322  交流下啊
回復(fù)

使用道具 舉報

ID:73082 發(fā)表于 2015-3-6 16:07 | 顯示全部樓層
用時鐘芯片如DS1302 或DS3231 DS3234,1302用外部晶振,精度較差。3231晶振內(nèi)置,內(nèi)部溫度補(bǔ)償,精度比較高,但價格也高
回復(fù)

使用道具 舉報

ID:71233 發(fā)表于 2015-3-6 18:02 | 顯示全部樓層
這個很好用!

單片機(jī)小精靈mcuelf_v1.3.rar

998.07 KB, 下載次數(shù): 15, 下載積分: 黑幣 -5

回復(fù)

使用道具 舉報

ID:18016 發(fā)表于 2015-4-26 18:44 | 顯示全部樓層
添加一個自動校正程序
回復(fù)

使用道具 舉報

ID:76800 發(fā)表于 2015-4-26 21:13 | 顯示全部樓層
本帖最后由 8055 于 2015-4-26 21:21 編輯

2-3個方法能改變你這個方式的時鐘精度
1、定時器改自動重裝方式。
2、不使用自動重裝時,計(jì)算出一個合適的裝載值,保證低位能有至少4個0,比如0xe0。
3、運(yùn)行一段時間(1-7天)算出誤差大小,用軟件定時處理誤差值。

我剛學(xué)習(xí)那會兒弄的那個時鐘,連續(xù)用了2年多,好像一年才快不到2分鐘,就一個普通的12M晶體,忘記了是30PPM還是100PPM的,反正一熱一冷的,一年四季綜合起來其實(shí)誤差也沒多大。我用的是軟件校正,好像是每3000秒減小定時器幾個數(shù)(實(shí)驗(yàn)幾天得出來的差值,我也記不清了)。
回復(fù)

使用道具 舉報

ID:78187 發(fā)表于 2015-4-27 10:39 | 顯示全部樓層
miuifen 發(fā)表于 2015-2-25 11:46
用  單片機(jī)精靈  算初值  要用12MMHz的才沒有誤差的

12M誤差才大吧
回復(fù)

使用道具 舉報

ID:73711 發(fā)表于 2015-4-29 13:23 | 顯示全部樓層

為什么  我到知道用通訊 是有誤差   延遲  還大   請教  謝謝了
回復(fù)

使用道具 舉報

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

本版積分規(guī)則

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

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

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