📄 408al.lst
字号:
C51 COMPILER V8.08 408AL 02/11/2009 11:21:57 PAGE 1
C51 COMPILER V8.08, COMPILATION OF MODULE 408AL
OBJECT MODULE PLACED IN 408al.OBJ
COMPILER INVOKED BY: E:\应用软件\keil c\C51\BIN\C51.EXE 408al.c BROWSE DEBUG OBJECTEXTEND
line level source
1 #include <reg51.h>
2 #include <stdio.h>
3 #include <intrins.h>
4 #include <math.h>
5
6 /******************************与编译器无关的数据类型定义*********************************/
7 typedef unsigned char uint8;
8 typedef signed char int8;
9 typedef unsigned short uint16;
10 typedef signed short int16;
11 typedef unsigned long uint32;
12 typedef signed long int32;
13 typedef float fp32;
14 typedef double fp64;
15 /********************************************************************************************
16 * 定义参数变量名
17 *********************************************************************************************/
18 sbit START=P3^5;
19 sbit STR=P3^6;
20 sbit SUBTIME=P3^7;
21 sbit CE=P1^0;
22 sbit OE=P1^1;
23 sbit STDBY=P1^2;
24 sbit SEN=P1^4;
25 sbit SCLK=P1^5;
26 sbit ACC_0=ACC^0;
27 sbit SDATA=P1^6;
28 sbit ACLK=P1^7;
29 sbit ADD_SUN=P2^5;
30 sbit SUBB_SUN=P2^7;
31 unsigned char NumINT0, TIME_NUM, WAIT;
32 unsigned char COM_P,STOP,COM_DATA;
33
34 /********************************************************************************************
35 * 函数名称:COM1() (SMOD=1,则波特率=19200) (SMOD=0,则波特率=9600)
36 * 功 能:串口初始化,用于串口数据发送(晶振为11.0592MHZ)
37 * 入口参数:无
38 * 出口参数:无
39 *********************************************************************************************/
40 void COM1()
41 {
42 1 TMOD=0X22; //(设置定时器T0工作在方式2)
43 1 TL1=0XFD;
44 1 TH1=0XFD;
45 1 SCON=0X50; //(采用方式1,波特率可变,带奇偶校验的)
46 1 PCON=0X80; //(SMOD=1)
47 1 TR1=1;
48 1 }
49
50 /********************************************************************************************
51 * 函数名称:EXIT_INT0()
52 * 功 能:外部中断0程序,用于检测CPLD计数地址是否计数完毕,转由单片机调用地址。
53 * 入口参数:无
54 * 出口参数:无
55 *********************************************************************************************/
C51 COMPILER V8.08 408AL 02/11/2009 11:21:57 PAGE 2
56 void EXIT_INT0() interrupt 0 //外部中断0子程序
57 {
58 1 unsigned char CCD_DATAL,CCD_DATAH,CCD_DATA;
59 1 unsigned char K1;
60 1 unsigned int K2;
61 1 NumINT0-=1; //第一,第二次曝光都放弃,第三次曝光保存。
62 1
63 1 if(NumINT0==0)
64 1 {
65 2 START=0; //START为低电平,表示CPLD计数地址停止,由单片机ACLK发出脉冲信号计数地址。
66 2 STR=1; //STR为高电平,关闭74HC244,此时74HC244输出呈高阻态
67 2 STDBY=1; //关闭TDA9965输出
68 2 while(COM_DATA!=66) //握手协议,准备发送串行数据给上位机PC
69 2 {
70 3 SBUF=88;
71 3 while(TI==0);
72 3 TI=0;
73 3 while(RI==0);
74 3 RI=0;
75 3 COM_DATA=SBUF;
76 3 } // while(COM_DATA!=66) 循环语句结束
77 2 COM_DATA=0X22;
78 2 for(K1=0;K1<247;K1++)
79 2 {
80 3 for(K2=1;K2<769;K2++)
81 3 {
82 4 OE=0;
83 4 CCD_DATAL=P0;
84 4 CCD_DATAH=P2;
85 4 OE=1; //读控制信号有效
86 4 CCD_DATA=(CCD_DATAH<<4)+(CCD_DATAL>>4);
87 4 ACLK=0; //地址计数脉冲信号
88 4 ACLK=1;
89 4 if(K2%2==1)
90 4 {
91 5 SBUF=CCD_DATA; //将累加器数据送入SBUF,准备发送
92 5 while(TI==0);
93 5 TI=0;
94 5 } // if(K1==244)语句结束
95 4 } //for循环语句结束
96 3 }
97 2 COM_P=0X00;
98 2 NumINT0=3; //重新赋NumINT0值
99 2 START=1; //转向由CPLD开始对地址计数
100 2 STR=0; //STR为低电平,开启74HC244
101 2 STDBY=0; //启动TDA9965输出
102 2 OE=1; //读控制信号无效
103 2 } //if(NumINT0==0)循环语句结束
104 1 STOP=0X02;
105 1 }
106
107 /********************************************************************************************
108 * 函数名称:delay_1ms()
109 * 功 能:软件延时
110 * 入口参数:t 延时参数,t值越大,延时越长
111 * 出口参数:无
112 *********************************************************************************************/
113 void delay_1ms(unsigned char t)
114 {
115 1 unsigned int i,j;
116 1 for(i=0;i<t;i++)
117 1 for(j=0;j<120;j++);
C51 COMPILER V8.08 408AL 02/11/2009 11:21:57 PAGE 3
118 1 }
119
120 void delay_50us(unsigned char t1)
121 {
122 1 unsigned int i,j;
123 1 for(i=0;i<t1;i++)
124 1 for(j=0;j<120;j++);
125 1 }
126 /********************************************************************************************
127 * 函数名称:EXIT_INT1()
128 * 功 能:外部中断1程序,采用外部中断1的下跳沿信号,对CCD进行曝光控制。
129 * 入口参数:无
130 * 出口参数:无
131 *********************************************************************************************/
132 void EXIT_INT1() interrupt 2
133 {
134 1 SUBTIME=0; //SUBTIME为低电平,开始进行曝光控制;
135 1 delay_50us(TIME_NUM); //根据设置TIME_NUM的数值,进行曝光延时控制;
136 1 SUBTIME=1;
137 1 }
138 /********************************************************************************************
139 * 函数名称:TDA9965()
140 * 功 能:对TDA9965写入参数值。
141 * 入口参数:无
142 * 出口参数:无
143 *********************************************************************************************/
144 void TDA9965(unsigned int TDA_SDATA)
145 {
146 1 unsigned char i;
147 1 SCLK=0;
148 1 SEN=0;
149 1 for(i=0;i<12;i++)
150 1 {
151 2 TDA_SDATA=_iror_(TDA_SDATA,1); //右循环移位,将参数一位位的参数移到SDATA中
152 2 ACC=TDA_SDATA;
153 2 SDATA=ACC_0;
154 2 SCLK=1;
155 2 SCLK=0;
156 2 }
157 1 SEN=1;
158 1 SCLK=1;
159 1 }
160
161 /********************************************************************************************
162 * 函数名称:main()
163 * 功 能:主函数
164 * 入口参数:无
165 * 出口参数:无
166 *********************************************************************************************/
167 void main()
168 {
169 1 STR=0; //74HC244工作有效,74HC244输出A=Y;
170 1 START=1; //START为高电平,CPLD对地址计数有效;
171 1 STDBY=0; //STDBY为低电平,启动TDA9965芯片工作。
172 1 OE=1; //OE为高电平,关闭外部数据储存器的读控制信号;
173 1 CE=0; //CE为低电平,外部数据存储器选通;
174 1 TIME_NUM=20;
175 1 STOP=0X01;
176 1 COM_P=0X00;
177 1 COM_DATA=0X22; //COM_DATA初始化
178 1 TDA9965(0X3FF0);
179 1 TDA9965(0X4FF0);
C51 COMPILER V8.08 408AL 02/11/2009 11:21:57 PAGE 4
180 1 TDA9965(0XAAE0);
181 1 TDA9965(0XC070);
182 1 SUBTIME=1; //SUBTIME为高电平,单片机没有实时曝光控制;
183 1 NumINT0=0X03; //采用三次曝光取一次曝光值,进行存储;
184 1 COM1();
185 1 EA=1;
186 1 EX1=1;
187 1 IT1=1;
188 1 ADD_SUN=1;
189 1 SUBB_SUN=1;
190 1
191 1
192 1 while(1)
193 1 {
194 2
195 2 if(ADD_SUN==0) //判断是否有"+"键被按下,如果有,每按下一次"+"键,相应的曝光延时增加1ms
196 2 {
197 3 delay_1ms(10);
198 3 if(ADD_SUN==0)
199 3 {
200 4 if(TIME_NUM<80)
201 4 TIME_NUM=TIME_NUM+1;
202 4 else
203 4 TIME_NUM=80;
204 4 while(ADD_SUN==0);
205 4 delay_1ms(10);
206 4 }
207 3 }
208 2
209 2
210 2 if(SUBB_SUN==0) //判断是否有"-"键被按下,如果有,每按下一次"-"键,相应的曝光延时减少1ms
211 2 {
212 3 delay_1ms(10);
213 3 if(SUBB_SUN==0)
214 3 {
215 4 if(TIME_NUM>1)
216 4 TIME_NUM=TIME_NUM-1;
217 4 else
218 4 TIME_NUM=1;
219 4 while(SUBB_SUN==0);
220 4 delay_1ms(10);
221 4 }
222 3 }
223 2
224 2
225 2 if(RI==1) //如果PC机KEY键有按下,则转向中断处理
226 2 {
227 3 RI=0;
228 3 COM_P=SBUF;
229 3
230 3 while(COM_P==0X01) //如果PC机KEY1键有按下,循环一次退出
231 3 {
232 4 EX0=1;
233 4 IT0=1;
234 4 while(STOP==0X01);
235 4 STOP=0X01;
236 4 EX0=0;
237 4 IT0=0;
238 4 }
239 3
240 3 while(COM_P==0X02) //如果PC机KEY2键有按下,则一直循环
241 3 {
C51 COMPILER V8.08 408AL 02/11/2009 11:21:57 PAGE 5
242 4 EX0=1;
243 4 IT0=1;
244 4 while(STOP==0X01);
245 4 STOP=0X01;
246 4 if(RI==1)
247 4 {
248 5 RI=0;
249 5 COM_P=SBUF;
250 5 }
251 4 if(COM_P==0X03)
252 4 break;
253 4
254 4 COM_P=0X02;
255 4 }
256 3
257 3 } //结束if(RI==1)语句
258 2 } //结束while(1)循环语句
259 1
260 1 }//main主函数结束
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 517 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 6 ----
IDATA SIZE = ---- ----
BIT SIZE = ---- ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -