一、STC15F2K60S2单片机简介
中国深圳宏晶STC系列单片机是2005年推出中国本土的第一款具有全球竞争力的,且与MCS-51兼容的STC系列单片机。它完全兼容51单片机,是新一代增强型单片机,速度快、抗干扰性强、加密性强,带ADC/PWM,超低功耗,可以远程升级,内部有MAX810专用复位电路,价格低廉。深圳宏晶科技有限公司根据市场需求,在STC89C51、STC89C52的基础上,先后推出STC10、STC11、STC12、STC15系列单片机。
其中,STC15F2K60S2单片机是一种增强型的8051单片机,是新型的FLASH单片机,与传统的8051系列单片机兼容,在片内资源、操作性能和运行速度上做了很大的的改进。IAP15F2K60S2是可以把单片机芯片硬件配置为具有仿真功能的单片机,与Keil C51编译器配合使用,进行仿真实验。
二、STC15F2K60S2单片机串口通信的相关知识
STC15F2K60S2单片机内部有两个可编程的全双工串行通信接口。每个串行口由一个数据缓存器、一个移位寄存器、一个串行控制器和一个波特率发生器组成。每个串行口的数据缓冲器在物理上分为两个独立的发送、接收缓冲器,可以同时发送和接收数据。发送缓存器只可以写入数据,接收缓存器只能读出数据,两个缓冲器共用一个地址。串口1的数据缓冲器为SBUF,地址为99H,串口2的数据缓冲器为S2BUF,地址为9BH。与串行口相关的特殊寄存器见下表。
与串行口相关的特殊寄存器
寄存器 |
功能 |
地址 |
位地址 |
复位值 |
PCON |
电源控制寄存器 |
87H |
SMOD |
SMOD0 |
LVDF |
POF |
GF1 |
GF0 |
PD |
IDL |
00110000 |
AUXR |
辅助寄存器 |
8EH |
T0x12 |
T1x2 |
UART_M0x6 |
T2R |
T2C/T |
T2x12 |
EXTRAM |
S1ST2 |
00000001 |
CLK-DIV |
时钟分频寄存器 |
97H |
MCKO-S1 |
MCKO-S0 |
ADRJ |
Tx-Rx |
Tx2-Rx2 |
CLKS2 |
CLKS1 |
CLKS0 |
00000000 |
SCON |
串口控制寄存器 |
98H |
SM0 |
SM1 |
SM2 |
REN |
TB8 |
RB8 |
TI |
RI |
00000000 |
SBUF |
串口数据寄存器 |
99H |
00000000 |
S2CON |
串口2控制寄存器 |
9AH |
S2M0 |
- |
S2M2 |
S2REN |
S2TB8 |
S2RB8 |
S2TI |
S2RI |
00000000 |
S2BUF |
串口2数据缓冲区 |
9BH |
00000000 |
AUXR1 |
辅助寄存器 |
A2H |
S1_S1 |
S1_S0 |
CCP_S1 |
CCP_S0 |
SPI_S1 |
SPI_S0 |
0 |
DPS |
01000000 |
IE |
中断控制寄存器 |
A8H |
EA |
ELVD |
EADC |
ES |
ET1 |
EX1 |
ET0 |
EX0 |
00000000 |
IE2 |
中断控制寄存器2 |
AFH |
- |
- |
- |
- |
- |
ET2 |
ESPI |
ES2 |
xxxxx000 |
IP2 |
中断优先级控制寄存器2 |
B5H |
- |
- |
- |
- |
- |
- |
PSPI |
PS2 |
xxxxxx00 |
IP |
中断优先级控制寄存器 |
B8H |
PPCA |
PLVF |
PADC |
PS |
PT1 |
PX1 |
PT0 |
PX0 |
00000000 |
P_SW2 |
外围功能切换寄存器 |
BBH |
- |
- |
- |
- |
- |
S4_S |
S3_S |
S2_S |
xxxxx000 |
(1)寄存PCON中的SMOD位为波特率倍增系数选择位,SMOD为1时,波特率加倍。
(2)辅助寄存器AUXR中的UART_M0x6用于设置串口1在方式0时数据传输的波特率,置1时波特率为fsys/2,置0时波特率为fsys/12。辅助寄存器AUXR中的S1ST2位用于选择串口1在方式1、3时的波特率发生器,置1时选择T2为波特率发生器,置0时选择T1为波特率发生器。
(3)串口控制寄存器SCON的功能和用法与一般的8051单片机类似,不同的是其中的SM0/FE位可以用作帧错误检测。
(4)数据寄存器SBUF和S2BUF分别用于串口1和串口2的数据缓冲器。
(5)寄存器S2CON用于设置串口2的工作方式,其余用法与SCON相同。
(6)寄存器IE、IE2中的PS、PS2位分别用于控制串口1和串口2的中断允许与禁止。置1为允许,置0为禁止。
(7)寄存器IP、IP2中的PS、PS2分别用于控制串口1和串口2的中断优先级,置1为高优先级,置0为低优先级。
(8)时钟分频寄存器CLK_DIV中的Tx_Rx用于设置串口1的中继广播方式,置1为中继广播方式,置0为正常工作方式。
(9)辅助寄存器AUXR1的S1_S1、S1_S0位用于串口1的硬件引脚切换,具体情况如下表。
串口1的硬件引脚切换
S1_S1 |
S1_S0 |
TXD |
RXD |
0 |
0 |
P3^1 |
P3^0 |
0 |
1 |
P3^7 |
P3^6 |
1 |
0 |
P1^7 |
P1^6 |
1 |
1 |
无效 |
(10)寄存器P2_SW2的S2_S位用于串口2的硬件引脚切换,具体情况如下表。
串口2的硬件引脚切换
S2_S |
TXD2 |
RXD2 |
0 |
P1^1 |
P1^0 |
1 |
P4^7 |
P4^6 |
另外,对于波特率,还有一个很重要的寄存器,即电源控制寄存器(PCON),电源管理寄存器(PCON)也在特殊功能寄存器中,字节地址为87H,不可位寻址,复位值0x00。
PD:掉电模式设定位。PD=0时,单片机处于正常工作状态;PD=1时,单片机进入掉电(Power Down)模式,可由外部中断低电平触发或由下降沿触发或者硬件复位模式唤醒,进入掉电模式后,外部晶振停振,CPU、定时器、串行口全部停止工作,只有外部中断继续工作。
IDL:空闲模式设定位。IDL=0时,单片机处于正常工作模式;IDL=1时,单片机进入空闲(IDLE)模式,除CPU不工作外,其余的部件继续工作,在空闲模式下可由任何一个中断或硬件复位唤醒。
三、串口通信程序
注:以下程序在一定程度上已调试成功,但是因为有很多功能没有实现完,所以后期可能需要修改,后期会进行更新。
1. UART头文件
#ifndef _UART_H_
#define _UART_H_
#include <STC15F2K60S2.H>
#ifndef uchar
#define uchar unsigned char
#endif
#ifndef uint
#define uint unsigned int
#endif
extern bit pageflag; //返回页面ID标志
extern uchar pageID; //页面ID号
extern uchar pagenum; //页面结束数据检测,满3代表结束
void write_COM(uchar COM);
void write_txt(char *s);
void write_END(void);
void UART_Init();
#endif
2. UART程序
#include "UART.h"
/*********串口送数据**********/
void write_COM(uchar COM)
{
SBUF=COM;
while(!TI);
TI=0;
}
/*********发送文本串**********/
void write_txt(char *s)
{
int i=0;
while(s[i]!=0)
{
write_COM(s[i]);
i++;
}
}
/*********发送结束符**********/
void write_END(void)
{
write_COM(0xFF);
write_COM(0xFF);
write_COM(0xFF);
}
/*********串口初始化**********/
void UART_Init()
{
//串口1 初始化
SCON = 0x50;
AUXR &= 0xBE;
AUXR |= 0x00;
TMOD &= 0x0F;
TMOD |= 0x20;
TH1 = 0xfd;
TL1 = 0xfd;
TR1 = 1; //定时器1启动
ES = 1; //开放串口中断
EA = 1;
// //串口2 初始化
// S2CON = 0x10;
// T2L = 0xE8;
// T2H = 0xFF;
// AUXR &= 0xE3;
// AUXR |= 0x10;
// IE2 &= 0xFE;
// IE2 |= 0x01;
}
/************UART1 中断服务程序*******************/
void Uart1(void) interrupt 4
{
uchar dataflag=0;//返回的十六进制数据的第一位
if(RI) //如果是接收中断
{
RI=0;
dataflag = SBUF; //将接收缓冲区的数据保存到num1变量中
/***********页面接收**********/
if(dataflag==0x66) pageflag = 1;
if(pageflag==1)
{
pageID = dataflag;//接收页面ID号
if(dataflag==0xff) //开始接收结束符
{
pagenum++;
if(pagenum==3) pageflag = 0;//接收3个结束符,数据接收完成
}
}
}
else //如果是发送中断,将TI清0
TI = 0;
}