求教一个C8051F310单片机的串口通信问题
//波特率为115200
#include <c8051f310.h>
#define uchar unsigned char
#define uint unsigned int
#define MaxLen 100
//----------------------------------------------------------------------------
//硬件地址
//----------------------------------------------------------------------------
sbit LED1=P3^3;
sbit LED2=P3^4;
uint readflag=0; //读标志
uchar idata RxData[MaxLen]; //接收数据存放位置
//-----------------------------------------------------------------------------
// 端口初始化
// P0.4 - UART TX
// P0.5 - UART RX
//-----------------------------------------------------------------------------
void PORT_Init (void)
{
P3MDOUT |= 0x18; // 使能 LED p3.3, p3.4为推挽输出
XBR0 = 0x01; // 交叉开关使能 UART P0.4(TX) and P0.5(RX)
XBR1 = 0x40; //使能交叉开关
}
//-----------------------------------------------------------------------------
// 系统时钟初始化
//-----------------------------------------------------------------------------
void SYSCLK_Init (void)
{
OSCICN |= 0x83; // 配置内部振荡器的的最大频率 1000 0011
RSTSRC = 0x04; // 使能始终丢失检测寄存器
}
//-----------------------------------------------------------------------------
// 串口初始化
//-----------------------------------------------------------------------------
void UART0_Init (void)
{
SCON0 = 0x10; //波特率可编程8位UART,UART接收允许
CKCON = 0x08; //定器1使用系统时钟(=0x08可将波特率设为115200,=00可将波特率设为9600)
TMOD = 0x20; //定时器1设为自动重装8位计数定时器
TH1=0X96; //为波特率装定时器初值
TL1=TH1;
TR1 = 1; //起动定时器1
}
//-----------------------------------------------------------------------------
// 延时程序
//-----------------------------------------------------------------------------
void Delayms(unsigned int count)
{
unsigned int i,j;
for(i=0;i<count;i++)
for(j=0;j<200;j++);
}
//-------------------------------------------------------------------------
//串口发送一个字节
//-------------------------------------------------------------------------
void Putchar(char c)
{
SBUF0=c; //发送一个字节
while(TI0==0); //等待发完一个字节
TI0=0; //清除发送中断标志
//readflag -=1;
}
//-------------------------------------------------------------------------
//串口发送接收到的数据存储区中的字符串
//-------------------------------------------------------------------------
void Putsting(char *ptr)
{
int i=0;
while(*(ptr+i) != '\0') //判断是否发完一个字符串
{
Putchar(*ptr);
ptr++;
i++;
//LED1=1;
};
//LED1=~LED1;
}
//----------------------------------------------------------
//系统初始化
//---------------------------------------------------------
void sys_init(void)
{
PCA0MD &= ~0x40; // 禁止看门狗
PORT_Init(); // 初始化端口I/O
SYSCLK_Init (); //初始化系统时钟
UART0_Init(); //串口初始化
ES0=1; //开串行中断
TI0=0;
//TR0=1;
//延时2秒后灯灭
LED1=1;
LED2=1;
Delayms(2000);
LED1=0;
LED2=0;
}
//-----------------------------------------------------------------------------
// 串行中断服务程序
//-----------------------------------------------------------------------------
void UART0_ISR (void) interrupt 4
{
uint i=0;
uchar temp_Tx;
if(RI0==1)
{
RI0=0; //复位接收中断标志位
temp_Tx=SBUF0; //接收数据到缓存
//flag_Tx=1; //打开中断发数标志位
i++;
if(i > MaxLen-1)
{
i = 0;
}
RxData[i]=temp_Tx;
readflag=1;
}
TI0=0; //复位发送中断标志位
}
//-----------------------------------------------------------------------------
// 主程序
//-----------------------------------------------------------------------------
void main (void)
{
sys_init();//初始化系统
EA=1; //开总中断
while(1)
{
if(readflag)
{
readflag=0;
Putsting(RxData);
LED2=1;
}
}
相关推荐
C8051F310例程
串口通信:C8051F310支持UART(通用异步收发传输器)通信,可以与外部设备进行串行数据交换。开发者需要掌握如何设置波特率、奇偶校验、停止位等参数,以及发送和接收数据的流程。
C8051F330与VC++串口通信实战:从固件UART配置到上位机波形显示
在嵌入式系统与上位机联合开发中,串口通信始终是连接单片机与PC端的核心桥梁。C8051F330作为集成高速8051内核、ADC及可编程交叉开关的混合信号控制器,其UART引脚映射与时钟配置直接决定通信可靠性;而Visual C++通过Win32 API实现串口读写与波形绘制,则构成典型的数据采集显示链路。理解波特率误差计算、环形缓冲帧同步、生产者消费者线程模型等基础原理,是解决乱码、丢帧、界面卡顿等工程问题的关键。该技术组合广泛应用于传感器数据采集、信号监测与工业控制场景,尤其适合需要快速搭建上位机界面的中
物联网全栈开发实战系列文章汇总(共1361篇,持续更新)
物联网全栈开发实战专栏将涵盖各类单片机、嵌入式设备及驱动开发实例。从仿真到硬件,从单个实例到综合实例,从单个设备到多个设备的各种方式通信、联网等等。以实例为线索,从硬件到用户终端,掌握物联网全栈开发基础。.................................
C8051F310实验程序
**串口通信**:C8051F310支持UART(通用异步收发传输器)和SPI(串行外设接口)等串行通信协议。UART常用于与计算机或其他设备进行数据交换,SPI则常用于高速、低功耗的设备间通信。
Silabs C8051F310例程
《Silabs C8051F310例程》是一个专门为Silabs公司C8051F310微控制器设计的开发教程,对于熟悉和掌握该芯片的特性和功能具有极其重要的价值。


单片机/工控
