|
51单片机串口中断服务程序
//串口中断服务程序,仅需做简单调用即可完成串口输入输出的处理 //出入均设有缓冲区,大小可任意设置。 //可供使用的函数名: //char getbyte(void);从接收缓冲区取一个byte,如不想等待则在调用前检测inbufsign是否为1。 //getline(char idata *line, unsigned char n); 获取一行数据回车结束,已处理backspce和delete,必须定义最大输入字符数 //putinbuf(uchar c);模拟接收到一个数据 //putbyte(char c);放入一个字节到发送缓冲区 //putbytes(unsigned char *outplace,j);放一串数据到发送缓冲区,自定义长度 //putstring(unsigned char code *puts);发送一个字符串到串口 //puthex(unsigned char c);发送一个字节的hex码,分成两个字节发。 //putchar(uchar c,uchar j);发送一个字节数据的asc码表达方式,需要定义小数点的位置 //putint(uint ui,uchar j);发送一个整型数据的asc码表达方式,需要定义小数点的位置 //CR;发送一个回车换行 //************************************************************************* #include <w77e58.h> //该头文件包括了51,52,80320的特殊寄存器,用在51,52上也可 #define uchar unsigned char #define uint unsigned int #define OLEN 64 /* size of serial transmission buffer */ idata unsigned char outbuf[OLEN]; /* storage for transmission buffer */ unsigned char idata *outlast=outbuf; //最后由中断传输出去的字节位置 unsigned char idata *putlast=outbuf; //最后放入发送缓冲区的字节位置 #define ILEN 2 /* size of serial receiving buffer */ idata unsigned char inbuf[ILEN]; unsigned char idata *inlast=inbuf; //最后由中断进入接收缓冲区的字节位置 unsigned char idata *getlast=inbuf; //最后取走的字节位置 bit outbufsign; //输出缓冲区非空标志 有=1 bit inbufsign; //接收缓冲区非空标志 有=1 bit inbufful; //输入缓冲区满标志 满=1 #define CR putstring("\r\n") //CR=回车换行 //***************************** //放入一个字节到发送缓冲区 putbyte(char c) {uchar i,j; ES=0; /*暂停串行中断,以免数据比较时出错? */ if (outlast==putlast ) { i=(0-TH1); do{i--;j=36; do {j--;}while(j!=0); }while(i!=0); //延时一个字节发送时间 } *putlast=c; //放字节进入缓冲区 putlast++; //发送缓冲区指针加一 if (putlast==outbuf+OLEN) putlast=outbuf; //指针到了顶部换到底部 if (!outbufsign) {outbufsign=1; TI=1; } //缓冲区开始为空置为有,启动发送 ES=1; } //****************************** //放一串数据到发送缓冲区 putbytes(unsigned char *outplace,unsigned char j) { int i; for(i=0;i<j;i++) {putbyte(*outplace); outplace++; } } //****************************** //putchar(uchar c,uchar j);发送一个字节数据的asc码表达方式,需要定义小数点的位置 putchar(uchar c,uchar j) {uchar idata free[4];uchar data i; i=0; free[i++]=(c/100+0x30); if (j==3) free[i++]=‘.‘; free[i++]=(c%100)/10+0x30; if (j==2) free[i++]=‘.‘; if (j==2 && free[i-3]==0x30) free[i-3]=0x20; free[i++]=(c%10)+0x30; if (j==1 && free[i-3]==0x30) free[i-3]=0x20; if (j==1 && free[i-3]==0x20 && free[i-2]==0x30) free[i-2]=0x20; putbytes(free,i); } 本文转自网络,经“单片机之路”(www.mcuway.com)摘选整理,版权归原作者所有
[1] [2] 下一页 |
|