基于STC12C5A60S2系列1T 8051单片机SPI通信应用

STC12C5A60S2系列1T 8051单片机管脚图

在这里插入图片描述在这里插入图片描述

STC12C5A60S2系列1T 8051单片机I/O口各种不同工作模式及配置

在这里插入图片描述

STC12C5A60S2系列1T 8051单片机I/O口各种不同工作模式介绍

在这里插入图片描述在这里插入图片描述

STC12C5A60S2系列1T 8051单片机SPI通信介绍

在这里插入图片描述在这里插入图片描述在这里插入图片描述

STC12C5A60S2系列1T 8051单片机SPI通信的结构

在这里插入图片描述在这里插入图片描述在这里插入图片描述

基于STC12C5A60S2系列1T 8051单片机SPI通信的特殊功能寄存器列表

在这里插入图片描述

基于STC12C5A60S2系列1T 8051单片机SPI通信用到的特殊功能寄存器

STC12C5A60S2系列1T 8051单片机辅助寄存器AUXR

在这里插入图片描述

STC12C5A60S2系列1T 8051单片机辅助寄存器AUXR1

在这里插入图片描述

SPI控制寄存器SPCTL

在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述
作用:用来设置STC12C5A60S2系列1T 8051单片机SPI通信以下功能
(1)、设置SPI通信主从机选择
(2)、设置SPI通信使能
(3)、设置SPI通信数据发送或接收的位顺序
(4)、设置SPI通信主从机模式
(5)、设置SPI通信时钟极性
(6)、设置SPI通信时钟相位
(7)、设置SPI通信时钟速率

SPI状态寄存器SPSTAT

在这里插入图片描述在这里插入图片描述在这里插入图片描述
作用:用来设置STC12C5A60S2系列1T 8051单片机SPI通信以下功能
(1)、设置SPI通信传输完成标志
(2)、设置SPI通信写冲突标志

SPI数据寄存器SPDAT

在这里插入图片描述在这里插入图片描述在这里插入图片描述
作用:用来设置STC12C5A60S2系列1T 8051单片机SPI通信传输数据

SPI辅助寄存器AUXR1

在这里插入图片描述在这里插入图片描述在这里插入图片描述
作用:用来设置STC12C5A60S2系列1T 8051单片机SPI通信接口切换

SPI通信相关内容

在这里插入图片描述在这里插入图片描述

SPI通信方式

在这里插入图片描述在这里插入图片描述在这里插入图片描述

SPI通信主从机配置

在这里插入图片描述

SPI通信主从机配置注意事项

在这里插入图片描述

SPI通信改变模式

在这里插入图片描述

SPI通信写冲突

在这里插入图片描述

SPI通信具体过程

在这里插入图片描述

SPI通信数据模式

在这里插入图片描述在这里插入图片描述在这里插入图片描述

基于STC15W4K58S4系列1T 8051单片机单主机单从机SPI通信方式 可根据以下内容进行编程

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述

/******以下是某一单片机作为主机的程序******/
#include <stc12c5a60s2.h>
#define uchar unsigned char//自定义无符号字符型为uchar
#define uint unsigned int//自定义无符号整数型为uint 
bit ReceiveDataFlag;//声明收到数据标志位变量
uchar ReceiveData;//声明收到数据变量
 void PortModeSet()//端口模式设置函数
{
   
  P0M1 = 0x00;
  P0M0 = 0x00;
  P1M1 = 0x00;
  P1M0 = 0x00;
  P2M1 = 0x00;
  P2M0 = 0x00;
  P3M1 = 0x00;
  P3M0 = 0x00;
  P4M1 = 0x00;
  P4M0 = 0x00;
 }
/*****关于8051系列单片机定时器溢出率、波特率和定时器初值(定时计数初值)之间计算的知识点*****/
/****
一、定时器溢出率计算公式
1、定时器溢出率:定时器每秒溢出的次数
2、定时器溢出率计算公式表
    定时方式           分频方式                      公式
方式1:16位定时器  12分频(即12T 默认值)  Ft=晶振频率/12/(65536-定时器初值)
方式2:8位定时器   12分频(即12T 默认值)  Ft=晶振频率/12/(256-定时器初值)
方式1:16位定时器      1分频(即1T)      Ft=晶振频率/1/(65536-定时器初值)
方式2:8位定时器       1分频(即1T)      Ft=晶振频率/1/(256-定时器初值)
二、波特率计算公式
1、波特率:每秒传输二进制位数的多少
2、波特率计算公式表
    定时方式             分频方式                        公式
方式1:16位定时器T1  12分频(即12T 默认值)  波特率=晶振频率/12/(65536-定时器初值)/4
方式2:8位定时器T1   12分频(即12T 默认值)  波特率=晶振频率/12/(256-定时器初值)*2^SMOD/32
方式1:16位定时器T2  12分频(即12T 默认值)  波特率=晶振频率/12/(65536-定时器初值)/4
方式1:16位定时器T1      1分频(即1T)      波特率=晶振频率/1/(65536-定时器初值)/4
方式2:8位定时器T1       1分频(即1T)      波特率=晶振频率/1/(256-定时器初值)*2^SMOD/32
方式1:16位定时器T2      1分频(即1T)      波特率=晶振频率/1/(65536-定时器初值)/4
三、根据波特率计算定时器初值(定时器定时计数)
    定时方式             分频方式                        公式
方式1:16位定时器T1  12分频(即12T 默认值)  定时器初值(定时计数)=65536-晶振频率/(48*波特率)
方式2:8位定时器T1   12分频(即12T 默认值)  定时器初值(定时计数)=256-晶振频率*2^SMOD/(384*波特率)
方式1:16位定时器T2  12分频(即12T 默认值)  定时器初值(定时计数)=65536-晶振频率/(48*波特率)
方式1:16位定时器T1      1分频(即1T)      定时器初值(定时计数)=65536-晶振频率/(4*波特率)
方式2:8位定时器T1       1分频(即1T)      定时器初值(定时计数)=256-晶振频率*2^SMOD/(32*波特率)
方式1:16位定时器T2      1分频(即1T)      定时器初值(定时计数)=65536-晶振频率/(4*波特率)
*****/
 void UartInit()//串行口1工作模式1的8位串行口波特率可变初始化函数 波特率为9600bps 晶振为22.1184MHz
{
   
  AUXR = 0x00;//设定定时器1的12分频定时作为串行口1的波特率发生器
  PCON &= 0x7f;//波特率不加倍
  SCON = 0x50;//工作模式1的8位串行口波特率可变
  TMOD &= 0x0f;//定时器/计数器工作模式清0
  TMOD |= 0x20;//设定定时器/计数器为定时器 工作模式为8位自动重装定时器1模式2
  TH1 = 0xfa;//设定定时器1高八位初值
  TL1 = 0xfa;//设定定时器1低八位初值
  ET1 = 0;//禁止定时器1中断
  ES = 1;//允许串行口1中断
  EA = 1;//开总中断
  TR1 = 1;//打开定时器1
 }
 void PortChange()//端口切换函数
{
   
  AUXR1 &= 0xf3;//默认SPI通信片选引脚、MOSI引脚、MISO引脚、SCLK引脚分别为单片机P1.2引脚、P1.3引脚、P1.4引脚、P1.5引脚
  AUXR1 |= 0x04;//由于是两个单片机进行SPI通信 因此SPI通信引脚要切换 则由上面SPI通信引脚切换表可知:原默认SPI通信片选引脚、MOSI引脚、MISO引脚、SCLK引脚所对应的单片机P1.2引脚、P1.3引脚、P1.4引脚、P1.5引脚要切换成另一单片机P2.4引脚、P2.3引脚、P2.2引脚、P2.1引脚
 }
 void main()//主函数
{
   
  uchar TemporaryData,SpiStatus;//声明临时数据变量 SPI状态变量
  PortModeSet();//端口模式设置函数
  UartInit();//串行口1工作模式1的8位串行口波特率可变初始化函数 波特率为9600bps 晶振为22.1184MHz
  PortChange();//端口切换函数
  SPCTL = 0xf0;//忽略片选 设定该器件为主机 SPI使能通信 数据最低位先发送 主机模式 SPI时钟空闲时低电平 前时钟沿为上升沿 后时钟沿为下降沿 前时钟沿采样外部数据 后时钟沿输出数据 SPI时钟速率位为CPU_CLK/4
  while(1)//主循环
 {
   
   if(RI)//判断主单片机串行口数据缓存器是否接收到数据
  {
   
    TemporaryData = SBUF;//读取主单片机串行口数据缓存器中的数据赋给临时数据变量 即主单片机串行口缓存寄存器通过串行口通信接收计算机用串口助手发送来的数据
    RI = 0;//主单片机串行口接收数据标志位清0
    SPDAT = TemporaryData;//把临时数据变量包含的数据写入主单片机SPI数据寄存器 即主单片机SPI数据寄存器通过SPI通信将数据发送给从单片机
    SpiStatus = 0;//SPI状态变量清0
    while(SpiStatus == 0)//当SPI状态变量为0
   {
   
     SpiStatus = SPSTAT;//当串行口传输完数据 读取SPI状态寄存器中SPIF传完数据标志位赋给SPI状态变量
     SpiStatus = SpiStatus & 0x80;//当SPI状态变量为1 跳出while(SpiStatus == 0)
    }
    SPSTAT = 0xc0;//SPI状态寄存器中SPIF传完数据标志位清0
    ReceiveData = SPDAT;//读取主单片机SPI数据寄存器中的数据赋给接收数据变量 即主单片机通过SPI通信接收从单片机SPI数据寄存器发送来的数据
    SBUF = ReceiveData;//把接收数据变量包含的数据赋给主单片机串行口数据缓存器 即主单片机通过串行口通信把来自从单片机SPI数据寄存器发送来的数据发送给计算机
    while(TI == 0);//等待串行口发送完数据
    TI = 0<
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
STC12C5A60S2是一款基于8051内核的单片机,支持SPI通信。以下是STC12C5A60S2SPI通信步骤: 1. 配置SPI口线 在STC12C5A60S2上,SPI通信需要配置P1口线为SPI口线。具体配置方法如下: ``` sbit SPIMISO = P1^1; sbit SPIMOSI = P1^2; sbit SPICLK = P1^3; sbit SPISS = P1^4; ``` 2. 初始化SPI口线 在SPI通信之前,需要对SPI口线进行初始化。具体初始化方法如下: ``` void SPI_Init() { SPIMISO = 1; // MISO高电平 SPICLK = 0; // CLK低电平 SPISS = 1; // SS高电平 SPIMOSI = 1; // MOSI高电平 } ``` 3. 配置SPI工作方式 在STC12C5A60S2上,SPI通信有三种工作方式,分别为0、1、2。可以通过CPHA和CPOL位来选择工作方式。具体配置方法如下: ``` void SPI_Config(unsigned char cpha, unsigned char cpol) { switch(cpha) { case 0: SPICPHA = 0; break; case 1: SPICPHA = 1; break; default: break; } switch(cpol) { case 0: SPICPOL = 0; break; case 1: SPICPOL = 1; break; default: break; } } ``` 4. 发送数据 在SPI通信中,发送数据需要将数据写入SPIMOSI寄存器,然后拉低SPICLK信号,等待从机接收数据。具体方法如下: ``` unsigned char SPI_SendByte(unsigned char data) { unsigned char i; for(i = 0; i < 8; i++) { if(data & 0x80) SPIMOSI = 1; else SPIMOSI = 0; data <<= 1; SPICLK = 1; data |= SPIMISO; SPICLK = 0; } return data; } ``` 5. 接收数据 在SPI通信中,接收数据需要将数据从SPIMISO寄存器读出,并且拉低SPICLK信号,等待主机发送数据。具体方法如下: ``` unsigned char SPI_ReceiveByte() { unsigned char i, data = 0; for(i = 0; i < 8; i++) { SPICLK = 1; data <<= 1; if(SPIMISO) data |= 0x01; SPICLK = 0; } return data; } ``` 以上就是STC12C5A60S2SPI通信步骤。在实际应用中,可以根据具体的需求来选择相应的通信方式和参数。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值