|
关于C8051F340的串口0通讯问题---查明为硬件问题
[复制链接]
论坛里看了几篇关于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 编辑 ]
|
|