本节将向大家介绍如何用 51 单片机去控制开发板上的 LED。开发板上的 LED 位置标注有 “LED 模块”。
第二章要写 3 个程序代码:第一个代码实现点亮开发板上的第一个 LED;第二个代码让第一个 LED 以 1 秒为周期闪烁;第三个代码使 8 个 LED 以流水灯的方式一位一位移动。左上角数码管可能因引脚冲突乱跳,不用理会,只要 LED 显示正确即可。
目录
一、新建工程
二、LED介绍
三、开发板上LED连接方式
一、新建工程
上一节已安装好软件,现在双击打开。编写代码前需新建一个工程,工程就像办公的桌子,有了它才能编写代码。
建工程步骤如下:
点击 “project”,选择 “new project”
提示保存工程位置时,默认会保存到文档,建议在桌面上新建一个名为 “keilproject” 的文件夹,将代码集中放在这里。
双击打开该文件夹,再新建一个名为 “2 -1 点亮一个 LED” 的文件夹。
工程名字建议起通用的,如 “project”,点击保存。
此时会弹出对话框让选择单片机型号,51 单片机有很多公司生产,有多种型号,我们用的是 STC89C52,但软件中没有STC,可选用 Atmel文件夹里的 AT89C52,它与 STC89C52 操作方式和功能一样。
接着会弹出复制启动文件到工程文件底下的对话框,选 “是” 或 “否” 均可,选 “是” 新建工程后会自动添加启动文件,一般不需要修改,所以选 “否”。
工程建立完成后,可看到工程及 “target 1”,点击左边加号,能看到编写代码的文件夹。
新建好工程后,要在工程里新建一个 C 语言程序文件。
选中组,右键点击添加新文件到组里
51 单片机可用 C 语言、C++ 语言和汇编语言编写,一般用 C 语言,因为 C++ 效率慢,汇编语言更底层难理解。
选中 C 语言,文件名起 “main”,点击添加,此时会出现 “main.c” 文件和编辑框。
先编译试一下,有三个按钮,“translate” 是编译,“build” 是建立工程,“rebuild” 是重新编译所有文件,一般点 “build”。
点击后下面会出现建立信息,提示没有错误但有一个警告,警告是 “无法确定根段”,这意味着缺少主函数 “main”。
在右边添加 “main” 函数,格式为 “void main ()”,回车后打两个花括号,再按 “Tab” 键缩进,使代码更有层次。
主函数字体太小,可通过 “configuration” 配置,选择第二个选项卡 “颜色和字体”,选择 “C C++” 编辑文件,点击 “font” 字体,在右边设置字体大小。
再次点击 “build”,显示 “0 error 0 warning”,即没有错误和警告。
二、LED介绍
建立好工程后,先了解本节要讲的 LED。学一个器件前,应通过百度等方式了解其原理和用法。LED 中文名是发光二极管,外文名是 “light emitting diode”,缩写为 LED。其用途广泛,可用于照明、广告灯、指引灯、屏幕等,在照明方面优势明显,相比白炽灯和节能灯,LED 更省电且亮度高。
LED 在电路图里的符号如上图所示,右边是较大的 LED 实物图,它区分正负极,图中左边是正极,右边是负极,只有正极接正极、负极接负极,才有电流通过,LED 才会亮,接反则不亮。
区分直插 LED 正负极的方法:里面较大的一块可看作 “大红旗”,较小的看作 “小红旗”,小的代表正极,大的代表负极;若引脚没剪过,长角是正极,短角是负极。开发板上的是贴片 LED,个头小,背面画有箭头指示正负极方向。
三、开发板上LED连接方式
接下来了解开发板上的 LED 连接方式。打开开发板资料,找到新版原理图(新版和旧版连接方式一样)
在原理图右下角可看到 LED 模块。
有 8 个 LED,右边是 VCC(电源正极),左边红色字是网络编号,连接到单片机的 P2引脚,P2引脚出来直接连到 LED 负极。
LED 正极出来通过一个电阻,这个电阻是四个一体的排阻,开发板上两个小黑块就是,它有八个引脚,里面是四个电阻,阻值为 1000 欧。
从排阻上写的数字 “102” 可看出,在电路元器件编号中,“102” 表示前两位 “10” 是有效数字,第三位 “2” 是倍率,即后面加2个 0,所以是 1000 欧。同理,“473” 是 47 后面加 3 个 0,即 47000 欧;“1001” 是 100 后面加1个 0,即 1000 欧。
电阻的作用是限流,若 LED 直接接 5V 电压,可能因电流过大烧毁,所以串联一个电阻。
当 LED 正极接正,负极接负时会点亮;若正负极都接正,则不亮。
这就将问题转化为控制单片机引脚输出高低电平,高电平是 5V,低电平是 0V,单片机使用的是 TTL 电平规范。接下来的主要任务是控制单片机的 P2 口输出高低电平。
通过上图解释单片机如何控制硬件设备。单片机名字叫 MCU,里面集成了 CPU,代码在 CPU 里执行。外部是引脚,如 P2 口引脚。CPU 通过寄存器控制引脚,寄存器是一种存储器,8 个为一组,每个寄存器下面都连着一根线控制硬件。比如 P2 口寄存器有 8 位,每一位背后都有一根导线,通过驱动器增大电流后连接到 P2 口端口。CPU 可通过程序直接访问寄存器并写值,写 “1” 引脚为高电平(5V),写 “0” 为低电平。P2 口也是 8 个为一组,寄存器每一位对应一个 P2 口引脚。
要点亮第一个 LED,需给 P2 口最低位低电平(0),其余为高电平(1),即二进制 “1111 1110”。但 C 语言程序不能直接写二进制,需将其转化为十六进制或十进制,一般转化为十六进制,因为二进制转十六进制可一眼看出。十六进制是二进制的简写,把四个二进制数化成一个十六进制数,十六进制数从 0 到 9,10 用字母 a 表示,依次是 b、c、d、e、f,f 代表 15,覆盖了四位二进制的所有情况。将 “1111 1110” 四个一组分开,“1111” 对应十六进制的 “f”,“1110” 对应 “e”,完整语句为 “P2 = 0xfe;”,在 C 语言里语句要以分号结尾。
写好代码点击 “build” 编译,提示 “P2 口是未定义的标识符”,需要在主函数之前添加头文件。右键点击 “insert”,选择头文件打开,里面定义了很多寄存器,包括 P2 寄存器,地址是十六进制的 A0。添加头文件后再次编译,显示没有错误和警告。
下一步将代码下载到单片机,打开 STC-ISP 软件,选择单片机型号为 STC89C52,新版本串口号可自动搜索。
点击 “打开程序文件”,在工程目录里找不到文件,因为编译器默认不生成下载文件,需在 “output” 选项卡里勾选 “create” 创建 HEX 文件,点击 “OK” 后再次编译,会生成 HEX 文件
选择该文件点击 “打开”,再点击 “下载”,下载后重新打开单片机开关,第一个 LED 点亮,第一个任务完成。
但代码还少一步,单片机上电后程序不会停止,主函数执行完会从头开始执行,“P2 = 0xfe” 会不断被执行,这不是我们想要的。
为让程序停下来,可在主函数下面写一个 “while” 循环,格式为 “while (1)”,回车后加一对花括号,“while” 是关键字,会变成蓝色。“while” 循环判断括号里的逻辑表达式,若为真则执行花括号里的语句,这里写 “1”,“1” 代表永远为真,程序会一直在循环里,相当于停下来。再次编译下载,现象不变,但程序实际上已停止对 P2 口的操作。
#includevoid main(){P2=0xFE; //1111 1110while(1){}
还可对程序进行升级,之前让 P2 口引脚电平为 “1111 1110” 点亮一个 LED,若想让 8 个 LED 一个亮一个灭,可把 “fe” 改成 “55”,十六进制的 “55” 是二进制的 “0101 0101”,下载后可看到 LED 间隔亮灭的现象。