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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

第一次償試51單片機做個100分鐘倒計時定時器 附程序

[復制鏈接]
跳轉到指定樓層
樓主
償試著做了個100分鐘倒計時定時器,原理圖和代碼都是東拼西湊來的(自己不會寫啊),侵刪

制作出來的實物圖如下:


電路原理圖如下:


單片機源程序如下:
#include <reg52.h>
#include <intrins.H>
#define uchar unsigned char
#define uint  unsigned  int        
uchar duan[16]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};
uchar wei[4]={0XEf,0XDf,0XBf,0X7f};  //位的控制端
uint setfen,setmiao,runfen,runmiao;
uint z,x,c,v;
uint fs,fg,ms,mg;
uint setwz;
sbit KEYSTOP=P3^7; //停止鍵
sbit KEYSET=P1^7; //設置鍵
sbit KEYUP=P1^6;   //上調
sbit KEYDOWN=P1^5; //下調
sbit KEYRUN=P1^4; //開始
sbit LEDSET=P1^3;  //設置燈
sbit LEDRUN=P1^2;  //運行燈
sbit LEDSTOP=P1^1; //停止燈
sbit LABA=P1^0; //喇叭
uint runmod=0; //狀態,0是等待運行(停止),1是運行,2是設置,3是剛剛完成
unsigned char n_50ms;
bit flag;
/****************特殊功能寄存器聲明,以下是關于讀寫FLASH的****************/
sfr ISP_DATA = 0xe2;   
sfr ISP_ADDRH = 0xe3;     
sfr ISP_ADDRL = 0xe4;   
sfr ISP_CMD = 0xe5;   
sfr ISP_TRIG = 0xe6;      
sfr ISP_CONTR = 0xe7;
void  cc(uint addr);
void  xcx(uint addr,uchar dat);
uchar dcx(uint addr);
void  Q0();
/******************************************************************
延時函數
******************************************************************/
void delay(uchar t)
{
  uchar i,j;
   for(i=0;i<t;i++)
   {
            for(j=13;j>0;j--);
           { ; }
   }
}
/**********使用定時器顯示數字*********************/
void timer_display(uchar gw)
{
    if(runmod==2)
                {
        z=setfen/10;                         //求分十位
        x=setfen%10;                         //求分個位
                          c=setmiao/10;                         //求秒十位
        v=setmiao%10;                         //求秒個位
    }
          else
                {
        z=runfen/10;                         //求分十位
        x=runfen%10;                         //求分個位
                          c=runmiao/10;                         //求秒十位
        v=runmiao%10;                         //求秒個位
     }
                if(gw==1 && (z>0  || runmod==2))
                {
      P2=wei[0];
                        if(runmod==2 && setwz==1)
                        {
              if(flag)
                            {P0=duan[z];}
                          else
                            {P0=0xFF;}
                        }
                        else {P0=duan[z];}
    }
                else if(gw==2 && (x>0 || z>0 || runmod==2))
                {
      P2=wei[1];
                        if(runmod==2 && setwz==1)
                        {
              if(flag)
                          {P0=duan[x];}
                          else
                                  {P0=0xFF;}
                        }
                        else {P0=duan[x];}
    }
                else if(gw==3 && (c>0 || x>0 || runmod==2))
                {
      P2=wei[2];
                        if(runmod==2 && setwz==0)
                        {
              if(flag)
                          {P0=duan[c];}
                          else
                          {P0=0xFF;}
                        }
                        else {P0=duan[c];}
    }
                else if(gw==4)
                {
      P2=wei[3];
                        if(runmod==2 && setwz==0)
                        {
              if(flag)
                            {P0=duan[v];}
                          else
                            {P0=0xFF;}
                  }
                        else
                        {P0=duan[v];}
    }
}
void Timer0_Init()
{
         TMOD|=0X01;
        TH0=60928/256;
        TL0=60928%256;//每5ms進入一次中斷
        TF0=0;
        TR0=1;
        EA=1;
        ET0=1; //TF0 如果這個標志為1,進入中斷子函數
}
void tshow()
{
   static char i=0;
          i++;
          timer_display(i);
          if(i>=4)
          {
                  i=0;
          }
}
void TF0_isr() interrupt 1
{
         TH0=60928/256;
        TL0=60928%256;//重裝初值
        tshow();
}
void Timer1_Init()
{
  TMOD|=0x10; //定時器1方式1,計數與否不受P3.3的影響
  TH1=(65536-50000)/256;   //50ms
  TL1=(65536-50000)%256;
        TF1=0;
  ET1=1;
  TR1=1;
}
void TF1_isr()        interrupt 3
{
  TH1=(65536-50000)/256;   //50ms
  TL1=(65536-50000)%256;        
        n_50ms++;
        if(runmod==2)
        {   
    n_50ms %= 5; //10對應1Hz
    if(!n_50ms) flag = ~flag;
        }
        else if(runmod==1)
        {
    n_50ms %= 20; //
    if(!n_50ms)
                {
       if(runmiao>0) runmiao--;
                         if(runmiao==0)
                         {
                                  if(runfen>0)
                                   {
                                     runmiao=59;
                                     runfen--;   
                                   }                                         
        }
                        if(runfen==0 && runmiao==0)
                          {
                                        runmod=3;  //狀態改為到時
                                        LEDRUN=0;  //運行燈滅
                                        LEDSTOP=1;  //停止燈亮                                 
        }
    }
  }
        else if(runmod==3) //到時,喇叭響
        {
    n_50ms %= 5; //10對應1Hz
    if(!n_50ms)
                 {
        LABA=!LABA;
      }
   }
}
void key() //按鍵掃描函數
{
if(runmod==0) //停止狀態下
{
   if(KEYSET==0) //設置鍵
          {
                        delay(100);
      if(KEYSET==0)
       {                                 
                           LEDSTOP=0;
                                 LEDRUN=0;
         LEDSET=1;
                     runmod=2;
                                 setwz=0;
                                 while (KEYSET==0)
                                { delay(100);}
                                Timer1_Init();
                         }         
    }
                else if(KEYRUN==0) //開始運行
                {
                        delay(100);
      if(KEYRUN==0)
       {
                                 runfen=setfen;  
                                 runmiao=setmiao;
         runmod=1;
                           LEDSTOP=0;
                           LEDRUN=1;
                                 LEDSET=0;
                                 while (KEYRUN==0)
                                { delay(100);}
                                Timer1_Init();
                         }                        
    }
  }
else if(runmod==1 || runmod==3)  //運行或到時狀態
{
    if(KEYSTOP==0)  //按下停止
                {
      delay(100);
      if(KEYSTOP==0)
       {
                                 ET1=0;
                                  TR1=0;
                                 runmod=0;
                           LEDSTOP=1;
                           LEDRUN=0;
                                 LEDSET=0;
                                 LABA=0;
                                 while (KEYSTOP==0)
                                { delay(100);}
                         }                        
    }        
}
else if(runmod==2) //設置狀態
  {
                if(KEYRUN==0)  //前移
      {
                                delay(10);
        if(KEYRUN==0)
         {
           setwz++;
                                         if(setwz>1) {setwz=0;}
                                         while (KEYRUN==0){ delay(10);}
                           }
                        }
                else if(KEYUP==0)  //增加
      {
        delay(10);
        if(KEYUP==0)
         {
                             if(setwz==0)
                                          {
               if(setmiao<59) setmiao++;
                                                         else
                                                                 setmiao=0;
            }
                                                else if(setwz==1)
                                          {
               if(setfen<99) setfen++;
                                                         else
                                                                 setfen=0;
            }               
           while (KEYUP==0) { delay(10);}                                                
                     }
             }
                else  if(KEYDOWN==0)  //減少
      {
       delay(10);
       if(KEYDOWN==0)
        {
                             if(setwz==0)
                                          {
               if(setmiao>0) setmiao--;
                                                         else setmiao=59;
            }
                                                else if(setwz==1)
                                          {
               if(setfen>0) setfen--;
                                                         else setfen=99;
            }
          while (KEYDOWN==0) { delay(10);}                                                
                    }
            }
                else  if(KEYSET==0)  //設置完成
     {
       delay(10);
       if(KEYSET==0)
        {                                       
                                        while (KEYSET==0) { delay(10);}
                                        ET1=0;
                                   EA=0;
                                   TR1=0;
                                        flag=1;
                                       
                                        fs=setfen/10;                         //求分十位
          fg=setfen%10;                         //求分個位
                            ms=setmiao/10;                         //求秒十位
          mg=setmiao%10;                         //求秒個位
                                       
                                        cc(0x2000);
                                        xcx(0x2001,fs);
                                        xcx(0x2002,fg);
                                        xcx(0x2003,ms);
                                        xcx(0x2004,mg);
                                        Q0();
                                       
                                        LEDSTOP=1;
          LEDSET=0;
                                        LEDRUN=0;
                      runmod=0;
                                        Timer0_Init();
                    }
           }
  }
}
/*************************************************************************
                                主函數        
**************************************************************************/
void main()
{         
         fs = dcx(0x2001);  // 開機讀取EEPROM區2002h數據
         fg = dcx(0x2002);
         ms = dcx(0x2003);
         mg = dcx(0x2004);
         setfen=fs*10+fg;
         setmiao=ms*10+mg;        
         runmod=0;        
         LEDSET=0;
        LEDSTOP=1;
        LEDRUN=0;
        LABA=0;
        Timer0_Init();        
        flag=1;
        setwz=0;        
        while(1)
         {         
           key();
       }        
}

評分

參與人數 2黑幣 +62 收起 理由
jz573079513 + 12 很給力!
admin + 50 共享資料的黑幣獎勵!

查看全部評分

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

使用道具 舉報

沙發
ID:553941 發表于 2020-1-20 14:18 | 只看該作者
P0口沒有上拉嗎,而且你這樣單純靠的是IO口的驅動能力來點亮,數碼管多一點可能就驅動不了了。而且數碼管最好加分壓電阻。可以使用共陽極數碼管,使用IO灌電流驅動。或者加375鎖存器或245之類的芯片增加驅動能力。簡單的幾個小建議,不一定對。只是覺得你這個電路現在是可以使用的,但是當你驅動大一點的負載你就會發現同樣的電路不能使用了,就是IO驅動能力限制的。

評分

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

查看全部評分

回復

使用道具 舉報

板凳
ID:686778 發表于 2020-2-1 20:32 | 只看該作者
我想用現有的KR-51開發板來運行樓主的程序,是否將設置的按鈕和數碼管的相應語句改為和自己板子相同的硬件接法相符就行了?
回復

使用道具 舉報

地板
ID:91165 發表于 2020-3-20 09:02 | 只看該作者
這就是全部代碼
回復

使用道具 舉報

5#
ID:97678 發表于 2020-3-20 10:33 | 只看該作者
編譯出現這些錯誤,怎么解決?

Build target 'Target 1'
linking...
*** WARNING L1: UNRESOLVED EXTERNAL SYMBOL
    SYMBOL:  Q0
    MODULE:  .\Objects\100分鐘定時器.obj (100__________)
*** WARNING L1: UNRESOLVED EXTERNAL SYMBOL
    SYMBOL:  _DCX
    MODULE:  .\Objects\100分鐘定時器.obj (100__________)
*** WARNING L1: UNRESOLVED EXTERNAL SYMBOL
    SYMBOL:  _CC
    MODULE:  .\Objects\100分鐘定時器.obj (100__________)
*** WARNING L1: UNRESOLVED EXTERNAL SYMBOL
    SYMBOL:  _XCX
    MODULE:  .\Objects\100分鐘定時器.obj (100__________)
*** WARNING L2: REFERENCE MADE TO UNRESOLVED EXTERNAL
    SYMBOL:  _CC
    MODULE:  .\Objects\100分鐘定時器.obj (100__________)
    ADDRESS: 0222H
*** WARNING L2: REFERENCE MADE TO UNRESOLVED EXTERNAL
    SYMBOL:  _XCX
    MODULE:  .\Objects\100分鐘定時器.obj (100__________)
    ADDRESS: 022BH
*** WARNING L2: REFERENCE MADE TO UNRESOLVED EXTERNAL
    SYMBOL:  _XCX
    MODULE:  .\Objects\100分鐘定時器.obj (100__________)
    ADDRESS: 0234H
*** WARNING L2: REFERENCE MADE TO UNRESOLVED EXTERNAL
    SYMBOL:  _XCX
    MODULE:  .\Objects\100分鐘定時器.obj (100__________)
    ADDRESS: 023DH
*** WARNING L2: REFERENCE MADE TO UNRESOLVED EXTERNAL
    SYMBOL:  _XCX
    MODULE:  .\Objects\100分鐘定時器.obj (100__________)
    ADDRESS: 0246H
*** WARNING L2: REFERENCE MADE TO UNRESOLVED EXTERNAL
    SYMBOL:  Q0
    MODULE:  .\Objects\100分鐘定時器.obj (100__________)
    ADDRESS: 0249H
*** WARNING L2: REFERENCE MADE TO UNRESOLVED EXTERNAL
    SYMBOL:  _DCX
    MODULE:  .\Objects\100分鐘定時器.obj (100__________)
    ADDRESS: 04F7H
*** WARNING L2: REFERENCE MADE TO UNRESOLVED EXTERNAL
    SYMBOL:  _DCX
    MODULE:  .\Objects\100分鐘定時器.obj (100__________)
    ADDRESS: 0503H
*** WARNING L2: REFERENCE MADE TO UNRESOLVED EXTERNAL
    SYMBOL:  _DCX
    MODULE:  .\Objects\100分鐘定時器.obj (100__________)
    ADDRESS: 050FH
*** WARNING L2: REFERENCE MADE TO UNRESOLVED EXTERNAL
    SYMBOL:  _DCX
    MODULE:  .\Objects\100分鐘定時器.obj (100__________)
    ADDRESS: 051BH
Program Size: data=59.1 xdata=0 code=1632
".\Objects\tiaosu" - 0 Error(s), 14 Warning(s).
Build Time Elapsed:  00:00:00
回復

使用道具 舉報

6#
ID:695749 發表于 2020-3-20 11:43 | 只看該作者
可以做廚房提醒器,增加聲音功能,多設幾個時間段,這樣方便設定,謝謝分享!
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 日韩一区二区在线看 | 在线亚洲人成电影网站色www | 在线看无码的免费网站 | 欧美视频精品 | av在线免费看网址 | 精品国产色 | 免费污视频 | 国产成人jvid在线播放 | 精品一区二区免费视频 | 国产一区二区在线免费观看 | 成人免费视频播放 | 日韩国产一区二区三区 | 久久久久国产一级毛片高清网站 | 中文字幕 欧美 日韩 | 日本三级日产三级国产三级 | 99久久国产综合精品麻豆 | 亚洲一区二区免费 | 伊人二区 | 精品一区免费 | 欧美极品一区二区 | 日日摸日日碰夜夜爽2015电影 | 久久69精品久久久久久久电影好 | 影音先锋欧美资源 | 青青操91| 欧美精品在线一区二区三区 | 亚洲国产一区在线 | 特级毛片爽www免费版 | 男人天堂免费在线 | 精品国产视频 | 中文字幕在线视频网站 | 国产视频二区 | 羞羞视频在线观看免费观看 | 欧美偷偷 | 日韩在线免费视频 | 日本欧美国产在线观看 | 在线播放国产视频 | 国内精品视频在线 | 国产福利在线 | 黄色大片毛片 | 亚洲精品美女视频 | aaaaaa大片免费看最大的 |