使用 Keil 软件实现 LED 流水灯和数码管动态显示

本教程将使用 Keil 软件,通过简洁的代码实现以下两个功能:

  1. 利用串行口实现 8 个 LED 灯流水灯的效果
#include <reg52.h>

sbit LED1 = P1^0;
sbit LED2 = P1^1;
sbit LED3 = P1^2;
sbit LED4 = P1^3;
sbit LED5 = P1^4;
sbit LED6 = P1^5;
sbit LED7 = P1^6;
sbit LED8 = P1^7;

void main()
{
    while(1)
    {
        LED1 = 1;
        LED2 = 0;
        LED3 = 0;
        LED4 = 0;
        LED5 = 0;
        LED6 = 0;
        LED7 = 0;
        LED8 = 0;
        Delay(500);

        LED1 = 0;
        LED2 = 1;
        LED3 = 0;
        LED4 = 0;
        LED5 = 0;
        LED6 = 0;
        LED7 = 0;
        LED8 = 0;
        Delay(500);

        LED1 = 0;
        LED2 = 0;
        LED3 = 1;
        LED4 = 0;
        LED5 = 0;
        LED6 = 0;
        LED7 = 0;
        LED8 = 0;
        Delay(500);

        LED1 = 0;
        LED2 = 0;
        LED3 = 0;
        LED4 = 1;
        LED5 = 0;
        LED6 = 0;
        LED7 = 0;
        LED8 = 0;
        Delay(500);

        LED1 = 0;
        LED2 = 0;
        LED3 = 0;
        LED4 = 0;
        LED5 = 1;
        LED6 = 0;
        LED7 = 0;
        LED8 = 0;
        Delay(500);

        LED1 = 0;
        LED2 = 0;
        LED3 = 0;
        LED4 = 0;
        LED5 = 0;
        LED6 = 1;
        LED7 = 0;
        LED8 = 0;
        Delay(500);

        LED1 = 0;
        LED2 = 0;
        LED3 = 0;
        LED4 = 0;
        LED5 = 0;
        LED6 = 0;
        LED7 = 1;
        LED8 = 0;
        Delay(500);

        LED1 = 0;
        LED2 = 0;
        LED3 = 0;
        LED4 = 0;
        LED5 = 0;
        LED6 = 0;
        LED7 = 0;
        LED8 = 1;
        Delay(500);
    }
}

void Delay(unsigned int count)
{
    unsigned int i,j;
    for(i=0;i<count;i++)
        for(j=0;j<1000;j++);
}
  1. 实现数码管动态显示 0~9,时间间隔为 1s(采用中断方式)
#include <reg52.h>

sbit LED1 = P1^0;
sbit LED2 = P1^1;
sbit LED3 = P1^2;
sbit LED4 = P1^3;
sbit LED5 = P1^4;
sbit LED6 = P1^5;
sbit LED7 = P1^6;
sbit LED8 = P1^7;

unsigned char cnt = 0;

void main()
{
    TMOD = 0x01;    // 设置定时器0为模式1
    TH0 = 0x4C;     // 设置计数初值
    TL0 = 0x00;
    ET0 = 1;        // 打开定时器0中断
    EA = 1;         // 打开总中断开关

    while(1)
    {
        // 动态显示0~9
        LED1 = cnt == 0 || cnt == 4 || cnt == 5 || cnt == 6 || cnt == 7 || cnt == 8 || cnt == 9;
        LED2 = cnt == 0 || cnt == 2 || cnt == 3 || cnt == 5 || cnt == 6 || cnt == 8 || cnt == 9;
        LED3 = cnt == 0 || cnt == 1 || cnt == 3 || cnt == 4 || cnt == 7 || cnt == 8 || cnt == 9;
        LED4 = cnt == 2 || cnt == 3 || cnt == 4 || cnt == 5 || cnt == 6 || cnt == 8 || cnt == 9;
        LED5 = cnt == 0 || cnt == 2 || cnt == 6 || cnt == 8;
        LED6 = cnt == 0 || cnt == 1 || cnt == 3 || cnt == 4 || cnt == 5 || cnt == 6 || cnt == 7 || cnt == 8 || cnt == 9;
        LED7 = cnt == 0 || cnt == 1 || cnt == 2 || cnt == 3 || cnt == 4 || cnt == 7 || cnt == 8 || cnt == 9;
        LED8 = cnt == 0 || cnt == 2 || cnt == 3 || cnt == 5 || cnt == 6 || cnt == 8 || cnt == 9;
    }
}

void InterruptTimer0() interrupt 1
{
    cnt++;      // 每次定时器0中断,计数器加1
    if(cnt == 10)
        cnt = 0;    // 计数器归零
    TH0 = 0x4C;     // 重新设置计数初值
    TL0 = 0x00;
}

本教程中使用了简单的延时函数和中断方式来实现流水灯效果和数码管动态显示。你可以在此基础上进行扩展,例如:

  • 使用不同的显示方式,例如矩阵点阵显示
  • 增加更多功能,例如按键控制、温度传感器等
  • 使用更复杂的算法,例如随机数生成、图像处理等

希望本教程能够帮助你入门 Keil 编程,并激发你对单片机编程的兴趣。祝你编程愉快!


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

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