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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

關于單片機數碼管倒計時如何變成正計時的問題?

[復制鏈接]
跳轉到指定樓層
樓主
請問如何將天數的倒計時變成天數的正計時


  1. #include <REGX52.H>
  2. #include<intrins.h>  //包含_nop_();定義的頭文件
  3. #include<LS595driver.h>
  4. #include<LS595_2driver.h>
  5. #include<ds1302driver.h>


  6. SYSTEMTIME today;                  //2018.1.2 12:00:00 2
  7. unsigned int T0loop;          //記錄進入T0的次數
  8. unsigned int flag;        //約10秒1次,
  9. unsigned int countupday; //記錄正計時天數的參數         
  10. unsigned char olddaytemp,newdaytemp;  //用來比較是否已經過一天
  11. unsigned char keyvalue;//記錄按鍵掃描函數的返回值

  12. //******************
  13. //unsigned int test[10]={0,111,222,333,444,555,666,777,888,999}; //記錄倒計時天數的參數
  14. unsigned char i;


  15. //*******************
  16. sbit key1 = P1^0;
  17. sbit key2 = P1^1;
  18. sbit key3 = P1^2;
  19. sbit LEDr=P1^3;
  20. sbit LEDg=P1^4;
  21. sbit LEDy=P1^5;
  22. void Init_89C52();      //初始化89C52
  23. void InitT0();
  24. char Keyscan();         //按鍵掃描并返回鍵值
  25. void Setcountupday(); //按鍵設置正計時天數

  26. void main()
  27. {
  28.   Init_89C52();
  29.   Delay_ms(1000);
  30.   countupday = 865;
  31.   LEDr = 1;
  32.   LEDg = 1;
  33.   LEDy = 1;

  34. //*****************************
  35.   Init_1302();  //初始化時鐘
  36.   InitT0();     //初始化T0定時器
  37.   Displayround();

  38.   while(1)
  39.   {   
  40.    Displaysecond_595(&today);
  41.    Displayday_595(&today);
  42.    Displayhour_595(&today);
  43.    Displayminute_595(&today);

  44.    Setcountupday();
  45.    Displaycountupnum(countupday);
  46.    if(flag==1)
  47.    {
  48.      flag = 0;
  49.          if(olddaytemp=!newdaytemp)
  50.          {         
  51.            countupday++;            
  52.      }      
  53.    }
  54.   }
  55. }

  56. //*************************************************************************
  57. //Time0中斷函數
  58. //功能:定時出10秒/50毫秒=200個循環
  59. //參數:無
  60. //*************************************************************************
  61. void Time0(void) interrupt 1 using 1
  62. {
  63.   TR0 = 0;
  64.   T0loop++;
  65.   if(T0loop==200)
  66.   {
  67.     Gettime_1302(&today);
  68.         olddaytemp = today.day;
  69.   }
  70.   if(T0loop==400)
  71.   {
  72.         Gettime_1302(&today);
  73.         newdaytemp = today.day;
  74.         flag = 1;
  75.         T0loop = 0;
  76.   }
  77.   TH0 = (65536-46083)/256;                                  //重新給T0賦初始值
  78.   TL0 = (65536-46083)%256;                                  //
  79.   TR0 = 1;                                //啟動T0
  80. }
  81. //*************************************************************************
  82. //Time0中斷函數
  83. //功能:每8秒進入中斷,執行開門或關門操作,并重設Time0
  84. //參數:無
  85. //*************************************************************************
  86. void InitT0()
  87. {
  88.   TMOD=0x01;    //使用定時器T0,11.0592MHz晶振的12分頻,16位定時器65536-1
  89.   TH0 =(65536-46083)/256;  //將定時器計時時間設定為46083*1.085微秒=50000微秒=50毫秒
  90.   TL0 =(65536-46083)%256;  //
  91.   EA  = 1;       //開啟總中斷
  92.   ET0 = 1;       //T0中斷允許
  93.   TR0 = 1;       //啟動定時器T0
  94.   T0loop = 0;                          //記錄進入T0的次數
  95.   flag = 0;         //10秒一個周期
  96. }

  97. /*89C52初始化*/
  98. void Init_89C52()
  99. {
  100.   P0 = 0;
  101.   P1 = 1;
  102.   P2 = 0;
  103.   T0loop = 0;
  104. }
  105. /*按鍵掃描函數*/
  106. char Keyscan()
  107. {
  108.   if(key1==0)
  109.   {
  110.     Delay_ms(200);
  111.         if(key1==0)
  112.         {
  113.           return 1;
  114.         }
  115.   }
  116.   if(key2==1)
  117.   {
  118.     Delay_ms(200);
  119.         if(key2==1)
  120.         {
  121.           return 2;
  122.         }
  123.   }
  124.   if(key3==1)
  125.   {
  126.     Delay_ms(200);
  127.         if(key3==1)
  128.         {
  129.           return 2;
  130.         }
  131.   }
  132.   else
  133.     return 0;
  134. }
  135. /*按鍵調整函數*/
  136. void Setcountupday()
  137. {
  138.   switch(Keyscan())
  139.   {
  140.     case 1:
  141.         countupday--;
  142.         Displaycountupnum(countupday);
  143.         break;

  144.         case 2:
  145.         countupday++;
  146.         Displaycountupnum(countupday);
  147.         break;  

  148.         default:
  149.         Displaycountupnum(countupday);
  150.         break;
  151.   }  
  152. }
復制代碼





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

使用道具 舉報

沙發
ID:277550 發表于 2018-9-17 09:35 | 只看該作者
這個Displaycountupnum函數在哪呢

其實,是把要顯示的變量,換成
unsigned int countupday; //記錄正計時天數的參數     
這個變量

~~~~~~~~~~

評分

參與人數 1黑幣 +20 收起 理由
admin + 20 回帖助人的獎勵!

查看全部評分

回復

使用道具 舉報

板凳
ID:393625 發表于 2018-9-17 14:11 | 只看該作者
devcang 發表于 2018-9-17 09:35
這個Displaycountupnum函數在哪呢

其實,是把要顯示的變量,換成

請問能詳細說一下怎么改嗎,非常感謝
回復

使用道具 舉報

地板
ID:397025 發表于 2018-9-17 14:36 | 只看該作者
你是想做成日期一樣嗎?
回復

使用道具 舉報

5#
ID:267330 發表于 2018-9-17 14:51 | 只看該作者
請問能詳細說一下怎么改嗎,非常感謝
回復

使用道具 舉報

6#
ID:80221 發表于 2018-9-17 17:56 | 只看該作者
Displaycountupnum(),這個函數貼出來
回復

使用道具 舉報

7#
ID:164602 發表于 2018-9-18 08:16 | 只看該作者
正計時,根本不需要你這個倒計時程序嘛,只要正確讀出1302的數據,就可以了,因為1302本身就是正計時啊。

評分

參與人數 1黑幣 +20 收起 理由
admin + 20 回帖助人的獎勵!

查看全部評分

回復

使用道具 舉報

8#
ID:393625 發表于 2018-9-19 10:13 | 只看該作者
a庚 發表于 2018-9-17 17:56
Displaycountupnum(),這個函數貼出來

/*===============================================================*/
/*                     第二組級聯74LS595_2數碼管驅動程序         */
/*===============================================================*/
#ifndef _LS595_2driver_H_
#define _LS595_2driver_H_

sbit RCK_595_2 = P0^4;        //第二組級聯595的并行輸出時鐘
sbit DS_595_2 = P0^3;         //第二組級聯595數據線
sbit CLK_595_2 = P0^5;        //第二組級聯595移位輸入時鐘

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}; //花式旋轉

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

/* 向1個LS595_2寫入1個字節*/
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個級聯LS595_2寫入3個字節*/
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輸出并行數據*/
void Out_595_2()
{
  RCK_595_2 = 0;
  _nop_();
  RCK_595_2 = 1;
}

/*顯示倒計時 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]);        //顯示倒計時的個、十、百位
  Out_595_2();

}
/*大字花式轉圈*/
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  

評分

參與人數 1黑幣 +40 收起 理由
admin + 40 回帖助人的獎勵!

查看全部評分

回復

使用道具 舉報

9#
ID:393625 發表于 2018-9-20 08:47 | 只看該作者
cico 發表于 2018-9-17 14:36
你是想做成日期一樣嗎?

就是數碼管000-999的的正計時,一天加一。
回復

使用道具 舉報

10#
ID:393625 發表于 2018-9-20 10:26 | 只看該作者
HC6800-ES-V2.0 發表于 2018-9-18 08:16
正計時,根本不需要你這個倒計時程序嘛,只要正確讀出1302的數據,就可以了,因為1302本身就是正計時啊。

/*===============================================================*/
/*                     DS1302驅動程序                            */
/*===============================================================*/
#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;          //定義單片機累加器寄存器ACC
sbit ACC7 = ACC^7;          //定義單片機累加器寄存器ACC

/*  宏定義DS1302的寫入寄存器  */
#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寫入一個字節*/
void Send1byte_1302(unsigned char dat)  
{
  unsigned char i;
  ACC = dat;        //將dat放入累加器ACC內
  for(i=8;i>0;i--)
  {
    IO_1302 = ACC0;     //將ACC的最低位賦值給IO管腳
        SCLK_1302 = 1;
        SCLK_1302 = 0;
        ACC = ACC>>1;
  }
}

/*從DS1302讀取一個字節*/
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指定地址寫入數據  add--1302的地址,dat--寫入的數據*/
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指定地址讀取數據  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);
}

/*設置寫保護 flag=1~禁止寫  flag=0~允許寫*/
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);                    //允許寫操作
  Write_1302(WDS1302_SECOND,0x00);    //向DS1302秒寄存器80H寫入秒初始00
  Write_1302(WDS1302_MINUTE,0x00);    //向DS1302分寄存器82H寫入分初始00
  Write_1302(WDS1302_HOUR,0x12);      //向DS1302時寄存器84H寫入時初始12
  Write_1302(WDS1302_WEEK,0x03);      //向DS1302周寄存器8aH寫入周初始03
  Write_1302(WDS1302_DAY,0x01);       //向DS1302日寄存器86H寫入日初始1
  Write_1302(WDS1302_MONTH,0x08);     //向DS1302月寄存器88H寫入月初始8
  Write_1302(WDS1302_YEAR,0x18);      //向DS1302年寄存器8cH寫入年初始18
  Protect_1302(1);                    //禁止寫操作
}

/*設置單個寄存器日期時間*/
void Set_time_1302(unsigned char add,unsigned char time)
{
  unsigned char timeBCD;
  timeBCD = (time/10)<<4 | (time%10);   //將十進制轉為二進制才能寫入
  Write_1302(0x8e,0x00);                                //允許寫入
  Write_1302(add,timeBCD);
  Write_1302(0x8e,0x80);                                //啟動保護 禁止寫
}

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


#endif  
請問這個程序能達到我想要的效果嗎
回復

使用道具 舉報

11#
ID:393625 發表于 2018-9-20 10:46 | 只看該作者
a庚 發表于 2018-9-17 17:56
Displaycountupnum(),這個函數貼出來

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]);        //顯示倒計時的個、十、百位
  Out_595_2();

}
回復

使用道具 舉報

12#
ID:393625 發表于 2018-9-20 10:48 | 只看該作者
devcang 發表于 2018-9-17 09:35
這個Displaycountupnum函數在哪呢

其實,是把要顯示的變量,換成

/*===============================================================*/
/*                     第二組級聯74LS595_2數碼管驅動程序         */
/*===============================================================*/
#ifndef _LS595_2driver_H_
#define _LS595_2driver_H_

sbit RCK_595_2 = P0^4;        //第二組級聯595的并行輸出時鐘
sbit DS_595_2 = P0^3;         //第二組級聯595數據線
sbit CLK_595_2 = P0^5;        //第二組級聯595移位輸入時鐘

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}; //花式旋轉

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

/* 向1個LS595_2寫入1個字節*/
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個級聯LS595_2寫入3個字節*/
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輸出并行數據*/
void Out_595_2()
{
  RCK_595_2 = 0;
  _nop_();
  RCK_595_2 = 1;
}

/*顯示倒計時 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]);        //顯示倒計時的個、十、百位
  Out_595_2();

}
/*大字花式轉圈*/
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  
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产精品不卡一区 | 伊人影院在线观看 | 亚洲精品欧美 | 三级免费av | 欧美日韩网站 | 久久精品亚洲欧美日韩精品中文字幕 | 亚洲 中文 欧美 日韩 在线观看 | 久久99国产精一区二区三区 | 成年人在线视频 | 国产三区在线观看视频 | 亚洲精品视频免费观看 | 国产精品久久久免费 | 蜜臀网 | 日韩精品免费在线 | 中文字幕亚洲视频 | 91中文字幕 | 91麻豆精品国产91久久久资源速度 | 黑人巨大精品欧美一区二区免费 | 亚洲一区二区三区久久久 | jizz亚洲人| 国产亚洲精品91 | 福利社午夜影院 | 亚洲专区在线 | 一区二区三区视频在线 | 国产精品1区2区3区 一区中文字幕 | 日韩精品视频在线免费观看 | 男人天堂久久久 | 国产一区二区三区久久久久久久久 | 国产精品区二区三区日本 | 天天草天天干 | 久草热播 | 男女下面一进一出网站 | 激情久久久久 | 国产亚洲欧美在线 | 婷婷开心激情综合五月天 | 精品综合视频 | av一级久久| 日韩av福利在线观看 | 国产精品免费一区二区 | 亚洲国产成人av好男人在线观看 | 久久久久久久一级 |