📄 ad574.lst
字号:
C51 COMPILER V7.50 AD574 02/28/2008 18:26:20 PAGE 1
C51 COMPILER V7.50, COMPILATION OF MODULE AD574
OBJECT MODULE PLACED IN AD574.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE AD574.c BROWSE DEBUG OBJECTEXTEND
line level source
1 #include<reg52.h>
2 #include<db18b20.h>//DB18B20数字温度传感器模块
3 #include<hd7279.h> //智能显示驱动模块
4 #include<absacc.h>
5 #define uchar unsigned char
6 #define uint unsigned int
7 #define ADCOM XBYTE[0XFFF8] //A0=0,R/~C=0,~CS=0
8 #define ADLO XBYTE[0XFFFB] //A0=1,R/~C=1,~CS=0
9 #define ADHI XBYTE[0XFFF9] //A0=0,R/~C=1,~CS=0
10 //#define dT -10 //运放零点输入及AD转换修正值
11 sbit r=P3^7;
12 sbit w=P3^6;
13 sbit adbusy=P3^0;
14 uint ADLast,ADMid,ADNext,Result;
15 uint ad574(void);
16 void delayms(uint k)
17 {
18 1 uchar i;
19 1 while(k--)
20 1 for(i=0;i<125;i++);
21 1 }
22 //A/D转换模块
23 uint ad574(void)
24 {
25 1 uint result0,result1;
26 1 r=0;
27 1 w=0;
28 1 ADCOM=0;
29 1 while(adbusy==1); //adbusy=0,表示一次转换结束
30 1 result0=ADHI;
31 1 result1=ADLO;
32 1 result0=(uint)(result0<<4);//高八位
33 1 result1=(uint)((result1&0xf0)>>4);//低四位
34 1 return(result0+result1); //输出12位
35 1 //return ((uint)(ADHI<<4)+(ADLO&0xf0)>>4);
36 1 }
37 //递推滤波和加权平均滤波组成复合滤波
38 void Filter()
39 { uint k=0;
40 1 uchar i;
41 1 for(i=0;i<15;i++)
42 1 {
43 2 ADLast=ADMid;
44 2 ADMid=ADNext;
45 2 ADNext=AD574();
*** WARNING C206 IN LINE 45 OF AD574.C: 'AD574': missing function-prototype
46 2 if((ADMid>ADLast&&ADMid>ADNext)||(ADMid<ADLast&&ADMid<ADNext))
47 2 Result=ADMid=(ADLast+ADMid+ADNext+Result*5)/8; //可信度大的数权值大
48 2 // ADMid 处于 ADLast 和 ADNext 中间
49 2 else
50 2 Result=(ADLast+ADMid*3+ADNext+Result*3 )/8;
51 2 delayms(20);
52 2 k+=Result;
53 2 }
54 1 Result=k/15;
C51 COMPILER V7.50 AD574 02/28/2008 18:26:20 PAGE 2
55 1 }
56
57 //非线性校正程序
58 uint Linearity()
59 {
60 1 // code uint DacCode[5]={dT+0,dT+1024,dT+2048,dT+3072,dT+4096};
61 1 code uint DacCode[11]={50,322,741,1100,1526,1873,2303,2664,3034,3425,4096};
62 1 // uchar k1,k2,k3,k4,b1,b2,b3,b4;
63 1 uint y;
64 1 Filter();
65 1 if(Result>DacCode[0]&&Result<=DacCode[1])
66 1 y=0.5017*Result+39;
67 1 else if(Result>DacCode[1]&&Result<=DacCode[2])
68 1 y=0.4773*Result+46;
69 1 else if(Result>DacCode[2]&&Result<=DacCode[3])
70 1 y=0.5571*Result-13;
71 1 else if(Result>DacCode[3]&&Result<=DacCode[4])
72 1 y=0.4695*Result+84;
73 1 else if(Result>DacCode[4]&&Result<=DacCode[5])
74 1 y=0.5764*Result-80;
75 1 else if(Result>DacCode[5]&&Result<=DacCode[6])
76 1 y=0.4651*Result+129;
77 1 else if(Result>DacCode[6]&&Result<=DacCode[7])
78 1 y=0.5540*Result-76;
79 1 else if(Result>DacCode[7]&&Result<=DacCode[8])
80 1 y=0.5405*Result-40;
81 1 else if(Result>DacCode[8]&&Result<=DacCode[9])
82 1 y=0.5115*Result+48;
83 1 else if(Result>DacCode[9]&&Result<=DacCode[10])
84 1 y=0.5076*Result+61;
85 1 else y=0;
86 1 return(y);
87 1 }
88 //压力显示子程序
89 void DisplayP(void)
90 { uint P;
91 1 uchar p1,p2,p3,p4;
92 1 P=Linearity();
93 1 p1=(uint)P%10;//小数点第三位
94 1 p2=(uint)P%100/10;//小数点第二位
95 1 p3=(uint)P%1000/100;// 小数点第一位
96 1 p4=(uint)P%10000/1000;// 个位
97 1 write7279(DECODE1,p1);
98 1 write7279(DECODE1+1,p2);
99 1 write7279(DECODE1+2,p3);
100 1 write7279(DECODE1+3,0x80+p4);
101 1 }
102
103 //温度显示子程序
104 void DisplayTemp(void)
105 {
106 1 uchar temp1,temp2,temp3;
107 1 delayms(1); // 延时1ms
108 1 convert(); // 启动温度转换,需要750ms
109 1 // delayms(1000); // 延时1s
110 1 RdTemp(); // 读取温度
111 1 temp1=tplsb%100/10;//小数点1位
112 1 temp2=tpmsb%10;//个位
113 1 temp3=tpmsb%100/10;//十位
114 1 write7279(DECODE1+4,0X0C); //显示温度符号
115 1 write7279(DECODE1+5,temp1);//显示小数点后一位
116 1 write7279(DECODE1+6,0x80+temp2);//显示个位
C51 COMPILER V7.50 AD574 02/28/2008 18:26:20 PAGE 3
117 1 write7279(DECODE1+7,temp3); //显示十位
118 1 }
119 /*
120 //0~4096数字量输出显示
121 void DisplayData(void)
122 {
123 uchar ge,ten,hun,thou;
124 Filter();
125 ge=Result%10;
126 ten=Result%100/10;
127 hun=Result%1000/100;
128 thou=Result%10000/1000;
129 write7279(DECODE1,ge);
130 write7279(DECODE1+1,ten);
131 write7279(DECODE1+2,hun);
132 write7279(DECODE1+3,thou);
133 }
134
135 //电压显示子程序
136 void DisplayVot(void)
137 {
138 uchar vot1,vot2,vot3,vot4;
139 float V;
140 Filter();
141 V=Result*10.0/4.096+0.5;
142 vot1=(uint)V%10;//小数点第三位
143 vot2=(uint)V%100/10;//小数点第二位
144 vot3=(uint)V%1000/100;// 小数点第一位
145 vot4=(uint)V%10000/1000;// 个位
146 write7279(DECODE1,vot1);
147 write7279(DECODE1+1,vot2);
148 write7279(DECODE1+2,vot3);
149 write7279(DECODE1+3,0x80+vot4);
150 }
151 */
152 //主程序
153 main()
154 {
155 1 ADLast=AD574();
156 1 ADMid=AD574();
157 1 ADNext=AD574();
158 1 Result=(ADLast+ADMid+ADNext)/3;
159 1 while(1)
160 1 {
161 2 DisplayTemp();
162 2 // DisplayData();
163 2 // DisplayVot();
164 2 DisplayP();
165 2 }
166 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 1666 ----
CONSTANT SIZE = 22 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 12 17
IDATA SIZE = ---- ----
BIT SIZE = ---- 2
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 1 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -