📄 serial.lst
字号:
C51 COMPILER V7.06 SERIAL 07/12/2006 00:10:08 PAGE 1
C51 COMPILER V7.06, 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 /*
2 黄 clock 5 红
3 绿 data 1 黑
4 黑 地 3
5 */
6 #include <reg51.H>
7 #include <stdio.h>
8 #include <string.h>
9 #include "delay.h"
10
11 typedef unsigned char UCHAR;
12 typedef unsigned long ULONG;
13 #define TRUE 1
14 #define FALSE 0
15
16 //UCHAR ucData = 0,i=0;
17 UCHAR gucBuf[16] = {0};
18 UCHAR* pBuf = gucBuf;
19 //bit isDataReady=0;
20 //bit canReceive=1;
21 sbit P1_0 = P1^0;
22 sbit P2_0 = P2^0;
23 sbit CLK_SND = P1^1;
24 sbit DAT_SND = P1^2;
25 //sbit CLK_RCV = P3^2;
26 sbit CLK_RCV = P1^3;
27 sbit DAT_RCV = P1^0;
28 ULONG tick = 0, prevtick = 0;
29 #define LED P0
30 UCHAR bitCount = 0;
31
32 bit checkP(UCHAR fr);
33 void rcvBit(UCHAR i);
34 void exint0_isr(UCHAR i);
35
36 idata UCHAR bTmp[80]={0};
37 UCHAR frCount = 0;
38 UCHAR rcvFrCount = 0;
39 /*
40 1) Set/Reset Data
41 2) Delay 20 microseconds
42 3) Bring Clock low
43 4) Delay 40 microseconds
44 5) Release Clock
45 6) Delay 20 microseconds
46 */
47 void sendBit(bit b)
48 {
49 1 //bTmp[frCount]=b;
50 1 //frCount++;
51 1
52 1 DAT_SND=b;
53 1 delay_u(20);
54 1 CLK_SND=0;
55 1 delay_u(40);
C51 COMPILER V7.06 SERIAL 07/12/2006 00:10:08 PAGE 2
56 1 CLK_SND=1;
57 1 delay_u(20);
58 1 }
59
60 /*
61 1) Wait for Clock = high.
62 2) Delay 50 microseconds.
63 3) Clock still = high?
64 No--goto step 1
65 4) Data = high?
66 No--Abort (and read byte from host)
67 5) Delay 20 microseconds (=40 microseconds to the time Clock is pulled low in sending the start bit.)
68 6) Output Start bit (0) \ After sending each of these bits, test
69 7) Output 8 data bits > Clock to make sure host hasn't pulled it
70 8) Output Parity bit / low (which would abort this transmission.)
71 9) Output Stop bit (1)
72 10) Delay 30 microseconds (=50 microseconds from the time Clock is released in sending the stop bit)
73 */
74 void sendFrame(UCHAR fr)
75 {
76 1 UCHAR i;
77 1 while(!CLK_SND)
78 1 {
79 2 //delay_u(50);
80 2 }
81 1 //if(!CLK_SND) return;
82 1 if(!DAT_SND) return;
83 1 delay_u(20);
84 1 sendBit(0);
85 1 for(i=0;i<8;i++)
86 1 {
87 2 sendBit(fr&(1<<i));
88 2 }
89 1 sendBit(checkP(fr));
90 1 sendBit(1);
91 1 delay_u(30);
92 1 }
93
94 bit checkP(UCHAR fr)//奇校验
95 {
96 1 bit b=1;
97 1 UCHAR i=0;
98 1 for(;i<8;i++)
99 1 {
100 2 b^=(fr&0x01);
101 2 fr>>=1;
102 2 }
103 1 return b;
104 1 }
105
106 void clock_init() reentrant using 0
107 {
108 1 TR0=0;
109 1 TF0=0;
110 1 TH0=0xDB;//10ms
111 1 TL0=0xF0;
112 1 //TH0=0XFC;
113 1 //TL0=0X18;
114 1 TR0=1;
115 1 }
116
117 bit rcvFrame(UCHAR* pucData)
C51 COMPILER V7.06 SERIAL 07/12/2006 00:10:08 PAGE 3
118 {
119 1 UCHAR i;
120 1 UCHAR ucData = 0,ucDataTmp = 0;
121 1 //while(CLK_RCV);
122 1 //if(CLK_RCV) return FALSE;//时钟为高,表明没有数据
123 1 //ucData = 0;
124 1
125 1 //首位
126 1 while(CLK_RCV);//等待时钟线变低
127 1 while(!CLK_RCV);//等待时钟线变高
128 1
129 1 //8个数据位
130 1 for(i=0;i<8;i++)
131 1 {
132 2 while(CLK_RCV);//等待时钟线变低
133 2 ucDataTmp = ucDataTmp<<1;
134 2 ucDataTmp|=DAT_RCV;
135 2 while(!CLK_RCV);//等待时钟线变高
136 2 }
137 1
138 1 //奇校验位
139 1 while(CLK_RCV);//等待时钟线变低
140 1 while(!CLK_RCV);//等待时钟线变高
141 1
142 1 //末位
143 1 while(CLK_RCV);//等待时钟线变低
144 1 while(!CLK_RCV);//等待时钟线变高
145 1
146 1 CLK_RCV = 0;//拉低时钟抑制发送,进行字节序转换
147 1 for(i=0;i<8;i++)
148 1 {
149 2 ucData=ucData<<1;
150 2 ucData|=(ucDataTmp&0x01);
151 2 ucDataTmp=ucDataTmp>>1;
152 2 }
153 1 *pucData = ucData;
154 1 printf("\r\n%bu,0x%bx",ucData,ucData);
155 1 CLK_RCV = 1;
156 1 return TRUE;
157 1 }
158 /*
159 void rcvBit(UCHAR i)
160 {
161 while(CLK_RCV);//等待时钟线变低
162 //CLK = 0;//有数据,拉低时钟,抑制键盘发送,进行处理
163 //exint0_isr(i);
164 if(1<=i&&i<=8)
165 {
166 ucData = ucData<<1;
167 ucData|=DAT_RCV;
168 }
169 //CLK = 1;//处理完一位,释放时钟
170 while(!CLK_RCV);//等待时钟线变高
171 }*/
172
173 void main(void)
174 {
175 1 //long j;
176 1 //unsigned char a;
177 1 //UCHAR j;
178 1 //UCHAR ucBuf[16];
179 1 UCHAR ucData;
C51 COMPILER V7.06 SERIAL 07/12/2006 00:10:08 PAGE 4
180 1 bit bRet;
181 1
182 1 //sendFrame(0x87);
183 1
184 1 SCON = 0xD8; //串口方式1,允许接收
185 1 TMOD |= 0x20; //定时器1 定时方式2
186 1 TH1 = 0xFD; //12MHz 9600 波特率
187 1 TL1 = 0xFD;
188 1 TI = 1;
189 1 TR1 = 1; //启动定时器
190 1
191 1 //定时器0初始化
192 1 TMOD|=0X01;
193 1 TF0=0;
194 1 clock_init();
195 1 ET0=1;
196 1 EA = 1;
197 1 IT0=1;
198 1 EX0=1;
199 1
200 1
201 1
202 1 while(1)
203 1 {
204 2 //CLK_RCV =1;
205 2 bRet = rcvFrame(&ucData);
206 2 sendFrame(ucData);
207 2 //CLK_RCV = 0;
208 2 //if(bRet)
209 2 // printf("\r\n%bu,0x%bx",ucData,ucData);
210 2 /*sendFrame(0x1c);
211 2 delay_u(200);
212 2 sendFrame(0xf0);
213 2 delay_u(200);
214 2 sendFrame(0x1c);
215 2 delay_u(200);*/
216 2 //while(!isDataReady);
217 2
218 2 /*
219 2 if(!P2_0)//50ms打印一次
220 2 {
221 2 EA=0;
222 2 memcpy(ucBuf,gucBuf,sizeof(ucBuf));
223 2 EA=1;
224 2
225 2 for(j=0;j<rcvFrCount;j++)
226 2 {
227 2 //if(ucBuf[j]==0) break;
228 2
229 2 printf("\r\n%bu,0x%bx",ucBuf[j],ucBuf[j]);
230 2 EA=0;
231 2 pBuf = gucBuf;
232 2 memset(gucBuf,0,sizeof(gucBuf));
233 2 rcvFrCount = 0;
234 2 EA=1;
235 2 }
236 2 }*/
237 2 //ucData=0;
238 2 //isDataReady=0;
239 2 //i=0;//启动接收
240 2
241 2
C51 COMPILER V7.06 SERIAL 07/12/2006 00:10:08 PAGE 5
242 2 /*if(!P2_0) i=0;
243 2 P0=ucData;*/
244 2 };
245 1
246 1 }
247
248 void clk_int() interrupt 1 using 0
249 {
250 1 EA=0;
251 1 tick++;
252 1 //if(0==(tick%100)) printf("1");
253 1 clock_init();
254 1 EA=1;
255 1 }
256
257
258 //idata char c[100] = {0};
259 #if 0
void exint0_isr(UCHAR i) //interrupt 0 using 0
{
//CLK_RCV = 0;
EA=0;
bitCount++;
LED=bitCount;
//c[0]=0;
/*if(strlen(c)>90)
printf("%s",c);
if(tick-prevtick>5)//超过50ms,新启一帧
{
strcat(c,"\r\n");
}
if(P1_0)
strcat(c,"1");
else
strcat(c,"0");
prevtick = tick;*/
/*
if(tick-prevtick>5)//超过50ms,新启一帧
{
i=0;
ucData=0;
}
*/
//while(!canReceive)
if(0==i)
{
//prevtick = tick;
//if(0!=DAT_RCV) goto RET;//首位应为0,否则返回继续等待首位
}
else if(1<=i&&i<=8)
{
if(DAT_RCV)
{
ucData|=(1<<(i-1));
}
else
{
ucData|=(0<<(i-1));
}
/*if(8==i)
{
C51 COMPILER V7.06 SERIAL 07/12/2006 00:10:08 PAGE 6
printf("\r\n%bu,0x%bx",ucData,ucData);
}*/
}
else if(9==i)//奇偶检验位
{
}
else if(10==i)//停止位
{
/*if(1!=P1_0)
{
return;
//printf("\r\n接受停止位出错!");
}*/
//ucData=0;
//i=0;
//isDataReady = 1;
/**pBuf = ucData;
rcvFrCount++;
pBuf++;*/
//ucData=0;
//i=0;//启动接收
goto RET;
}
else goto RET;
//i++;
RET:
EA=1;
//CLK_RCV = 1;
return;
}
#endif
337
338 /*void delay_u(UCHAR t)
339 {
340 UCHAR i;
341 for(i=0;i<t;i++);
342 }*/
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 382 ----
CONSTANT SIZE = 12 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 31 1
IDATA SIZE = 80 ----
BIT SIZE = ---- 3
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -