📄 text1.lst
字号:
C51 COMPILER V8.05a TEXT1 02/05/2009 20:39:53 PAGE 1
C51 COMPILER V8.05a, COMPILATION OF MODULE TEXT1
OBJECT MODULE PLACED IN Text1.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE Text1.c BROWSE DEBUG OBJECTEXTEND
line level source
1 #include "reg51.h"
2 #define uint unsigned int
3 #define uchar unsigned char
4 uchar disbuf[6];
5 unsigned char code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,
6 0xf8,0x80,0x90,0x88,0x83,0xc6,0xa2,0x86,0x8e};
7 float VolTureValudeA;
8 #define V_hig 0x80
9 #define V_mid 0x40
10 #define V_low 0x20
11 sbit e=P2^3;
12 sbit cs=P2^5;
13 sbit din=P2^6;
14 sbit clk=P2^4;
15 sbit out=P2^7;
16 bdata bit busy=0;
17 uchar disp_move=0;
18 long float Vol_actual;
19 uchar Level=2; //0,1,2三个电压等级标志
20
21 void delay3(int a)
22 {
23 1 while(a--);
24 1 }
25
26 uint read1543(uchar port) //从TLC1543读取采样值,形参port是采样的通道号
27 {
28 1 uint data ad;uint data i;
29 1 uchar data al=0,ah=0;
30 1
31 1 busy=1;
32 1 clk=0;
33 1 cs=0;
34 1 port<<=4;
35 1 for (i=0;i<4;i++) //把通道号打入1543
36 1 {
37 2 din=(bit)(port&0x80);clk=1;clk=0;
38 2 port<<=1;
39 2 }
40 1
41 1 for (i=0;i<6;i++) //填充6个CLOCK
42 1 {
43 2 clk=1;clk=0;
44 2 }
45 1
46 1 cs=1;
47 1 delay3(20);
48 1 cs=0; //等待AD转换
49 1 while(e==0);
50 1 delay3(5);
51 1
52 1 for (i=0;i<2;i++) //取D9,D8
53 1 {
54 2 out=1;
55 2 clk=1;
C51 COMPILER V8.05a TEXT1 02/05/2009 20:39:53 PAGE 2
56 2 ah<<=1;
57 2 if (out) ah|=0x01;
58 2 clk=0;
59 2 }
60 1
61 1 for (i=0;i<8;i++) //取D7--D0
62 1 {
63 2 out=1;
64 2 clk=1;
65 2 al<<=1;
66 2 if (out) al|=0x01;
67 2 clk=0;
68 2 }
69 1
70 1 cs=1;
71 1 ad=(uint)ah;ad<<=8;ad|=(uint)al; //得到AD值
72 1 busy=0;
73 1 return (ad);
74 1 }
75
76 /*float GetData_MedianFilter()
77 {
78 unsigned int xdata m=0,i,k;
79 float xdata d_p,mad,d[11],z,b[11],v_sum=0,data_p;
80 float VolTureValude;
81 for(i=0;i<10;i++)//取出窗口中的n个收据
82 {
83 b[i]=read1543(0x0a);
84 }
85
86 delay3(100);
87
88 for(i=0;i<10;i++)
89 v_sum=v_sum+b[i];
90 delay3(100);
91 VolTureValude=v_sum/10;
92 return(VolTureValude); } */
93
94
95
96 float filter(uchar v)
97 { float sum=0;
98 1 float value_buf[11],temp;
99 1 char count,i,j;
100 1 for (count=0;count<11;count++)
101 1 {
102 2 value_buf[count]=read1543(v); //获取采样值
103 2 delay3(300);
104 2 }
105 1 for (j=0;j<10;j++) //采样值由小到大排列,排序采用冒泡法
106 1 {
107 2 for (i=0;i<11-j;i++)
108 2 {
109 3 if(value_buf[i]>value_buf[i+1])
110 3 {
111 4 temp=value_buf[i];
112 4 value_buf[i]=value_buf[i+1];
113 4 value_buf[i+1]=temp;
114 4 }
115 3 }
116 2 }
117 1 for(count=1;count<10;count++) //去掉第一个和末一个数
C51 COMPILER V8.05a TEXT1 02/05/2009 20:39:53 PAGE 3
118 1 {
119 2 sum+=value_buf[count];
120 2 delay3(100);
121 2 }
122 1 return (float)(sum/9);
123 1 }
124
125
126
127 timer0() interrupt 1 using 1 //显示处理部分
128 {
129 1 if(busy==0)
130 1 {
131 2 if(Level!=3)
132 2 {
133 3 disbuf[0]=Vol_actual/10;
134 3 disbuf[1]=(uchar)Vol_actual%10;
135 3 disbuf[2]=(uint)(Vol_actual*10)%10;
136 3 disbuf[3]=(uint)(Vol_actual*100)%10;
137 3 disbuf[4]=(unsigned long)(Vol_actual*1000)%10;
138 3 disbuf[5]=(unsigned long)(Vol_actual*10000)%10;
139 3
140 3 P0=0x00;
141 3 if(disp_move==1)
142 3 {
143 4 P1=table[disbuf[disp_move]]&0x7f;
144 4 }
145 3 else
146 3 P1=table[disbuf[disp_move]];
147 3 P0=0x01<<disp_move;
148 3 disp_move=(disp_move+1)%6;
149 3 }
150 2 else
151 2 {
152 3 P0=0xff;
153 3 P1=table[15];
154 3 }
155 2 }
156 1 TH0=(65536-2000)/256; //定时器1定时50ms
157 1 TL0=(65536-2000)%256;
158 1 }
159 main()
160 {
161 1 long float Vol_test;
162 1 TMOD=0x01; //定时器0在工作方式1
163 1 TH0=(65536-2000)/256; //定时器1定时50ms
164 1 TL0=(65536-2000)%256;
165 1 ET0=1;
166 1 EA=1;
167 1 TR0=1;
168 1 while(1)
169 1 {
170 2 if( filter(0x0a)>=0x3ff) //超出总量程
171 2 {
172 3 P3=0x00;
173 3 Level=3;
174 3 }
175 2 else
176 2 {
177 3 Vol_test= filter(0x0a)/1024*5;
178 3 if(Vol_test<=2.4658)
179 3 {
C51 COMPILER V8.05a TEXT1 02/05/2009 20:39:53 PAGE 4
180 4 if(Vol_test<=0.2490)
181 4 {
182 5 P3=V_low;
183 5 Level=0;
184 5 }
185 4 else
186 4 {
187 5 P3=V_mid;
188 5 Level=1;
189 5 }
190 4
191 4
192 4 }
193 3 else
194 3 {
195 4 P3=V_hig;
196 4 Level=2;
197 4 }
198 3 }
199 2 delay3(1000);
200 2 switch(Level)
201 2 {
202 3 case 0:
203 3 {
204 4 Vol_actual=(float)filter(0x09)/1024*5+0.0005;
205 4 break;
206 4 }
207 3 case 1:
208 3 {
209 4 Vol_actual=(float)filter(0x08)/1024*5*10+0.0005;
210 4 break;
211 4 }
212 3 case 2:
213 3 {
214 4 Vol_actual=(float)filter(0x07)/1024*5*20+0.0005;
215 4 break;
216 4 }
217 3 default: break;
218 3 }
219 2 }
220 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 988 ----
CONSTANT SIZE = 16 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 16 60
IDATA SIZE = ---- ----
BIT SIZE = 1 ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -