📄 ze015_1.lst
字号:
0352 E083 LDI R24,3
0353 93800302 STS beep_times,R24
0355 E58A LDI R24,0x5A
0356 93800305 STS beep_stop_time_ask,R24
0358 9508 RET
_Fun_ad_20k:
a_d2 --> R12
a_d1 --> R14
th_value --> R20
temp --> R22
n --> R10
thAD --> R16
0359 940E26CB CALL push_gset5
(0037) }
(0038)
(0039)
(0040) //将AD采样值查表得到温度值20K感温包-分压电阻20K,,15K感温包-分压电阻15K
(0041) signed char Fun_ad_20k(unsigned char thAD)
(0042) {
(0043) unsigned char n; //对应AD查表中的偏移量
(0044) unsigned char temp; //AD查表中的偏移量的AD值
(0045) unsigned char a_d1; //实际采样值与温度值的差距
(0046) unsigned char a_d2; //实际采样值与下一个温度值的差距
(0047) signed char th_value; //温度值
(0048) if (thAD <=24) {th_value =-20;return(th_value);} //实际采样值小于-20℃的AD(8)时,温度为-20℃
035B E188 LDI R24,0x18
035C 1780 CP R24,R16
035D F018 BCS 0x0361
035E EE4C LDI R20,0xEC
035F 2F04 MOV R16,R20
0360 C061 RJMP 0x03C2
(0049) if (thAD >=246) {th_value =117; return(th_value);} //实际采样值大于127℃的AD(232)时,温度为127℃
0361 3F06 CPI R16,0xF6
0362 F018 BCS 0x0366
0363 E745 LDI R20,0x75
0364 2F04 MOV R16,R20
0365 C05C RJMP 0x03C2
(0050) if (thAD <=167) //实际采样值小于40℃的AD(167)时,如实际采样值大于10℃的AD(86)时,起始步n为45(25℃)
0366 EA87 LDI R24,0xA7
0367 1780 CP R24,R16
0368 F040 BCS 0x0371
(0051) {
(0052) if (thAD >=86) n=45; //TH=10-40,TH0=25
0369 3506 CPI R16,0x56
036A F018 BCS 0x036E
036B E28D LDI R24,0x2D
036C 2EA8 MOV R10,R24
036D C00A RJMP 0x0378
(0053) else n=20; //TH0=0
036E E184 LDI R24,0x14
036F 2EA8 MOV R10,R24
(0054) }
0370 C007 RJMP 0x0378
(0055) else //实际采样值大于70℃的AD(218)时,起始步n为100(80℃),否则起始步n为70(50℃)
(0056) {
(0057) if (thAD >=218) n=100; //TH>=70,TH0=80
0371 3D0A CPI R16,0xDA
0372 F018 BCS 0x0376
0373 E684 LDI R24,0x64
0374 2EA8 MOV R10,R24
0375 C002 RJMP 0x0378
(0058) else n=70; //TH=40-70,TH0=50
0376 E486 LDI R24,0x46
0377 2EA8 MOV R10,R24
(0059) }
(0060)
(0061) temp=TAB20K_20temp[n];
0378 EC8C LDI R24,0xCC
0379 E091 LDI R25,1
037A 2DEA MOV R30,R10
037B 27FF CLR R31
037C 0FE8 ADD R30,R24
037D 1FF9 ADC R31,R25
037E 9164 LPM R22,0(Z)
(0062) if (thAD ==temp) th_value =n-20; //相等时取温度-20
037F 1706 CP R16,R22
0380 F419 BNE 0x0384
0381 2D4A MOV R20,R10
0382 5144 SUBI R20,0x14
0383 C03D RJMP 0x03C1
(0063) else
(0064) {
(0065) if (thAD >temp)
0384 1760 CP R22,R16
0385 F4F0 BCC 0x03A4
(0066) {//实际采样值大于当前步的AD值时,步加,直到实际采样值小于当前步的AD值,再比较离得最近的步为温度。
(0067) do
(0068) {n++;temp=TAB20K_20temp[n];}
0386 94A3 INC R10
0387 EC8C LDI R24,0xCC
0388 E091 LDI R25,1
0389 2DEA MOV R30,R10
038A 27FF CLR R31
038B 0FE8 ADD R30,R24
038C 1FF9 ADC R31,R25
038D 9164 LPM R22,0(Z)
(0069) while (thAD >=temp);
038E 1706 CP R16,R22
038F F7B0 BCC 0x0386
(0070) a_d1= temp- thAD;
0390 2EE6 MOV R14,R22
0391 1AE0 SUB R14,R16
(0071) n--;temp=TAB20K_20temp[n];a_d2=thAD-temp;
0392 94AA DEC R10
0393 EC8C LDI R24,0xCC
0394 E091 LDI R25,1
0395 2DEA MOV R30,R10
0396 27FF CLR R31
0397 0FE8 ADD R30,R24
0398 1FF9 ADC R31,R25
0399 9164 LPM R22,0(Z)
039A 2EC0 MOV R12,R16
039B 1AC6 SUB R12,R22
(0072) if (a_d1 >=a_d2) th_value =n-20;
039C 14EC CP R14,R12
039D F018 BCS 0x03A1
039E 2D4A MOV R20,R10
039F 5144 SUBI R20,0x14
03A0 C020 RJMP 0x03C1
(0073) else th_value=n-19;
03A1 2D4A MOV R20,R10
03A2 5143 SUBI R20,0x13
(0074) }
03A3 C01D RJMP 0x03C1
(0075) else
(0076) {//实际采样值小于当前步的AD值时,步减,直到实际采样值小于当前步的AD值,再比较离得最近的步为温度。
(0077) do
(0078) {n--;temp=TAB20K_20temp[n];}
03A4 94AA DEC R10
03A5 EC8C LDI R24,0xCC
03A6 E091 LDI R25,1
03A7 2DEA MOV R30,R10
03A8 27FF CLR R31
03A9 0FE8 ADD R30,R24
03AA 1FF9 ADC R31,R25
03AB 9164 LPM R22,0(Z)
(0079) while (thAD <=temp);
03AC 1760 CP R22,R16
03AD F7B0 BCC 0x03A4
(0080) a_d1=thAD-temp;
03AE 2EE0 MOV R14,R16
03AF 1AE6 SUB R14,R22
(0081) n++;temp=TAB20K_20temp[n];a_d2=temp-thAD;
03B0 94A3 INC R10
03B1 EC8C LDI R24,0xCC
03B2 E091 LDI R25,1
03B3 2DEA MOV R30,R10
03B4 27FF CLR R31
03B5 0FE8 ADD R30,R24
03B6 1FF9 ADC R31,R25
03B7 9164 LPM R22,0(Z)
03B8 2EC6 MOV R12,R22
03B9 1AC0 SUB R12,R16
(0082) if (a_d1 >=a_d2) th_value=n-20;
03BA 14EC CP R14,R12
03BB F018 BCS 0x03BF
03BC 2D4A MOV R20,R10
03BD 5144 SUBI R20,0x14
03BE C002 RJMP 0x03C1
(0083) else th_value=n-21;
03BF 2D4A MOV R20,R10
03C0 5145 SUBI R20,0x15
(0084) }
(0085) }
(0086) return(th_value); //返回温度值
03C1 2F04 MOV R16,R20
03C2 940E26C8 CALL pop_gset5
03C4 9508 RET
_Fun_ad_50k:
a_d2 --> R12
a_d1 --> R14
th_value --> R20
temp --> R22
n --> R10
thAD --> R16
03C5 940E26CB CALL push_gset5
(0087) }
(0088)
(0089) unsigned char Fun_ad_50k(unsigned char thAD)//将AD采样值查表得到排气温度值50K感温包-分压电阻10K
(0090) {
(0091) unsigned char n; //对应AD查表中的偏移量
(0092) unsigned char temp; //AD查表中的偏移量的AD值
(0093) unsigned char a_d1; //实际采样值与温度值的差距
(0094) unsigned char a_d2; //实际采样值与下一个温度值的差距
(0095) unsigned char th_value;//温度值
(0096) if (thAD <=15) {th_value =0;return(th_value);} //实际采样值小于0℃的AD(15)时,温度为0℃
03C7 E08F LDI R24,0xF
03C8 1780 CP R24,R16
03C9 F018 BCS 0x03CD
03CA 2744 CLR R20
03CB 2F04 MOV R16,R20
03CC C05E RJMP 0x042B
(0097) if (thAD >=250) {th_value =199; return(th_value);} //实际采样值大于169℃的AD(254)时,温度为149℃
03CD 3F0A CPI R16,0xFA
03CE F018 BCS 0x03D2
03CF EC47 LDI R20,0xC7
03D0 2F04 MOV R16,R20
03D1 C059 RJMP 0x042B
(0098) if (thAD <=138) //实际采样值小于70℃的AD(138)时,如实际采样值大于40℃的AD(71)时,起始步n为60(140)
03D2 E88A LDI R24,0x8A
03D3 1780 CP R24,R16
03D4 F040 BCS 0x03DD
(0099) {
(0100) if (thAD >=71) n=60; //TH 40-70 TH TH0=60
03D5 3407 CPI R16,0x47
03D6 F018 BCS 0x03DA
03D7 E38C LDI R24,0x3C
03D8 2EA8 MOV R10,R24
03D9 C00A RJMP 0x03E4
(0101) else n=20; //TH 0-40 TH0=20
03DA E184 LDI R24,0x14
03DB 2EA8 MOV R10,R24
(0102) }
03DC C007 RJMP 0x03E4
(0103) else //实际采样值大于70℃的AD(138)时,起始步n为100℃,否则起始步n为120℃
(0104) {
(0105) if (thAD >=193) n=120; //TH>=100,TH0=120
03DD 3C01 CPI R16,0xC1
03DE F018 BCS 0x03E2
03DF E788 LDI R24,0x78
03E0 2EA8 MOV R10,R24
03E1 C002 RJMP 0x03E4
(0106) else n=80; //TH 100-70,TH0=80
03E2 E580 LDI R24,0x50
03E3 2EA8 MOV R10,R24
(0107) }
(0108)
(0109) temp=TAB50K_10temp[n];
03E4 E88C LDI R24,0x8C
03E5 E090 LDI R25,0
03E6 2DEA MOV R30,R10
03E7 27FF CLR R31
03E8 0FE8 ADD R30,R24
03E9 1FF9 ADC R31,R25
03EA 9164 LPM R22,0(Z)
(0110) if (thAD ==temp) th_value =n; //相等时取温度
03EB 1706 CP R16,R22
03EC F411 BNE 0x03EF
03ED 2D4A MOV R20,R10
03EE C03B RJMP 0x042A
(0111) else
(0112) {
(0113) if (thAD >temp)
03EF 1760 CP R22,R16
03F0 F4E8 BCC 0x040E
(0114) {//实际采样值大于当前步的AD值时,步加,直到实际采样值小于当前步的AD值,再比较离得最近的步为温度。
(0115) do
(0116) {n++;temp=TAB50K_10temp[n];}
03F1 94A3 INC R10
03F2 E88C LDI R24,0x8C
03F3 E090 LDI R25,0
03F4 2DEA MOV R30,R10
03F5 27FF CLR R31
03F6 0FE8 ADD R30,R24
03F7 1FF9 ADC R31,R25
03F8 9164 LPM R22,0(Z)
(0117) while (thAD >=temp);
03F9 1706 CP R16,R22
03FA F7B0 BCC 0x03F1
(0118) a_d1= temp- thAD;
03FB 2EE6 MOV R14,R22
03FC 1AE0 SUB R14,R16
(0119) n--;temp=TAB50K_10temp[n];a_d2=thAD-temp;
03FD 94AA DEC R10
03FE E88C LDI R24,0x8C
03FF E090 LDI R25,0
0400 2DEA MOV R30,R10
0401 27FF CLR R31
0402 0FE8 ADD R30,R24
0403 1FF9 ADC R31,R25
0404 9164 LPM R22,0(Z)
0405 2EC0 MOV R12,R16
0406 1AC6 SUB R12,R22
(0120) if (a_d1 >=a_d2) th_value =n;
0407 14EC CP R14,R12
0408 F010 BCS 0x040B
0409 2D4A MOV R20,R10
040A C01F RJMP 0x042A
(0121) else th_value=n+1;
040B 2D4A MOV R20,R10
040C 5F4F SUBI R20,0xFF
(0122) }
040D C01C RJMP 0x042A
(0123) else
(0124) {//实际采样值小于当前步的AD值时,步减,直到实际采样值小于当前步的AD值,再比较离得最近的步为温度。
(0125) do
(0126) {n--;temp=TAB50K_10temp[n];}
040E 94AA DEC R10
040F E88C LDI R24,0x8C
0410 E090 LDI R25,0
0411 2DEA MOV R30,R10
0412 27FF CLR R31
0413 0FE8 ADD R30,R24
0414 1FF9 ADC R31,R25
0415 9164 LPM R22,0(Z)
(0127) while (thAD <=temp);
0416 1760 CP R22,R16
0417 F7B0 BCC 0x040E
(0128) a_d1=thAD-temp;
0418 2EE0 MOV R14,R16
0419 1AE6 SUB R14,R22
(0129) n++;temp=TAB50K_10temp[n];a_d2=temp-thAD;
041A 94A3 INC R10
041B E88C LDI R24,0x8C
041C E090 LDI R25,0
041D 2DEA MOV R30,R10
041E 27FF CLR R31
041F 0FE8 ADD R30,R24
0420 1FF9 ADC R31,R25
0421 9164 LPM R22,0(Z)
0422 2EC6 MOV R12,R22
0423 1AC0 SUB R12,R16
(0130) if (a_d1 >=a_d2) th_value=n;
0424 14EC CP R14,R12
0425 F010 BCS 0x0428
0426 2D4A MOV R20,R10
0427 C002 RJMP 0x042A
(0131) else th_value=n-1;
0428 2D4A MOV R20,R10
0429 5041 SUBI R20,1
(0132) }
(0133) }
(0134) return(th_value); //返回温度值
042A 2F04 MOV R16,R20
042B 940E26C8 CALL pop_gset5
042D 9508 RET
(0135) }
(0136)
(0137)
(0138) //******************************
(0139) //******************************
(0140)
(0141) void ADStartP(void)
(0142) {//ADSC=1启动ADC,等待采样工作完成;
(0143) ADCSRA |=0x40; //ADSC=1启动ADC
_ADStartP:
042E 9A36 SBI 0x06,6
042F C001 RJMP 0x0431
(0144) while (!(ADCSRA & 0x10)) WDR(); //ADIF=1时AD转换结束且数据更新
0430 95A8 WDR
0431 9B34 SBIS 0x06,4
0432 CFFD RJMP 0x0430
(0145) ADCSRA |=0x10; //ADIF=1软件写1清ADC中断完成位
0433 9A34 SBI 0x06,4
0434 9508 RET
(0146) }
(0147)
(0148) //************************************************************************************
(0149) //CD4052-A:PORTA1,CD4052-B:PORTA0,在每次AD转换后置CD4052动作,再进行下2AD。00-01-11-10
(0150) //20070813改为PF3[ADC3] 排气温度EXHAUST,50K感温包,PF2[ADC2] 预留环境采样15KOUTROOM,
(0151) //PF0[ADC0]除湿电流I-HUMID。去掉CD4052
(0152) //************************************************************************************
(0153)
(0154) void funADsample(void) //AD采样程序
(0155) {
(0156) //SFIOR =0x04; //不允许任何上拉
(0157) ADCSRA =0x86; //ADEN=1使能AD,6=110分频64
_funADsample:
0435 E886 LDI R24,0x86
0436 B986 OUT 0x06,R24
(0158) ADMUX =0x42; //选择ADC2、右对齐,y0-管温
0437 E482 LDI R24,0x42
0438 B987 OUT 0x07,R24
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -