基于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通信的特殊功能寄存器列表
- 基于STC15W4K58S4系列1T 8051单片机单主机单从机SPI通信方式 可根据以下内容进行编程
- 基于STC15W4K58S4系列1T 8051单片机互为主从SPI通信方式 可根据以下内容进行编程
- 基于STC15W4K58S4系列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<