【单片机】时钟(不利用中断中断)

本文介绍了一种基于51单片机的LED数码管动态扫描显示时钟的实现方法。通过定时更新数码管显示内容来实现秒、分、时的递增,并通过动态扫描技术避免了重影现象。该方案适用于教学实验及小型电子设备的时间显示。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include <reg52.h>
#include "./delay/delay.h"

#define TIMEPORT P0

sbit bit_select = P2^0;    //位锁存
sbit seg_select = P2^1;    //段锁存

unsigned char timedata[10] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};    //存放0~9的段码值
unsigned char bitdata[8] = {0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};                //位码
unsigned char clock_num[8];                                                          //显示值

void display(unsigned char firstplace, unsigned char len);

void main()
{
    unsigned char sec = 0;      //秒的个位
    unsigned char s_sec = 0;    //秒的十位
    unsigned char min = 5;      //分的个位
    unsigned char s_min = 5;    //分的十位
    unsigned char hour = 3;     //时的个位
    unsigned char s_hour = 2;   //时的十位
	
	unsigned char i;    
	
    while(1)
	{
        sec++;
		
		if(10 == sec)         //秒的个位计到10,进1并将个位清零
		{
		    sec = 0;
			s_sec++;
			
			if(6 == s_sec)    //秒的十位计到6,进1并将十位清零
			{
			    s_sec = 0;
				min++;
			}
		}
		
		if(10 == min)         //分的个位计到10,进1并将个位清零
		{
		    min = 0;
			s_min++;
			
			if(6 == s_min)    //分的十位计到6,进1并将十位清零        
			{
			    s_min = 0;
				hour++;
			}
		}
		
		if(10 == hour && s_hour != 2)        //时的十位不为2时,当个位计到10,进1并将个位清零
		{
		    hour = 0;
			s_hour++;
		}
			
		if(2 == s_hour && 4 == hour)         //24时清零
		{
			s_hour = 0;
		    hour = 0;
		}
		
		clock_num[0] = timedata[s_hour];     //时的十位
		clock_num[1] = timedata[hour];       //时的个位	
		clock_num[2] = 0x40;		         //-
		clock_num[3] = timedata[s_min];      //分的十位
		clock_num[4] = timedata[min];		 //分的个位
		clock_num[5] = 0x40;		         //-
		clock_num[6] = timedata[s_sec];      //秒的十位
		clock_num[7] = timedata[sec];        //秒的个位
		
		for(i = 0; i < 65; i++)
		{
		    display(0,8);                    //输出显示
		}
	}
}

/*
==========================
功能:动态扫描,显示数据
==========================
*/
void display(unsigned char firstplace, unsigned char len)
{
    unsigned char i;
	
	for (i = firstplace; i < len + firstplace; i++)
	{		
	    TIMEPORT = 0x00;            //清空数据,防止重影
		seg_select = 1;
		seg_select = 0;
		
		TIMEPORT = 0xff;            //清空数据,防止重影
		bit_select = 1;
		bit_select = 0;
		
		TIMEPORT = clock_num[i];    //取出显示值
		seg_select = 1;
		seg_select = 0;
		
		TIMEPORT = bitdata[i];      //取出位码
		bit_select = 1;
		bit_select = 0;
		
		delay_ms(2);
	}
}


delay.h
void delay_us(unsigned char t)
{
    while (--t);
}

void delay_ms(unsigned char t)
{
    while (t--)
    {
	delay_us(245);
	delay_us(245);
    }
}

void delay_s(unsigned char t)
{
    while (t--)
    {
        delay_ms(200);
	delay_ms(200);
	delay_ms(200);
	delay_ms(200);
	delay_ms(200);
    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值