概要
实验名称:LED流水灯及继电器开关实验
实验环境:IAP15F2K61S2国信长天实验板
实验配置:J3跳线配置为I/O模式,J5配置为BTN模式,J3配置为1-3,2-4模式
实验要求:实现LED从第一位到第八位的流水灯,此时继电器为闭合状态,LED全部点亮意为流水灯结束,此时继电器为断开状态。
备注:蜂鸣器在实验过程中应为关闭状态
技术实现
1.硬件环境
IAP15F2K61S2单片机部分
74HC138
74HC573
ULN22003
2.原理图
因为硬件设计原因,在实验中会涉及到蜂鸣器电路部分
3.代码实现
#include <stc15f2k60s2.h>
#include <intrins.h>
/*宏函数*/
#define REL(X) {P0=X;P2=((P2&0X1F)|0XAF);P2=P2&0X1F;}
#define LED(X) {P0=X;P2=((P2&0X1F)|0X80);P2=P2&0X1F;}
#define BUZ(X) {P0=X;P2=((P2&0X1F)|0XAF);P2=P2&0X1F;}
/*延时函数*/
void Delay3000ms(void) //@11.0592MHz
{
unsigned char data i, j, k;
_nop_();
_nop_();
i = 127;
j = 18;
k = 107;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
/*LED流水灯+全部点亮*/
void LED_TASK()
{
static unsigned char led = 0x01;
while(led != 0x00)
{
LED(~led);
led <<= 1;
Delay3000ms();
}
LED(led);
}
/*主函数*/
void main(void)
{
BUZ(0X00); //关闭蜂鸣器
LED(0X01); //上电后L1亮,其余熄灭
REL(0X10); //打开继电器
LED_TASK();
REL(0X00); //关闭继电器
while(1);
}
4.内容要点
1.宏函数
宏函数:宏函数是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();
蜂鸣器部分
/*关闭蜂鸣器*/
void clo_buzzer()
{
//选中控制蜂鸣器的锁存器
P2 = ((P2 & 0X1F) | 0XAF);
/*
P2 & 0x1F:高三位清零
P2 | 0xAF 设置高三位
*/
//关闭
P0 = 0X00;
//将138锁存器的输入端置空
P2 = (P2 & 0x1F);
}
2.移位操作实现流水灯
/*LED流水灯+全部点亮*/
void LED_TASK()
{
static unsigned char led = 0x01;
while(led != 0x00)
{
LED(~led);
led <<= 1;
Delay3000ms();
}
LED(led);
}
实验结果