C8051F02x串口通信程序
程序如下:
//外部晶振24MHz 波特率115200
#include "c8051f020.h"
#include "stdio.h"
#include "string.h"
#define INBUF_LEN 4 //数据长度
unsigned char inbuf1[INBUF_LEN];
unsigned char checksum,count3;
bit read_flag= 0 ;
void init_serialcomm( void )
{ CKCON = 0x30;
SCON0 = 0x50 ; //SCON: serail mode 1, 8-bit UART, enable ucvr
TMOD |= 0x20 ; //TMOD: timer 1, mode 2, 8-bit reload
PCON |= 0x80 ; //SMOD=1;
TH1 = 0xF4 ; //Baud:115200 fosc=24MHz
IE |= 0x90 ; //Enable Serial Interrupt
TR1 = 1 ; // timer 1 run
// TI=1;
// 这里我没有EIE1 ,这个是有何用????//用于扩着呢中断,是为SPI用的
}
//向串口发送一个字符
void send_char_com( unsigned char ch)
{
SBUF0=ch;
while (TI0== 0 );
TI0= 0 ;
}
//向串口发送一个字符串,strlen为该字符串长度
void send_string_com( unsigned char *str, unsigned int strlen)
{
unsigned int k= 0 ;
do
{
send_char_com(*(str + k));
k++;
}
while (k < strlen);
}
//串口接收中断函数
void serial () interrupt 4 using 3
{
if (RI0)
{
unsigned char ch;
RI0 = 0 ;
ch=SBUF0;
if (ch> 127 )
{
count3= 0 ;
inbuf1[count3]=ch;
checksum= ch- 128 ;
}
else
{
count3++;
inbuf1[count3]=ch;
checksum ^= ch;
if ( (count3==(INBUF_LEN- 1 )) && (!checksum) )
{
read_flag= 1 ; //如果串口接收的数据达到INBUF_LEN个,且校验没错,
//就置位取数标志
}
}
}
}
void main(void)
{
//c8051f020 initial
//禁止看门狗
WDTCN = 0xDE;
WDTCN = 0xAD;
//设置并选用外部晶振
OSCXCN = 0x67;
while(OSCXCN & 0x80 ==0);
OSCICN |= 0x08;
//Crossbar配置 XBR0.2为串口配置引脚,配置1有效,端口状态由数字外设决定;未配置(0)将作为通用I/O使用,可以读写相应端口寄存器
XBR0 = 0x04; //串口映射到P0.0,TX0;P0.1 RX0
XBR1 = 0;
XBR2 = 0x46; //7 6 5 4 3 2 1 0
// ENABLE crossbar
// P0.0 - TX0 (UART0), Push-Pull, Digital
// P0.1 - RX0 (UART0), Open-Drain, Digital
// P0.2 - Unassigned, Open-Drain, Digital
// P0.3 - Unassigned, Open-Drain, Digital
// P0.4 - Unassigned, Open-Drain, Digital
// P0.5 - Unassigned, Open-Drain, Digital
// P0.6 - Unassigned, Open-Drain, Digital
// P0.7 - Unassigned, Open-Drain, Digital
//输出驱动方式配置
P0MDOUT = 0x01;
// P1MDOUT = 0xFF;
// P2MDOUT = 0xFF;
//P3MDOUT = 0xFF;
//EMIF配置 EMI0CF = 0x1C;
//EMI0TC = 0xFF;
init_serialcomm(); //初始化串口
while ( 1 )
{
if (read_flag) //如果取数标志已置位,就将读到的数从串口发出
{
read_flag= 0 ; //取数标志清0
send_string_com(inbuf1,INBUF_LEN);
}
}
}
基本现状:
程序可以调通,正确生成Hex文件。
用串口通信调试助手,端口可以检测到,数据发送出去,但是收不到。
问题:
如果您手边有这种板子,请麻烦用上面源码,检测程序的正确性,如果有问题,请指出问题所在,并给出调试方法和改正方法。
备注:
如有不明,请留言。