一、流水灯
实验用开发板型号:STC15W4K56S4
1.1硬件设计

由原理可知,LED采用共阴极接法,给高电平LED亮。(LED 共阴极指的是LED共同的接点是GND(接地),而共阳极指的是LED共同的接点是电源,共阳极给低电平LED点亮。LED亮灯的条件是两端有电势差。)
<1>控制LED亮灭需要控制573锁存器,开启573锁存器,使能端口Y3要给高电平1。
Y3端口由74HC02控制,如下图所示。
74HC02原理:
74HC02芯片内部是一个或非门,如下图所示:
或非门原理:
例如上图Y7给高电平1,WR给低电平0,经过逻辑运算或非,1或0 = 1,非就是0,Y7C就是0。74HC02就是经过了一个或非逻辑运算(WR一般在硬件端实现)。
<2>原理图如下图所示可看出Y3的输出和CS与1Y2有关,CS与硬件跳帽连接有关,1Y2连接138译码器。
138译码器简单介绍
由该原理图可知:
138译码器由端口P0.0~P0.2控制,例如:P0.0 --P0.1–P0.2对应000,端口Y0输出0;P0.0 --P0.1–P0.2对应001,端口Y1输出0;P0.0 --P0.1–P0.2对应010,端口Y2输出0。原理就是控制端口的二进制编码对应输出十进制端口的低电平。
138译码器真值表:
1.2硬件流程

1.控制LED灯就要打开使能端口Y3 = 1;
2.使能端口Y3 = 1那么CS = 0,1Y2 = 0,经过或非以后才为1;
3.控制端口P0.0–P0.1–P0.2 = 0–1–1,使138译码器Y3口即1Y2输出0;
4.所以P0的端口控制为P0 = 0x06
所以要打开硬件流程就是:
1.3代码设计
例:依次点亮LED灯再依次熄灭LED灯
/*****
STC15单片机开发系统演示程序
依次点亮LED灯再依次熄灭LED灯
MCU:STC15W4K56S4 ,晶体频率:22.1184MHz
****/
#include <stc15.h>
void Delay(unsigned char t) //@22.1184MHz延时1ms
{
while(t)
{
unsigned char i, j;
_nop_();
_nop_();
i = 22;
j = 128;
do
{
while (--j);
} while (--i);
t--;
}
}
void main()
{
int i = 0;
P0M1=0;P0M0=0;
P1M1=0;P1M0=0;
P2M1=0;P2M0=0;
P3M1=0;P3M0=0;
while(1)
{
P0 = 0x06; //打开控制LED灯的锁存器 0x06 = 0000 0110
for(i = 0;i<8;i++)
{
P2 = 0xff << i; //左移
Delay(100);
}
for(i = 0;i<8;i++)
{
P2 = ~(0xff << i); //~取反
Delay100ms(100);
}
}
}
代码内容解释:
I/O 口工作模式:
STC15W4K58S4 单片机所有 I/O 口都可由软件配置成 4 种工作模式之一:准双向口(标准 8051 单片机输出模式)、推挽输出、仅为输入(高阻)与开漏输出。
每个口的工作模式由 2个控制寄存器(PnM1、PnM0)中的相应位控制,其中 n = 0、1、2、3、4、5、6、7,例如 P0M1 和 P0M0 用于设定 P0 口,其中 P0M1.0和P0M0.0 用于设置 P0.0,P0M1.7 和 P0M0.7 用于设置 P0.7,依次类推,设置关系如表 1-2 所示。STC15 系列中的 STC15W4K32S4 系列芯片,上电后所有与死区控制专用 PWM 相关的 IO 口均为高阻态,需将这些口设置为准双向口或强推挽模式方可正常使用,相关 IO: P0.6/P0.7,P1.6/P1.7,P2.1/P2.2/P2.3/P2.7, P3.7,P4.2/P4.4/P4.5,其余 IO 口上电复位后都是 200uA 的弱上拉输出状态,可直接作输出口使用。
例如:
若设置 P1.7 为开漏,P1.6 为强推挽输出,P1.5 为高阻输入,P1.4、P1.3、P1.2、P1.1 和 P1.0 为弱上拉,则可使用下面的代码进行设置。
P1M1 = 0xa0; // 1010 0000
P1M0 = 0xc0; // 1100 0000
为了所有 IO 口都方便直接使用,可将所有 IO 口都配置为准双向口,函数代码如下。
void port_mode() // 端口模式设置
{
P0M1=0x00; P0M0=0x00;
P1M1=0x00; P1M0=0x00;
P2M1=0x00; P2M0=0x00;
P3M1=0x00; P3M0=0x00;
P4M1=0x00; P4M0=0x00;
P5M1=0x00; P5M0=0x00;
P6M1=0x00; P6M0=0x00;
P7M1=0x00; P7M0=0x00;
}
二、数码管
实验用开发板型号:STC15W4K56S4
2.1硬件设计
数码管简介:
数码管常用的是七段式和八段式LED数码管,八段比七段多了一个小数点,其他的基本相同。所谓的八段就是指数码管里有八个小LED发光二极管,通过控制不同的LED的亮灭来显示出不同的字形。
数码管显示分为位码显示和段码显示;位码显示就是哪一位数码管亮,段码显示就是这一位数码管显示什么数字。
例如显示数字1,需要b,c两处LED亮(共阴极,段码);
dp g f e d c b a = 0000 0110 = 0x06;
原理图:
由图可知,U10(Y1)控制位码,U11(Y2)控制段码。
2.2硬件流程
首先控制位码操作,具体芯片操作上一章已回顾
然后再进行段码操作:
2.3代码设计
数码管显示:
共阴极 0—9:0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71;
共阳极 0—9:0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef,0xf7,0xfc,0xb9,0xde,0xf9,0xf1;
本实验采用的数码管断码是共阴极接法,0亮1灭,位码是共阳极,1亮0灭;573锁存器用法在LED灯介绍过。
例如:数码管第一位循环显示数字0-9
/*****
STC15单片机开发系统演示程序
数码管第一位循环显示数字0-9
MCU:STC15W4K56S4 ,晶体频率:22.1184MHz
****/
#include <stc15.h>
#include <intrins.h>
//共阴极0-9
unsigned char code SMG_DuanMa[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //通过code将断码值设置为表格的形式
void Delay(unsigned char t) //@22.1184MHz延时1ms
{
while(t)
{
unsigned char i, j;
_nop_();
_nop_();
i = 22;
j = 128;
do
{
while (--j);
} while (--i);
t--;
}
}
void HC138_Y(unsigned char n) //138译码器控制使能端口
{
switch(n)
{
case 1: //数码管---位码--控制输出Y1
P0 = ((P0&0xF8)|0x04);
break;
case 2: //数码管---断码--控制输出Y2
P0 = ((P0&0xF8)|0x02);
break;
case 3: //LED灯--控制输出Y3--控制输出Y3
P0 = ((P0&0xF8)|0x06);
break;
case 4: //ULN2003--电机--继电器--控制输出Y4
P0 = ((P0&0xF8)|0x01);
break;
}
}
void main()
{
P0M1=0;P0M0=0;
P1M1=0;P1M0=0;
P2M1=0;P2M0=0;
P3M1=0;P3M0=0;
while(1)
{
HC138_Y(1);//打开位选 ,在第一位显示数字
P2 = 0xFE; //0xFE = 1111 1110
P0 &= 0xF8;//清空控制138译码器的低三位
Delay(100);
for(i =0 ;i<10;i++)
{
HC138_Y(2); //打开段选
P2 = SMG_DuanMa[i];
P0 &= 0xF8;
Delay(100);
}
}
}
若有错误,欢迎各位斧正,留言
附图: