资讯详情

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

一、流水灯

实验开发板型号:STC15W4K56S4

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);  
        }  
    }  
} 

若有错误,欢迎各位斧正,留言 附图:

标签: y2p连接器k58继电器

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台