单片机控制数码管显示时间代码

本文提供两种单片机控制数码管显示时间的代码,分别基于STC89C52和ATmega16,并附带详细注释,帮助您快速掌握单片机控制数码管显示时间的技巧。

STC89C52单片机控制数码管显示时间代码:

#include <reg52.h>

sbit DIO = P1^0; //定义P1.0口为数据线
sbit CLK = P1^1; //定义P1.1口为时钟线

unsigned char code num[] = { //共阴数码管0~9的编码
    0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F
};

void delay(unsigned int t) //延时函数
{
    unsigned int i, j;
    for(i=0; i<t; i++)
        for(j=0; j<120; j++);
}

void sendByte(unsigned char dat) //发送一个字节到数码管
{
    unsigned char i;
    for(i=0; i<8; i++)
    {
        DIO = dat & 0x01;
        CLK = 1;
        CLK = 0;
        dat >>= 1;
    }
}

void main()
{
    unsigned char hour, minute, second;
    while(1)
    {
        for(hour=0; hour<24; hour++)
        {
            for(minute=0; minute<60; minute++)
            {
                for(second=0; second<60; second++)
                {
                    sendByte(num[hour/10]); //发送十位时
                    sendByte(0x01); //选择第一个数码管
                    delay(5);
                    sendByte(num[hour%10]); //发送个位时
                    sendByte(0x02); //选择第二个数码管
                    delay(5);
                    sendByte(num[minute/10]); //发送十位分
                    sendByte(0x04); //选择第三个数码管
                    delay(5);
                    sendByte(num[minute%10]); //发送个位分
                    sendByte(0x08); //选择第四个数码管
                    delay(5);
                    sendByte(num[second/10]); //发送十位秒
                    sendByte(0x10); //选择第五个数码管
                    delay(5);
                    sendByte(num[second%10]); //发送个位秒
                    sendByte(0x20); //选择第六个数码管
                    delay(5);
                }
            }
        }
    }
}

ATmega16单片机控制数码管显示时间代码:

#include <avr/io.h>
#include <util/delay.h>

#define DIO PB0 //数据线
#define CLK PB1 //时钟线

unsigned char num[] = { //共阴数码管0~9的编码
    0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F
};

void sendByte(unsigned char dat) //发送一个字节到数码管
{
    unsigned char i;
    for(i=0; i<8; i++)
    {
        if(dat & 0x01)
            PORTB |= (1<<DIO);
        else
            PORTB &= ~(1<<DIO);
        PORTB |= (1<<CLK);
        PORTB &= ~(1<<CLK);
        dat >>= 1;
    }
}

void main()
{
    unsigned char hour, minute, second;
    DDRB = 0x03; //PB0和PB1输出
    while(1)
    {
        for(hour=0; hour<24; hour++)
        {
            for(minute=0; minute<60; minute++)
            {
                for(second=0; second<60; second++)
                {
                    sendByte(num[hour/10]); //发送十位时
                    PORTB |= (1<<2); //选择第一个数码管
                    _delay_ms(5);
                    sendByte(num[hour%10]); //发送个位时
                    PORTB &= ~(1<<2); //选择第二个数码管
                    _delay_ms(5);
                    sendByte(num[minute/10]); //发送十位分
                    PORTB |= (1<<3); //选择第三个数码管
                    _delay_ms(5);
                    sendByte(num[minute%10]); //发送个位分
                    PORTB &= ~(1<<3); //选择第四个数码管
                    _delay_ms(5);
                    sendByte(num[second/10]); //发送十位秒
                    PORTB |= (1<<4); //选择第五个数码管
                    _delay_ms(5);
                    sendByte(num[second%10]); //发送个位秒
                    PORTB &= ~(1<<4); //选择第六个数码管
                    _delay_ms(5);
                }
            }
        }
    }
}
单片机控制数码管显示时间代码 - STC89C52 & ATmega16

原文地址: https://www.cveoy.top/t/topic/l3aM 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录