一、流水灯
1.1硬件设计
由原理可知,LED采用共阴极接法,给高电平LED亮。(LED 共阴极是指LED常见的接点是GND(接地),共阳极指LED常见的接点是电源,共阳极给低电平LED点亮。LED亮灯的条件是两端有电势差。) <1>控制LED亮灭需要控制573锁存器,打开573锁存器,使能源端口Y三是给高电平1。 Y3端口由74HC如下图所示,02控制。 74HC02原理: 74HC芯片内部有一个或非门,如下图所示: 或非门原理: 例如上图Y7给高电平1,WR给低电平0,逻辑操作或非,1或0 = 1,非就是0,Y7C就是0。74HC02是通过一个或非逻辑操作(WR一般在硬件端实现)。 <2>原理图如下图所示Y3的输出和CS与1Y2有关,CS与硬件跳帽连接有关,1Y连接138译码器。 简介绍138翻译器
从原理图可以看出: 由端口组成的138译码器P0.0~P0.例如: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); } } }
若有错误,欢迎各位斧正,留言 附图: