1024手机基地看电影,午夜福利视频导航,国产精品福利在线一区,亚洲欧美日韩另类成人,在线观看午夜日本理论片,成年超爽免费网站,国产精品成人免费,精品动作一级毛片,成人免费观看网站,97精品伊人久久大香蕉

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

QQ登錄

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

搜索
查看: 1786|回復(fù): 0
收起左側(cè)

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

[復(fù)制鏈接]
ID:380598 發(fā)表于 2018-7-29 19:30 | 顯示全部樓層 |閱讀模式
/*
名稱:定時(shí)器T0實(shí)現(xiàn)電子表功能
時(shí)間:2018.7.15
功能:8位數(shù)碼管顯示時(shí)分秒(01-25-55);
                        按鍵Key1顯示秒表計(jì)時(shí),每60s報(bào)時(shí)一次
                        整時(shí)報(bào)時(shí),
*/
#include <reg51.h>
#define DataPort P1//宏定義端口
sbit Sound = P0^0;//將Sound位定義為P0.0引腳
unsigned char  time;        //記錄中斷次數(shù)
unsigned char  second;//記錄秒
unsigned char  min;//記錄分鐘
unsigned char  hour;//記錄小時(shí)
unsigned char key = 0;//記錄按鍵次數(shù)
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];//存儲(chǔ)顯示值
unsigned char num2[5];
void Display(unsigned int i,unsigned char j);//顯示函數(shù)
void Init_Timer0(void);//

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

while(t--)
{
   DelayUs2x(245);
         DelayUs2x(245);
}
}
/****************主函數(shù)**********************/
void main()
{
                TMOD = 0x01; //T0方式1
                TH0 = 0xd8;        //(65536-10000)/256
                TL0 = 0xf0;        //(65536-10000)%256 0.01s
                ET0 = 1;//允許T0中斷
                EA = 1;   //開(kāi)總中斷
                TR0 = 1;        //        啟動(dòng)T0
                /*PX0 = 0;        //中斷1為高優(yōu)先級(jí)
                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;                //關(guān)閉T0
                        EA = 0;
                        time = 0;
                        second = 0;
                        Init_Timer0();
               
                        switch(key)
                        {
                                case 1:                                //第一次按下
                                        TH1 = 0xd8;                //定時(shí)0.01s
                                        TL1 = 0xf0;
                                        ET1 = 1;        //允許T1中斷
                                        TR1 = 1;  //起動(dòng)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;        //關(guān)閉T1
                                        break;
                                case 3:                        //第三次按下
                                        key = 0;        //鍵值清零
                                        DataPort = 0;
                                        second = 0;
                                        time = 0;
                                        TR0 = 1;
                                        break;
                        }
                }
        }
}

/*************顯示函數(shù)*****************/
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;   //開(kāi)總中斷
        TH1 = 0xd8;                //定時(shí)0.01s
        TL1 = 0xf0;
}

/****************T0中斷函數(shù)************************/
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中斷函數(shù)*********************************/
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;
}


回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

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