论坛里看了几篇关于C8051F340的串口通讯问题,发现都没能解决我目前的问题,不知是天热的原因还是本身过于急躁,越来越找不到串口通讯故障的原因了。
我用C8051F340的串口0进行通讯测试,使用串口中断的方式进行调试,上位机发送一串字符串共计18位,以‘@’起始,‘*’为结束符,内部12MHz的晶振,9600波特率;目前的现象是可以通过串口调试器进行接收数据,能看到指示灯的变化,知道接收是正常的,但是没有任何数据发送出来。程序贴上来请高手帮助分析一下,很着急,谢谢。
#include
//#include
#define uchar unsigned char
#define uint unsigned int
#define BAUDRATE 9600 // Baud rate of UART in bps
#define SYSTEMCLOCK 12000000 // SYSCLK frequency in Hz
//引脚定义
sbit LED1 = P2^2;
sbit LED2 = P2^3;
//全局变量
uchar UATR0_Buffer[20]; //从串口接收的数据
uchar com_dat1=0; //串口接收的数据计数
uchar flag=0; //串口接收标志位
/*****************************************************************************
程序名称:delay()
功能介绍:延时程序
******************************************************************************/
void delay(uint i)
{
uint j;
for(i; i > 0; i--)
{
for(j = 550; j > 0; j--);
}
}
/*****************************************************************************
程序名称:OSCILLATOR_Init()
功能介绍:晶振初始化
******************************************************************************/
void OSCILLATOR_Init (void)
{
OSCICN |= 0x03; // Configure internal oscillator for
// its maximum frequency (24.5 Mhz)
}
/*****************************************************************************
程序名称:UART0_Init()
功能介绍: 串口0的初始化配置 9600
******************************************************************************/
void UART0_Init (void)
{
SCON0 = 0x10; // SCON0: 8-bit variable bit rate
// level of STOP bit is ignored
// RX enabled
// ninth bits are zeros
// clear RI0 and TI0 bits
if (SYSTEMCLOCK/BAUDRATE/2/256 < 1)
{
TH1 = -(SYSTEMCLOCK/BAUDRATE/2);
CKCON &= ~0x0B; // T1M = 1; SCA1:0 = xx
CKCON |= 0x08;
}
else if (SYSTEMCLOCK/BAUDRATE/2/256 < 4)
{
TH1 = -(SYSTEMCLOCK/BAUDRATE/2/4);
CKCON &= ~0x0B; // T1M = 0; SCA1:0 = 01
CKCON |= 0x01;
}
else if (SYSTEMCLOCK/BAUDRATE/2/256 < 12)
{
TH1 = -(SYSTEMCLOCK/BAUDRATE/2/12);
CKCON &= ~0x0B; // T1M = 0; SCA1:0 = 00
}
else
{
TH1 = -(SYSTEMCLOCK/BAUDRATE/2/48);
CKCON &= ~0x0B; // T1M = 0; SCA1:0 = 10
CKCON |= 0x02;
}
TL1 = TH1; // init Timer1
TMOD &= ~0xf0; // TMOD: timer 1 in 8-bit autoreload
TMOD |= 0x20;
TR1 = 1; // START Timer1
IP |= 0x10; // Make UART high priority
ES0 = 1; // Enable UART0 interrupts
}
/*****************************************************************************
程序名称:PORT_Init()
功能介绍:端口初始化;
参 数:
修改记录:
备 注:
日 期:20120719
******************************************************************************/
void PORT_Init (void)
{
P0MDOUT |= 0x14; // Enable UTX as push-pull output
// P0.0 digital open-drain SMBus SDA
// P0.1 digital open-drain SMBus SCL
P2MDOUT |= 0x08; // Make the LED (P2.3) a push-pull output
P1MDOUT = 0xff; // enable LEDs as push-pull outputs
P0 |= 0x03; //漏极开
P1 = 0x00;
XBR0 = 0x05;
XBR1 = 0x40;
XBR2 = 0x01;
}
void putchar(uchar ch)
{
ES0 = 0;
SBUF0 = ch;
while(!TI0);
TI0 = 0;
ES0 = 1;
}
void send_string(unsigned int Send_num,unsigned char data *Send_add)
{
unsigned int k=0;
do
{
putchar(*(Send_add+k));
k++;
}while(k
}
/*****************************************************************************
程序名称:main()
功能介绍: 主函数
参 数:无
修改记录:
备 注:
日 期:20120719
******************************************************************************/
void main(void)
{
PCA0MD &= ~0x40; // 禁止看门狗
PORT_Init(); // 设置P2口类型
OSCILLATOR_Init (); // 设置内部12M晶振
UART0_Init();
// EA =1;
while(1)
{
if(flag==1)
{
com_dat1=0;
flag=0;
delay(1000);
LED1=1;
LED2=1;
delay(1000);
LED1=0;
LED2=0;
send_string(18,UATR0_Buffer);
}
else
{
putchar('#');
delay(1000);
LED1=1;
LED2=0;
delay(1000);
LED1=0;
LED2=1;
}
}
}
void UART0_Interrupt (void) interrupt 4
{
EA = 0;
if(RI0 == 1)
{
RI0 = 0;
if(com_dat1==0)
{
UATR0_Buffer[0] = SBUF0; //把从串口读出的数存到数组
if(UATR0_Buffer[0]=='@') com_dat1++;
}
else if(com_dat1<=17)
{
UATR0_Buffer[com_dat1] = SBUF0;
if(UATR0_Buffer[com_dat1]=='*') flag=1;
com_dat1++;
}
else
{com_dat1=0;flag=0;}
}
if(TI0==1) TI0=0;
EA = 1;
}
本程序是可用的,最后查明是硬件线路的问题
[ 本帖最后由 怕碎的瓶子 于 2012-7-21 09:17 编辑 ]
此帖出自小平头技术问答
一周热门 更多>