⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 数字钟.c

📁 AT89S52单片机程序50例(00-50)
💻 C
字号:
//数字钟
//P3.0、P3.1、P3.2接键盘;P1口接数码管的A-H;P2口接数码管的位码。

#include <regX52.h>

sbit KB1=P3^0;  //定义P3.0为按键1
sbit KB2=P3^1;  //定义P3.1为按键2
sbit KB3=P3^2;  //定义P3.2为按键3

unsigned char second;  //定义秒钟变量 
unsigned char minite;  //定义分钟变量
unsigned char hour;  //定义小时变量

//0-F的段码值以及-的段码值
unsigned char code dispcode[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x40};

//数码管的位码值
unsigned char dispbitcode[]={0x07,0x06,0x05,0x04,0x03,0x02,0x01,0x00};

//每个数码管的显示值
unsigned char dispbuf[8]={0,0,16,0,0,16,0,0};  //数码管上的各个数位值包括-
unsigned char dispbitcnt;  //定义数组偏移变量

unsigned int tcnt;  //T0计数器重复计数变量0-4000
unsigned char mstcnt;  //0-8计数变量,显示延时计数变量2ms延时
  
unsigned char i,j;

//主程序  
void main(void) 
{
	second=0;
	minite=0;
	hour=12;
	TMOD=0x02;  //定时/计数器T0为方式2,可自动重装载的8位计数器。 
    TH0=0x06;  //初始化计数器为0606H,0.25ms
    TL0=0x06;
    TR0=1;  //定时/计数器T0启动
    ET0=1;  //定时/计数器T0开溢出中断
    EA=1;  //CPU开总中断
  
    while(1) 
    {
    	
    	if(KB1==0)  //秒钟加1按键P3.0=0时
        {
        	for(i=5;i>0;i--) 
            for(j=248;j>0;j--);  //按键仿抖动延时
            if(KB1==0)  //秒钟加1按键P3.0=0时
            {
            	second++;  //秒钟加1
                if(second==60)  //秒钟=60时,重新初始化秒钟
                {
                	second=0; 
                } 
                dispbuf[0]=second%10;  //秒钟的个位数字存储在dispbuf[0]
                dispbuf[1]=second/10;  //秒钟的十位数字存储在dispbuf[1]
                while(KB1==0);
            }
        }
        if(KB2==0)  //分钟加1按键P3.1=0时
        {
        	for(i=5;i>0;i--) 
            for(j=248;j>0;j--);  //按键仿抖动延时
            if(KB2==0)  //分钟加1按键P3.0=0时
            {
            	minite++;  //分钟加1
                if(minite==60)  //分钟=60时,重新初始化分钟
                {
                	minite=0; 
                } 
                dispbuf[3]=minite%10;  //分钟的个位数字存储在dispbuf[3]
                dispbuf[4]=minite/10;  //分钟的十位数字存储在dispbuf[4]
                while(KB2==0); 
            }
        }
        if(KB3==0)  //小时加1按键P3.2=0时
        {
        	for(i=5;i>0;i--)
            for(j=248;j>0;j--);  //按键仿抖动延时
            if(KB3==0)  //小时加1按键P3.2=0时
            {
            	hour++;  //小时加1
                if(hour==24)  //小时=24时,重新初始化小时
                {
                	hour=0; 
                }
                dispbuf[6]=hour%10;  //小时的个位数字存储在dispbuf[6]
                dispbuf[7]=hour/10;  //小时的十位数字存储在dispbuf[7]
                while(KB3==0); 
            }
        }
    }
}

//定时/计数器T0中断服务子程序
void t0(void) interrupt 1 using 0 
{
	mstcnt++;  //mstcnt加1
    if(mstcnt==8)  //如果mstcnt=8
    {
    	mstcnt=0;  //重新初始化
        P0=dispcode[dispbuf[dispbitcnt]];  //P0口输出各个数码管的段码值
        P2=dispbitcode[dispbitcnt];  //P2口输出各个数码管的位码值
        dispbitcnt++;  //
        if(dispbitcnt==8)  //如果dispbitcnt=8
        {
        	dispbitcnt=0;  //重新初始化
        }
    }
    tcnt++; 
    if(tcnt==4000)  //一秒种时间到
    {
    	tcnt=0;  //tcnt重新初始化 
        second++;  //秒钟加1
        if(second==60)  //second=60
        {
        	second=0;  //重新初始化
            minite++;  //分钟加1
            if(minite==60)  //minite=60
            {
            	minite=0;  //重新初始化
                hour++;  //小时加1
                if(hour==24)  //hour=24
                {
                	hour=0;  //重新初始化
                }
            }
        }
        dispbuf[0]=second%10;  //秒钟的个位数字存储在dispbuf[0]
        dispbuf[1]=second/10;  //秒钟的十位数字存储在dispbuf[1]
        dispbuf[3]=minite%10;  //分钟的个位数字存储在dispbuf[3]
        dispbuf[4]=minite/10;  //分钟的十位数字存储在dispbuf[4]
        dispbuf[6]=hour%10;  //小时的个位数字存储在dispbuf[6]
        dispbuf[7]=hour/10;  //小时的十位数字存储在dispbuf[7]
    }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -