📄 11-7.1.lst
字号:
C51 COMPILER V7.09 11_7_1 08/24/2005 21:48:33 PAGE 1
C51 COMPILER V7.09, COMPILATION OF MODULE 11_7_1
OBJECT MODULE PLACED IN 11-7.1.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE 11-7.1.c BROWSE DEBUG OBJECTEXTEND
line level source
1 //串口中断服务程序,仅需做简单调用即可完成串口输入输出的处理
2 //出入均设有缓冲区,大小可任意设置。
3 //可供使用的函数名:
4 //char getbyte(void);从接收缓冲区取一个byte,如不想等待则在调用前检测inbufsign是否为1。
5 //putbyte(char c);放入一个字节到发送缓冲区
6 //putbytes(unsigned char *outplace,j);放一串数据到发送缓冲区,自定义长度
7 //putstring(unsigned char code *puts);发送一个定义在程序存储区的字符串到串口
8 //puthex(unsigned char c);发送一个字节的hex码,分成两个字节发。
9 //putchar(uchar c,uchar j);发送一个字节数据的asc码表达方式,需要定义小数点的位置
10 //putint(uint ui,uchar j);发送一个整型数据的asc码表达方式,需要定义小数点的位置
11 //delay(unsigned char d); 延时n x 100ns
12 //getline(char idata *line, unsigned char n); 获取一行数据回车结束,必须定义最大输入字符数
13 //CR;发送一个回车换行
14 //*************************************************************************
15 #include <w77e58.h>
16 //#include <reg51.h>
17 #define uchar unsigned char
18 #define uint unsigned int
19 #define OLEN 10 /* size of serial transmission buffer */
20 idata unsigned char outbuf[OLEN]; /* storage for transmission buffer */
21 unsigned char idata *outlast=outbuf; //最后由中断传输出去的字节位置
22 unsigned char idata *putlast=outbuf; //最后放入发送缓冲区的字节位置
23 #define ILEN 2 /* size of serial receiving buffer */
24 idata unsigned char inbuf[ILEN];
25 unsigned char idata *inlast=inbuf; //最后由中断进入接收缓冲区的字节位置
26 unsigned char idata *getlast=inbuf; //最后取走的字节位置
27 bit outbufsign; //输出缓冲区非空标志 有=1
28 bit inbufsign; //接收缓冲区非空标志 有=1
29 bit inbufful; //输入缓冲区满标志 满=1
30 #define CR putstring("\r\n") //CR=回车换行
31 unsigned char code comready[]="com is ready!";
32 //*****************************
33 //延时n x 100ns
34 void delay(unsigned char d) //在源程序开头定义是否用w77e58或22。1184M晶振
35 {unsigned char j;
36 1 do{ d--;
37 2
38 2 //110592 & 89c52
39 2 #ifndef cpuw77e58
40 2 #ifndef xtal221184
41 2 j=21; //k=38 cpu80320 100us k=21 cpu 8052
42 2 #else
j=42;
#endif
45 2 #else
#ifndef xtal221184
j=38;
#else
j=76;
#endif
#endif
52 2
53 2 do {j--;} while(j!=0);
54 2 }while(d!=0);
55 1 }
C51 COMPILER V7.09 11_7_1 08/24/2005 21:48:33 PAGE 2
56 //*****************************
57 //放入一个字节到发送缓冲区
58
59 putbyte(char c)
60 {uchar i,j;
61 1 ES=0; /*暂停串行中断,以免数据比较时出错? */
62 1 if (outlast==putlast )
63 1 { i=(0-TH1);
64 2 do{i--;j=36; do {j--;}while(j!=0); }while(i!=0); //延时一个字节发送时间
65 2 }
66 1 *putlast=c; //放字节进入缓冲区
67 1 putlast++; //发送缓冲区指针加一
68 1 if (putlast==outbuf+OLEN) putlast=outbuf; //指针到了顶部换到底部
69 1 if (!outbufsign) {outbufsign=1;TI=1; } //缓冲区开始为空置为有,启动发送
70 1 ES=1;
71 1 }
72 //******************************
73 //放一串数据到发送缓冲区
74 putbytes(unsigned char *outplace,unsigned char j)
75 { int i;
76 1 for(i=0;i<j;i++)
77 1 {putbyte(*outplace);
78 2 outplace++;
79 2 }
80 1 }
81 //******************************
82 putchar(uchar c,uchar j)
83 {uchar idata free[4];uchar data i;
84 1 i=0;
85 1 free[i++]=(c/100+0x30);
86 1 if (j==3) free[i++]='.';
87 1 free[i++]=(c%100)/10+0x30;
88 1 if (j==2) free[i++]='.';
89 1 if (j==2 && free[i-3]==0x30) free[i-3]=0x20;
90 1 free[i++]=(c%10)+0x30;
91 1 if (j==1 && free[i-3]==0x30) free[i-3]=0x20;
92 1 if (j==1 && free[i-3]==0x20 && free[i-2]==0x30) free[i-2]=0x20;
93 1 putbytes(free,i);
94 1 }
95
96 //******************************
97
98 putint(uint ui,uchar j)
99 {uchar idata free[6];
100 1 uchar data i;
101 1 i=0;
102 1 free[i++]=(ui/10000+0x30);
103 1 if (j==5) free[i++]='.';
104 1 free[i++]=((ui%10000)/1000+0x30);
105 1 if (j==4) free[i++]='.';
106 1 if (j==4 && free[i-3]==0x30) free[i-3]=0x20;
107 1 free[i++]=((ui%1000)/100+0x30);
108 1 if (j==3) free[i++]='.';
109 1 if (j==3 && free[i-4]==0x30) free[i-4]=0x20;
110 1 if (j==3 && free[i-4]==0x20 && free[i-3]==0x30) free[i-3]=0x20;
111 1 free[i++]=((ui%100)/10+0x30);
112 1 if (j==2) free[i++]='.';
113 1 if (j==2 && free[i-5]==0x30) free[i-5]=0x20;
114 1 if (j==2 && free[i-5]==0x20 && free[i-4]==0x30) free[i-4]=0x20;
115 1 if (j==2 && free[i-5]==0x20 && free[i-4]==0x20 && free[i-3]==0x30) free[i-3]=0x20;
116 1 free[i++]=(ui%10+0x30);
117 1 if (j==1 && free[i-5]==0x30) free[i-5]=0x20;
C51 COMPILER V7.09 11_7_1 08/24/2005 21:48:33 PAGE 3
118 1 if (j==1 && free[i-5]==0x20 && free[i-4]==0x30) free[i-4]=0x20;
119 1 if (j==1 && free[i-5]==0x20 && free[i-4]==0x20 && free[i-3]==0x30) free[i-3]=0x20;
120 1 if (j==1 && free[i-5]==0x20 && free[i-4]==0x20 && free[i-3]==0x20 && free[i-2]==0x30) free[i-2]=0x20;
121 1 putbytes(free,i);
122 1 }
123 //***************************************
124 //发送一个定义在程序存储区的字符串到串口
125 putstring(unsigned char *puts)
126 {for (;*puts!=0;puts++) //遇到停止符0结束
127 1 putbyte(*puts);
128 1 }
129 //*************************************
130 //发送一个字节的hex码,分成两个字节发。
131 unsigned char code hex_[]={"0123456789ABCDEF"};
132 puthex(unsigned char c)
133 {int ch;
134 1 ch=(c>>4)&0x0f;
135 1 putbyte(hex_[ch]);
136 1 ch=c&0x0f;
137 1 putbyte(hex_[ch]);
138 1 }
139 //*************************************
140 //从接收缓冲区取一个byte,如不想等待则在调用前检测inbufsign是否为1。
141 uchar getbyte (void)
142 { char idata c ;
143 1 while (!inbufsign); //缓冲区空等待
144 1 ES=0;
145 1 c= *getlast; //取数据
146 1 getlast++; //最后取走的数据位置加一
147 1 inbufful=0; //输入缓冲区的满标志清零
148 1 if (getlast==inbuf+ILEN) getlast=inbuf; //地址到顶部回到底部
149 1 if (getlast==inlast) inbufsign=0; //地址相等置接收缓冲区空空标志,再取数前要检该标志
150 1 ES=1;
151 1 return (c); //取回数据
152 1 }
153 //*****************************************
154 //接收一行数据,必须定义放数据串的指针位置和大小 del=0x7f,backspace=0x08,cr=0x0d,lf=0x0a
155 void getline (uchar idata *line, unsigned char n)
156 { unsigned char cnt = 0; //定义已接收的长度
157 1 char c;
158 1 do {
159 2 if ((c = getbyte ()) == 0x0d) c = 0x00; //读一个字节,如果是回车换成结束符
160 2 if (c == 0x08 || c == 0x7f) //BACKSPACE 和 DEL 的处理
161 2 { if (cnt != 0) //已经输入退掉一个字符
162 3 {cnt--; //总数目减一
163 4 line--; //指针减一
164 4 putbyte (0x08); //屏幕回显的处理
165 4 putbyte (' ');
166 4 putbyte (0x08);
167 4 }
168 3 }
169 2 else
170 2 { putbyte (*line = c); //其他字符取入,回显
171 3 line++; //指针加一
172 3 cnt++; //总数目加一
173 3 }
174 2 } while (cnt < n - 1 && c != 0x00 && c!=0x1b); //数目到了,回车或ESC停止
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -