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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

AT89c51單片機數碼管時鐘+3個可調按鍵,可顯示鬧鐘程序仿真 帶詳細注釋

[復制鏈接]
跳轉到指定樓層
樓主
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)


三個按鍵:
key0 //調整鍵--模式
key1//加1鍵
key2//減1鍵

#include  <reg51.h>
#define uchar unsigned char
uchar code tab[12]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff,0xbf};
//共陽極數碼管顯示"0~9","滅"和"-"的字段碼
//uchar code tab[]={0x3f,0x06,05b,0x4f,0x66,0x6d,07d,0x07,0x7f,0x6f,0x00,0x40};//共陰數碼管
uchar code wetab[8]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};  //位選
uchar data dis[8]={0x00,0x00,0x0b,0x00,0x00,0x0b,0x00,0x00};
//顯示數據緩沖區,時十、個位、分十、個位、秒十、個位初始為0,0x0b為"-"編碼
uchar data timedat[3]={0x00,0x00,0x00};  //分別為秒、分和小時的計數值(記錄K1和K2次數)
uchar data  ms50=0x00, num=0x00,  n1=0x00,  n2=0x00;
//定義定時次數變量,調整模式變量,按加1鍵次數變量,按減1鍵次數變量
sbit  key0=P1^0 ;  //調整鍵--模式
sbit  key1=P1^1 ;  //加1鍵
sbit  key2=P1^2 ;  //減1鍵
//---------------------------------------
void  delay1ms( unsigned  int  z )  //定義延時1ms函數
{ unsigned  int  x, y ;
for  ( x=z;  x>0;  x-- )
                for  ( y=120; y>0 ;  y-- )        ;
}
//---------------------------------------
//按鍵處理函數。如果沒有按鍵則時鐘正常走時。當按K0鍵1次→暫停走時進入調小時狀態;再按K0鍵1次→進入調分鐘狀態;再按K0鍵1次→回到正常走時狀態。對于K1和K2鍵,如果正常走時下→按K1K2鍵不起作用;如果進入調時或者調分狀態→按K1鍵可對時或分加1操作,小時加到24則回0,分鐘加到60則回0。按K2鍵可對時或分減1操作,小時減到負則回23,分鐘減到負則回59。
void keyscan(  void )
{        EA=0;  //關中斷
        if(timedat[0]==0&timedat[1]==0&timedat[2]==7)  {P1=0xff;}
if (key0==0)         { delay1ms(10);         while (key0==0);
                        num++; TR0=0; ET0=0;  // 調整鍵K0每按1次--模式變量num加1
                        if (num>=3)         {num=0;  ET0=1;  TR0=1;  }  // 啟動T0校時
        }
                if (num!=0)        //模式變量不等于0
{        if (key1==0)        // K1鍵確實按下
         {        delay1ms(10);         while (key1==0);           timedat[num]++;  //記錄按鍵K1按下次數
                                if (num==2) n1=24;  else n1=60;                //模式變量等于小時2--則回遲到一天或60分鐘
if (timedat[num]>=n1)          { timedat[num]=0; }          }
                }
                if (num!=0)
                 {        if (key2==0)        
{        delay1ms(10);        while (key2==0);                 timedat[num]--;  //記錄按鍵K2按下次數
                                if (num==2) n2=23;else n2=59;                        
                                if (timedat[num]<=0)                  {timedat[num]=n2; }          }
                }
                 EA=1;
        }
//---------------------------------------
//數碼管顯示函數。時間顯示先秒個位計算顯示→秒十位計算顯示→再分個位計算顯示→分十位顯示→再時個位計算顯示→時十位顯示。
         void  display( void )
        {          uchar k;
                if(timedat[0]==0&timedat[1]==0&timedat[2]==7)  {P1=0xff;}
                 dis[0]=timedat[0]%10;  dis[1]=timedat[0]/10;   //秒
dis[3]=timedat[1]%10;  dis[4]=timedat[1]/10;  //分
dis[6]=timedat[2]%10;  dis[7]=timedat[2]/10;  //時
for ( k=0;  k<8;  k++ )
                        {         P0=tab[ dis[k] ];  P2=wetab[k];    delay1ms(1);     P2=0x00;         }
        }        
//---------------------------------------
//主函數,時間顯示先秒個位計算顯示,然后是秒十位計算顯示;再就是分個位計算顯示,然后是分十位顯示;再就是時個位計算顯示,然后是時十位顯示。定時器中斷先檢測1秒是否到→1秒如果到則秒單元加1;1秒如果沒到就檢測1分鐘是否到→1分鐘如果到則分單元加1;如果沒到就檢測1小時是否到→1小時如果到則時單元加1;如果沒到→則顯示時間。
         void main( void )
        {   TMOD=0x01;   //T0定時50ms,方式1
                EA=1;  ET0=1;  TR0=1;  //開中斷,允許T0中斷,啟動T0
                TH0=0x3c;  TL0=0xb0;
                while (1)
                        {         display( ) ;
                                keyscan( ) ;
                        }
}
//定時器/計數器T0中斷服務函數。定時器中斷先檢測1秒是否到→1秒如果到則秒單元加1;1秒如果沒到就檢測1分鐘是否到→1分鐘如果到則分單元加1;如果沒到就檢測1小時是否到→1小時如果到則時單元加1;如果沒到→則顯示時間。
  void  timer0(void)  interrupt  1
{ ET0=0; TR0=0;   //不許T0中斷也不啟動
TH0=0x3c;  TL0=0xb0;  
TR0=1;  //啟動T0
ms50++;
P1=0xf7;
         if(timedat[0]==0&timedat[1]==0&timedat[2]==7)  {P1=0xff;}
if (ms50==20)         {        ms50=0x00;  timedat[0]++;  //變量m回0,且秒加1
                if (timedat[0]==60)          {         timedat[0]=0;timedat[1]++;  //秒到60后回0,且分加1
                        if (timedat[1]==60)         {         timedat[1]=0;timedat[2]++;  //分到60后回0,且時加1
                                if (timedat[2]==24)         {         timedat[2]=0;         }         }        }  //時到24后回0

        }
        ET0=1;   //允許T0中斷
}


全部資料51hei下載地址:
時鐘.zip (81.22 KB, 下載次數: 121)
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏5 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:845675 發表于 2021-8-7 06:54 來自手機 | 只看該作者
你好大神哈哈哈,我是菜鳥if(timedat[0]==0&timedat[1]==0&timedat[2]==7)  {P1=0xff;}這句是什么意思,為什么timedat[2]==7,P1=0xff又是什么意思呢
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: www.日本国产 | 日韩精品一区二区三区中文在线 | 亚洲欧美日韩精品久久亚洲区 | 亚洲午夜精品一区二区三区 | 国产羞羞视频在线观看 | 欧美精品1区2区3区 精品国产欧美一区二区 | 一区二区三区在线看 | 午夜影院官网 | 欧美日韩大片 | 国产精品一区二区av | 国产精品日韩一区二区 | 中文字幕一区二区三区四区五区 | 有码一区| 国产精品爱久久久久久久 | 欧美成人一区二免费视频软件 | 中文字幕国产 | 999免费观看视频 | 色爱区综合 | 欧美亚洲高清 | 毛片在线看片 | 国产伦精品一区二区三区高清 | 人人干人人干人人 | 国产精品视频一二三区 | 精区3d动漫一品二品精区 | 亚洲精品成人av久久 | 免费观看成人性生生活片 | 不卡视频一区二区三区 | 国产亚洲精品久久久久动 | 亚洲精品9999 | 中文字幕视频在线看 | 亚洲精品视频网站在线观看 | 日本三级电影在线免费观看 | 欧美精品v国产精品v日韩精品 | 久久综合久色欧美综合狠狠 | 国产 亚洲 网红 主播 | 日韩精品在线播放 | 妞干网视频 | 中文字幕加勒比 | 国产精品久久久亚洲 | 日本精品999 | 久久久久成人精品免费播放动漫 |