一、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。
(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的硬件引腳切換,具體情況如下表。
另外,對于波特率,還有一個很重要的寄存器,即電源控制寄存器(PCON),電源管理寄存器(PCON)也在特殊功能寄存器中,字節地址為87H,不可位尋址,復位值0x00。
PD:掉電模式設定位。PD=0時,單片機處于正常工作狀態;PD=1時,單片機進入掉電(Power Down)模式,可由外部中斷低電平觸發或由下降沿觸發或者硬件復位模式喚醒,進入掉電模式后,外部晶振停振,CPU、定時器、串行口全部停止工作,只有外部中斷繼續工作。
IDL:空閑模式設定位。IDL=0時,單片機處于正常工作模式;IDL=1時,單片機進入空閑(IDLE)模式,除CPU不工作外,其余的部件繼續工作,在空閑模式下可由任何一個中斷或硬件復位喚醒。
三、串口通信程序
注:以下程序在一定程度上已調試成功,但是因為有很多功能沒有實現完,所以后期可能需要修改,后期會進行更新。
- 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
- 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;
}
-
緩沖器
+關注
關注
6文章
1921瀏覽量
45473 -
移位寄存器
+關注
關注
3文章
258瀏覽量
22265 -
串口通信
+關注
關注
34文章
1624瀏覽量
55508 -
STC15F2K60S2
+關注
關注
9文章
25瀏覽量
17297 -
波特率發生器
+關注
關注
0文章
11瀏覽量
4028
發布評論請先 登錄
相關推薦
評論