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

QQ登錄

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

搜索

關(guān)于單片機(jī)數(shù)碼管倒計(jì)時(shí)如何變成正計(jì)時(shí)的問(wèn)題?

查看數(shù): 3909 | 評(píng)論數(shù): 11 | 收藏 0
關(guān)燈 | 提示:支持鍵盤(pán)翻頁(yè)<-左 右->
    組圖打開(kāi)中,請(qǐng)稍候......
發(fā)布時(shí)間: 2018-9-17 09:05

正文摘要:

請(qǐng)問(wèn)如何將天數(shù)的倒計(jì)時(shí)變成天數(shù)的正計(jì)時(shí) #include <REGX52.H> #include<intrins.h>  //包含_nop_();定義的頭文件 #include<LS595driver.h> #include<LS595_2driver.h> #include ...

回復(fù)

ID:393625 發(fā)表于 2018-9-20 10:48
devcang 發(fā)表于 2018-9-17 09:35
這個(gè)Displaycountupnum函數(shù)在哪呢

其實(shí),是把要顯示的變量,換成

/*===============================================================*/
/*                     第二組級(jí)聯(lián)74LS595_2數(shù)碼管驅(qū)動(dòng)程序         */
/*===============================================================*/
#ifndef _LS595_2driver_H_
#define _LS595_2driver_H_

sbit RCK_595_2 = P0^4;        //第二組級(jí)聯(lián)595的并行輸出時(shí)鐘
sbit DS_595_2 = P0^3;         //第二組級(jí)聯(lián)595數(shù)據(jù)線(xiàn)
sbit CLK_595_2 = P0^5;        //第二組級(jí)聯(lián)595移位輸入時(shí)鐘

unsigned char code countupseg[] =                                                                                                                                  //第二組595中定義0~9,高亮低滅
{// 0         1          2           3        4         5          6           7        8         9
        0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F
};
unsigned char code roundseg[6]={0x01,0x02,0x04,0x08,0x10,0x20}; //花式旋轉(zhuǎn)

/*延時(shí)函數(shù)  1ms為單位*/
void Delay_ms(unsigned int t)           //延時(shí)函數(shù),t/ms
{
  unsigned int a,b;
  for(a=0;a<t;a++)
  {  
    for(b=0;b<100;b++)
    {
       _nop_();
    }
  }
}

/* 向1個(gè)LS595_2寫(xiě)入1個(gè)字節(jié)*/
void Send1byte_595_2(unsigned char dat)   
{
  unsigned char i;

  for(i=0;i<8;i++)
  {   
        if(dat&0x80)
        DS_595_2 = 1;
        else
        DS_595_2 = 0;
        dat <<=1;
        CLK_595_2 = 0;
        _nop_();
        CLK_595_2 = 1;       
  }

}
/* 向3個(gè)級(jí)聯(lián)LS595_2寫(xiě)入3個(gè)字節(jié)*/
void Send3byte_595_2(unsigned char dat1,unsigned char dat2,unsigned char dat3)
{
  Send1byte_595_2(dat1);
  Send1byte_595_2(dat2);
  Send1byte_595_2(dat3);
}

/*允許將LS595輸出并行數(shù)據(jù)*/
void Out_595_2()
{
  RCK_595_2 = 0;
  _nop_();
  RCK_595_2 = 1;
}

/*顯示倒計(jì)時(shí) 3位*/
void Displaycountupnum(unsigned int num)
{
  unsigned int units,tens,hundreds;
  units = num%10;
  tens = (num/10)%10;
  hundreds = num/100;

  Send3byte_595_2(countupseg[hundreds],countupseg[tens],countupseg[units]);        //顯示倒計(jì)時(shí)的個(gè)、十、百位
  Out_595_2();

}
/*大字花式轉(zhuǎn)圈*/
void Displayround()
{
  unsigned char j;
  for(j=0;j<5;j++)
  {
    Send3byte_595_2(roundseg[j],roundseg[j],roundseg[j]);
        Out_595_2();
        Delay_ms(800);
  }
  
}
#endif  
ID:393625 發(fā)表于 2018-9-20 10:46
a庚 發(fā)表于 2018-9-17 17:56
Displaycountupnum(),這個(gè)函數(shù)貼出來(lái)

void Displaycountupnum(unsigned int num)
{
  unsigned int units,tens,hundreds;
  units = num%10;
  tens = (num/10)%10;
  hundreds = num/100;

  Send3byte_595_2(countupseg[hundreds],countupseg[tens],countupseg[units]);        //顯示倒計(jì)時(shí)的個(gè)、十、百位
  Out_595_2();

}
ID:393625 發(fā)表于 2018-9-20 10:26
HC6800-ES-V2.0 發(fā)表于 2018-9-18 08:16
正計(jì)時(shí),根本不需要你這個(gè)倒計(jì)時(shí)程序嘛,只要正確讀出1302的數(shù)據(jù),就可以了,因?yàn)?302本身就是正計(jì)時(shí)啊。

/*===============================================================*/
/*                     DS1302驅(qū)動(dòng)程序                            */
/*===============================================================*/
#ifndef _ds1302driver_H_
#define _ds1302driver_H_
//#include<LS595driver.h>

sbit RST_1302 = P2^2;       //1302的RST
sbit IO_1302 = P2^1;        //1302的IO
sbit SCLK_1302 = P2^0;      //1302的SCLK
sbit ACC0 = ACC^0;          //定義單片機(jī)累加器寄存器ACC
sbit ACC7 = ACC^7;          //定義單片機(jī)累加器寄存器ACC

/*  宏定義DS1302的寫(xiě)入寄存器  */
#define WDS1302_SECOND  0X80
#define WDS1302_MINUTE  0X82
#define WDS1302_HOUR    0X84
#define WDS1302_WEEK    0X8A
#define WDS1302_DAY     0X86
#define WDS1302_MONTH   0X88
#define WDS1302_YEAR    0X8C
#define WDS1302_BATTERY 0X90

/*  宏定義DS1302的讀取寄存器  */
#define RDS1302_SECOND  0X81
#define RDS1302_MINUTE  0X83
#define RDS1302_HOUR    0X85
#define RDS1302_WEEK    0X8B
#define RDS1302_DAY     0X87
#define RDS1302_MONTH   0X89
#define RDS1302_YEAR    0X8D
#define RDS1302_BATTERY 0X91

/*向DS1302寫(xiě)入一個(gè)字節(jié)*/
void Send1byte_1302(unsigned char dat)  
{
  unsigned char i;
  ACC = dat;        //將dat放入累加器ACC內(nèi)
  for(i=8;i>0;i--)
  {
    IO_1302 = ACC0;     //將ACC的最低位賦值給IO管腳
        SCLK_1302 = 1;
        SCLK_1302 = 0;
        ACC = ACC>>1;
  }
}

/*從DS1302讀取一個(gè)字節(jié)*/
unsigned char Get1byte_1302()
{
  unsigned char i;
  for(i=8;i>0;i--)
  {
    ACC = ACC>>1;                  //挪空最高位
        ACC7 = IO_1302;       //將IO管腳賦值給ACC的最高位
    SCLK_1302 = 1;
        SCLK_1302 = 0;
  }
  return(ACC);            
}

/*向DS1302指定地址寫(xiě)入數(shù)據(jù)  add--1302的地址,dat--寫(xiě)入的數(shù)據(jù)*/
void Write_1302(unsigned char add,unsigned char dat)
{
  RST_1302 = 0;
  SCLK_1302 = 0;
  RST_1302 = 1;
  Send1byte_1302(add);
  Send1byte_1302(dat);
  SCLK_1302 = 1;
  RST_1302 = 0;
}

/*從DS1302指定地址讀取數(shù)據(jù)  add--1302的地址*/
unsigned char Read_1302(unsigned char add)
{
  unsigned char temp;
  RST_1302 = 0;
  SCLK_1302 = 0;
  RST_1302 = 1;
  Send1byte_1302(add|0x01);
  temp = Get1byte_1302();
  SCLK_1302 = 1;
  RST_1302 = 0;
  return(temp);
}

/*設(shè)置寫(xiě)保護(hù) flag=1~禁止寫(xiě)  flag=0~允許寫(xiě)*/
void Protect_1302(unsigned char flag)
{
  if(flag)
    Write_1302(0x8e,0x80);
  else
    Write_1302(0x8e,0x00);
}

/*初始化DS1302 的日期*/
void Init_1302()//
{
  RST_1302 = 0;
  SCLK_1302 = 0;
  Protect_1302(0);                    //允許寫(xiě)操作
  Write_1302(WDS1302_SECOND,0x00);    //向DS1302秒寄存器80H寫(xiě)入秒初始00
  Write_1302(WDS1302_MINUTE,0x00);    //向DS1302分寄存器82H寫(xiě)入分初始00
  Write_1302(WDS1302_HOUR,0x12);      //向DS1302時(shí)寄存器84H寫(xiě)入時(shí)初始12
  Write_1302(WDS1302_WEEK,0x03);      //向DS1302周寄存器8aH寫(xiě)入周初始03
  Write_1302(WDS1302_DAY,0x01);       //向DS1302日寄存器86H寫(xiě)入日初始1
  Write_1302(WDS1302_MONTH,0x08);     //向DS1302月寄存器88H寫(xiě)入月初始8
  Write_1302(WDS1302_YEAR,0x18);      //向DS1302年寄存器8cH寫(xiě)入年初始18
  Protect_1302(1);                    //禁止寫(xiě)操作
}

/*設(shè)置單個(gè)寄存器日期時(shí)間*/
void Set_time_1302(unsigned char add,unsigned char time)
{
  unsigned char timeBCD;
  timeBCD = (time/10)<<4 | (time%10);   //將十進(jìn)制轉(zhuǎn)為二進(jìn)制才能寫(xiě)入
  Write_1302(0x8e,0x00);                                //允許寫(xiě)入
  Write_1302(add,timeBCD);
  Write_1302(0x8e,0x80);                                //啟動(dòng)保護(hù) 禁止寫(xiě)
}

/*獲取DS1302內(nèi)的時(shí)間日期*/
void Gettime_1302(SYSTEMTIME *time)
{
  unsigned char gettempe;
  gettempe = Read_1302(RDS1302_SECOND);                                                   //獲取秒寄存器
  time->second = ((gettempe&0x70)>>4)*10 + (gettempe&0x0F);           //完成秒賦值 二進(jìn)制轉(zhuǎn)十進(jìn)制
  gettempe = Read_1302(RDS1302_MINUTE);                                                   //獲取分寄存器
  time->minute = ((gettempe&0x70)>>4)*10 + (gettempe&0x0F);           //完成分賦值 二進(jìn)制轉(zhuǎn)十進(jìn)制
  gettempe = Read_1302(RDS1302_HOUR);                                                   //獲取時(shí)寄存器
  time->hour = ((gettempe&0x70)>>4)*10 + (gettempe&0x0F);           //完成時(shí)賦值 二進(jìn)制轉(zhuǎn)十進(jìn)制
  gettempe = Read_1302(RDS1302_WEEK);                                                   //獲取周寄存器
  time->week= ((gettempe&0x70)>>4)*10 + (gettempe&0x0F);           //完成周賦值 二進(jìn)制轉(zhuǎn)十進(jìn)制
  gettempe = Read_1302(RDS1302_DAY);                                                   //獲取日寄存器
  time->day = ((gettempe&0x70)>>4)*10 + (gettempe&0x0F);           //完成日賦值 二進(jìn)制轉(zhuǎn)十進(jìn)制
  gettempe = Read_1302(RDS1302_MONTH);                                                   //獲取月寄存器
  time->month = ((gettempe&0x70)>>4)*10 + (gettempe&0x0F);           //完成月賦值 二進(jìn)制轉(zhuǎn)十進(jìn)制
  gettempe = Read_1302(RDS1302_YEAR);                                                   //獲取年寄存器
  time->year = ((gettempe&0x70)>>4)*10 + (gettempe&0x0F);           //完成年賦值 二進(jìn)制轉(zhuǎn)十進(jìn)制
}


#endif  
請(qǐng)問(wèn)這個(gè)程序能達(dá)到我想要的效果嗎
ID:393625 發(fā)表于 2018-9-20 08:47
cico 發(fā)表于 2018-9-17 14:36
你是想做成日期一樣嗎?

就是數(shù)碼管000-999的的正計(jì)時(shí),一天加一。
ID:393625 發(fā)表于 2018-9-19 10:13
a庚 發(fā)表于 2018-9-17 17:56
Displaycountupnum(),這個(gè)函數(shù)貼出來(lái)

/*===============================================================*/
/*                     第二組級(jí)聯(lián)74LS595_2數(shù)碼管驅(qū)動(dòng)程序         */
/*===============================================================*/
#ifndef _LS595_2driver_H_
#define _LS595_2driver_H_

sbit RCK_595_2 = P0^4;        //第二組級(jí)聯(lián)595的并行輸出時(shí)鐘
sbit DS_595_2 = P0^3;         //第二組級(jí)聯(lián)595數(shù)據(jù)線(xiàn)
sbit CLK_595_2 = P0^5;        //第二組級(jí)聯(lián)595移位輸入時(shí)鐘

unsigned char code countupseg[] =                                                                                                                                  //第二組595中定義0~9,高亮低滅
{// 0         1          2           3        4         5          6           7        8         9
        0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F
};
unsigned char code roundseg[6]={0x01,0x02,0x04,0x08,0x10,0x20}; //花式旋轉(zhuǎn)

/*延時(shí)函數(shù)  1ms為單位*/
void Delay_ms(unsigned int t)           //延時(shí)函數(shù),t/ms
{
  unsigned int a,b;
  for(a=0;a<t;a++)
  {  
    for(b=0;b<100;b++)
    {
       _nop_();
    }
  }
}

/* 向1個(gè)LS595_2寫(xiě)入1個(gè)字節(jié)*/
void Send1byte_595_2(unsigned char dat)   
{
  unsigned char i;

  for(i=0;i<8;i++)
  {   
        if(dat&0x80)
        DS_595_2 = 1;
        else
        DS_595_2 = 0;
        dat <<=1;
        CLK_595_2 = 0;
        _nop_();
        CLK_595_2 = 1;       
  }

}
/* 向3個(gè)級(jí)聯(lián)LS595_2寫(xiě)入3個(gè)字節(jié)*/
void Send3byte_595_2(unsigned char dat1,unsigned char dat2,unsigned char dat3)
{
  Send1byte_595_2(dat1);
  Send1byte_595_2(dat2);
  Send1byte_595_2(dat3);
}

/*允許將LS595輸出并行數(shù)據(jù)*/
void Out_595_2()
{
  RCK_595_2 = 0;
  _nop_();
  RCK_595_2 = 1;
}

/*顯示倒計(jì)時(shí) 3位*/
void Displaycountupnum(unsigned int num)
{
  unsigned int units,tens,hundreds;
  units = num%10;
  tens = (num/10)%10;
  hundreds = num/100;

  Send3byte_595_2(countupseg[hundreds],countupseg[tens],countupseg[units]);        //顯示倒計(jì)時(shí)的個(gè)、十、百位
  Out_595_2();

}
/*大字花式轉(zhuǎn)圈*/
void Displayround()
{
  unsigned char j;
  for(j=0;j<5;j++)
  {
    Send3byte_595_2(roundseg[j],roundseg[j],roundseg[j]);
        Out_595_2();
        Delay_ms(800);
  }
  
}
#endif  

評(píng)分

參與人數(shù) 1黑幣 +40 收起 理由
admin + 40 回帖助人的獎(jiǎng)勵(lì)!

查看全部評(píng)分

ID:164602 發(fā)表于 2018-9-18 08:16
正計(jì)時(shí),根本不需要你這個(gè)倒計(jì)時(shí)程序嘛,只要正確讀出1302的數(shù)據(jù),就可以了,因?yàn)?302本身就是正計(jì)時(shí)啊。

評(píng)分

參與人數(shù) 1黑幣 +20 收起 理由
admin + 20 回帖助人的獎(jiǎng)勵(lì)!

查看全部評(píng)分

ID:80221 發(fā)表于 2018-9-17 17:56
Displaycountupnum(),這個(gè)函數(shù)貼出來(lái)
ID:267330 發(fā)表于 2018-9-17 14:51
請(qǐng)問(wèn)能詳細(xì)說(shuō)一下怎么改嗎,非常感謝
ID:397025 發(fā)表于 2018-9-17 14:36
你是想做成日期一樣嗎?
ID:393625 發(fā)表于 2018-9-17 14:11
devcang 發(fā)表于 2018-9-17 09:35
這個(gè)Displaycountupnum函數(shù)在哪呢

其實(shí),是把要顯示的變量,換成

請(qǐng)問(wèn)能詳細(xì)說(shuō)一下怎么改嗎,非常感謝
ID:277550 發(fā)表于 2018-9-17 09:35
這個(gè)Displaycountupnum函數(shù)在哪呢

其實(shí),是把要顯示的變量,換成
unsigned int countupday; //記錄正計(jì)時(shí)天數(shù)的參數(shù)     
這個(gè)變量

~~~~~~~~~~

評(píng)分

參與人數(shù) 1黑幣 +20 收起 理由
admin + 20 回帖助人的獎(jiǎng)勵(lì)!

查看全部評(píng)分

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

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

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