首页 » 科学 » 51单片机进修笔记7 串转并操作方法_数据_时钟

51单片机进修笔记7 串转并操作方法_数据_时钟

雨夜梧桐 2025-01-10 09:22:54 0

扫一扫用手机浏览

文章目录 [+]

在串转并操作中,串行数据首先经由一个串行转并行转换器,该转换器将串行数据拆分为多个并行数据。
这些并行数据同时传输到并行数据吸收器,每个并行数据吸收器卖力吸收并处理个中的一部分数据。
末了,这些处理后的并行数据再通过并行数据输出端口一起输出,形成并行数据流。

二、74HC595先容

74HC595是一种串行输入/并行输出(SIPO)移位寄存器,常用于扩展微掌握器的输出端口:

51单片机进修笔记7 串转并操作方法_数据_时钟 科学

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. 开拓板事理图(1)88 LED点阵:

通过P0 端口掌握列是否有效,设置P0=0,可以启用全部列。
通过 DPa~DPh掌握每一行是否有效,行的数值通过 74HC595传过来。
(2)74HC595 串转并:

传送一个数据的过程:

OE 置低使能芯片;SER传一个BIT数据;给SR_CLK 一个上升沿,将SER的数据移到QA;重复第2步,更多数据移入寄存器,先移入的数据放入A,其它B、C、D…依次向后移动;传完8个bit数据,给 R_CLK一个上升沿,将数据推到DPn的并口输出。
三、代码示例1. LED 滚动显示程序

本代码实验征象是: LED 点阵从最下行向上,每次滚动显示一行。
显示到第一行后,改从最右列向左,每次滚动显示一列。

(1)led_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 i=0; LED_MATRIX_PORT = 0; for(i=0;i<8;i++){ hc595_show_data(0x00); hc595_show_data(gc595_buf[i]); delay_ms(500); }}void hc595_show_column(void){ u8 i=0; hc595_show_data(0xFF); for(i=0;i<8;i++){ LED_MATRIX_PORT = ~gc595_buf[i]; delay_ms(500); }}(2)main.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();}}12345678910111213141516171819202. 显示一个点

void hc595_show_point(u8 x, u8 y){ // 把 LED_MATRIX_PORT 对应的x位置设置为0 x = 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(i=0;i<8;i++){ LED_MATRIX_PORT = gled_column[i]; hc595_show_data(gled_row[i]); delay_10us(280); hc595_show_data(0x00); }}(2)main.c

#include <reg52.h>#include "led_utils.h"#include "common_utils.h"#include "led_matrix_utils.h"#include "types.h"// 数据0u8 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);}}

相关文章