单片机C语言的第一个程序应该是让LED灯闪烁
注意
本篇文章的功能实现基于 STC89C52RC 芯片,八颗LED灯接于P2口,使用Keil4原版编译环境,借鉴时注意不要一昧照搬。
正文
可能有不少人自学C语言的时候和我一样第一个程序是这个样子
#include<stdio.h> // 此行为程序头文件里面包含了一些
// 可能用到的声明,比如函数、数据接口等
int main(void) // main为程序执行的入口,程序由此开始执行
{
printf(Hello Wrold !\n);
return(0);
}
在电脑上编译出来后,就会出现“Hello Wrold !”的字样。

但是我学习单片机的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:创建