3.1 闪烁的LED |
|
单片机P2.0引脚连接LED,程序按设定的时间间隔取反P2.0,使LED按固定时间间隔持续闪烁。案例电路如图3-1所示,注意设置限流电阻R2的阻值。
图3-1 闪烁的LED电路
(1)关于头文件reg51.h
要特别注意源程序中包含的头文件reg51.h不能省略,否则将导致编译时出现错误提示:
Build target 'Target 1'
compiling Text1.c...
TEXT1.C(10): error C202: 'P2': undefined identifier
TEXT1.C(26): error C202: 'LED': undefined identifier
Target not created
Keil C认为P2是未定义的标识符,因为头文件reg51.h定义了所有的特殊功能寄存(SFR),其中有关P1~P4端口的定义如下:
sfr P0 = 0x80;
sfr P1 = 0x90;
sfr P2 = 0xA0;
sfr P3 = 0xB0;
错误提示中(??)指出了错误所在的行号。当然,如果在省略该头文件时添加一行代码:sfr P2 = 0xA0;也可以通过编译,因为P2的地址为0xA0。
(2)延时函数设计与应用
本例中的延时函数代码为
源程序中将延时子程序放在主函数main()前面,如果要放在主函数之后,则应在#define语句下面添加函数声明:void delay_ms (INT16U x); 注意函数声明语句后面要添加分号“;”。
要改变LED的闪烁频率,可修改26行代码中的延时函数参数,由于参数类型为INT16U,其取值范围为0~65 535,如果延时函数参数类型为INT8U,则参数取值范围仅为0~255。
所设计的延时函数delay_ms将在本书大量案例中使用,这样一个延时函数在12MHz振荡器频率下,其延时长度到底是多少呢?
一种简单的方法是通过µVision与Proteus联调得到,具体步骤如下:
① 打开Proteus仿真电路,在Debug菜单中选中“Use Remote Debug Monitor”,但注意此时不要通过Proteus运行仿真电路。
② 打开µVision C语言程序项目,单击菜单“Project/Option for Target ‘Target 1’”,在打开的对话框中单击Debug选项卡,在右边选择使用“Proteus VSM simulator”,并勾选“Load Application at Start”及“Run to main()”,确定后继续单击工具栏中的“Start/ Stop debug session”按钮,然后单击工具栏中的“Run”按钮运行程序。如果显示的是汇编代码,则将其切换到C语言模式。
③ 将光标定位于延时函数所在的第26行,单击右键并选择“Run to cursor line”。
④ 将光标定位于第25行,即LED取反语句所在行,同样单击右键并选择“Run to cursor line”。
⑤ 此时Proteus状态栏中显示“146.42ms elapsed”,由此可知delay_ms(150)实际延时为146.42ms,相当于每次调时延时0.9761ms,接近于1ms。
有的案例中并不需要太精确的延时,如本例的LED闪烁控制,但有的项目设计中,必须精确控制延时长度,特别是本书第4章在模拟有关传感器的操作时序时,必须提供精确的延时值,如温度传感器DS18B20的程序设计中,其延时值精确到了微秒级。
这里提供的延时长度的联调检测方法在需要精确控制延时的项目设计中将发挥重要作用。
(3)关于两个常用的重定义类型
本例源程序及后续多个源程序中均加入了重定义的INT8U、INT16U类型,虽然并非每个程序都同时使用这两种类型,但几乎所有程序中都同时提供了这两种类型。
(4)仿真运行
仿真运行本例过程时,可能观察到的引脚状态颜色可能有以下四种:
红色:表示高电平(1);
蓝色:表示低电平(0);
灰色:表示高阻状态;
黄色:表示出现逻辑冲突。
图3.1所示电路运行时,将观察到P2.0引脚出现“红色-蓝色”交替,LED持续闪烁显示。
① 在P2端口增加若干个LED,编写程序控制多个LED闪烁显示并提高闪烁频率。
② 分别将LED的阳极或阴极连接P0,在两种不同接法下分别实现LED闪烁控制。
③ 继续在P1、P3端口使用不同的接法实现LED的闪烁控制。