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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3698|回復: 9
打印 上一主題 下一主題
收起左側

求助,我是初學者,也是業余愛好者,對51單片機c語言不是很了解,希望老師們多多指點

[復制鏈接]
跳轉到指定樓層
樓主
ID:65179 發表于 2014-11-15 19:16 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
本帖最后由 chweji123 于 2014-11-15 19:20 編輯

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

#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;                            //報時IO輸出
uchar a;
char miao_num;                                   //冒號標志
char didi_dd;                                   //鬧鈴標志
/********************************************************/
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();                                  //按鍵掃描函數
void bao_shi();                                         //報時聲明
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;                                                          //關閉定時器1
}
/********************************************************/
unsigned char button_time(n,x,y)        //時鐘調整子程序
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;                                                   //函數返回
}
/********************************************************/
void display(shi10,shi1,fen10,fen1)//顯示子程序
{
  P2=0xf7;
  a=shumg[shi10];   //顯示時的十位
  if(a==0xc0)                //如a是零讓其它的數碼管顯示
          {
  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()                                                        //主函數
{  
   Initial_DS1302();                                 //初始化DS1302這個時鐘芯片,   
   t0_init();                                                 //中斷初始化
   while(1)                                                         //大循環   
   {                                                                 
   mao_hao();                                                 //冒號初始
    nao_ling();                                                   //鬧鈴初始
     bao_shi();                                                 //報時初始
           keyscan();
  
  DS1302_GetTime(&time1);                       //讀取時間參數            
  
  Bime[3]=(time1.Week)%10;                   //把時的個位數據存入Bime[3]
  Bime[2]=(time1.Week)/10;                         //把時的個位數據存入Bime[2]
  Bime[1]=(time1.Day)%10;                       //把時的個位數據存入Bime[1]
  Bime[0]=(time1.Day)/10;                     //把時的個位數據存入Bime[0]
  
  Dime[3]=(time1.Month)%10;                   //把時的個位數據存入Dime[3]
  Dime[2]=(time1.Month)/10;                         //把時的個位數據存入Dime[2]
  Dime[1]=(time1.Year)%10;                   //把時的個位數據存入Dime[1]
  Dime[0]=(time1.Year)/10;                         //把時的個位數據存入Dime[0]
  
  Time[3]=(time1.Minute)%10;                 //把分的個位數據存入Time[3]
  Time[2]=(time1.Minute)/10;                 //把分的十位數據存入Time[2]
  Time[1]=(time1.Hour)%10;                   //把時的個位數據存入Time[1]
  Time[0]=(time1.Hour)/10;                         //把時的十位數據存入Time[0]
}
}
/********************************************************/
void keyscan()                   //按鍵掃描函數
{
   if(P1_3==0)                                    //切換
        {
         delay(100);
        if(P1_3==0)
           {
           TR0=0;                                                        //有按鍵按下關閉定時器0
                miao_num=0;                                         //冒號常亮
                 flag++;
                if(flag>2)                                                //翻頁年月日周按兩次后啟動定時器
                        {
                 flag=0;
                   TR0=1;                                                //啟動定時器0
                        }
                }
        while(P1_3==0);
        }
/********************************************************/
        if(P1_4==0)                                    //設置
        {
         delay(100);
        if(P1_4==0)
           {
          TR0=0;                                                        //有按鍵按下關閉定時器0
         miao_num=0;                                                //冒號常亮
            flag++;                                                        
            if(flag>2)                                                //按兩次后啟動定時器
           {
           TR0=1;                                                        //啟動定時器0
                }
          if(flag>4)                                                //按四次后關閉定時器
           {
           TR0=0;                                                        //關閉定時器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]);                //調用子函數display,把存入數組time的數據給顯示出來
                        break;
        case 1:display(Dime[0],Dime[1],Dime[2],Dime[3]);                //調用子函數display,把存入數組Dime的數據給顯示出來
                        break;
        case 2:display(Bime[0],Bime[1],Bime[2],Bime[3]);                //調用子函數display,把存入數組Bime的數據給顯示出來
                        break;
/*******************************************************/        
        case 3:time1.Hour=button_time(time1.Hour,24,23);                //調整時                           
                        DS1302_SetTime(0x84,time1.Hour);
                        display(Time[0],Time[1],10,10);
                        break;


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

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

5#
ID:51088 發表于 2014-11-16 19:20 來自手機 | 只看該作者
我看你的定時器1還沒有使用,你可以啟動定時器一,然后把下面的程序寫進中斷程序里面去就行了
回復

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

我沒有用定時器,自動翻頁是可行就是時間有點短,差不多兩秒一次,想把時間延長點還在慢慢調試,下面是我加了一段,還望老師多指點
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);
        }
}
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: av大全在线观看 | 欧美成人精品一区二区三区 | 欧美在线观看黄色 | 毛片在线看看 | 9久久婷婷国产综合精品性色 | 国产免费一级一级 | 国产91在线 | 亚洲 | 亚洲精品丝袜日韩 | 久久久久国产一区二区三区 | 午夜免费电影 | 国产第一区二区 | 亚洲精品国产成人 | 成人小视频在线观看 | 免费观看毛片 | 91精品国产一区 | 成人1区2区 | 在线午夜 | 国产网站在线免费观看 | 精品免费国产一区二区三区 | 久久亚洲综合 | 亚洲国产成人精品女人久久久 | 久久极品 | 久久精品91| 中文字幕 国产精品 | 成人精品国产免费网站 | 99福利| 亚洲人的av| 国产精品美女久久久久久免费 | 狠狠操电影| 精品一区二区三区四区 | 久草在线中文888 | 国产一区二区在线免费观看 | 中文字幕一区二区在线观看 | 亚洲视频区 | 亚洲欧洲一区 | 99久久婷婷国产精品综合 | 欧美日韩在线成人 | 久久国内 | 欧美精品在线观看 | 久久99精品久久久久久 | 波多野结衣一区二区三区在线观看 |