自己用 C51写的串口通讯程序
- /*定义为中断方式串口处理*/
- #define INTERSENDSTR
- /*不为8032系列芯片 */
- //#define CHIP_8032
- #include <absacc.h>
- #include <reg51.h>
- #include <string.h>
- #include "err.h"
- #ifdef INTERSENDSTR
- unsigned char xdata sSendComBuf[256],sRecComBuf[256];
- unsigned char data bOut,bIn,bSout,bSin;
- #else
- #define DEFSENDCHAR TI=0;SBUF=ACC;while(!TI);TI=0;
- #endif
- //bps设置 9600 就是 PSetBps(96)(11.0592Mhz)
- unsigned char PSetBps(unsigned int bps) SMALL
- {
- unsigned int t1;
- unsigned char t2;
- #ifdef INTERSENDSTR
- /*如果使用中断方式发送数据,必须等待发送数据完毕才能更换波特率 */
- while(bSin!=bSout)
- {
- ;
- }
- ES=0;
- #endif
- #ifdef CHIP_8032
- if(3456%bps)
- {
- return ERR_SET_BPS;
- }
- t1=3456/bps;
- t1--;t1=~t1;
- RCAP2H=t1/256;RCAP2L=t1;
- T2MOD=0x00;
- /*使用定时器 2 做波特率发生器 */
- T2CON=0x34;/*TF2=0;EXF2=0;RCLK=1;TCLK=1;EXEN2=0;TR2=1;C/T2=0;CP/RL2=0
- */
- #else
- t1=576/bps;
- if((576%bps)||((t1==0))||(t1>=2*256))
- {
- return ERR_SET_BPS;
- }
- if(t1>256)
- {
- PCON=00;
- t2=256-(288/bps);
- }
- else
- {
- PCON=0x80;
- t2=256-t1;
- }
- TH1=t2;TL1=t2;
- TR1=1;
- #endif
- /*模式3*/
- SM0=0;
- RI=0;TI=0;
- REN=1;
- SM1=1;
- SM2=1;
- #ifdef INTERSENDSTR
- bOut=bIn;
- bSout=bSin;
- ES=1;
- #endif
- return OK;
- }
- void PSendChar(unsigned char ch) SMALL
- {
- #ifdef INTERSENDSTR
- unsigned char tch;
- tch=bSin+1;
- while(tch==bSout)
- {
- ;
- }
- sSendComBuf[bSin]=ch;
- ES=0;
- if((bSout==bSin))
- {
- SBUF=sSendComBuf[bSin];
- bSin++;
- }
- else
- {
- bSin++;
- }
- ES=1;
- #else
- ACC=ch;
- DEFSENDCHAR;
- #endif
- }
- unsigned char PGetChar() SMALL
- {
- unsigned char ch;
- #ifdef INTERSENDSTR
- ch=sRecComBuf[bOut];
- bOut++;
- return ch;
- #else
- ch=SBUF;
- RI=0;
- #endif
- }
- bit PCharInCom() SMALL
- {
- #ifdef INTERSENDSTR
- if(bIn!=bOut)
- {
- return 1;
- }
- return 0;
- #else
- return RI;
- #endif
- }
- void PSendString(unsigned char *st) SMALL
- {
- while(*st)
- {
- PSendChar(*st);
- st++;
- }
- }
- void PSendArray(unsigned char *st,unsigned int len) SMALL
- {
- unsigned int ii;
- for(ii=0;ii<len;ii++)
- {
- PSendChar(st[ii]);
- }
- }
- #ifdef INTERSENDSTR
- void PSerialInt() interrupt 4
- {
- if(RI)
- {
- sRecComBuf[bIn]=SBUF;
- bIn++;
- RI=0;
- }
- if(TI)
- {
- TI=0;
- if(bSout!=bSin)
- {
- bSout++;
- }
- if(bSout!=bSin)
- {
- SBUF=sSendComBuf[bSout];
- }
- }
- }
- #endif