📄 1.lst
字号:
C51 COMPILER V7.50 1 04/17/2008 14:38:42 PAGE 1
C51 COMPILER V7.50, COMPILATION OF MODULE 1
OBJECT MODULE PLACED IN 1.OBJ
COMPILER INVOKED BY: d:\Keil\C51\BIN\C51.EXE 1.C ROM(COMPACT) BROWSE DEBUG OBJECTEXTEND
line level source
1 /*
2 *********************************************************************************************************
3 * 倒计时牌源代码
4 *
5 * CPU :AT89C2051
6 *
7 * FILE : 18.C
8 * By : CC
9 * DATE : 2008-04-05
10 * VERSION : 1.0
11 * 修改记录 :
12 *********************************************************************************************************
13 */
14 #include<REG2051.H>
15
16 #define uchr unsigned char
17 #define uint unsigned int
18
19 #define T100MS 180//100ms
20 #define T500MS 500//500ms
21 #define T1S 1000//1000ms
22 #define TMAX 20000//20s
23 #define DISP_0 0xFC
24 #define DISP_1 0x0C
25 #define DISP_2 0xDA
26 #define DISP_3 0xF2
27 #define DISP_4 0x66
28 #define DISP_5 0xB6
29 #define DISP_6 0xBE
30 #define DISP_7 0xE0
31 #define DISP_8 0xFE
32 #define DISP_9 0xF6
33 #define DISP_10 0x01
34
35 #define WIP 0x01 //X5045 写操作忙标志位掩码
36 #define WEL 0x02 //X5045 写保护标志位掩码
37 #define WDT 0x00 //X5045 看门狗时间:1.4s
38 //#define WDT 0x10 //X5045 看门狗时间:600ms
39 //#define WDT 0x20 //X5045 看门狗时间:200ms
40 //#define WDT 0x30 //X5045 关闭看门狗
41 #define BLA 0x00 //X5045 ROM块锁定范围:无
42 //#define BLA 0x04 //X5045 ROM块锁定范围:180H-1FFH
43 //#define BLA 0x08 //X5045 ROM块锁定范围:100H-1FFH
44 //#define BLA 0x0C //X5045 ROM块锁定范围:000H-1FFH
45
46
47 #define WREN 0x06 //允许X5045写操作
48 //#define WRDS 0x04 //禁止X5045写操作
49 #define RDSR 0x05 //读X5045状态寄存器
50 #define WRSR 0x01 //写X5045状态寄存器
51
52 sbit LE = P3^7;
53 sbit p17 = P1^7;
54 //X5045 PINS
55 sbit cs = P3^4;
C51 COMPILER V7.50 1 04/17/2008 14:38:42 PAGE 2
56 sbit sck = P3^0;
57 sbit si = P3^1;
58 sbit so = P3^5;
59
60 extern bit freset = 0;
61 extern bit frcntdstart = 0;
62 //extern bit fgcntdstart = 0;
63 extern bit frpulsechk = 0;
64 //extern bit fgpulsechk = 0;
65 extern bit frcntdend = 0;
66 //extern bit fgcntdend = 0;
67 extern bit frcomp = 0;
68 //extern bit fgcomp = 0;
69 extern bit frdisp = 0;
70 //extern bit fgdisp = 0;
71 extern bit frdispstr = 0; //////////////
72
73 //extern uchr gcountdn = 0;
74 extern uint rcntdtim = 0; /////////////////
75 //extern uchr gcntdtim = 0;
76 extern uint rchktim = 0;
77 //extern uint gchktim = 0;
78 extern uint r1stim = 0;
79 //extern uint g1stim = 0;
80 extern uchr rcountdn = 0;
81
82
83 void rint(void);
84 void t0int(void);
85 void disp(uchr num);
86 void closedisp(void);
87 void delay(void);
88 void delay1(void);
89 void send(uchr tx);
90 void x5045ini(void);
91 //void 2051initi(void);
92 void main(void)
93 {
94 1 uchr rdisptim=0;
95 1 //uchr gdisptim=0;
96 1 uchr tmp=0,i=0;
97 1 P1=0xFF;
98 1 LE=0;
99 1 EA=1;
100 1 //外部中断允许,下降沿触发
101 1 PX0=1;
102 1 IT0=1;
103 1 PT0=0;
104 1 TMOD=0x11;
105 1 TL0=0x66;
106 1 TH0=0xFC;
107 1 TR0=1;
108 1 x5045ini();
109 1 delay1();
110 1 EX0=1;
111 1 ET0=1;
112 1
113 1 while(1)
114 1 {
115 2 cs=0;
116 2 cs=1;
117 2 if(frdispstr==1)//显示标志置1///
C51 COMPILER V7.50 1 04/17/2008 14:38:42 PAGE 3
118 2 {
119 3 if(frdisp==1)//显示更新标志置1//
120 3 {
121 4 frdisp=0;//清显示更新标志//
122 4 if(rdisptim>2) { rdisptim--; disp(rdisptim); }
123 4 else closedisp();
124 4 }
125 3 }
126 2 else closedisp();
127 2 if(frcomp)
128 2 {
129 3 frcomp=0;
130 3 tmp=(rcntdtim-T1S)/1000;
131 3 if(((rcntdtim-T1S)%1000)/100 >= 5) tmp++;
132 3 if(rcountdn!=tmp) rcountdn=tmp;
133 3 rdisptim=rcountdn-1;
134 3 }
135 2 }
136 1 }
137
138 //////外部中断0服务程序///////////////////////////////////////////////////////////////////////////////
139 void rint(void) interrupt 0
140 {
141 1 if (frcntdstart==0)////触发脉冲还没有来到时//
142 1 {
143 2 if((rchktim>T100MS)&&(rchktim<T500MS))//如果时间大于100ms并且小于500ms,/////检测到触发脉冲////////准
-备开始计数
144 2 {
145 3 //p17=!p17;
146 3 rcntdtim=rchktim; //延时计数器
147 3 r1stim=rchktim; //用于处理1秒钟后要更新显示的问题//
148 3 frcntdstart=1; //触发脉冲来到标志
149 3 frdispstr=1; //显示开始标志
150 3 }
151 2 }
152 1 frpulsechk=1;//保证在红灯亮的前提下让定时器0开始计数//否则定时器0进入中断只是重置初值而不计数//
153 1 rchktim=0;//清0脉宽计数器
154 1 }
155 ////////////定时器0中断服务程序///////////////////////////////////////////////////////////////////////
156 //T0:16位,1ms//11.0592MHZ晶振////////////////////
157 void t0int(void) interrupt 1
158 {
159 1 TL0=0x66;
160 1 TH0=0xFC;
161 1 // tt0++;
162 1 if(frpulsechk==1)
163 1 {
164 2 rchktim++;
165 2 if(rchktim>=T1S)////判断学习结束//学习时间结束后的1S//
166 2 {
167 3 frpulsechk=0;//红灯已经熄灭没有脉冲了//
168 3 rchktim=0;
169 3 if(frcntdstart==1) frcntdend=1;//置学习时间结束标志///
170 3 }
171 2 }
172 1 if(frcntdstart==1)////触发脉冲来到之后///
173 1 {
174 2 if(frcntdend==0)////如果学习时间还没有结束//
175 2 {
176 3 r1stim++;///从触发脉冲来到的时刻起一直在计算时间///
177 3 rcntdtim++;///从触发脉冲来到的时刻起延时计数器也一直在计算时间///
178 3 if(r1stim>=T1S)/////从触发脉冲来到的时刻起每隔1秒的时间//置显示更新标志
C51 COMPILER V7.50 1 04/17/2008 14:38:42 PAGE 4
179 3 {
180 4 r1stim=0;///清0//
181 4 frdisp=1;///每隔1秒的时间置显示更新标志//
182 4 }
183 3 if(rcntdtim>=TMAX) frcntdend=1; ///包含触发脉冲共20S后认为结束//
184 3 }
185 2 else////学习结束///
186 2 {
187 3 frcomp=1;//比较标志置1///
188 3 frcntdstart=0;
189 3 frcntdend=0;
190 3 frdisp=0;
191 3 frdispstr=0;
192 3 }
193 2 }
194 1 }
195 ////////////////////////////////////////////////////////////////////////////////////////////
196 void disp(uchr num)
197 {
198 1 P1=0xFF;
199 1 LE=0;
200 1 switch(num%10)
201 1 {
202 2 case 0:P1 = P1 & DISP_0; break;
203 2 case 1:P1 = P1 & DISP_1; break;
204 2 case 2:P1 = P1 & DISP_2; break;
205 2 case 3:P1 = P1 & DISP_3; break;
206 2 case 4:P1 = P1 & DISP_4; break;
207 2 case 5:P1 = P1 & DISP_5; break;
208 2 case 6:P1 = P1 & DISP_6; break;
209 2 case 7:P1 = P1 & DISP_7; break;
210 2 case 8:P1 = P1 & DISP_8; break;
211 2 case 9:P1 = P1 & DISP_9; break;
212 2 default: break;
213 2 }
214 1 if(num>=10) P1|=DISP_10;
215 1 LE=1;
216 1 delay();
217 1 LE=0;
218 1 }
219 //////////////////////////////
220 void closedisp(void)
221 {
222 1 P1=0;
223 1 LE=1;
224 1 delay();
225 1 LE=0;
226 1 }
227 //////////////////////////
228 void delay()
229 {
230 1 uchr i;
231 1 for(i=0;i<10;i++)
232 1 {;}
233 1 }
234 ///////////////////////////////////////////////////////
235 void delay1()
236 {
237 1 uint i;
238 1 for(i=0;i<1000;i++)
239 1 {;}
240 1 }
C51 COMPILER V7.50 1 04/17/2008 14:38:42 PAGE 5
241 //////////////////////////////////////////////////////
242 void send(uchr tx)
243 {
244 1 uchr i;
245 1 uchr tmp=0x80;
246 1 for(i=0;i<8;i++)
247 1 {
248 2 sck = 0 ;
249 2 if(tx & tmp)si = 1;
250 2 else si = 0;
251 2 tmp = tmp >> 1;
252 2 delay();
253 2 sck = 1;
254 2 delay();
255 2 }
256 1 }
257 ///////////////////////////////////////////////////////////
258 void x5045ini(void)
259 {
260 1 cs = 1;
261 1 delay();
262 1 cs = 0;
263 1 delay();
264 1 send(WREN);
265 1 cs = 1;
266 1 delay();
267 1 cs = 0;
268 1 delay();
269 1 send(WRSR);
270 1 send(WDT);//设置X5045
271 1 cs = 1;
272 1 delay1();
273 1 }
274 ////////////////////////////////////////////////////////////
275
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 530 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 7 3
IDATA SIZE = ---- ----
BIT SIZE = 7 ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -