找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1376|回复: 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;
}


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表