?? serial.lst
字號:
C51 COMPILER V7.06 SERIAL 09/12/2005 12:55:40 PAGE 1
C51 COMPILER V7.06, COMPILATION OF MODULE SERIAL
OBJECT MODULE PLACED IN serial.OBJ
COMPILER INVOKED BY: d:\Keil\C51\BIN\C51.EXE serial.c BROWSE DEBUG OBJECTEXTEND TABS(2)
stmt level source
1 //本函數集來自51單片機世界,作者斑竹丁丁(聶小猛)。
2 //主頁地址http://www.mcu51.com
3 //串口中斷服務程序,僅需做簡單調用即可完成串口輸入輸出的處理
4 //出入均設有緩沖區,大小可任意設置。
5 //可供使用的函數名:
6 /*
7 extern char getbyte(void);//從接收緩沖區取一個byte,如不想等待則在調用前檢測inbufsign是否為1。
8 extern putbyte(char c);//放入一個字節到發送緩沖區
9 extern putstring(uchar *puts);//發送一個定義在程序存儲區的字符串到串口
10 extern puthex(uchar c);//發送一個字節的hex碼,分成兩個字節發。
11 extern bit inbufsign;
12 #define CR putstring("\r\n")//發送一個回車換行
13 extern void serial_init (void);
14 */
15
16 //*************************************************************************
17 #pragma small
18
19 #include <AT89X52.H>
20 #define uchar unsigned char
21 #define uint unsigned int
22
23 #define OLEN 8 /* size of serial transmission buffer */
24 idata uchar outbuf[OLEN]; /* storage for transmission buffer */
25 uchar idata * data outlast=outbuf; //最后由中斷傳輸出去的字節位置
26 data uchar idata *putlast=outbuf; //最后放入發送緩沖區的字節位置
27 #define ILEN 32//32 /* size of serial receiving buffer */
28 idata uchar inbuf[ILEN];
29 data uchar idata *inlast=inbuf; //最后由中斷進入接收緩沖區的字節位置
30 data uchar idata *getlast=inbuf; //最后取走的字節位置
31 bit outbufsign0; //最后一個數據覵BUF發完標志 發完=0
32 bit outbufsign; //輸出緩沖區非空標志 有=1
33 bit inbufsign; //接收緩沖區非空標志 有=1
34 bit inbufful; //輸入緩沖區滿標志 滿=1
35 #define CR putstring("\r\n") //CR=回車換行
36
37
38 //*****************************
39 //放入一個字節到發送緩沖區
40 putbyte(unsigned char c)
41 {
42 1 ES=0; /*暫停串行中斷,以免數據比較時出錯 */
43 1 while((((outlast-putlast)==2) && (outlast > putlast )) || ((outlast < putlast) && (OLEN-(putlast-outlast)
-==2)))
44 1 {
45 2 ES=1;
46 2 c++;c--;
47 2 ES=0;
48 2 }
49 1 *putlast=c; //放字節進入緩沖區
50 1 putlast++; //發送緩沖區指針加一
51 1 if (putlast==outbuf+OLEN) putlast=outbuf; //指針到了頂部換到底部
52 1 outbufsign=1;
53 1 if (!outbufsign0)
54 1 {
C51 COMPILER V7.06 SERIAL 09/12/2005 12:55:40 PAGE 2
55 2 outbufsign0=1;
56 2 TI=1;
57 2 } //緩沖區開始為空置為有,啟動發送
58 1 ES=1;
59 1 }
60
61 //***************************************
62 //發送字符串到串口
63 putstring(uchar *puts)
64 {
65 1 for(;*puts!=0;puts++) //遇到停止符0結束
66 1 putbyte(*puts);
67 1 }
68 //******************************
69 /*放一串數據到發送緩沖區,需要定義發送的字節數
70 putbytes(uchar *outplace,uint j)
71 { int i;
72 for(i=0;i<j;i++)
73 {
74 putbyte(*outplace);
75 outplace++;
76 }
77 }*/
78 //*************************************
79 //發送一個字節的hex碼,分成兩個字節發。
80 /*uchar code hex_[]={"0123456789ABCDEF"};
81 puthex(unsigned char c)
82 {
83 int ch;
84 ch=(c>>4)&0x0f;
85 putbyte(hex_[ch]);
86 ch=c&0x0f;
87 putbyte(hex_[ch]);
88 }*/
89 //*************************************
90 //從接收緩沖區取一個byte,如不想等待則在調用前檢測inbufsign是否為1。
91 uchar getbyte (void)
92 {
93 1 char idata c ;
94 1 while (!inbufsign); //緩沖區空等待
95 1 ES=0;
96 1 c= *getlast; //取數據
97 1 getlast++; //最后取走的數據位置加一
98 1 inbufful=0; //輸入緩沖區的滿標志清零
99 1 if (getlast==inbuf+ILEN) getlast=inbuf; //地址到頂部回到底部
100 1 if (getlast==inlast) inbufsign=0; //地址相等置接收緩沖區空空標志,再取數前要檢該標志
101 1 ES=1;
102 1 return (c); //取回數據
103 1 }
104 //*****************************************
105 //串口中斷處理
106
107 serial () interrupt 4
108 {
109 1 if (TI)
110 1 {
111 2 TI = 0;
112 2 if (outbufsign)
113 2 {
114 3 SBUF=*outlast; //未發送完繼續發送
115 3 outlast++; //最后傳出去的字節位置加一
116 3 if (outlast==outbuf+OLEN) outlast=outbuf;//地址到頂部回到底部
C51 COMPILER V7.06 SERIAL 09/12/2005 12:55:40 PAGE 3
117 3 if (putlast==outlast) outbufsign=0; //數據發送完置發送緩沖區空標志
118 3 }
119 2 else
120 2 {
121 3 outbufsign0=0;
122 3 }
123 2 }
124 1 if (RI)
125 1 {
126 2 RI = 0;
127 2 if(!inbufful)
128 2 {
129 3 *inlast= SBUF; //放入數據
130 3 inlast++; //最后放入的位置加一
131 3 inbufsign=1;
132 3 if (inlast==inbuf+ILEN) inlast=inbuf;//地址到頂部回到底部
133 3 if (inlast==getlast) inbufful=1; //接收緩沖區滿置滿標志
134 3 }
135 2 }
136 1 }
137
138 //*****************************
139 //串口初始化
140 void serial_init (void)
141 {
142 1 SCON = 0x50;
143 1 T2CON = 0x34; // mode 1: 8-bit UART, enable receiver // timer 1 m
-ode 2: 8-Bit reload
144 1 TH2=0xff;TL2 = 0xb8; //baud*2 /* reload value 9600 baud -22118400HZ
145 1 RCAP2H =0xff;
146 1 RCAP2L=0xb8;
147 1 TR2 = 1; // timer 1 run
148 1
149 1 ES = 1;
150 1 REN=1;
151 1 EA=1;
152 1
153 1 }
154
155
156
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 262 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 4 ----
IDATA SIZE = 40 1
BIT SIZE = 4 ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -