?? cam.lst
字號:
C51 COMPILER V8.16 CAM 05/23/2009 21:20:21 PAGE 1
C51 COMPILER V8.16, COMPILATION OF MODULE CAM
OBJECT MODULE PLACED IN CAM.obj
COMPILER INVOKED BY: D:\Program Files\Keil\C51\BIN\C51.EXE SRC\CAM.c BROWSE DEBUG OBJECTEXTEND CODE PRINT(.\CAM.lst) OBJ
-ECT(CAM.obj)
line level source
1 #include <SST89x5xxRD2.h>
2 #define uchar unsigned char
3 #define uint unsigned int
4 #define Width 10 //圖像的寬80(8*10)個像素
5 #define Height 32 //圖像的高
6 uchar lcd_x;//lcd的x坐標
7 uchar lcd_y;//lcd的y坐標
8
9 sbit cs=P3^3; //定義LCD的D/#C控制口
10 sbit std=P3^5; //定義LCD的串行數據端口
11 sbit sclk=P3^7; //定義LCD的串行時鐘端口
12 sbit rst=P3^6;
13 sbit key=P2^0;
14
15 uchar code SYNC_ID[]= {0xaa,0x0d,0x00,0x00,0x00,0x00};
16 uchar code INITAL_ID[]= {0xaa,0x01,0x00,0x01,0x01,0x01}; //2位灰度圖160*120,4800B
17 uchar code BAUDRATE_ID[]= {0xaa,0x07,0xbf,0x01,0x00,0x00}; //baudrate=9600
18 uchar code SNAPSHOT_ID[]= {0xaa,0x05,0x01,0x00,0x00,0x00};
19 uchar code GETPICTURE_ID[]= {0xaa,0x04,0x01,0x00,0x00,0x00};
20 uchar code RESET1_ID[]= {0xaa,0x08,0x01,0x00,0x00,0x00};//狀態寄存器復位
21 uchar code RESET2_ID[]= {0xaa,0x08,0x00,0x00,0x00,0x00};//完全復位
22 uchar code SLEEP_ID[]= {0xaa,0x09,0x00,0x00,0x00,0x00};
23 uchar code ACK1_ID[]= {0xaa,0x0e,0x0d,0x00,0x00,0x00};
24 uchar code ACK2_ID[]= {0xaa,0x0e,0x0a,0x00,0x00,0x00};
25
26 //定義兩個隊列用來緩存圖片數據
27 uchar xdata Picture_Dat1[256]; //內部擴展數據RAM(00H~2FFH)
28 uchar xdata Picture_Dat2[256];
29 uchar idata front=0,rear=0;//隊列的隊頭指針和隊尾指針
30 bit bank;//bank=0指向Picture_Dat1,否則指向Picture_Dat2
31
32 uint idata countr;//已接受的數據(byte)
33
34 bit error;//傳輸出錯
35
36 void delay(uchar mm)
37 {
38 1 uchar idata i;
39 1 for(i=0;i<mm;i++)
40 1 ;
41 1 }
42
43 void delay_1ms()
44 {
45 1 uchar idata i;
46 1 for(i=0;i<255;i++)
47 1 ;
48 1 for(i=0;i<42;i++)
49 1 ;
50 1 }
51
52 void delay_ms(uchar t)
53 {
54 1 uchar idata i;
C51 COMPILER V8.16 CAM 05/23/2009 21:20:21 PAGE 2
55 1 for(i=0;i<t;i++)
56 1 delay_1ms();
57 1 }
58
59 void wr_lcd (uchar dat_comm,uchar content)
60 {
61 1 uchar idata a,i,j;
62 1 delay(50);
63 1 a=content;
64 1 cs=1;
65 1 sclk=0;
66 1 std=1;
67 1 for(i=0;i<5;i++)
68 1 {
69 2 sclk=1;
70 2 sclk=0;
71 2 }
72 1 std=0;
73 1 sclk=1;
74 1 sclk=0;
75 1 if(dat_comm)
76 1 std=1;//data
77 1 else
78 1 std=0;//command
79 1 sclk=1;
80 1 sclk=0;
81 1 std=0;
82 1 sclk=1;
83 1 sclk=0;
84 1 for(j=0;j<2;j++)
85 1 {
86 2 for(i=0;i<4;i++)
87 2 {
88 3 a=a<<1;
89 3 std=CY;
90 3 sclk=1;
91 3 sclk=0;
92 3 }
93 2 std=0;
94 2 for(i=0;i<4;i++)
95 2 {
96 3 sclk=1;
97 3 sclk=0;
98 3 }
99 2 }
100 1 }
101
102 void init_lcd (void)
103 {
104 1 rst=0;
105 1 delay(100);
106 1 rst=1;
107 1 wr_lcd(0,0x30); //30---基本指令動作
108 1 wr_lcd(0,0x01); //清屏,地址指針指向00H
109 1 delay(100);
110 1 wr_lcd(0,0x06); //光標的移動方向
111 1 wr_lcd(0,0x0c); //開顯示,關游標
112 1 }
113
114
115
116
C51 COMPILER V8.16 CAM 05/23/2009 21:20:21 PAGE 3
117
118
119
120 //1、換晶振,用22.1184M晶振,在TH1=0xff時,剛好可以產生115200波特率。
121
122 //2、采用6個時鐘周期的單片機(換單片機啊。。。)
123
124 //3、增強型51單片機有定時器2!(幸好偶用的是增強型。。。)
125
126 //就用第三種方法啦!這時的公式如下:
127
128 //波特率=11059200/(32×[65536-(RCAP2H,RCAP2L)])
129
130 //其中的RCAP2H,RCAP2L為自動重裝值,由上式得:
131
132 //RCAP2H,RCAP2L=65536-11059200/(32×波特率)
133
134 void init_UART()
135 {
136 1 SCON=0x50; //串口工作方式1,8位UART,波特率可變
137 1 TH2=0xFF;
138 1 TL2=0xDC; //波特率:9600 晶振=11.0592MHz
139 1 RCAP2H=0xFF;
140 1 RCAP2L=0xDC; //16位自動再裝入值
141 1 //*****************
142 1 TCLK=1;
143 1 RCLK=1;
144 1 C_T2=0;
145 1 EXEN2=0; //波特率發生器工作方式
146 1
147 1 //*****************
148 1 ES=0;//關閉串口中斷
149 1 EA=1;//開全局中斷
150 1 TR2=1 ; //定時器2開始
151 1 }
152
153 void Read_Picture() interrupt 4 using 1
154 {
155 1 uchar dat;
156 1 if(RI)
157 1 {
158 2 dat=SBUF;
159 2 RI=0;
160 2 if(front==rear+1)//隊列已滿
161 2 {
162 3 ES=0;
163 3 error=1;
164 3 }
165 2 if(bank)
166 2 {
167 3 Picture_Dat2[rear]=dat;
168 3 bank=!bank;
169 3 rear++;
170 3 }
171 2 else
172 2 {
173 3 Picture_Dat2[rear]=dat;
174 3 bank=!bank;
175 3 countr++;
176 3 countr++;
177 3 }
178 2 }
C51 COMPILER V8.16 CAM 05/23/2009 21:20:21 PAGE 4
179 1 }
180
181 void Send_Cmd(uchar *cmd)
182 {
183 1 uchar idata i;
184 1 for(i=0;i<6;i++)
185 1 {
186 2 SBUF=cmd[i];
187 2 while(TI==0)
188 2 ;
189 2 TI=0;
190 2 delay(1);
191 2 }
192 1 }
193
194 void Wait_ACK(uchar *cmd)
195 {
196 1 uchar idata i;
197 1 for(i=0;i<6;i++)
198 1 {
199 2 while(RI==0)
200 2 ;
201 2 cmd[i]=SBUF;
202 2 RI=0;
203 2 }
204 1 //if(cmd[0]==0xAA&&cmd[1]>=0x01&&cmd[1]<=0x0F)
205 1 // return 1;
206 1 //return 0;
207 1 }
208
209 bit CAM_Cmd(uchar *cmd)
210 {
211 1 uchar idata temp_cmd[6];
212 1 Send_Cmd(cmd);
213 1 Wait_ACK(temp_cmd);
214 1 if(temp_cmd[0]==0xAA&&temp_cmd[1]==0x0E&&temp_cmd[2]==cmd[1])
215 1 {
216 2 delay_ms(50);
217 2 return 1;
218 2 }
219 1 return 0;
220 1 }
221
222 bit Send_SYNC_Cmd()
223 {
224 1 uchar idata OldTH2,OldTL2;//保存原先的波特率
225 1 uchar idata cmd1[6];
226 1 uchar idata cmd2[6];
227 1 uchar idata i,j,k;
228 1 //*****************
229 1 //將波特率調整為115200
230 1 TR2=0 ; //定時器2停止
231 1 OldTH2=RCAP2H;
232 1 OldTL2=RCAP2L;
233 1 TH2=0xFF;
234 1 TL2=0xFD; //波特率:115200 晶振=11.0592MHz
235 1 RCAP2H=0xFF;
236 1 RCAP2L=0xFD; //16位自動再裝入值
237 1 TR2=1 ; //定時器2開始
238 1 //*****************
239 1 for(i=0;i<60;i++)
240 1 {
C51 COMPILER V8.16 CAM 05/23/2009 21:20:21 PAGE 5
241 2 Send_Cmd(SYNC_ID);
242 2 for(j=0;j<255;j++)
243 2 {
244 3 for(k=0;k<255;k++)
245 3 {
246 4 if(RI!=0)
247 4 {
248 5 Wait_ACK(cmd1);
249 5 Wait_ACK(cmd2);
250 5 break;
251 5 }
252 4 }
253 3 }
254 2 if(j==255&&k==255)//350ms內沒有獲得應答
255 2 continue;
256 2 if(cmd1[0]!=0xAA||cmd1[1]!=0x0E||cmd1[2]!=0x0D)
257 2 continue;
258 2 if(cmd2[0]!=0xAA||cmd2[1]!=0x0D)
259 2 continue;
260 2 Send_Cmd(ACK1_ID);
261 2 delay_ms(50);
262 2 break;
263 2 }
264 1 if(i==60)
265 1 return 0;
266 1
267 1 //將CAM的波特率設置為9600
268 1 CAM_Cmd(BAUDRATE_ID);
269 1
270 1 //*****************
271 1 //恢復原先波特率9600
272 1 TR2=0 ; //定時器2停止
273 1 TH2=OldTH2;
274 1 TL2=OldTL2;
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -