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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

基于51的電子鐘,可切換秒表

[復制鏈接]
跳轉到指定樓層
樓主
ID:380598 發表于 2018-7-29 19:30 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
/*
名稱:定時器T0實現電子表功能
時間:2018.7.15
功能:8位數碼管顯示時分秒(01-25-55);
                        按鍵Key1顯示秒表計時,每60s報時一次
                        整時報時,
*/
#include <reg51.h>
#define DataPort P1//宏定義端口
sbit Sound = P0^0;//將Sound位定義為P0.0引腳
unsigned char  time;        //記錄中斷次數
unsigned char  second;//記錄秒
unsigned char  min;//記錄分鐘
unsigned char  hour;//記錄小時
unsigned char key = 0;//記錄按鍵次數
unsigned int i;
unsigned char code Seg_Code[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//段碼
unsigned char code Bit_Code[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//位碼
sbit Seg_Latch = P2^2;  //段口
sbit Bit_Latch = P2^3; //位口
unsigned char num[8];//存儲顯示值
unsigned char num2[5];
void Display(unsigned int i,unsigned char j);//顯示函數
void Init_Timer0(void);//

/*****************延時************************/
void DelayUs2x(unsigned int t)
{   
while(--t);
}
void DelayMs(unsigned char t)
{

while(t--)
{
   DelayUs2x(245);
         DelayUs2x(245);
}
}
/****************主函數**********************/
void main()
{
                TMOD = 0x01; //T0方式1
                TH0 = 0xd8;        //(65536-10000)/256
                TL0 = 0xf0;        //(65536-10000)%256 0.01s
                ET0 = 1;//允許T0中斷
                EA = 1;   //開總中斷
                TR0 = 1;        //        啟動T0
                /*PX0 = 0;        //中斷1為高優先級
                PX1 = 1;*/
                while(1)
                {
                                if(second == 60)        //60s/1min
                                {
                                        second = 0;
                                        min++;
                                        if(min == 60)        //60min
                                        {
                                                min =0 ;
                                                hour ++;
                                                Sound = ~Sound;
                                                if(hour == 24)        //24h
                                                {
                                                        hour = 0;
                                                }
                                        }
                                }
                num[0] = Seg_Code[hour/10];
                num[1] = Seg_Code[hour%10];
                num[2] = 0x40;
                num[3] = Seg_Code[min/10];
                num[4] = Seg_Code[min%10];
                num[5] = 0x40;
                num[6] = Seg_Code[second/10];
                num[7] = Seg_Code[second%10];
                for(i=0;i<8;i++)
                {                               
                        Display(i,num[i]);
                }
               
                if((P3&0x80)==0x00)//按鍵被按下
                {
                        key ++;
                        TR0 = 0;                //關閉T0
                        EA = 0;
                        time = 0;
                        second = 0;
                        Init_Timer0();
               
                        switch(key)
                        {
                                case 1:                                //第一次按下
                                        TH1 = 0xd8;                //定時0.01s
                                        TL1 = 0xf0;
                                        ET1 = 1;        //允許T1中斷
                                        TR1 = 1;  //起動T1
                                        while(1)
                                        {
                                                if(second == 60)        //60s / 1min
                                                {
                                                        second = 0;
                                                        Sound = ~Sound;
                                                }
                                                num2[0] = Seg_Code[second/10];
                                                num2[1] = Seg_Code[second%10];
                                                num2[2] = 0x40;
                                                num2[3] = Seg_Code[time/10];
                                                num2[4] = Seg_Code[time%10];       
                                                for(i=0;i<5;i++)
                                                {
                                                        Display(i,num2[i]);
                                                }
                                        }
                                        break;
                                case 2:                        //第二次按下
                                        ET1 = 0;
                                        TR1 = 0;        //關閉T1
                                        break;
                                case 3:                        //第三次按下
                                        key = 0;        //鍵值清零
                                        DataPort = 0;
                                        second = 0;
                                        time = 0;
                                        TR0 = 1;
                                        break;
                        }
                }
        }
}

/*************顯示函數*****************/
void Display(unsigned int i,unsigned char j)
{
                       
                                        DataPort =0;
                                        Seg_Latch =1;
                                        Seg_Latch =0;
                       
                                        DataPort = Bit_Code[i];
                                        Bit_Latch =1;
                                        Bit_Latch =0;
                               
                                        DataPort = j;
                                        Seg_Latch =1;
                                        Seg_Latch = 0;
                               
                                        DelayUs2x(300);               
}

/******************        void Init_Timer0(void);****************************/
void Init_Timer0(void)
{
        TMOD = 0x10; //T1方式1
        EA = 1;   //開總中斷
        TH1 = 0xd8;                //定時0.01s
        TL1 = 0xf0;
}

/****************T0中斷函數************************/
void int_T0() interrupt 1
{
        EA = 0;        //屏蔽
        TH0 = 0xd8;        //(65536-10000)/256
        TL0 = 0xf0;        //(65536-10000)%256 0.01s
       
                time ++;
                if(time == 100)        //中斷100次(1s)
                {
                                time = 0;
                                second++;
       
                }
        EA = 1;
}
/********************T1中斷函數*********************************/
void int_T1() interrupt 3
{
        EA = 0;        //屏蔽
        TH1 = 0xd8;        //(65536-10000)/256
        TL1 = 0xf0;        //(65536-10000)%256 0.01s
       
                time ++;
                if(time == 100)        //中斷100次(1s)
                {
                                time = 0;
                                second++;
                }
        EA = 1;
}


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

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 亚洲欧美日韩激情 | 国产午夜久久 | 亚洲人va欧美va人人爽 | 久久精品亚洲精品国产欧美 | 国产亚洲一区二区三区 | 国产精品揄拍一区二区 | 91 在线| 欧美精品三区 | 成人精品鲁一区一区二区 | 91天堂| 中文字幕免费在线 | 久久人人爽人人爽人人片av免费 | 九九久久国产 | 午夜国产精品视频 | 91伦理片 | 国产免费xxx | 午夜视频大全 | 国产精品视频久久久 | 国产成人精品一区二区三区网站观看 | 99久久精品免费看国产高清 | 欧美日产国产成人免费图片 | 国产成视频在线观看 | 日本中文字幕视频 | 亚洲高清在线观看 | 欧美一区2区三区3区公司 | 精品欧美乱码久久久久久1区2区 | 精品国产一区二区三区日日嗨 | www.一区二区三区 | 亚洲一区 | 亚洲看片网站 | 欧美中文 | 久久久久亚洲 | 国产一区二区欧美 | 在线观看www | 色婷婷综合久久久中文字幕 | 国精产品一区二区三区 | 国产精品视频 | 性色的免费视频 | 亚洲乱码一区二区三区在线观看 | 欧美福利一区 | 国产精品久久久久久久久久妞妞 |