一、说明
LED闪烁实验
* 实验目的:1.掌握单片机IO口操作的基本方法
2.掌握软件延时函数的设计方法
* 实验配置:J3跳线配置为IO方式,J5配置为KBD、J2配置为1-3和2-4
* 实验现象:LED以0.2S为间隔亮灭
* 硬件环境:IAP15F2K61S2单片机,单片机内部振荡器频率:11.0592M
* 注意事项:包含STC15F2K60S2.H头文件,里面包含了所有的STC15系列的寄存器定义,
此头文件可在STC-ISP软件中生成,要用到_nop_()必须要包含intrins.h头文件
二、电路图及分析
LED阳极接电源,阴极接573,输出0点亮LED灯
P25P26P27控制Y4的值,Y4控制Y4C的值,Y4C决定573输出端是否接通,通过改变P0端控制LED
1.74HC573 锁存器
2.74HC138三八译码器
3.74HC02
先或再取反
需要输出1,即需要Y4输入0(WR是0)
三、代码
#include "STC15F2K60S2.H"
#include "intrins.h"
//关闭蜂鸣器
void cls_buzz(void)
{
P2 = (P2 & 0x1F | 0xA0);
P0 = 0x00;
P2 &= 0x1F;
}
//延时200ms
void delay() //@11.0592MHz
{
unsigned char i, j, k;
_nop_();
_nop_();
i = 9;
j = 104;
k = 139;
do
{
do
{
while (--k);
}
while (--j);
}
while (--i);
}
void main(void)
{
cls_buzz();
while(1)
{
P2 = ((P2 & 0x1f) | 0x80);
P0 = 0xff; //LED关
P2 &= 0x1f;
delay();
P2 = ((P2 & 0x1f) | 0x80);
P0 = 0x00; //LED开
P2 &= 0x1f;
delay();
}
}
四、硬件结果拍照
上面实验我们点亮了8个LED灯,但是当我想要点亮一个LED小灯时,输入了以下代码
#include "STC15F2K60S2.H"
void main()
{
P0 = 0xfe;//直接令P0口为0
}
却点亮了8个LED灯。下一节我将介绍其中的原理。
实际代码应该如下:
#include "STC15F2K60S2.H"
#include <intrins.h>
void delay200ms();
void main()
{
while(1)
{
P2=((P2&0x1f)|0x80);// 选择74HC138的Y4输出
P0=0xfe; // 点亮第一个LED灯
P2=P2&0x1f; // 关闭74HC138的Y4输出
delay200ms();
P2=((P2&0x1f)|0x80);
P0=0xff; // 熄灭所有LED灯
P2=P2&0x1f;
delay200ms();
}
}
void delay200ms()// 延时200ms的函数
{
unsigned char data i, j, k;
_nop_();
_nop_();
i = 9;
j = 104;
k = 139;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}