📄 admain.lst
字号:
C51 COMPILER V7.10 ADMAIN 06/05/2006 09:59:57 PAGE 1
C51 COMPILER V7.10, COMPILATION OF MODULE ADMAIN
OBJECT MODULE PLACED IN admain.OBJ
COMPILER INVOKED BY: D:\Keil\C51\BIN\C51.EXE admain.c BROWSE DEBUG OBJECTEXTEND CODE SYMBOLS PREPRINT
line level source
1 /***********************************************************************
2
3 ***********************************************************************/
4 #include <ADUC812.H>
5 #include <math.h>
6
7 sbit Run_Id=P2^5; //工作指示灯
8 sbit Ctrl1 =P2^6;
9 sbit Ctrl0 =P2^7;
10 sbit Adv0 =P1^2;
11 sbit Adv1 =P1^3;
12
13 #define RUN 0
14 #define STOP 1
15 #define V_ref 5 //5伏参考电压
16 #define V_12 4095 //12位A/D转换系数 1024=8位
17 #define ADIN_V0 0x02 //ad输入通道号2
18 #define ADIN_V1 0x03 //ad输入通道号3
19
20 unsigned int Ad_o[2];
21 unsigned int Da_i[2];
22
23 struct segment{
24 unsigned char V_start; //电压启示值*10 相当于0.1V为单位
25 unsigned char V_end; //电压结束值*10
26 unsigned char mul_col; //成绩系数*10
27 unsigned char add_col; //加法系数*10
28 }; //00,12,02,30 含义0v到1.2v 范围内y=0.2x+3 单位V
29
30 struct segment Seg;
31
32 unsigned char DATA_U[64];
33 unsigned char Rptr,Wptr;
34 unsigned char DATA_W[16];
35 unsigned char Uptr,Ulen;
36 unsigned char flag,flag1,flag_s;
37 unsigned char time_p,time_r;
38 idata unsigned int temp_s[20];
39 //---ad-转换返回int型整数----------------------------------------------
40 //ADC function and choose ADC0---ADC7 by Channel
41 unsigned int GetADC(unsigned char Channel) //ADIN_V0,V1
42 {
43 1 unsigned char *p;
44 1 unsigned char variable;
45 1 unsigned int ADC_value; //用指针将2个char类型数合并成一个int型数
46 1
47 1 p=(unsigned char *)&ADC_value;
48 1 ADCCON2=Channel;
49 1 SCONV=1;
50 1 while (SCONV)
51 1 { }
52 1 SCONV=1;
53 1 while (SCONV)
54 1 { }
55 1 variable=0x0F&ADCDATAH; //屏蔽ADC输入的通道标识符号
C51 COMPILER V7.10 ADMAIN 06/05/2006 09:59:57 PAGE 2
56 1 *p=variable;
57 1 p++;
58 1 *p=ADCDATAL;
59 1 //Write_Serial(ADC_value);
60 1 return(ADC_value);
61 1 }
62 //----Da转换----0-1--------------------
63 void SetDac(unsigned char num,unsigned int Da_data)
64 {
65 1 if(num==0)
66 1 {
67 2 DACCON=0x1F;
68 2 DAC0H=(unsigned char)((Da_data>>8) & 0x000f);
69 2 DAC0L=(unsigned char)(Da_data & 0x00ff);
70 2 }
71 1 else if(num==1)
72 1 {
73 2 DACCON=0x1F;
74 2 DAC1H=(unsigned char)((Da_data>>8) & 0x000f);
75 2 DAC1L=(unsigned char)(Da_data & 0x00ff);
76 2 }
77 1 }
78 //--------------------------------
79 void Delay(unsigned char D_time)
80 {
81 1 unsigned char i,j,k;
82 1 for(i=0;i<D_time;i++)
83 1 {
84 2 for(j=0;j<0xff;j++);
85 2 {
86 3 k=j;
87 3 k=i;
88 3 i=i;
89 3 }
90 2 }
91 1 }
92 //-----------------eeprom中的数据为10倍数--------------------
93 unsigned char Select_V(unsigned int Y) //查表找运算参数
94 {
95 1 unsigned long M;
96 1 unsigned char i,Vsel;
97 1 M=(unsigned long)Y*10*V_ref*2; //2-运放的倍数
98 1 M=M / V_12;
99 1 Vsel=(unsigned char)(M & 0x000000ff);
100 1 if(Vsel>100) Vsel=100;
101 1 for(i=0;i<20;i++)
102 1 {
103 2 EADRL=i;
104 2 ECON=0x01;
105 2 if((Vsel>=EDATA1)&&(Vsel<EDATA2))
106 2 {
107 3 Seg.V_start= EDATA1;
108 3 Seg.V_end = EDATA2;
109 3 Seg.mul_col= EDATA3;
110 3 Seg.add_col= EDATA4;
111 3 return 1;
112 3 }
113 2 }
114 1 return 0;
115 1 }
116 //------------------------------------------------------
117 unsigned char Write_f(unsigned char type,unsigned char Addr)
C51 COMPILER V7.10 ADMAIN 06/05/2006 09:59:57 PAGE 3
118 {
119 1 switch(type)
120 1 {
121 2 case 0: //全部擦除
122 2 ECON=0x06;
123 2 Delay(20); //20ms
124 2 ECON=0x03;
125 2 break;
126 2 case 1: //通过结构进行4字节写操作
127 2 EADRL=Addr;
128 2 ECON=0x01;
129 2 EDATA1=Seg.V_start;
130 2 EDATA2=Seg.V_end ;
131 2 EDATA3=Seg.mul_col;
132 2 EDATA4=Seg.add_col;
133 2 ECON=0x05;
134 2 ECON=0x02;
135 2 ECON=0x03; //读
136 2 break;
137 2 case 2: //只进行写操作
138 2 EADRL=Addr;
139 2 ECON=0x02; //写
140 2 ECON=0x03; //读
141 2 break;
142 2 }
143 1
144 1 return 1;
145 1 }
146
147 //------Ad-Da转化函数-------y=ax+b----------------------
148 void Calcu(unsigned char num)
149 {
150 1 unsigned long G;
151 1 unsigned int Y;
152 1 if(num==0)
153 1 {Y=GetADC(ADIN_V0);}
154 1 else if(num==1)
155 1 {Y=GetADC(ADIN_V1); } //读取ad 转换值
156 1
157 1 Ad_o[num]=Y;
158 1 if(Select_V(Y)==1); //查表找运算参数
159 1 {
160 2 G=Seg.add_col *V_12;
161 2 G=G/V_ref/2; //电压〉点数 2--运放调整
162 2 Y=(unsigned int)((Seg.mul_col*Y+G)/10);
163 2 if(Y>=0x0FFF)
164 2 {
165 3 Y=0x0FFF;
166 3 }
167 2 if(Y<=0x0000)
168 2 {
169 3 Y=0x0000;
170 3 }
171 2 }
172 1 Da_i[num]=Y;
173 1 SetDac(num,Y);
174 1 }
175
176 void SystemInit() //系统初始化函数
177 {
178 1
179 1 TL2=0xDC;
C51 COMPILER V7.10 ADMAIN 06/05/2006 09:59:57 PAGE 4
180 1 TH2=0xFF;
181 1 RCAP2L=0xDC;
182 1 RCAP2H=0xFF;
183 1 T2CON=0x30; //set rate and start 9600
184 1 TR2=1;
185 1 SCON=0x50; //set serial port mode
186 1 ES=1; //允许串口中断
187 1
188 1 TMOD=0x01; //定时器0工作在方式1 10ms
189 1 TL0=0xFF;
190 1 TH0=0xDB; //设定定时器初值
191 1 TR0=1;
192 1 ET0=1; //允许定时器0中断
193 1
194 1 // EX1=1;
195 1 // EX0=1; //允许外部中断
196 1 // IT0=1;
197 1 // IT1=1; //设置外部中断为下降沿触发方式
198 1 // PX1=1;
199 1 // PX0=1; //设定外部中断优先位
200 1 ADCCON1=0x7c;
201 1 EA=1;
202 1 }
203 //--------------------------------------------
204 void Write_Serial(unsigned int T_Data) //串口发送函数 在发送的过程中没有禁止中断
205 {
206 1 unsigned char *p;
207 1 p=(unsigned char *)&T_Data;
208 1 DATA_W[0]=*p;
209 1 DATA_W[1]=*(p+1);
210 1 Uptr=0;
211 1 Ulen=2;
212 1 TI=1;
213 1 flag=1;
214 1 }
215
216 //---------------------------------------------
217 void W_Uart(unsigned char *p, unsigned char len) //串口发送函数 在发送的过程中没有禁止中断
218 {
219 1 unsigned char i;
220 1 for(i=0;i<len;)
221 1 {
222 2 DATA_W[i]=*p;
223 2 i++;
224 2 p++;
225 2 }
226 1 Uptr=0;
227 1 Ulen=len;
228 1 TI=1;
229 1 flag=1;
230 1 }
231
232 //###########################################
233 void main(void)
234 {
235 1 unsigned char i,k;
236 1 unsigned char len_r,count;
237 1 unsigned char Addr_P;
238 1 unsigned char temp_t;
239 1 unsigned char j;
240 1 SystemInit();
241 1 // P1^2=1; P1^3=1;
C51 COMPILER V7.10 ADMAIN 06/05/2006 09:59:57 PAGE 5
242 1 Rptr=Wptr=Uptr=0x00;
243 1 flag=flag1=0x00;
244 1 flag_s=0x00;
245 1 temp_t=0;
246 1 W_Uart("Aduc812 start",13);
247 1 //ptr =(unsigned char*)&Seg_r;
248 1 for(i=0;i<20;i++) { temp_s[i]=0x00;}
249 1 //--------初始化flash-----------
250 1 EADRL=0;
251 1 ECON=0x01;
252 1 if(EDATA1==0xff)
253 1 {
254 2 Write_f(0x00,0x00); //擦除flash
255 2 EADRL=0x9f;
256 2 for(i=0;i<16;i++)
257 2 {
258 3 EADRL=i;
259 3 EDATA1=i*10;
260 3 EDATA2=(i+1)*10;
261 3 EDATA3=10;
262 3 EDATA4=0;
263 3 ECON=0x02;
264 3 EADRL=0x9f;
265 3 }
266 2 }
267 1 EADRL=0x40;
268 1 ECON=0x01;
269 1 j=EDATA1;//j=EDATA1&0x01;
270 1 //------------------------------
271 1 while(1)
272 1 {
273 2 if(time_r==0){Run_Id=~Run_Id;time_r=10;}
274 2 if(Ctrl0)
275 2 {
276 3 if(GetADC(ADIN_V0)>0x0030)
277 3 {
278 4 i=j&0x1f;
279 4 if(i>20) i=20;
280 4 //SetDac(0,Da_i[i]);
281 4 SetDac(0,temp_s[i]);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -