新建工程、点亮LED、LED闪烁、LED流水灯

阅读本文大致需要:7分

单片机学习之旅 day_1

一、安装必要软件

1,keil uvision5 点此链接前往官网下载

2,STC-ISP 点此链接前往官网下载

tips:上述两程序均为完成本文时对应程序的最新版本,链接均指向官网链接

二、创建空工程

启动Keil,依次点击ProjectNew uVision Project,选择用于存储工程的文件夹并为工程命名。

屏幕截图 2026-04-08 204634.png

随后会弹出选择单片机型号的窗口,本人单片机型号为STC89C52RC,这里选择MicroChip的AT89C52,实际请根据自己单片机型号进行选择。

屏幕截图 2026-04-08 204750.png

选择完成后会弹出选择是否加入初始化代码询问的信息,此处通常选择“是”,初学者不知道如何修改启动代码可以选择“否”。

屏幕截图 2026-04-08 204827.png

随后依次展开Project窗口的Tatget 1Source Group 1,右键Source Group 1,点击Add New Item to Group ‘Source Group 1’,命名为main.c,写入如下代码:

屏幕截图 2026-04-08 205042.png

void main(){

}

这个工程编译运行后会让你的单片机回到初始状态。

三、点亮LED灯

将光标移动至main.c第一行void之前,右键打开菜单,单击**Insert #include**,也可自己在第一行输入

#include<REGX52.H>

屏幕截图 2026-04-08 205818.png

查看单片机LED模块原理图,可知

tips:此处为普中开发板LED模块原理图,不同型号单片机的原理也可能不同,请根据自己单片机型号查找原理图,建议询问自己购买单片机的店铺客服。

屏幕截图 2026-04-08 210410.png

此处提供两个实例代码,并说明其作用:

#include <REGX52.H>
void main(){
    P2=0xFE;
    //此处FE为16进制,转换为二进制为11111110,此代码可以点亮单片机LED模块第一个LED灯
}
#include <REGX52.H>
void main(){
    P2=0xFC;
    //此处FC为16进制,转换为二进制为11111100,此代码可以点亮单片机LED模块前两个LED灯
}

显然这个程序可以通过一个由8位二进制转换而来的16进制控制单片机的LED灯,8位二进制的0代表灯亮,1代表灯灭,8位二进制从右往左对应单片机的从左往右。

要生成可在STC-ISP下载到单片机的Hex文件需要打开Keil uvision的Creat HEX File选项

屏幕截图 2026-04-09 212413.png

四、Led闪烁

打开STC-ISP程序,在工具栏找到软件延时计算器,自由设定定时长度,此处以500ms为例。

tips:注意选择自己单片机型号,此处为STC89

屏幕截图 2026-04-09 213452.png

生成C代码并复制粘贴到keil uvision中,完成后续程序。

屏幕截图 2026-04-09 213028.png

#include <REGX52.H>
#include <INTRINS.H>
// 此处库INTRINS.H为函数_nop_()所用到的
void Delay500ms(void)
{
    unsigned char data i, j, k;

    _nop_();
    i = 4;
    j = 129;
    k = 119;
    do
    {
        do
        {
            while (--k);
        } while (--j);
    } while (--i);
}
void main(){
    while(1){
        P2=0xFE; //点亮led灯
        Delay500ms(); //延时500ms
        P2=0xFF; //熄灭led灯
        Delay500ms(); //延时500ms
    }
}

五、LED流水灯

由四的LED闪烁我们可以直觉的想到可以让LED灯从左至右依次点亮后熄灭,以下代码可以实现:

void main(){
    while(1){
        P2=0xFE; //点亮led灯1,1111 1110
        Delay500ms(); //延时500ms
        P2=0xFD; //点亮led灯2,1111 1101
        Delay500ms(); //延时500ms
        P2=0xFB; //点亮led灯3,1111 1011
        Delay500ms(); //延时500ms
        P2=0xF7; //点亮led灯4,1111 0111
        Delay500ms(); //延时500ms
        P2=0xEF; //点亮led灯5,1110 1111
        Delay500ms(); //延时500ms
        P2=0xDF; //点亮led灯6,1101 1111
        Delay500ms(); //延时500ms
        P2=0xBF; //点亮led灯7,1011 1111
        Delay500ms(); //延时500ms
        P2=0x7F; //点亮led灯8,0111 1111
        Delay500ms(); //延时500ms
        P2=0xFF; //熄灭所有led灯,1111 1111
        Delay500ms(); //延时500ms
    }
}

这是一种极其原始的方法,代码繁琐但必定有效,更高阶一些的写法,如unsigned char可以让控制LED的八位二进制的高电平位从右往左移动,对应单片机LED灯从左往右依次点亮后熄灭,实现流水灯的效果。

unsigned char ucled=0x01; //0000 0001
void main(){
    while(1){
    P2=~ucled;
    Delay500ms();
    ucled<<=1;
    if(ucled==0x00) ucled=0x01; //循环
    }
}

© 2026 化学反应罢了 · Powered by Jekyll · Theme by Morecho