找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

求助,我是初學(xué)者,也是業(yè)余愛好者,對51單片機(jī)c語言不是很了解,希望老師們多多指點(diǎn)

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:65179 發(fā)表于 2014-11-15 19:16 | 只看該作者 回帖獎勵 |倒序?yàn)g覽 |閱讀模式
本帖最后由 chweji123 于 2014-11-15 19:20 編輯

我有一個ds1302+4位數(shù)碼管時鐘帶,年月,日周,時間,有一部分是抄襲的,有一部分只能學(xué)著開始修改程序沒想到這玩意真難搞,搞幾天頭都高大了,嗨老天不負(fù)有心人終于有點(diǎn)點(diǎn)收獲,只是不足之處就是要按鍵來切換,我想讓它自動切換來顯示,年月,日周,時間,不知道這個程序怎么寫,望老師指點(diǎn),在此謝了。

#include <at89x52.h>
#include <DS1302.h>
#define uchar unsigned char
/********************************************************/
unsigned char code shumg[]={
0xc0,0xf9,0xa4,0xb0,
0x99,0x92,0x82,0xf8,
0x80,0x90,0xff};
/********************************************************/
sbit led=P1^7;                                   //冒號閃爍
sbit buzz=P3^6;                            //報(bào)時IO輸出
uchar a;
char miao_num;                                   //冒號標(biāo)志
char didi_dd;                                   //鬧鈴標(biāo)志
/********************************************************/
unsigned char Time[]={0,0,0,0};//用來儲存,時間
unsigned char Dime[]={0,0,0,0};//用來儲存,年月
unsigned char Bime[]={0,0,0,0};//用來儲存,日期
unsigned char flag;
/********************************************************/
SYSTEMTIME  time1;   
/********************************************************/
void keyscan();                                  //按鍵掃描函數(shù)
void bao_shi();                                         //報(bào)時聲明
void mao_hao();                                         //冒號聲明
void nao_ling();                                 //鬧鈴聲明
/********************************************************/
void delay(unsigned char i)      //延時子程序  
{
  unsigned char j;
  while((i--)!=0)
  {
    for(j=123;j>0;j--);
  }
}
/********************************************************/
void t0_init()                        //定時50ms一個中斷
{
  TMOD=0x11;                                                  //總中斷初始化
  TH0=(65536-50000)/256;                          //定時50ms一個中斷
  TL0=(65536-50000)%256;                          //定時50ms一個中斷
  TH1=(65536-50000)/256;                          //定時50ms一個中斷
  TL1=(65536-50000)%256;                          //定時50ms一個中斷
  EA=1;                                                                  //開啟總中斷
  ET0=1;                                                         
  ET1=1;                                                         
  TR0=1;                                                          //開啟定時器0
  TR1=0;                                                          //關(guān)閉定時器1
}
/********************************************************/
unsigned char button_time(n,x,y)        //時鐘調(diào)整子程序
unsigned char n,x,y;
{
if(P1_5==0)                                                        //加
  {
  delay(50);
if(P1_5==0)
{
n++;
if(n==x)
  n=0;
while(P1_5==0);
   }
}
/********************************************************/
if(P1_6==0)                                                //減
    {
   delay(50);
if(P1_6==0)
    {
if(n==0)
   n=y;
else
    n--;                                                
  while(P1_6==0);
    }
}
return n;                                                   //函數(shù)返回
}
/********************************************************/
void display(shi10,shi1,fen10,fen1)//顯示子程序
{
  P2=0xf7;
  a=shumg[shi10];   //顯示時的十位
  if(a==0xc0)                //如a是零讓其它的數(shù)碼管顯示
          {
  P0=0xff;                        //消隱
  P2=0xff;                        //消隱
        }
  P0=a;                            //如a是1讓它顯示
  delay(1);                        //延時
  P0=0xff;
   
  P2=0xfb;
  P0=shumg[shi1];        //顯示時的個位
  delay(1);                        //延時
  P2=0xff;                        //消隱
  P0=0xff;                        //消隱                                                         
  
  P2=0xfd;
  P0=shumg[fen10];  //顯示分的十位
  delay(1);                        //延時
  P2=0xff;                        //消隱
  P0=0xff;                        //消隱
  
  P2=0xfe;
  P0=shumg[fen1];        //顯示分的個位
  delay(1);                        //延時
  P2=0xff;                        //消隱
  P0=0xff;                    //消隱
}
/********************************************************/
void main()                                                        //主函數(shù)
{  
   Initial_DS1302();                                 //初始化DS1302這個時鐘芯片,   
   t0_init();                                                 //中斷初始化
   while(1)                                                         //大循環(huán)   
   {                                                                 
   mao_hao();                                                 //冒號初始
    nao_ling();                                                   //鬧鈴初始
     bao_shi();                                                 //報(bào)時初始
           keyscan();
  
  DS1302_GetTime(&time1);                       //讀取時間參數(shù)            
  
  Bime[3]=(time1.Week)%10;                   //把時的個位數(shù)據(jù)存入Bime[3]
  Bime[2]=(time1.Week)/10;                         //把時的個位數(shù)據(jù)存入Bime[2]
  Bime[1]=(time1.Day)%10;                       //把時的個位數(shù)據(jù)存入Bime[1]
  Bime[0]=(time1.Day)/10;                     //把時的個位數(shù)據(jù)存入Bime[0]
  
  Dime[3]=(time1.Month)%10;                   //把時的個位數(shù)據(jù)存入Dime[3]
  Dime[2]=(time1.Month)/10;                         //把時的個位數(shù)據(jù)存入Dime[2]
  Dime[1]=(time1.Year)%10;                   //把時的個位數(shù)據(jù)存入Dime[1]
  Dime[0]=(time1.Year)/10;                         //把時的個位數(shù)據(jù)存入Dime[0]
  
  Time[3]=(time1.Minute)%10;                 //把分的個位數(shù)據(jù)存入Time[3]
  Time[2]=(time1.Minute)/10;                 //把分的十位數(shù)據(jù)存入Time[2]
  Time[1]=(time1.Hour)%10;                   //把時的個位數(shù)據(jù)存入Time[1]
  Time[0]=(time1.Hour)/10;                         //把時的十位數(shù)據(jù)存入Time[0]
}
}
/********************************************************/
void keyscan()                   //按鍵掃描函數(shù)
{
   if(P1_3==0)                                    //切換
        {
         delay(100);
        if(P1_3==0)
           {
           TR0=0;                                                        //有按鍵按下關(guān)閉定時器0
                miao_num=0;                                         //冒號常亮
                 flag++;
                if(flag>2)                                                //翻頁年月日周按兩次后啟動定時器
                        {
                 flag=0;
                   TR0=1;                                                //啟動定時器0
                        }
                }
        while(P1_3==0);
        }
/********************************************************/
        if(P1_4==0)                                    //設(shè)置
        {
         delay(100);
        if(P1_4==0)
           {
          TR0=0;                                                        //有按鍵按下關(guān)閉定時器0
         miao_num=0;                                                //冒號常亮
            flag++;                                                        
            if(flag>2)                                                //按兩次后啟動定時器
           {
           TR0=1;                                                        //啟動定時器0
                }
          if(flag>4)                                                //按四次后關(guān)閉定時器
           {
           TR0=0;                                                        //關(guān)閉定時器0
          miao_num=0;                                                //冒號常亮
                }
        if(flag>8)                                                        //顯示多少位和翻頁按八次啟動定時器
                        {
                 flag=0;
                  TR0=1;                                                //啟動定時器0
                        }
                }
        while(P1_4==0);
        }
switch(flag)
        {
/********************************************************/
        case 0:display(Time[0],Time[1],Time[2],Time[3]);                //調(diào)用子函數(shù)display,把存入數(shù)組time的數(shù)據(jù)給顯示出來
                        break;
        case 1:display(Dime[0],Dime[1],Dime[2],Dime[3]);                //調(diào)用子函數(shù)display,把存入數(shù)組Dime的數(shù)據(jù)給顯示出來
                        break;
        case 2:display(Bime[0],Bime[1],Bime[2],Bime[3]);                //調(diào)用子函數(shù)display,把存入數(shù)組Bime的數(shù)據(jù)給顯示出來
                        break;
/*******************************************************/        
        case 3:time1.Hour=button_time(time1.Hour,24,23);                //調(diào)整時                           
                        DS1302_SetTime(0x84,time1.Hour);
                        display(Time[0],Time[1],10,10);
                        break;


    case 4:time1.Minute=button_time(time1.Minute,60,59);        //調(diào)整分                           
                        DS1302_SetTime(0x82,time1.Minute);
                        display(10,10,Time[2],Time[3]);
                        break;
/*******************************************************/
               
        case 5:time1.Year=button_time(time1.Year,100,99);                //調(diào)整年                          
                        DS1302_SetTime(0x8c,time1.Year);
                        display(Dime[0],Dime[1],10,10);
                        break;
        
        case 6:time1.Month=button_time(time1.Month,13,12);                //調(diào)整月                           
                        DS1302_SetTime(0x88,time1.Month);
                        display(10,10,Dime[2],Dime[3]);
                        break;
/********************************************************/        
                                         
           case 7:time1.Day=button_time(time1.Day,32,31);                        //調(diào)整日
                        DS1302_SetTime(0x86,time1.Day);
                        display(Bime[0],Bime[1],10,10);
                        break;
        
        case 8:time1.Week=button_time(time1.Week,8,7);                        //調(diào)整周
                        DS1302_SetTime(0x8a,time1.Week);
                        display(10,10,Bime[2],Bime[3]);
                        break;
    }
}

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

使用道具 舉報(bào)

沙發(fā)
ID:51088 發(fā)表于 2014-11-15 20:22 來自手機(jī) | 只看該作者
先看看。幫頂一下
回復(fù)

使用道具 舉報(bào)

板凳
ID:68897 發(fā)表于 2014-11-16 17:05 | 只看該作者
先看看                                          
回復(fù)

使用道具 舉報(bào)

地板
ID:65179 發(fā)表于 2014-11-16 18:06 | 只看該作者
老師,大俠,哥哥,姐姐們,就幫幫我指點(diǎn)指點(diǎn)迷經(jīng),我只是想讓它自動切換顯示年月,日周,時間,可是這段程序是在不知道怎么寫都停在這里了,為了找這段程序例子一天到論壇網(wǎng)都來好幾趟,都是歡歡喜喜而來,空手而歸
回復(fù)

使用道具 舉報(bào)

5#
ID:51088 發(fā)表于 2014-11-16 19:20 來自手機(jī) | 只看該作者
我看你的定時器1還沒有使用,你可以啟動定時器一,然后把下面的程序?qū)戇M(jìn)中斷程序里面去就行了
回復(fù)

使用道具 舉報(bào)

6#
ID:51088 發(fā)表于 2014-11-16 19:21 來自手機(jī) | 只看該作者
  if(P1_3==0)                                    //切換         {          delay(100);         if(P1_3==0)            {            TR0=0;                                                        //有按鍵按下關(guān)閉定時器0                 miao_num=0;                                         //冒號常亮                  flag++;                 if(flag>2)                                                //翻頁年月日周按兩次后啟動定時器                         {                  flag=0;                    TR0=1;                                                //啟動定時器0                         }                 }         while(P1_3==0);
回復(fù)

使用道具 舉報(bào)

7#
ID:51088 發(fā)表于 2014-11-16 19:22 來自手機(jī) | 只看該作者
由于我沒有你的頭文件,沒法進(jìn)行編譯。這個方法理論上是覺得可行的
回復(fù)

使用道具 舉報(bào)

8#
ID:65179 發(fā)表于 2014-11-17 08:00 | 只看該作者
首先照您的方法去試試,其實(shí)中斷器1做了整點(diǎn)鬧鈴用了,只是程序沒有發(fā)上來,不行就把整個程序上來
回復(fù)

使用道具 舉報(bào)

9#
ID:26188 發(fā)表于 2014-11-17 10:26 來自手機(jī) | 只看該作者
那就用定時器2
回復(fù)

使用道具 舉報(bào)

10#
ID:65179 發(fā)表于 2014-11-17 12:22 | 只看該作者
本帖最后由 chweji123 于 2014-11-17 13:31 編輯

我沒有用定時器,自動翻頁是可行就是時間有點(diǎn)短,差不多兩秒一次,想把時間延長點(diǎn)還在慢慢調(diào)試,下面是我加了一段,還望老師多指點(diǎn)
k++;
//  if(k==200)
    if(k==0)                                    
        {
         delay(50);
         if(k==0)
          {
           TR0=0;                                                        
                miao_num=0;                                         
                 buzz=0;                                                
                 flag++;
                if(flag>2)
                        {                                       
                        flag=0;
                   TR0=1;
                          }
                delay(50);  
            if(k==0)  
                   {k=1;}                                       
        }
        while(k==0);
        }
}
回復(fù)

使用道具 舉報(bào)

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

本版積分規(guī)則

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

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

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