📄 uart0.c
字号:
//-----------------------------------------------------------------------------
// WUART0.c
//-----------------------------------------------------------------------------
//
// 作者: daqian
// DATE: 2007年12月7号
//
// Target: C8051F02x
// Tool chain: KEIL C51
//
// 描述:
// 用UART0实现RS-232通信,运行前将TX0和P0.0短接,将RXD和P0.1短接,当接收到一个
// 数据后,再将接收到的数据送出。
//
//-----------------------------------------------------------------------------
// 包含文件
//-----------------------------------------------------------------------------
#include <c8051f020.h> // SFR声明
#include <intrins.h>
//-----------------------------------------------------------------------------
// C8051F02X的16位SFR定义
//-----------------------------------------------------------------------------
sfr16 DP = 0x82; // 数据指针寄存器
sfr16 TMR3RL = 0x92; // Timer3 重加载寄存器
sfr16 TMR3 = 0x94; // Timer3 寄存器
sfr16 ADC0 = 0xbe; // ADC0 转换结果寄存器
sfr16 ADC0GT = 0xc4; // ADC0 下限寄存器
sfr16 ADC0LT = 0xc6; // ADC0 上限寄存器
sfr16 RCAP2 = 0xca; // Timer2 捕捉寄存器
sfr16 T2 = 0xcc; // Timer2 寄存器
sfr16 RCAP4 = 0xe4; // Timer4 捕捉寄存器
sfr16 T4 = 0xf4; // Timer4 寄存器
sfr16 DAC0 = 0xd2; // DAC0 数据寄存器
sfr16 DAC1 = 0xd5; // DAC1 数据寄存器
//-----------------------------------------------------------------------------
// 全局常量
//-----------------------------------------------------------------------------
#define SYSCLK 22118400 // SYSCLK frequency in Hz
#define BAUDRATE 9600 // Baud rate of UART in bps
bit ReceiveBit; // 接受标志位
unsigned char temp;
//-----------------------------------------------------------------------------
// 函数原型
//-----------------------------------------------------------------------------
sbit button = P0^5;
sbit b0=P1^0;
sbit light7=P2^7;
sbit light6=P2^6;
sbit light5=P2^5;
sbit light4=P2^4;
sbit light3=P2^3;
sbit light2=P2^2;
sbit light1=P2^1;
sbit light0=P2^0;
void main (void);
void SYSCLK_Init (void);
void PORT_Init (void);
void UART0_Init (void);
void UART0_ISR (void);
void delay (unsigned int x);//unsigned int m
//-----------------------------------------------------------------------------
// 主程序
//-----------------------------------------------------------------------------
void main (void)
{
char bdata i;
WDTCN = 0xde; // 禁止看门狗定时器
WDTCN = 0xad;
ReceiveBit = 1;
SYSCLK_Init ();
PORT_Init ();
UART0_Init ();
EA = 1; // 允许全局变量
ES0 = 1;
// T1M=0; //系统时钟12分频,兼容51
temp = 0x22;
light7 = 0;
delay(100000);
light6 = 0;
delay(100000);
light5 = 0;
delay(100000);
light4 = 0;
delay(100000);
light3 = 0;
delay(100000);
light2 = 0;
delay(100000);
light1 = 0;
delay(100000);
light0 = 0;
delay(100000);
while(1)
{ // 是否接收到一个数据
// if(button==0)
{
/* b0=1;
delay (6000000); // 延时
b0=0;
delay (6000000);*/
// if(ReceiveBit)
{
SBUF0 = temp; // 将接收到的数据送出
while(TI0 == 0);// 发送标志位是否产生
TI0 = 0;// 清发送标志位
// ReceiveBit=0;
}
}
}
_nop_();
}
//-----------------------------------------------------------------------------
// 初始化程序
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
// 系统时钟初始化
//-----------------------------------------------------------------------------
//
// 该程序初始化系统时钟,使用11.0592MHz的晶振作为时钟源
//
void SYSCLK_Init (void)
{
int i; // 延时计数器
OSCXCN = 0x67; // 启动外部振荡器使用
// 11.0592MHz 的晶体
for (i=0; i < 256; i++) ; // 等待振荡器起振
while (!(OSCXCN & 0x80)) ; // 等待晶体振荡器稳定
OSCICN = 0x88; // 选择外部振荡器作为系统时钟源并允许时钟丢失检测器
}
//-----------------------------------------------------------------------------
// IO口初始化
//-----------------------------------------------------------------------------
//
// 配置交叉开关和GPIO端口
//
void PORT_Init (void)
{
XBR0 = 0x04; // 允许UART0
XBR1 = 0x00;
XBR2 = 0x40; // 允许交叉开关和弱上拉
P0MDOUT |= 0x01; // 使能TX0作为推拉输出
P1MDOUT |= 0x40; // 允许P1.6(LED)为推挽输出
}
//-----------------------------------------------------------------------------
// 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 |= 0x80; // SMOD0 = 1
//TI0 = 1; // Indicate TX0 ready
}
//-----------------------------------------------------------------------------
// UART0_ISR(串口中断0子程序)
//-----------------------------------------------------------------------------
//
void UART0_ISR (void) interrupt 4
{
if(RI0)// 是发送中断还是接收中断
{
RI0 = 0;// 清接收标志位
temp = SBUF0; // 保存接收到的数据
ReceiveBit = 1; // 置接收标志
delay(200);
}
}
void delay(unsigned int x)
{
int i;
for(i=0;i<=x;i++);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -