BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / circuit / #14454同步于 2010/7/17
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Circuit机器人发帖

C8051F020串口通信代码求助!!!!

zhangdc007
2010/7/17镜像同步0 回复
最近在弄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); }
订阅后,新回复会通过你的通知中心匿名送达。
0 条回复
暂无回复 · 你可以订阅本帖等待新回复。