📄 dac0808.lst
字号:
C51 COMPILER V7.50 DAC0808 04/11/2007 12:57:54 PAGE 1
C51 COMPILER V7.50, COMPILATION OF MODULE DAC0808
OBJECT MODULE PLACED IN dac0808.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE dac0808.c BROWSE DEBUG OBJECTEXTEND
line level source
1 //adc转化一定要有一定的时间,不要一转化完成后立即就再ADC=0转化.这样可能会出错
2 //adc的转化后最高值是OUT0非OUT7所以接线要注意.但也可通过程序转化.?
3 //74LS373内部本身有上位电阻,所以电路中,外接的SLED无需再接上上位电阻,接了会出错的
4 #include"reg51.h"
5 #include"intrins.h"
6 #include"absacc.h"
7 #define uchar unsigned char
8 #define uint unsigned int
9
10 void shift8(unsigned char temp); //移位程序
11 char rd8(void); //移位写入程序
12
13 sbit set=P2^0; //SET KEY
14 sbit up=P2^1; //UP KEY
15 sbit down=P2^2; //DOWN KEY
16 //24c02
17 sbit sda=P3^5;
18 sbit sck=P3^4;
19 sbit cc=PSW^7;
20 //24c02
21 bit up_ed; //UP KEY PRESSED
22 bit down_ed; //DOWN KEY PRESSED
23 bit set_ed;
24 bit set_over; //SET KEY PRESSED
25 bit timer_beg; //TIMER FLAG
26
27 sbit hot=P3^0; //HOT CONTROL
28 sbit cold=P3^1; //COLD CONTROL
29
30 //小数显示
31 sbit pp0=P2^3;
32 sbit pp1=P2^4;
33 sbit pp2=P2^5;
34 sbit pp3=P3^3;
35
36 uchar w4;
37 uchar w3;
38 uchar w2;
39 uchar w1; //显示电压(小数显示)
40 uchar rota=0;
41 uchar ad_data; //AD转化成的值
42 uchar set_deg; //设定的温度
43 uchar rel_deg; //实际温度
44 uchar second; //秒计时
45 uchar ms_100; //MS计时
46 uchar timer_100; //MS计时
47 char set_var; //设定温度差值
48 uchar change; //设定后按下SET的有效时间
49
50 #define adc XBYTE[0X7FF8] //AD Change adrress
51
52 //延时子程序
53 void delay(void)
54 {
55 1 uint i;
C51 COMPILER V7.50 DAC0808 04/11/2007 12:57:54 PAGE 2
56 1 for(i=0;i<30000;i++)
57 1 {
58 2 _nop_();
59 2 }
60 1 }
61
62 //开机按下SET自检子程序
63 void check_self(void)
64 {
65 1 uint i;
66 1 uchar j;
67 1 uchar array[10]={0x00,0x11,0x22,0x33,0x44,0x55,0x66,0x77,0x88,0x99};
68 1 while(i<20000)
69 1 {
70 2 i++;
71 2 if(~set)
72 2 {
73 3 for(j=0;j<10;j++)
74 3 {
75 4 P1=array[j];
76 4 delay();
77 4 }
78 3 i=49999;
79 3 }
80 2 }
81 1 }
82
83 //按键子程序
84 void key(void)
85 {
86 1 uchar i;
87 1 uchar temp;
88 1 if(~up)
89 1 {
90 2 for(i=0;i<50;i++) _nop_();
91 2 if(up) {up_ed=0;return;}
92 2 if(up_ed) return;
93 2 beep();
*** WARNING C206 IN LINE 93 OF DAC0808.C: 'beep': missing function-prototype
94 2 ms_100=0;
95 2 second=0;
96 2 timer_beg=1;
97 2 up_ed=1;
98 2 temp=set_deg;
99 2 set_deg++;
100 2 if(set_deg>=100) set_deg=99;
101 2 set_var=set_var+(set_deg-temp);
102 2 }
103 1 else
104 1 up_ed=0;
105 1
106 1
107 1 if(~down)
108 1 {
109 2 for(i=0;i<50;i++) _nop_();
110 2 if(down) {down_ed=0;return;}
111 2 if(down_ed) return;
112 2 beep();
113 2 ms_100=0;
114 2 second=0;
115 2 timer_beg=1;
116 2 temp=set_deg;
C51 COMPILER V7.50 DAC0808 04/11/2007 12:57:54 PAGE 3
117 2 down_ed=1;
118 2 if(set_deg<=1) set_deg=1;
119 2 set_deg--;
120 2 set_var=set_var-(temp-set_deg);
121 2 }
122 1 else
123 1 down_ed=0;
124 1
125 1 if(~set)
126 1 {
127 2 for(i=0;i<50;i++) _nop_();
128 2 if(set) {set_ed=0;return;}
129 2 if(set_ed) return;
130 2 set_ed=1;
131 2 beep();
132 2 if(timer_beg==0) return; //只有在按下UP/DOWN之后按下SET,SET才有效
133 2 timer_beg=0;
134 2 change=0;
135 2 if(second<=7) {set_over=1;second=0;ms_100=0;} //在一定的时间内按下SET则显示LED灯
136 2 }
137 1 else
138 1 set_ed=0;
139 1 }
140
141 //制热/冷子程序
142 void fan_ctrl(void)
143 {
144 1 if(change<30) return;
145 1 change=0;
146 1 if(timer_beg) return; //设定未确定前输入无法控制FAN;
147 1 if(rel_deg>set_deg) {cold=1;hot=0;}
148 1 else {hot=1;cold=0;}
149 1 }
150
151 //初始化子程序
152 void init(void)
153 {
154 1 second=0;
155 1 ms_100=0;
156 1 set_var=0;
157 1 timer_beg=0;
158 1 change=29;
159 1
160 1 pp0=pp1=pp2=pp3=0;
161 1
162 1 EA=1;
163 1 EX0=1;
164 1 IT0=1;
165 1
166 1 ET0=1;
167 1 TMOD=0X1;
168 1 TH0=0X0ec;
169 1 TL0=0X78;
170 1 TR0=1; //Start timer
171 1
172 1 hot=0;
173 1 cold=0;
174 1 up_ed=0;
175 1 down_ed=0;
176 1 //set_deg=50;
177 1 }
178
C51 COMPILER V7.50 DAC0808 04/11/2007 12:57:54 PAGE 4
179 void start(void)
180 {
181 1 sck=1;
182 1 _nop_();
183 1 _nop_();
184 1 sda=1;
185 1 _nop_();
186 1 _nop_();
187 1 sda=0;
188 1 _nop_();
189 1 _nop_();
190 1 sck=0;
191 1 _nop_();
192 1 _nop_();
193 1 }
194
195 void stop(void)
196 {
197 1 sda=0;
198 1 _nop_();
199 1 _nop_();
200 1 sck=1;
201 1 _nop_();
202 1 _nop_();
203 1 sda=1;
204 1 _nop_();
205 1 _nop_();
206 1 }
207
208 void ack(void)
209 {
210 1 sck=1;
211 1 _nop_();
212 1 _nop_();
213 1 sck=0;
214 1 _nop_();
215 1 _nop_();
216 1 }
217
218 //24c02写子程序
219 void write(void)
220 {
221 1 start();
222 1 shift8(0xa0);
223 1 ack();
224 1 shift8(0x00);
225 1 ack();
226 1 shift8(set_deg);
227 1 ack();
228 1 stop();
229 1 }
230
231 //24c02读子程序
232 void read(void)
233 {
234 1 start();
235 1 shift8(0xa0);
236 1 ack();
237 1 shift8(0x00); //地址
238 1 ack();
239 1 start();
240 1 shift8(0xa1);
C51 COMPILER V7.50 DAC0808 04/11/2007 12:57:54 PAGE 5
241 1 ack();
242 1 set_deg=rd8();
243 1 }
244
245 //显示转化子程序
246 void dis(void)
247 {
248 1 uint temp=ad_data;
249 1 uchar gw,sw;
250 1 temp=ad_data*(0x63);
251 1 temp=temp/(0x0ff); //得出实际温度
252 1 rel_deg=temp;
253 1
254 1 if(second>7) {set_deg-=set_var;set_var=0;timer_beg=0;second=0;ms_100=0;}
255 1 if(set_over) {set_deg+=0;set_over=0;write();set_var=0;}
256 1 temp=set_deg;
257 1 sw=temp/10;
258 1 gw=temp%10;
259 1 sw<<=4;
260 1 sw|=0x0f;
261 1 gw|=0x0f0;
262 1 sw&=gw;
263 1 temp=sw;
264 1 P1=temp;
265 1 }
266
267 //将得到的ADC转化为电压(小娄)
268 void proc(void)
269 {
270 1 unsigned int temp;
271 1 temp=ad_data;
272 1 w4=temp/51;
273 1 w3=(temp%51)*10/51;
274 1 w2=(((temp%51)*10)%51)*10/51;
275 1 w1=((((temp%51)*10)%51)*10%51)*10/51;
276 1 }
277
278 void dis_proc(void)
279 {
280 1 uchar array[10]={0xc0,0xF9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
281 1 rota++;
282 1 if(rota>=4) rota=0;
283 1 pp0=pp1=pp2=pp3=0;
284 1
285 1 switch(rota)
286 1 {
287 2 case 0:P0=array[w4]&0x7f;pp0=1;break;
288 2 case 1:P0=array[w3];pp1=1;break;
289 2 case 2:P0=array[w2];pp2=1;break;
290 2 case 3:P0=array[w1];pp3=1;break;
291 2 default:rota=0;break;
292 2 }
293 1 }
294
295 //AD转化中断程序
296 void adc0808(void) interrupt 0
297 {
298 1 EA=0;
299 1 ad_data=adc;
300 1 EA=1;
301 1 }
302
C51 COMPILER V7.50 DAC0808 04/11/2007 12:57:54 PAGE 6
303 //timer 0 100MS
304 void timer0(void) interrupt 1
305 {
306 1 EA=0;
307 1 dis_proc();
308 1 key();
309 1 dis();
310 1 timer_100++;
311 1 if(timer_100>=50) {change++;timer_100=0;}
312 1 if(!timer_beg) ms_100=0;
313 1 ms_100++;
314 1 if(ms_100>=50)
315 1 {second++;ms_100=0;} //1秒
316 1 TH0=0X0fc;
317 1 TL0=0X78;
318 1 EA=1;
319 1 }
320
321 //-----------------------------主函数-----------------------------//
322 void main(void)
323 {
324 1 uint i;
325 1 init();
326 1 EA=0;
327 1 check_self();
328 1 EA=1;
329 1 read();
330 1 timer_beg=0;
331 1 while(1)
332 1 {
333 2 adc=0;
334 2 proc();
335 2
336 2 //AD转化次后值给P0,同时也给了SLED显示,所以减少ADC可以减少SLED显示出ADC的值
337 2 //只要FOR大点,可以减少ADC,但是太大了,ADC转化速度又变慢.
338 2
339 2 for(i=0;i<20000;i++)
340 2 {
341 3 _nop_();
342 3 _nop_();
343 3 _nop_();
344 3 _nop_();
345 3 }
346 2 fan_ctrl();
347 2 }
348 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 1004 ----
CONSTANT SIZE = 20 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 13 26
IDATA SIZE = ---- ----
BIT SIZE = 5 ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 1 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -