单片机C语言第一篇之”Hello LED”


单片机C语言的第一个程序应该是让LED灯闪烁

注意

本篇文章的功能实现基于 STC89C52RC 芯片,八颗LED灯接于P2口,使用Keil4原版编译环境,借鉴时注意不要一昧照搬。

正文

可能有不少人自学C语言的时候和我一样第一个程序是这个样子

#include<stdio.h>                // 此行为程序头文件里面包含了一些
                                 // 可能用到的声明,比如函数、数据接口等

int main(void)     // main为程序执行的入口,程序由此开始执行
{
    printf(Hello Wrold !\n);
    return(0);
}

在电脑上编译出来后,就会出现“Hello Wrold !”的字样。

1

但是我学习单片机的C语言的第一步是用protues仿真,搭了这样一个东西,让LED灯闪烁

初始程序是这样的

#include<reg52.h>   // 定义头文件

void main()         // 主函数_程序入口
{
    int t;          // 定义整数变量t
    while(1)        // 主循环
    {
        P2=0x7f;     // 用8421算出八颗LED中要亮的那颗LED对应的十六进制数
        t=30000;     // 给t赋值
        while(t--);  // 在这里作减法循环,直到减到0再进行下一步,效果是作延迟

        P2=0xff;     // LED灯全灭(对于单片机来说I/O口高电位为截止、低电位接通)
        t=30000;     //重复赋值
        while(t--);  //计算,作延迟

    }
}

不难看出,程序中作延迟的代码出现重复了,如果想要控制多个I/O口LED灯的亮灭,那么重复的代码会更多。更麻烦的是,如果想要改变延迟时间,要一一手动更改t的值,很浪费时间精力。所以这个程序对于延迟方面做了如下改进:

#include<reg52.h>   

void delay(unsigned int t)  //定义一个延迟函数
{
    while(t--);
}

void main()     //主函数
{

    while(1)    //弄个死循环
    {
        P2=0x7F;        //灯亮
        delay(30000);  //亮这么长时间。
        P2=0xFF;        //灯暗
        delay(30000);   //暗这么长时间
    }
}

这个程序的改进在于定义了delay函数。当程序看到delay(30000)时,会将3000拿到这里↓

void delay(unsigned int t)  //定义一个延迟函数
{
    while(t--);
}

作减法,直到减到为0,再进行下一步,也即P2=0xFF;//灯灭

优点:

  • 代码可阅读性变高
  • 每一次要使用delay的话直接调用即可,不用自己手动定义个t然后再加一个while(t--),能省两行代码。节省生命

总结

这个程序很简单,实现的功能是让连接P2口的那颗LED发出闪烁。调用两次delay函数是为了控制LED的点亮时间和熄灭时间。如果想让点亮和熄灭的时间不同,那么就要单独对延时时间进行赋值,如果没有这个需要的话可以在循环前直接给delay赋值,调用的时候就不需要手动输入数值。

我的单片机第一个程序就这样跑起来啦。


Change Log:

2018-03-31:

  • 修改错别字、错误的定义
  • 测试代码,保证无错
  • 修改文章,优化可读性

2018-03-21:创建