📄 uart1.c
字号:
//-----------------------------------------------------------------------------
// WUART0.c
//-----------------------------------------------------------------------------
//
// 作者: LILU
// DATE: 2008年12月22号
//
// Target: C8051F02x
// Tool chain: KEIL C51
//
// 描述:
//
//
//-----------------------------------------------------------------------------
// 包含文件
//-----------------------------------------------------------------------------
#include <c8051f020.h> // SFR声明
#include <intrins.h>
//-----------------------------------------------------------------------------
// C8051F02X的16位SFR定义
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
// 全局常量
//-----------------------------------------------------------------------------
#define SYSCLK 22118400 // SYSCLK frequency in Hz
#define BAUDRATE 9600 // Baud rate of UART in bps
bit sendbit0;
bit sendbit1;
unsigned char tempr0,tempr1,tempt0,tempt1;
//-----------------------------------------------------------------------------
// 函数原型
//-----------------------------------------------------------------------------
void main (void);
void SYSCLK_Init (void);
void PORT_Init (void);
void UART0_Init (void);
void UART0_ISR (void);
void UART1_Init (void);
void UART1_ISR (void);
void delay (unsigned int x);//unsigned int m
//-----------------------------------------------------------------------------
// 主程序
//-----------------------------------------------------------------------------
void main (void)
{
char bdata i;
WDTCN = 0xde; // 禁止看门狗定时器
WDTCN = 0xad;
SYSCLK_Init ();
PORT_Init ();
UART0_Init ();
UART1_Init ();
EA = 1; // 允许全局变量
ES0 = 1; // UART0 中断允许
EIE2 |= 0x40; // UART1 中断允许
tempt0 = 0x03;
tempt1 = 0x55;
sendbit0 = 0;
sendbit1 = 0;
while(1)
{
if(sendbit0)
{
SBUF0 = tempt0;
}
if(sendbit1)
{
SBUF1 = tempt1;
}
}
_nop_();
}
//-----------------------------------------------------------------------------
// 初始化程序
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
// 系统时钟初始化
//-----------------------------------------------------------------------------
//
// 该程序初始化系统时钟,使用22.1184MHz的晶振作为时钟源
//
void SYSCLK_Init (void)
{
int i; // 延时计数器
OSCXCN = 0x67; // 启动外部振荡器使用
// 22.1184MHz 的晶体
for (i=0; i < 256; i++) ; // 等待振荡器起振
while (!(OSCXCN & 0x80)) ; // 等待晶体振荡器稳定
OSCICN = 0x88; // 选择外部振荡器作为系统时钟源并允许时钟丢失检测器
}
//-----------------------------------------------------------------------------
// IO口初始化
//-----------------------------------------------------------------------------
//
// 配置交叉开关和GPIO端口
//
void PORT_Init (void)
{
XBR0 = 0x07; // 允许UART0
XBR1 = 0x00;
XBR2 = 0x44; // 允许交叉开关和弱上拉,允许UART1,P1.0(TX1),P1.1(RX1)
P0MDOUT |= 0x01; // 使能TX0作为推拉输出
P1MDOUT |= 0x01; // 使能TX1作为推拉输出
}
//-----------------------------------------------------------------------------
// UART0_Init(串口通信扩展用)
//-----------------------------------------------------------------------------
//
// 配置UART0使用Timer1, 波特率为<baudrate>,桢格式为8-N-1.
//
void UART0_Init (void)
{
SCON0 = 0x50; // SCON0: mode 1, 8-bit UART, enable RX
TMOD = 0x20; // TMOD: timer 1, mode 2, 8-bit reload
TH1 = 244; // set Timer1 reload value for baudrate:-(SYSCLK/BAUDRATE/16)
TL1 = TH1;
TR1 = 1; // start Timer1
// CKCON |= 0x10; // Timer1 uses SYSCLK as time base
PCON |= 0x90; // SMOD0 = 1,SMOD1 = 1
// TI0 = 1; // Indicate TX0 ready
}
//-----------------------------------------------------------------------------
// UART1_Init(串口通信扩展用)
//-----------------------------------------------------------------------------
//
// 配置UART1使用Timer4, 波特率为<baudrate>,桢格式为8-N-1.
//
void UART1_Init (void)
{
// RCAP4L = 0xB8; //set value for baudrater:-(65536-SYSCLK/BAUDRATE)/32,(=1976)
// RCAP4H = 0x07;
// TL4 = 0xB8;
// TH4 = 0x07;
// T4CON = 0x34; //T4CON: timer4, mode 3,UART1 tx/rx rate;Indicate TR4 ready
SCON1 = 0x50; // SCON1: mode 1, 8-bit UART, enable RX
}
//-----------------------------------------------------------------------------
// UART0_ISR(串口中断0子程序)
//-----------------------------------------------------------------------------
//
void UART0_ISR (void) interrupt 4
{
if(RI0)// 接收中断
{
RI0 = 0;// 清接收标志位
tempr0 = SBUF0;
}
}
//-----------------------------------------------------------------------------
// UART1_ISR(串口中断1子程序)
//-----------------------------------------------------------------------------
//
void UART1_ISR (void) interrupt 20
{
if(SCON1 == 0x55)// 接收中断
{
SCON1 = 0x50;// 清接收志位
tempr1 = SBUF1;
tempt1 = tempr1;
sendbit1 = 1;
}
}
void delay(unsigned int x)
{
int i;
for(i=0;i<=x;i++);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -