![单片机C语言程序设计实训100例:基于STC8051+Proteus仿真与实战](https://wfqqreader-1252317822.image.myqcloud.com/cover/270/43738270/b_43738270.jpg)
3.1 闪烁的LED
STC15 P2.0引脚连接LED,程序按设定的时间间隔取反P2.0引脚的值,使LED按固定时间间隔持续闪烁。闪烁的LED电路如图3-1所示,注意要设置限流电阻R1的电阻值。
![](https://epubservercos.yuewen.com/DF9E4A/23020648309755406/epubprivate/OEBPS/Images/42553-00-55-1.jpg?sign=1738906341-WLjxqVTVcCm8wopVPvAEcgGv9kDBXNcP-0-1acead570c32fe856bb8869bc2bac496)
图3-1 闪烁的LED电路
1. 程序设计与调试
1)关于头文件STC15xxx.h(传统8051单片机的头文件为reg51.h)
程序中包含的头文件STC15xxx.h不能被省略,它定义了所有的特殊功能寄存(SFR),例如其所包含的P0~P3的定义如下。
![](https://epubservercos.yuewen.com/DF9E4A/23020648309755406/epubprivate/OEBPS/Images/42553-00-56-1.jpg?sign=1738906341-6HMsDL6jxv59IjwRVffgHa84ceyngbIY-0-3ee2cf902d94932ea67b1a651c70b239)
本例如果省略头文件STC15xxx.h,编译时将出现以下错误提示。
![](https://epubservercos.yuewen.com/DF9E4A/23020648309755406/epubprivate/OEBPS/Images/42553-00-56-2.jpg?sign=1738906341-M79o0dDKB5fwTEdUqynUzm3XyMXVYIzT-0-9964cfcf53071458b4991b18f281611d)
上述错误提示中,括号内为错误行号,“undefined identifier”表示“未定义标识符”。如果在省略该头文件时添加一行代码:sfr P2=0x80,其中0x80为STC15的P2地址,对其他寄存器(例如P2M1、P2M0)也用同样方法添加定义,则编译仍可正常通过。
2)延时函数设计与应用
本案例中毫秒级延时函数由STC-ISP工具提供,其参考代码为:
![](https://epubservercos.yuewen.com/DF9E4A/23020648309755406/epubprivate/OEBPS/Images/42553-00-56-3.jpg?sign=1738906341-VKMoyHEaccLwUuZuAARxTUlePIO2EDuO-0-8bd9b8b871addfddb692a2500e1044bb)
如果delay_ms函数被放到了主函数main的后面,则应在其前面添加声明,例如:
![](https://epubservercos.yuewen.com/DF9E4A/23020648309755406/epubprivate/OEBPS/Images/42553-00-56-4.jpg?sign=1738906341-YOSC61BYoHHXAhfLpMbrVgr4XwDdiEvq-0-9ee594cd9dee5834b1179378abd180b7)
注意函数声明语句后面要添加分号。
要改变LED的闪烁频率,可修改延时函数参数。由于延时函数参数类型为u8,其取值范围可为1~255,如果需要更大的延时值,不可直接在该参数中给出大于255的值,相应的延时函数应重新设计。例如,先通过STC-ISP工具得到1ms的延时函数,然后再通过一个参数为u16类型的函数来循环调用。使用STC-ISP工具生成软件延时函数的界面如图3-2所示。
![](https://epubservercos.yuewen.com/DF9E4A/23020648309755406/epubprivate/OEBPS/Images/42553-00-56-5.jpg?sign=1738906341-KeK0F100rllkIaSSBcPY0v3jmtPCgCNP-0-ddbc38291b8a30ac7ba5ee9d12434ff3)
图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. 源程序代码
![](https://epubservercos.yuewen.com/DF9E4A/23020648309755406/epubprivate/OEBPS/Images/42553-00-57-1.jpg?sign=1738906341-81xd5C91zXn7LI6eolwFh5g8xkDDbloa-0-e1e132c2d22486fb270d362567762934)