免费英文翻译-现代教育理论
1.
源程序开发环境建立
1.1
程序编译软件
编译软件用
keil
C51
,打开安装文件,一路点击下一步即可完成。
1.2
程序下载软件
使用
STC
ISP
下载软件。
2.
源程序文件整体结构
工程中,只有一个
main.c
文件,所有程序都
写在这个文件里面。
Reg51.h
是包含的头文件。是
不是非常简单!
3.
源程序执行流程
无线
数据处理
程序:
串口
数据处理
程序:
4.
串口配置函数
void serial_open(void)
{
SCON = 0X50;
AUXR |= 0X04;
TL2 = 0Xc0; //
9600
TH2 = 0Xfd;
AUXR|=0X10;
} <
/p>
此串口配置函数,
利用
单片机
内部的
定时器
2
作为
p>
波特率发生器
。
共用到
4
个寄存器:
SCON
AUXR
TL2 TH2
SM0
和
SM1
的位决定串口工作的
4
种方式:
< br>程序中,
SCON=0X50
,即
SM0=0 SM1=1
,即串口工作在
“
< br>方式
1”
;
REN=1
,允许串口接收数
据。
TL2
和
TH2
是
< br>定时器
2
的高位和低位寄存器。
程序中
,首先
AUXR|=0X40
,最后
A
UXR|=0X10
。即首先把
T2x12
置
1
,然后把
T2R
置
1
。即
首先把
定时器
2
设置为
1T
p>
模式,然后把
定时器
打开。
5.
串口发送数据函数
void senddata(uchar data_buf)
{
SBUF = data_buf;
while(!TI);
TI
= 0;
}
用到了寄存器
SBUF
和寄存器
SCON
中的
TI
位。
SBUF
寄存器是串口收发数据缓存寄存器,放到这个寄存器中的数据,会通过串口发送出去,接
收到的串口数据,也会放到这个寄存器中。也就是串口接收和发送都是使用这个寄存器。
程序中,
SBUF=data_buf
,就是把
data_buf
给了
SBUF
,
单片机
自动把<
/p>
SBUF
里面的数据发送
到串口。
TI
是串口发送数据完成标志位,当串口发送完一个数据,此位置
p>
1
,置位后,需要通过软件
清
0
。所以通过
while(!TI)
,来检测
TI
位,达到检测串口是否发送完数据的目的
。当
TI
为
0
,程序会
停留在
while(!TI)
,不断检测;当
TI=1
,
while
括号里面的条件
=0
,退出
while
,程序向下执行。
TI=0
,
把
TI
清
0
。
6.
串口接收数据函数
bit WaitComm()
{
unsigned int i=0;
unsigned char j=0;
if(RI==1)
{
rece_buf[++j]=SBUF;
RI=0;
while(i<1000)
{
if(RI)
{
rece_buf[++j]=SBUF;
RI = 0;
i=0;
}
i++;
}
rece_buf[0] = j;
return 0;
}
else
{
return 1;
}
}
程序中,用到了
SBUF
寄存器和
SCON
寄存器中的
RI
位。
串口接收到数据,
RI
位置
1
,所以,通过判断
RI
位,就可以判断
是否接收到串口数据:
if(RI)
,
就是
if(RI==1)
的省略形式,因为
if
括号里面要的是逻辑真假,即
0
和
1
,所以可以省略。
程序中
i
和
j
用作计数器。
i
用来规定此次串口接收数据所用的
时间,这个时间就是个大概值;
j
用来计数此次串口一共接收到
了多少个字节。
程序中,通过
rec
e_buf[0]=j
把一共接收到多少个字节存储到
rece
_buf
中的第一个字节,通过
rece_buf[++i]=
SBUF
把接收到的数据从
rece_buf
< br>数据的第二个字节依次放进去。
程序有返回值,如果返
回
0
,表示接收到数据,如果返回
1<
/p>
,表示没有接收到数据。
初始化配置函数
void SPI_Init(void)
{
SPSTAT |= 0XC0;
SPCTL = 0XD0;
}
我们用的这款
51
单片机
STC15W404AS
内部有
SPI
通信模块。
引脚配置如下图所示:(红色方框中的引脚)
SS
是片选引脚,也可以叫做使能引
脚,也可以叫做从机选择引脚;
MOSI
是主机输出从机输入引脚;
MISO
是主机输入从机输出引脚;
SCLK
是通信
时钟
< br>引脚。
在我们的应用中,
单片
机
是主机,从机是
NRF24L01
芯
片。
程序中,用到了
2
个寄存器:
SPSTAT
和
SPCTL
。
这个寄存器的
bit6
和
bit7
是有效位,具体定义看上图。程序中,
SPSTAT|=0XC
0
,即向寄存器
的
bit6
和
bit7
写
1
,由上图定义知,我们在清这两个位,目的是不要让这两个位影响
SPI
通信。
程
序中,
SPCTL=0xD0
,即
SS
IG=1 SPEN=1 MSTR=1
,剩下的位
=0
。
因为程序中,
SPR1 SPR0
位为
0
,所以选择了
CPU_CLK/4<
/p>
的
时钟
,因为我们源程序规定的主
频是
22.1184MHz
主频,所以
SPI
速率就是
22.1184/4=5.5
296MHz
,
NRF24L01
芯片
规定的
SPI
通
信速率最大是
10MHz
,所以符合通信的要求。
这两个位的值是由
NRF24L01
的通信时序决定的。
NRF24L01
的
时序图
如下所示:
由
NRF24L01
的
时序图
得知,
SCK
时钟
引脚在空闲时应该是低电平,所以
CPO
L=0
。
还可以看出来,数据是由前
时钟
沿采样,所以
CPHA=0
。
把
时序图
放大,看其中一部分,如下图:
由
NRF24L01
的
时序图
和
RORD
位的定义可知,数据的高位先发送,低位后发送,所以
RORD=0
p>
。
我们选择的
SPI
口为主机模式,把
P1.2/S
S
引脚当做普通
IO
口使用,通过拉低
P1.2
引脚来选
择
< br>NRF24L01
。
数据收发函数
uchar SPI_RW(uchar tr_data)
{
uchar i=0;
SPSTAT |= 0Xc0;
SPDAT=tr_data;
while(((SPSTAT&0X80)!=0X80)&&(i<20))
{
i++;
delay_ms(1);
}
return SPDAT;
}
SPI
是
双工通信
,接收一个数据的同时,就要发送一个数据,发送一个数据的同时,就要接收<
/p>
一个数据。
SPDAT
是
SPI
数据寄存器,接收和发送的数据都放到这里面
。
程序里面,先把
状态寄存器
的位清
0
,然后把要发送的数据给了
SPDAT
,然后通过观察
SPI
状态寄存器
看是否发送完数据,最后把接收到的
SP
I
数据返回。