📄 uart.c
字号:
#include "STK6031.h"
//********************************************************************************
//定义数据类型
typedef unsigned char uint8;
typedef unsigned int uint16;
//下面宏定义用来选择UART 的接受或发送及是否使用中断方式
#define USE_INT 0
#define SEND_REC 1
/*
********************************************************************************
* 函 数 名:InitMCU
* 功能描述:初始化MCU,其中包括初始化各I/O口,CHIPCON,
CKCON,选择I/O口的功能
* 输 入: 无
* 返 回: 无
********************************************************************************
*/
void InitMcu(void)
{
P0 = 0xFF; //初始化各I/O 口
P1 = 0xFF;
P2 = 0xFF;
P3 = 0xFF;
P4 = 0x0F;
CHIPCON = 0x1A; // 设置CPUCLK=XTAL1/3
CKCON = 0x39; // 设置TIMER0,TIMER1,TIMER2 的计数频率为CPUCLK/4
}
#if USE_INT
#if SEND_REC
/*
********************************************************************************
* 函 数 名:
* 功能描述: 使用查询方式控制串行口通信,工作在模式1,
TIMER1 作为波特率发生器。设波特率为6250 b/s
* 输 入: 无
* 返 回: 无
********************************************************************************
*/
//UART, 通过TxD 脚发送,查询方式
void main(void)
{
InitMcu();
SCON = 0x52; // UART 工作在模式1
TMOD = 0x21; // TIMER1 工作在模式2,自动装载初值模式
// TH1 = 256-(31250/6250); // 晶振为12MHz
TH1 = 256-(62500/6250); // 晶振为24 MHz
TR1 = 1; // TIMER1 定时开始
while(1)
{
if(TI) // 查询发送中断标志位有没变化
{
TI = 0; //当发送中断置位后清除该标志位
SBUF = 0xF0; // 发送数据
}
}
}
#else
//UART, 通过RxD 脚接收,查询方式
void main(void)
{
InitMcu();
uint8 temp = 0; //接收寄存器
SCON = 0x52; // UART 工作在模式1
TMOD = 0x21; // TIMER1 工作在模式2,自动装载初值模式
TH1 = 256-(31250/6250); // 12MHz
//TH1 = 256-(62500/6250); // 24 MHz
TR1 = 1;
while(1)
{
if(RI) // 查询接收中断标志位有没变化
{
RI = 0;
temp = SBUF; // 接收数据
}
}
}
#endif
#else
#if SEND_REC
/*
********************************************************************************
* 函 数 名:
* 功能描述: 使用中断方式控制串行口通信,工作在模式1,
TIMER2 作为波特率发生器。设波特率为2500 b/s
* 输 入: 无
* 返 回: 无
********************************************************************************
*/
//UART, 通过TxD 脚发送,中断方式
void main(void)
{
InitMcu();
SCON = 0x52; // UART 工作在模式1
TCLK = 1; // 使用T2 作为波特率发生器的发送时钟
C_T2 = 0; // 配置T2 为定时器
TL2 = 0x9C; // 设置初值
TH2 = 0xFF;
RCAP2L = 0x9C; // 设置装载值
RCAP2H = 0xFF;
ES = 1; // 允许UART 中断
EA = 1; // CPU 开中断
TR2 = 1; // TIMER2 定时开始
while(1); // 等待中断
}
//中断程序4,串行口中断
void ISR_UART(void) interrupt INTERRUPT_SERIAL
{
TI = 0; //当发送中断置位后清除该标志位
SBUF = 0x0F; // 发送数据
}
#else
//UART, 通过RxD 脚接收,中断方式
uint8 rectemp; // 接收寄存器
void main(void)
{
InitMcu();
SCON = 0x52; // UART 工作在模式1
RCLK = 1; // 使用T2 作为波特率发生器的接收时钟
C_T2 = 0; // 配置T2 为定时器
TL2 = 0x9C;
TH2 = 0xFF;
RCAP2L = 0x9C;
RCAP2H = 0xFF;
ES = 1; // 允许UART 中断
EA = 1; // CPU 开中断
TR2 = 1; // TIMER2 定时开始
while(1); // 等待中断
}
//中断程序4,串行口中断
void ISR_UART(void) interrupt INTERRUPT_SERIAL
{
RI = 0; //当接收中断置位后清除该标志位
rectemp = SBUF; // 发送数据
}
#endif
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -