STM32-(07):串行通信基础(164芯片)

上一篇:STM32-(06):位绑定的基础应用下一篇:STM32-(08):USART通信基础

164芯片的通信

微处理器与外设交换数据的过程中可选择以下两种方式:

并行通信:数据的各个数位同时传送;
串行通信:数据按照位顺序一位一位传送;

通信制式:
在串行通信中数据是在两个站之间进行传送的,按照数据传送方向,串行通信可分为单工、半双工和全双工3中制式。

在这里插入图片描述

1、在单工制式下,数据只能从发送站向接收站传送。
2、在半双工制式下,数据能双向传送,但是不能同时在两个方向上传送。
3、全双工制式下,接收数据和发送数据占用不同的线路。全双工通信可以同时发送和接收。

串行通信标准有许多,下面对部分常见的串行通信标准进行简单介绍。

在这里插入图片描述

最简单的单工通信

1.与外设串行通信过程中,数据是一位一位依次顺序传送的 ; 而在微处理器内部,数据是并行处理和传送的。
2.当微处理器发送数据到外设时,必须要先把并行的数据转换为串行数据再传送;当微处理器接收来自外设的数据时,必须要先把接收到的串行数据转换为并行数据才能处理。
3.这种并/串之间的转换既可用硬件实I也可用软件实现。
4.以74LS164芯片为例,介绍如何用软件方法实现数据的串一并转换。(ARM与74LS164之间的串行通信)

74LS164芯片:串行输入,并行输出
在这里插入图片描述

引脚功能:

1.A、B:串行数据输入端。
2.Clock:时钟输入端。
3.Clear:清零端。低电平有效。
4.QA~QH:数据输出引脚。

真值表:(L低电平,H高电平,X表示任意值,↑表示上升沿)
大致可看出:当清零端为高电平,时钟输入为上升沿时,起作用,A、B有一个输入低电平,输出全为低电平。
在这里插入图片描述

74LS164的时钟是由ARM处理器产生,每来1个上升沿74LS164就接收1位数据。
假设要使QA~QH = 10110011,则ARM 要发送一串数据 10110011 给A、B输入端,并产生相应的时钟信号。

在这里插入图片描述

164内部结构(连接示意----一共有8个D触发器)
在这里插入图片描述

芯片简介

在这里插入图片描述

实验

连接示意

在这里插入图片描述

在这里插入图片描述

代码

// PA.0连接A/B,PA.1连接Clock,PB.0连接Clear
// 使得164的QA~QH输出:11000011

//----------------头文件声明--------------------
#include"stm32f10x_lib.h"		//包含所有的头文件
#include<stdio.h>
//----------------函数声明--------------------
void Delay_MS(u16 dly);
void RCC_Configuration(void);
void GPIO_Configuration(void);

#define PA1 GPIOA->BSRR
#define PA0 GPIOA->BRR

#define GPIOA_ODR_A  (GPIOA_BASE+0x0C)
#define GPIOA_IDR_A  (GPIOA_BASE+0x08)
#define GPIOB_ODR_A  (GPIOB_BASE+0x0C)
#define GPIOB_IDR_A  (GPIOB_BASE+0x08)
#define GPIOC_ODR_A  (GPIOC_BASE+0x0C)
#define GPIOC_IDR_A  (GPIOC_BASE+0x08)
#define GPIOD_ODR_A  (GPIOD_BASE+0x0C)
#define GPIOD_IDR_A  (GPIOD_BASE+0x08)
#define GPIOE_ODR_A  (GPIOE_BASE+0x0C)
#define GPIOE_IDR_A  (GPIOE_BASE+0x08)

#define BitBand(Addr,BitNum)    *((volatile unsigned long *)((Addr&0xF0000000)+0x2000000+((Addr&0xfffff)<<5)+(BitNum<<2)))

#define PAout(n)   BitBand(GPIOA_ODR_A,n)
#define PAin(n)    BitBand(GPIOA_IDR_A,n)
#define PBout(n)   BitBand(GPIOB_ODR_A,n)
#define PBin(n)    BitBand(GPIOB_IDR_A,n)
#define PCout(n)   BitBand(GPIOC_ODR_A,n)
#define PCin(n)    BitBand(GPIOC_IDR_A,n)
#define PDout(n)   BitBand(GPIOD_ODR_A,n)
#define PDin(n)    BitBand(GPIOD_IDR_A,n)
#define PEout(n)   BitBand(GPIOE_ODR_A,n)
#define PEin(n)    BitBand(GPIOE_IDR_A,n)

/*******************************************************************************
* Function Name  : main
* Description    : Main program.
* Input          : None
* Output         : None
* Return         : None
*******************************************************************************/ 
int  main(void)
{
u8 data,i;
//1、设置PA.0推挽输出,设置PA.1、PB.0推挽输出
GPIOA->CRL = 0x33;
GPIOB->CRL = 0X03;
//2、进行164通信 QA~QH=11000100 , PA.0=0, PA.1来一个上升沿
PBout(0) = 1;
data = 0xC4;
for(i=0;i<8;i++)
{
	PAout(1) = 0;
	if((data&0x01)==0x01)
		PAout(0) = 1;
	else
		PAout(0) = 0;
	Delay_MS(1);				
	PAout(1) = 1;
	Delay_MS(1);
	data=data>>1;
} 
	return(1);
}

/*******************************************************************************
* Function Name  : Delay_Ms
* Description    : delay 1 ms.
* Input          : dly (ms)
* Output         : None
* Return         : None
*******************************************************************************/
void Delay_MS(u16 dly)
{
	u16 i,j;
	for(i=0;i<dly;i++)
		for(j=1000;j>0;j--);
}

仿真程序运行结果
在这里插入图片描述

上一篇:STM32-(06):位绑定的基础应用下一篇:STM32-(08):USART通信基础
  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值