?? 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 + -