公司电商网站开发合同,wordpress 学校,郑州快速网站优化公司哪家好,书法网站建设51单片机学习笔记7 串转并操作方法 一、串转并操作简介二、74HC595介绍1. **功能**#xff1a;2. **引脚**#xff1a;3. **工作原理**#xff1a;4. 开发板原理图#xff08;1#xff09;8*8 LED点阵#xff1a;#xff08;2#xff09;74HC595 串转并#xff1a; 三… 51单片机学习笔记7 串转并操作方法 一、串转并操作简介二、74HC595介绍1. **功能**2. **引脚**3. **工作原理**4. 开发板原理图18*8 LED点阵274HC595 串转并 三、代码示例1. LED 滚动显示程序1led_matrix_utils.c2main.c 2. 显示一个点3. 显示字符程序1 led_matrix_utils.c2main.c 一、串转并操作简介
由于单片机的I/O资源有限在进行一些外围设备通讯时如LED点阵、数码管操作需要大量的I/O资源为了减少单片机的资源占用可以使用串转并的操作通过引入专用芯片用较少的单片机I/O引脚控制大量的外围I/O引脚设备。
在串转并操作中串行数据首先经过一个串行转并行转换器该转换器将串行数据拆分为多个并行数据。 这些并行数据同时传输到并行数据接收器每个并行数据接收器负责接收并处理其中的一部分数据。 最后这些处理后的并行数据再通过并行数据输出端口一起输出形成并行数据流。
二、74HC595介绍
74HC595是一种串行输入/并行输出SIPO移位寄存器常用于扩展微控制器的输出端口
1. 功能
74HC595具有8位并行输出端口可以同时控制8个输出设备如LED、数码管等。它具有串行输入端口可以通过串行输入将数据加载到内部寄存器中。74HC595还具有控制引脚用于控制数据的加载和输出使能。74HC595的并行输出为三态输出高电平、低电平
2. 引脚 DS串行数据输入用于接收串行输入数据。SH_CP时钟输入用于接收时钟脉冲控制数据的移位。ST_CP存储时钟输入用于接收存储时钟脉冲控制数据的加载到寄存器中。OE输出使能用于控制输出端口的使能状态。Q7’串行输出输出从DS端输入的数据用于级联多个74HC595。Q0-Q7并行输出8位并行输出端口。
其中Q7’可以级联下一个74HC595这样通过3个单片机的IO口可以控制更多的外设IO。
3. 工作原理
74HC595的工作过程分为两个阶段移位阶段和存储阶段。移位阶段在时钟信号的作用下串行输入的数据从DS端依次移位到寄存器中。存储阶段当存储时钟信号触发时寄存器中的数据被加载到并行输出端口并同时输出到外部设备。
4. 开发板原理图
18*8 LED点阵 通过P0 端口控制列是否有效设置P00可以启用全部列。通过 DPa~DPh控制每一行是否有效行的数值通过 74HC595传过来。
274HC595 串转并 传送一个数据的过程
OE 置低使能芯片SER传一个BIT数据给SR_CLK 一个上升沿将SER的数据移到QA重复第2步更多数据移入寄存器先移入的数据放入A其它B、C、D…依次向后移动传完8个bit数据给 R_CLK一个上升沿将数据推到DPn的并口输出。
三、代码示例
1. LED 滚动显示程序
本代码实验现象是 LED 点阵从最下行向上每次滚动显示一行。 显示到第一行后改从最右列向左每次滚动显示一列。
1led_matrix_utils.c
#include led_matrix_utils.h
#include common_utils.h// 时钟输入引脚用于控制数据的移位操作
sbit SR_CLK P3^6;
// 数据数据推到输出寄存器的引脚
sbit R_CLK P3^5;
// 串行数据输入
sbit SER P3^4;u8 gc595_buf[8] {0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80};// 低电平有效开启列
#define LED_MATRIX_PORT P0void hc595_show_data(u8 show_data)
{u8 i 0;for (i 0; i 8; i){SER show_data 7 ;show_data 1;// 移位寄存器时钟上升沿,进行移位操作SR_CLK 0;delay_10us(1);SR_CLK 1;delay_10us(1);}// 输出寄存器时钟上升沿,将移位寄存器的数据复制到输出寄存器R_CLK 0;delay_10us(1);R_CLK 1;delay_10us(1);
}
void hc595_show_row(void){u8 i0;LED_MATRIX_PORT 0;for(i0;i8;i){hc595_show_data(0x00);hc595_show_data(gc595_buf[i]);delay_ms(500);}
}
void hc595_show_column(void){u8 i0;hc595_show_data(0xFF);for(i0;i8;i){LED_MATRIX_PORT ~gc595_buf[i];delay_ms(500);}
}
2main.c
#include reg52.h
#include led_utils.h
#include common_utils.h
#include led_matrix_utils.h/**
* brief 主函数
*/
main()
{// 关闭所有ledled_all_off();while(1){hc595_show_row();hc595_show_column();}
}
2. 显示一个点
void hc595_show_point(u8 x, u8 y){// 把 LED_MATRIX_PORT 对应的x位置设置为0x 8-x;y 8-y;LED_MATRIX_PORT ~(0x01 x);hc595_show_data(gc595_buf[x]);delay_ms(1000);
}
3. 显示字符程序
1 led_matrix_utils.c
#include led_matrix_utils.h
#include common_utils.h
#include reg52.h// 时钟输入引脚用于控制数据的移位操作
sbit SR_CLK P3^6;
// 数据数据推到输出寄存器的引脚
sbit R_CLK P3^5;
// 串行数据输入
sbit SER P3^4;u8 gled_column[8] {0x7f, 0xbf, 0xdf, 0xef, 0xf7, 0xfb, 0xfd, 0xfe};// 低电平有效开启列
#define LED_MATRIX_PORT P0void led_matrix_init(void){LED_MATRIX_PORT 0x00;
}
void hc595_show_data(u8 show_data)
{u8 i 0;for (i 0; i 8; i){SER show_data 7 ;show_data 1;// 移位寄存器时钟上升沿,进行移位操作SR_CLK 0;delay_10us(1);SR_CLK 1;}// 输出寄存器时钟上升沿,将移位寄存器的数据复制到输出寄存器R_CLK 0;delay_10us(1);R_CLK 1;
}
void hc595_show_char(u8* gled_row){u8 i 0;for(i0;i8;i){LED_MATRIX_PORT gled_column[i];hc595_show_data(gled_row[i]);delay_10us(280);hc595_show_data(0x00);}
}
2main.c
#include reg52.h
#include led_utils.h
#include common_utils.h
#include led_matrix_utils.h
#include types.h
// 数据0
u8 gled_row[8] {0x00, 0x7c, 0x82, 0x82, 0x82, 0x7c, 0x00, 0x00};
/**
* brief 主函数
*/
main()
{// 关闭所有ledled_all_off();led_matrix_init();while(1){hc595_show_char(gled_row);}
}
本文开源地址https://gitee.com/xundh/learn51