概要
实验名称:LED闪烁
实验环境:IAP15F2K61S2国信长天实验板
实验配置:J3跳线配置为I/O模式,J5配置为BTN模式,J3配置为1-3,2-4模式,
J6配置为蜂鸣器电源
实验要点:宏函数,异或语句控制LED闪烁
备注:蜂鸣器在整个实验中应处于关闭状态
技术实现
1.硬件环境
IAP15F2K61S2单片机部分
74HC138译码器
74HC573锁存器
ULN2003达林顿管
2.原理图
因为硬件设计原因,在实验中会涉及到蜂鸣器电路部分
3.代码实现
#include <STC15F2K60S2.h>
#include <intrins.h>
/*宏函数*/
#define LED(X) {P0 = X;P2 = ((P2 & 0X1F) | 0X80);P2 = P2 & 0x1f;}
#define BUZ(X) {P0 = X;P2 = ((P2 & 0X1F) | 0XA0);P2 = P2 & 0x1f;}
/*延时函数*/
void Delay100ms(void) //@11.0592MHz
{
unsigned char data i, j, k;
_nop_();
_nop_();
i = 5;
j = 52;
k = 195;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
/*LED闪烁函数*/
void LED_TASK()
{
static unsigned char led = 0xff;/*静态局部变量*/
led ^= 0xff;
LED(led);
}
/*主函数*/
void main(void)
{
BUZ(0X00); //关闭蜂鸣器
LED(0XFF); //初始LED熄灭
while(1)
{
LED_TASK();
Delay100ms();
}
}
4.内容要点
-
宏函数
宏函数:宏函数是C语言中的一种预处理器指令,它在预编译阶段将宏名替换为后面的替换体。宏函数的使用可以提高程序的执行效率,因为它避免了函数调用的开销,如参数压栈、生成汇编语言的CALL调用、返回参数、执行return等过程。
宏函数的定义使用#define指令。例如:#define SQUARE(x) ((x)*(x))
通过向LED(X)传递实参实现相应功能 ,代替的代码部分如下:
/*LED开*/
P2 = ((P2 & 0X1F) | 0X80);
P0 = 0x00;
P2 = P2 & 0x1f;
Delay();
/*LED关*/
P2 = ((P2 & 0x1f) | 0x80);
P0 = 0xff;
P2 = P2 & 0x1f;
Delay();
同理,BUZ(X)部分:
/*关闭蜂鸣器*/
void clo_buzzer()
{
//选中控制蜂鸣器的锁存器
P2 = ((P2 & 0X1F) | 0XAF);
/*
P2 & 0x1F:高三位清零
P2 | 0xAF 设置高三位
*/
//关闭
P0 = 0X00;
//将138锁存器的输入端置空
P2 = (P2 & 0x1F);
}
2.异或语句控制LED闪烁
/*LED闪烁函数*/
void LED_TASK()
{
static unsigned char led = 0xff;/*静态局部变量*/
led ^= 0xff;
LED(led);
}
此处利用异或语句的特点,使得每次执行该语句时,静态局部变量的值均与前一次相反,从而实现高低电平转换 ,达到LED闪烁的效果。
实验结果