No.2357 作者:AbrahamGwang 邮件:AbrahamGwang@yahoo.com ID:6339 登陆:1次 文章数:6篇 最后登陆IP: 最后登陆:2001/8/16 19:47:00 注册:2001/8/16 19:47:00 财富:28 发帖时间:2001/11/4 12:06:00 发贴者IP:172.149.153.82 标题:AbrahamGwang:C51编程:救命!CYGNAL C8051单片机通信3/3 摘要:No.2357C51编程:救命!CYGNAL C8051单片机通信3/3 请教古班主和各路高手有关CYGNAL C8051F000 单片机与PC 通信的问题, 请解答讨论。 新近购置一台CYGNAL C8051F000单片机,感觉的确设计不俗。阅读 MANUAL 后, 发现其内置晶振可以由软件设定为2MHZ,4MHZ, 8MHZ,16MHZ。 同时也可以外接11.059200MHZ,18.432MHZ的晶振。 我想用9600,8,N,1的参数与PC通信,不知道如何编程,CYGNAL C8051F000 单片机的编程指令,是否与普通8051单片机指令相兼容? 曾经采用普通8031单片机,用以下语句,通信(6MHZ晶振,2400,8,N,1)成功: ------------------------------------------------*/ #ifndef MONITOR51 SCON = 0x50; /* SCON: mode 1, 8-bit UART, enable rcvr */ TMOD = 0x20; /* TMOD: timer 1, mode 2, 8-bit reload */ PCON = 0x80; /* PCON: Power control frequency double */ TH1 = 0xf3; /* 2400 bps, TH1: reload value /6MHz */ TL1 = 0xf3; TR1 = 1; /* TR1: timer 1 run */ TI = 1; /* TI: set TI to send first char of UART */ #endif ------------------------------------------------*/ ) 不知道是否可以如法炮制到CYGNAL系统?另外用TH1 RELOAD value 公 式TH1=256 - 2fosc/(384 X bps) [SMOD=1时]; TH1=256 - fosc/(384 X bps) [SMOD=0时], 采用11.0592MHZ晶振, 9600,8,N,1的参数, 计算得TH1=250 [SMOD=1时]; TH1=253 [SMOD=0时]; 上述公式是否适用于晶振为2MHZ,4MHZ, 8MHZ,16MHZ? 菜鸟本人不 明白用上述晶振, CYGNAL系统怎样与PC通信? 以下是CYGNAL 公司提供的Keil C51通信范例AN015SW 3/3部分(因帖子有 16K限制,不能一次发完,故分为3部分), 愚夫难以应用, 敬请高手指教。 // Check Transmit interrupt; service if CCF1 is set. else if (CCF1){ CCF1 = 0; // Clear interrupt flag switch (SUTXST){ // State 0: Transmit Initiated. // Here, the user has loaded a byte to transmit into TDR, and set the // module 1 interrupt to initiate the transfer. // - Transmit START bit (drop SW_TX) // - Read PCA0, add one bit time, & store in module 1 capture registers // for first bit. // - Increment TX state variable. case 0: SW_TX = 0; // Drop TX pin as START bit. PCA_TEMP = PCA0L; // Read PCA counter value into PCA_TEMP |= (PCA0H << 8); // PCA_TEMP. PCA_TEMP += TIME_COUNT; // Add 1 bit time. PCA0CPL1 = PCA_TEMP; // Store updated match value into PCA0CPH1 = (PCA_TEMP >> 8); // module 1 capture/compare registers. PCA0CPM1 |= 0x48; // Enable module 1 software timer. SUTXST++; // Update TX state variable. break; // States 1-9: Transmit Bit. // - Output LSB of TDR onto TX // - Shift TDR 1 bit right. // - Shift a '1' into MSB of TDR for STOP bit in State 9. // - Add 1 bit time to module 1 capture register case 1: case 2: case 3: case 4: case 5: case 6: case 7: case 8: case 9: SW_TX = (TDR & 0x01); // Output LSB of TDR onto SW_TX pin. TDR >>= 1; // Shift TDR right 1 bit. TDR |= 0x80; // Shift '1' into MSB of TDR for // STOP bit in State 9. PCA_TEMP = (PCA0CPH1 << 8); // Read module 1 contents into PCA_TEMP |= PCA0CPL1; // PCA_TEMP. PCA_TEMP += TIME_COUNT; // Add 1 bit time to PCA_TEMP PCA0CPL1 = PCA_TEMP; // Restore PCA0CPL1 and PCA0CPH1 PCA0CPH1 = (PCA_TEMP >> 8); // with the updated value SUTXST++; // Update TX state variable. break; // State 10: Last bit has been transmitted. Transmit STOP bit // and end transfer. // - Transmit STOP bit // - Set TX Complete indicator, clear Busy flag // - Reset TX st ......
>>返回讨论的主题
|