📄 33xuart.c
字号:
//-----------------------------------------------------------------------------
// UART.c
//-----------------------------------------------------------------------------
// 版权归新华龙电子有限公司所有
// 作者:Robi Ken
// 功能:串口通讯
// 目标板: C8051F33x
// 日期: 2004.12.28
// 开发工具: Silicon Laboratories IDE
//-----------------------------------------------------------------------------
// 所包含的头文件
//------------------------------------------------------------------------
#include <c8051f330.h>
#include <stdio.h>
//-----------------------------------------------------------------------------
// 常量定义
//-----------------------------------------------------------------------------
#define SYSCLK 24500000 // 系统工作频率
#define BAUDRATE 9600 // 串口工作波特率
#define TIMER2_RATE 1000 // 定时器2溢出标志位频率
//-----------------------------------------------------------------------------
// F33x’定时器2的16位SFR
//-----------------------------------------------------------------------------
sfr16 TMR2RL = 0xca;
sfr16 TMR2 = 0xcc;
//--------------------------------------------------------------------------------
// 功能函数
//-----------------------------------------------------------------------------
void SYSCLK_Init (void);
void PORT_Init (void);
void UART0_Init (void);
void Timer2_Init (int);
//-----------------------------------------------------------------------------
// 主程序
//-----------------------------------------------------------------------------
void main (void) {
PCA0MD &= ~0x40; // 禁止看门狗
PORT_Init(); // 初始化端口I/O
SYSCLK_Init (); // 初始化系统时钟
Timer2_Init(SYSCLK/TIMER2_RATE); // 初始化 Timer 2
UART0_Init(); // 串口初始化
printf (" KEN :) Happy new year! \n "); // 输出字符
}
//-----------------------------------------------------------------------------
// 端口初始化
//-----------------------------------------------------------------------------
//
// Configure the Crossbar and GPIO ports.
//
// P0.4 - UART TX
// P0.5 - UART RX
// P3.3 - LED
void PORT_Init (void)
{
P0SKIP |= 0x01;
P0MDIN |= 0x01; // 配置P0.0为模拟出入
P0MDOUT |= 0x10; // 使能 UTX 为推挽输出
P1MDOUT |= 0x08; // 使能 LED 为推挽输出
XBR0 = 0x01; // 使能 UART on P0.4(TX) and P0.5(RX)
XBR1 = 0x40;
}
//-----------------------------------------------------------------------------
// 系统时钟初始化
//-----------------------------------------------------------------------------
void SYSCLK_Init (void)
{
OSCICN |= 0x03; // 配置内部振荡器的的最大频率
RSTSRC = 0x04; // 使能始终丢失检测寄存器
}
//-----------------------------------------------------------------------------
// 串口初始化
//-----------------------------------------------------------------------------
void UART0_Init (void)
{
SCON0 = 0x10;
if (SYSCLK/BAUDRATE/2/256 < 1) {
TH1 = -(SYSCLK/BAUDRATE/2);
CKCON &= ~0x0B;
CKCON |= 0x08;
} else if (SYSCLK/BAUDRATE/2/256 < 4) {
TH1 = -(SYSCLK/BAUDRATE/2/4);
CKCON &= ~0x0B;
CKCON |= 0x09;
} else if (SYSCLK/BAUDRATE/2/256 < 12) {
TH1 = -(SYSCLK/BAUDRATE/2/12);
CKCON &= ~0x0B;
} else {
TH1 = -(SYSCLK/BAUDRATE/2/48);
CKCON &= ~0x0B;
CKCON |= 0x02;
}
TL1 = TH1;
TMOD &= ~0xf0;
TMOD |= 0x20;
TR1 = 1;
TI0 = 1;
}
//-----------------------------------------------------------------------------
// 时钟2中断
//-----------------------------------------------------------------------------
void Timer2_Init (int counts)
{
TMR2CN = 0x00; // 停止时钟2;清除 TF2H 和TF2L;
CKCON |= 0x10;
TMR2RL = -counts;
TMR2 = TMR2RL;
ET2 = 0;
TR2 = 1;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -