
3.1 闪烁的LED
STC15 P2.0引脚连接LED,程序按设定的时间间隔取反P2.0引脚的值,使LED按固定时间间隔持续闪烁。闪烁的LED电路如图3-1所示,注意要设置限流电阻R1的电阻值。

图3-1 闪烁的LED电路
1. 程序设计与调试
1)关于头文件STC15xxx.h(传统8051单片机的头文件为reg51.h)
程序中包含的头文件STC15xxx.h不能被省略,它定义了所有的特殊功能寄存(SFR),例如其所包含的P0~P3的定义如下。

本例如果省略头文件STC15xxx.h,编译时将出现以下错误提示。

上述错误提示中,括号内为错误行号,“undefined identifier”表示“未定义标识符”。如果在省略该头文件时添加一行代码:sfr P2=0x80,其中0x80为STC15的P2地址,对其他寄存器(例如P2M1、P2M0)也用同样方法添加定义,则编译仍可正常通过。
2)延时函数设计与应用
本案例中毫秒级延时函数由STC-ISP工具提供,其参考代码为:

如果delay_ms函数被放到了主函数main的后面,则应在其前面添加声明,例如:

注意函数声明语句后面要添加分号。
要改变LED的闪烁频率,可修改延时函数参数。由于延时函数参数类型为u8,其取值范围可为1~255,如果需要更大的延时值,不可直接在该参数中给出大于255的值,相应的延时函数应重新设计。例如,先通过STC-ISP工具得到1ms的延时函数,然后再通过一个参数为u16类型的函数来循环调用。使用STC-ISP工具生成软件延时函数的界面如图3-2所示。

图3-2 使用STC-ISP工具生成软件延时函数的界面
有的案例中并不需要太精确的延时,如本案例的LED闪烁控制,但有的项目设计中,必须精确控制延时,特别是在模拟有关传感器的操作时序时,必须提供精确的延时值,如温度传感器DS18B20的程序设计,其延时值精确到了微秒级。
3)关于两个常用的重定义类型
本案例程序及后续多个案例程序中均加入了重定义的u8、u16等类型参数,参数类型重定义可使含有大量变量的程序代码变得更加清晰、简洁。
4)仿真运行
当运行Proteus进行仿真时,用户可能观察到的STC15引脚状态颜色有以下4种。
• 红色:表示高电平(1)。
• 蓝色:表示低电平(0)。
• 灰色:表示高阻状态。
• 黄色:表示出现逻辑冲突。
对于图3-1所示电路,在运行时可观察到P2.0引脚状态颜色按“红色-蓝色”交替变化,它表示P2.0引脚按“1-0”,即“高电平-低电平”交替变化,这导致LED持续闪烁显示。
2. 实训要求
① 在P2端口增加若干个LED,编写程序控制闪烁显示并提高闪烁频率。
② 分别将LED的阳极或阴极连接P0,在这两种不同连接方式下分别实现LED闪烁控制。
③ 继续在P1、P3使用不同的连接LED方式实现LED的闪烁控制。
3. 源程序代码
