返回信息流最近在弄C8051F020通过串口与PC通信,看了UART的设置,参考了一些网上的代码,写了一个串口通信的程序,但是PC端总收不到或者受到乱码,用示波器看TX端口,感觉输出的波形也不太对,不知道是不是代码错了,望各位大牛指点!
PS:参考的代码没设中断,与使用了查询的方式发送与接收,不知道这样会出现什么问题
#include <c8051f020.h> /*SFR定义*/
#include <intrins.h>
#define BAUDRATE 9600 /*UART0的波特率*/
#define SYSCLK 8000000 /*系统时钟*/
void SYSCLK_Init (void);
void PORT_Init (void);
void UART0_Init (unsigned char BaudRate);
xdata unsigned char temp;
xdata unsigned char tx_buff[9]={0x02,0x37,0x30,0x37,0x30,0x35,0x03,0x30,0x36};
/*延时子程序*/
void delay(unsigned int m)
{
unsigned int n;
n=0;
while(n < m)
{n++;}
return;
}
/*******************************************************************
*
* 函数名称:SYSCLK_Init;
*
* 函数功能描述:系统时钟初始化
,使用内部8MHz晶振作为时钟源;
*
* 输入参数:none;
*
* 返回数据:none;
*
* 注意: none;
*******************************************************************
/
void SYSCLK_Init (void)
{
OSCICN =0x86; //使用内部时钟8M MSCLKE使能时钟丢失检测 CLKSL内部时钟 IOSCEN内部振荡器使能 IFCN0~1=10内部8M
while((OSCICN & 0x10)==0); //内部时钟按设定频率运行 IFRDY 内部振荡器是否按IFCN速度运行}
/***********************************************************************************
* 函数名称:PORT_Init;
*
* 函数功能描述:配置端口初始化
,配置交叉开关和端口;
*
* 输入参数:none;
*
* 返回数据:none;
*
* 注意: none;
************************************************************************************
/
void PORT_Init (void)
{
XBR0 = 0x04; //设置XBR0 UART0 TX和 RX端口
XBR1 INT1E T1E INT0E T0E
XBR2 = 0x40; //打开交叉开关和弱上拉 XBARE 交叉开关使能 UART0E
P0MDOUT = 0x01; //设置P0口输出 p00推挽输出
}
/*******************************************************************************************************************************************
/
* 函数名称:Uart0_Init;
*
* 函数功能描述:Uart0初始化;
*
* 输入参数:unsigned char类型
,发送数据波特率;
*
* 返回数据:none;
*
* 注意: none;
****************************
****************************
****************************
/
void Uart0_Init (unsigned char BaudRate) //Uart0初始化
{
T2CON=0x34; // 工作模式2: TX,RX UART0波特率模式
RCLK0=1 TCLK0=1 ,定时器2允许
PCON|=0x80; // 电源控制寄存器, SMOD1=1,BaudRate加倍
SCON0=0x52; // SCON0:模式1, 8字节UART, 打开RX, 发送中断标志 TI1=1, RI1=0 SM0~1=01 REN1=1
CKCON |= 0x20; // Uart0使用SYSCLK/2作为时间基准 T4M=1 没有12分频
RCAP2H =(65536-(SYSCLK/1200/(BaudRate*32)))/256; //0xFF
RCAP2L =(65536-(SYSCLK/1200/(BaudRate*32)))%256; //0xE6
// 设置定时器Timer2重载值, Uart1_CLK=SYSCLK/2
IE=0X90; //打开中断。允许UART0中断
}
/***************************
****************************
/***************************
****************************
****************************
* 函数名称:Uart0_SendByte;
*
* 函数功能描述:Uart0初始化;
*
* 输入参数:unsigned char类型
指针,发送数据;
*
* 返回数据:none;
*
* 注意: none;
****************************
****************************
****************************
/
void Uart0_SendByte (unsigned char value)
{
delay(6000);
SBUF0=value; // 发送数据到uart0
while(!(TI0)); // 等待发送1个字节数据完成
TI0=0; // 清除中断标志
delay(6000);
}
/***************************
****************************
****************************
* 函数名称: Uart1_SendString;
*
* 函数功能描述:Uart0初始化;
*
* 输入参数:unsigned char类型
指针,发送数据;
*
* 返回数据:none;
*
* 注意: none;
****************************
****************************
****************************
/
void Uart0_SendString (unsigned
char *pt)
{
while(*pt)
{
Uart0_SendByte(*pt++);
}
}
/***************************
****************************
****************************
* 函数名称:Uart0_ReceiveData;
*
* 函数功能描述:Uart0初始化;
*
* 输入参数:none;
*
* 返回数据:unsigned char类型
,接收数据;
*
* 注意: none;
****************************
****************************
****************************
/
unsigned char Uart0_ReceiveData
(void)
{
while(RI0) //接收标志位
{
RI0=0; // 清除RI0标志位
return SBUF0;
}
return 0xff;
}
void main(void)
{
WDTCN = 0xde; /*关看门狗*/
WDTCN = 0xad;
SYSCLK_Init (); /*初始化系统时钟*/
PORT_Init (); /*初始挂交叉开关和I/O口*/
UART0_Init (BAUDRATE); /*初始化UART0,和波特率9600*/
EA=1; //允许所有中断
// ES0=1;
delay(6000);
delay(6000);
delay(6000);
while(1)
{
Uart0_SendString("HELLO");
if(RI0)
{
temp=Uart0_ReceiveData();
Uart0_SendByte (temp);
}
}
delay(6000);
delay(6000);
}
这是一条镜像帖。来源:北邮人论坛 / circuit / #14454同步于 2010/7/17
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Circuit机器人发帖
C8051F020串口通信代码求助!!!!
zhangdc007
2010/7/17镜像同步0 回复
订阅后,新回复会通过你的通知中心匿名送达。
0 条回复
暂无回复 · 你可以订阅本帖等待新回复。