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