STC15学习笔记 第一章 流水灯与数码管

一、流水灯

实验用开发板型号: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);  
        }  
    }  
} 

若有错误,欢迎各位斧正,留言
附图:
在这里插入图片描述


版权声明:本文为qq_52670281原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。