单片机
返回首页

c51单片机学习笔记-IO扩展(串转并)实验 - 74HC595

2022-07-13 来源:csdn

目的:通过 74HC595 模块控制 LED 点阵以一行循环滚动显示。


编译软件:keil5


过程:


(1)先定义好74HC595 控制管脚,以及点阵列控制口


//定义 74HC595 控制管脚

sbit SRCLK=P3^6; //移位寄存器时钟输入

sbit RCLK=P3^5; //存储寄存器时钟输入

sbit SER=P3^4; //串行数据输入

#define LEDDZ_COL_PORT P0 //点阵列控制端口

u8 ghc595_buf[8]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};

(2)重新定义了一个 ms 级延时函数 delay_ms,该函数与前面 delay_10us 类似,都是利用循环占用 CPU 起到延时效果


void delay_ms(u16 ms)

{

u16 i,j;

for(i=ms;i>0;i--)

for(j=110;j>0;j--);

}

(3)定义了 74HC595 的控制函数 hc595_write_data,该函数完全按照 74HC595 的通信时序要求编写,主要要注意 的是 74HC595 是先传输字节的高位后传输低位,所以需要将字节低位移动到高位传输,在传输数据时,要注意移位寄存器时钟和存储寄存器时钟的先后顺序,将 要写入的数据先传输到 74HC595 寄存器中,即在准备好每位数据时要将 SRCLK 进行一个上升沿变化,此时即可将数据传输到寄存器内,待循环 8 次即一个字节 传输到寄存器中时,就可以来一个存储时钟上升沿,此时就可以将 74HC595 寄存 器中的数据全部一次传输到 595 端口输出。


void hc595_write_data(u8 dat)

{

u8 i=0;

for(i=0;i<8;i++)//循环 8 次即可将一个字节写入寄存器中

{

SER=dat>>7;//优先传输一个字节中的高位

dat<<=1;//将低位移动到高位

SRCLK=0;

delay_10us(1);

SRCLK=1;

delay_10us(1);//移位寄存器时钟上升沿将端口数据送入寄存器中

}

RCLK=0;

delay_10us(1);

RCLK=1;//存储寄存器时钟上升沿将前面写入到寄存器的数据输出

}

(4)main 函数中调用 74HC595 的控制函数,将实验中要实现的效果数据写入进去,从而控制 LED 点阵的阳极, 而阴极由 P0 口控制,默认初始化时已经设置为 0,也就是说只要 595 输出高电 平,那么对应的行就会点亮。


void main()

{

u8 i=0;

LEDDZ_COL_PORT=0x00;//将 LED 点阵列全部设置为 0,即 LED 阴极为低电平

while(1)

{

for(i=0;i<8;i++)

{

hc595_write_data(0x00);//消除前面寄存器缓存数据

hc595_write_data(ghc595_buf[i]);//写入新的数据

delay_ms(500);//延时 500ms

}

}

(5)编译整段代码烧录到开发板

 

(6)如图连接观察实验现象

 

 


进入单片机查看更多内容>>
相关视频
  • RISC-V嵌入式系统开发

  • SOC系统级芯片设计实验

  • 云龙51单片机实训视频教程(王云,字幕版)

  • 2022 Digi-Key KOL 系列: 你见过1GHz主频的单片机吗?Teensy 4.1开发板介绍

  • TI 新一代 C2000™ 微控制器:全方位助力伺服及马达驱动应用

  • MSP430电容触摸技术 - 防水Demo演示

精选电路图
  • PIC单片机控制的遥控防盗报警器电路

  • 使用ESP8266从NTP服务器获取时间并在OLED显示器上显示

  • 用NE555制作定时器

  • 如何构建一个触摸传感器电路

  • 基于ICL296的大电流开关稳压器电源电路

  • 基于TDA2003的简单低功耗汽车立体声放大器电路

    相关电子头条文章