📄 wenshidu.lst
字号:
00213 98AC CBI 0x15,4
(0166) DelaymS(1);
00214 E001 LDI R16,1
00215 E010 LDI R17,0
00216 DF58 RCALL _DelaymS
(0167) COM_IN;
00217 98A4 CBI 0x14,4
(0168) COM_SET;
00218 9AAC SBI 0x15,4
(0169)
(0170) //总线由上拉电阻拉高 主机延时20us
(0171) Delay_10us();
00219 DF6A RCALL _Delay_10us
(0172) Delay_10us();
0021A DF69 RCALL _Delay_10us
(0173) Delay_10us();
0021B DF68 RCALL _Delay_10us
(0174) Delay_10us();
0021C DF67 RCALL _Delay_10us
(0175) //主机设为输入 判断从机响应信号
(0176) //P2_0=1;
(0177)
(0178) //判断从机是否有低电平响应信号 如不响应则跳出,响应则向下运行
(0179) // if(!P2_0) //T !
(0180) if(COM_R)U8FLAG=1;
0021D 9B9C SBIS 0x13,4
0021E C05D RJMP 0x027C
0021F E081 LDI R24,1
00220 9380 0212 STS U8FLAG,R24
00222 C059 RJMP 0x027C
(0181) while(!(COM_R))
(0182) {
(0183) U8FLAG=2;
00223 E082 LDI R24,2
00224 9380 0212 STS U8FLAG,R24
(0184) //判断从机是否发出 80us 的低电平响应信号是否结束
(0185) //while((!P2_0)&&U8FLAG++);
(0186) while((!(COM_R))&&U8FLAG++);
00226 999C SBIC 0x13,4
00227 C009 RJMP 0x0231
00228 9020 0212 LDS R2,U8FLAG
0022A 2433 CLR R3
0022B 2D82 MOV R24,R2
0022C 5F8F SUBI R24,0xFF
0022D 9380 0212 STS U8FLAG,R24
0022F 2022 TST R2
00230 F7A9 BNE 0x0226
(0187) if(U8FLAG==1)break;
00231 9180 0212 LDS R24,U8FLAG
00233 3081 CPI R24,1
00234 F409 BNE 0x0236
00235 C048 RJMP 0x027E
(0188) U8FLAG=2;
00236 E082 LDI R24,2
00237 9380 0212 STS U8FLAG,R24
(0189) //判断从机是否发出 80us 的高电平,如发出则进入数据接收状态
(0190) //while((P2_0)&&U8FLAG++);
(0191) while((COM_R)&&U8FLAG++);
00239 9B9C SBIS 0x13,4
0023A C009 RJMP 0x0244
0023B 9020 0212 LDS R2,U8FLAG
0023D 2433 CLR R3
0023E 2D82 MOV R24,R2
0023F 5F8F SUBI R24,0xFF
00240 9380 0212 STS U8FLAG,R24
00242 2022 TST R2
00243 F7A9 BNE 0x0239
(0192) if(U8FLAG==1)break;
00244 9180 0212 LDS R24,U8FLAG
00246 3081 CPI R24,1
00247 F409 BNE 0x0249
00248 C035 RJMP 0x027E
(0193) //数据接收状态
(0194) COM();
00249 DF81 RCALL _COM
(0195) if(U8FLAG==1)break;
0024A 9180 0212 LDS R24,U8FLAG
0024C 3081 CPI R24,1
0024D F409 BNE 0x024F
0024E C02F RJMP 0x027E
(0196) U8T_data_H_temp=U8comdata;
0024F 9020 0204 LDS R2,U8comdata
00251 9220 0209 STS U8T_data_H_temp,R2
(0197) COM();
00253 DF77 RCALL _COM
(0198) if(U8FLAG==1)break;
00254 9180 0212 LDS R24,U8FLAG
00256 3081 CPI R24,1
00257 F409 BNE 0x0259
00258 C025 RJMP 0x027E
(0199) U8T_data_L_temp=U8comdata;
00259 9020 0204 LDS R2,U8comdata
0025B 9220 0208 STS U8T_data_L_temp,R2
(0200) COM();
0025D DF6D RCALL _COM
(0201) if(U8FLAG==1)break;
0025E 9180 0212 LDS R24,U8FLAG
00260 3081 CPI R24,1
00261 F409 BNE 0x0263
00262 C01B RJMP 0x027E
(0202) U8RH_data_H_temp=U8comdata;
00263 9020 0204 LDS R2,U8comdata
00265 9220 0207 STS U8RH_data_H_temp,R2
(0203) COM();
00267 DF63 RCALL _COM
(0204) if(U8FLAG==1)break;
00268 9180 0212 LDS R24,U8FLAG
0026A 3081 CPI R24,1
0026B F409 BNE 0x026D
0026C C011 RJMP 0x027E
(0205) U8RH_data_L_temp=U8comdata;
0026D 9020 0204 LDS R2,U8comdata
0026F 9220 0206 STS U8RH_data_L_temp,R2
(0206) COM();
00271 DF59 RCALL _COM
(0207) if(U8FLAG==1)break;
00272 9180 0212 LDS R24,U8FLAG
00274 3081 CPI R24,1
00275 F409 BNE 0x0277
00276 C007 RJMP 0x027E
(0208) U8checkdata_temp=U8comdata;
00277 9020 0204 LDS R2,U8comdata
00279 9220 0205 STS U8checkdata_temp,R2
(0209) break;
0027B C002 RJMP 0x027E
0027C 9B9C SBIS 0x13,4
0027D CFA5 RJMP 0x0223
(0210) }//while
(0211) //P2_0=1;
(0212) COM_IN;
0027E 98A4 CBI 0x14,4
(0213) COM_SET;
0027F 9AAC SBI 0x15,4
(0214) //数据校验
(0215)
(0216) U8temp=(U8T_data_H_temp+U8T_data_L_temp+U8RH_data_H_temp+U8RH_data_L_temp);
00280 9020 0208 LDS R2,U8T_data_L_temp
00282 9030 0209 LDS R3,U8T_data_H_temp
00284 0C32 ADD R3,R2
00285 9020 0207 LDS R2,U8RH_data_H_temp
00287 0C32 ADD R3,R2
00288 9020 0206 LDS R2,U8RH_data_L_temp
0028A 0C32 ADD R3,R2
0028B 9230 020F STS U8temp,R3
(0217) if(U8temp==U8checkdata_temp)
0028D 9020 0205 LDS R2,U8checkdata_temp
0028F 1432 CP R3,R2
00290 F4A1 BNE 0x02A5
(0218) {
(0219) U8RH_data_H=U8T_data_H_temp;
00291 9020 0209 LDS R2,U8T_data_H_temp
00293 9220 020C STS U8RH_data_H,R2
(0220) U8RH_data_L=U8T_data_L_temp;
00295 9020 0208 LDS R2,U8T_data_L_temp
00297 9220 020B STS U8RH_data_L,R2
(0221) U8T_data_H=U8RH_data_H_temp;
00299 9020 0207 LDS R2,U8RH_data_H_temp
0029B 9220 020E STS U8T_data_H,R2
(0222) U8T_data_L=U8RH_data_L_temp;
0029D 9020 0206 LDS R2,U8RH_data_L_temp
0029F 9220 020D STS U8T_data_L,R2
(0223) U8checkdata=U8checkdata_temp;
002A1 9020 0205 LDS R2,U8checkdata_temp
002A3 9220 020A STS U8checkdata,R2
(0224) }//fi
(0225)
(0226)
(0227) COM_IN;
002A5 98A4 CBI 0x14,4
(0228) COM_SET;
002A6 9AAC SBI 0x15,4
002A7 9508 RET
(0229)
(0230) }
(0231)
(0232) /*
(0233) 串口初始化函数
(0234) 系统频率:2MHz
(0235) 停止位:1
(0236) 波特率:9600
(0237) 数据长度:8
(0238) */
(0239) void Uart_Init(void) {
(0240) UCSRA = 0x02; /*2倍速 */
_Uart_Init:
002A8 E082 LDI R24,2
002A9 B98B OUT 0x0B,R24
(0241) UCSRB = 0x18; /*允许接收和发送*/
002AA E188 LDI R24,0x18
002AB B98A OUT 0x0A,R24
(0242) UCSRC = 0x06; /*8位数据 */
002AC E086 LDI R24,6
002AD BD80 OUT 0x20,R24
(0243) UBRRH = 0x00;
002AE 2422 CLR R2
002AF BC20 OUT 0x20,R2
(0244) //UBRRL = 47; /*9600 3.6864M */
(0245) //UBRRL = 95; /*9600 7.3728M */
(0246) UBRRL = 103; /*9600 8.0000M */
002B0 E687 LDI R24,0x67
002B1 B989 OUT 0x09,R24
002B2 9508 RET
(0247) }
(0248)
(0249) /*
(0250) 串数据发送
(0251) 查询方式发送
(0252) */
(0253) void Uart_Transmit(unsigned char i) {
(0254)
(0255) /* 等待发送缓冲器为空*/
(0256) while (!(UCSRA & (1<<UDRE)));
_Uart_Transmit:
i --> R16
002B3 9B5D SBIS 0x0B,5
002B4 CFFE RJMP _Uart_Transmit
(0257) /* 将数据放入缓冲器,发送数据*/
(0258) UDR = i;
002B5 B90C OUT 0x0C,R16
002B6 9508 RET
(0259) }
(0260)
(0261) /*
(0262) 串数据接收
(0263) 查询方式接收
(0264) */
(0265) unsigned char Uart_Receive( void ) {
(0266)
(0267) /* 等待接收数据*/
(0268) while (!(UCSRA & (1<<RXC)));
_Uart_Receive:
002B7 9B5F SBIS 0x0B,7
002B8 CFFE RJMP _Uart_Receive
(0269) /* 从缓冲器中获取并返回数据*/
(0270) // Uart_Transmit(UDR);
(0271) return UDR;
002B9 B10C IN R16,0x0C
002BA 9508 RET
(0272) }
(0273)
(0274) void init_devices(void)
(0275) {
(0276) unsigned char i;
(0277) CLI();
_init_devices:
i --> Y,+1
002BB 94F8 BCLR 7
(0278) port_init();
002BC DE9D RCALL _port_init
(0279) watchdog_init();
002BD DEA8 RCALL _watchdog_init
(0280) Uart_Init();
002BE DFE9 RCALL _Uart_Init
(0281) MCUCR = 0x03;
002BF E083 LDI R24,3
002C0 BF85 OUT 0x35,R24
(0282) GICR = 0x00; //关外部中断0
002C1 2422 CLR R2
002C2 BE2B OUT 0x3B,R2
(0283) TIMSK = 0x00; //关定时器1中断
002C3 BE29 OUT 0x39,R2
(0284) SEI(); //re-enable interrupts
002C4 9478 BSET 7
002C5 9508 RET
(0285)
(0286) }
(0287) /**************************************************************************
(0288)
(0289)
(0290)
(0291) 主函数
(0292)
(0293)
(0294)
(0295)
(0296) **************************************************************************/
(0297)
(0298)
(0299) void main(void)
(0300) {
(0301)
(0302) init_devices() ;
_main:
002C6 DFF4 RCALL _init_devices
(0303) COM_IN;
002C7 98A4 CBI 0x14,4
(0304) COM_SET;
002C8 9AAC SBI 0x15,4
002C9 C023 RJMP 0x02ED
(0305)
(0306) while(1)
(0307) {
(0308)
(0309) //读DHT21
(0310) RH();
002CA DF47 RCALL _RH
(0311)
(0312) //由串口发送数据
(0313) Uart_Transmit(U8RH_data_H);
002CB 9100 020C LDS R16,U8RH_data_H
002CD DFE5 RCALL _Uart_Transmit
(0314) Uart_Transmit(U8RH_data_L);
002CE 9100 020B LDS R16,U8RH_data_L
002D0 DFE2 RCALL _Uart_Transmit
(0315) Uart_Transmit(U8T_data_H);
002D1 9100 020E LDS R16,U8T_data_H
002D3 DFDF RCALL _Uart_Transmit
(0316) Uart_Transmit(U8T_data_L);
002D4 9100 020D LDS R16,U8T_data_L
002D6 DFDC RCALL _Uart_Transmit
(0317) Uart_Transmit(U8checkdata);
002D7 9100 020A LDS R16,U8checkdata
002D9 DFD9 RCALL _Uart_Transmit
(0318)
(0319)
(0320) Uart_Transmit(U8checkdata);
002DA 9100 020A LDS R16,U8checkdata
002DC DFD6 RCALL _Uart_Transmit
(0321) //延时2S
(0322) for(U8temp=0;U8temp<200;U8temp++)
002DD 2422 CLR R2
002DE 9220 020F STS U8temp,R2
002E0 C008 RJMP 0x02E9
(0323) {
(0324) DelaymS(10);
FILE: <library>
002E1 E00A LDI R16,0xA
002E2 E010 LDI R17,0
002E3 DE8B RCALL _DelaymS
002E4 9180 020F LDS R24,U8temp
002E6 5F8F SUBI R24,0xFF
002E7 9380 020F STS U8temp,R24
002E9 9180 020F LDS R24,U8temp
002EB 3C88 CPI R24,0xC8
002EC F3A0 BCS 0x02E1
002ED CFDC RJMP 0x02CA
002EE 9508 RET
push_xgsetF00C:
002EF 937A ST -Y,R23
002F0 936A ST -Y,R22
002F1 935A ST -Y,R21
002F2 934A ST -Y,R20
002F3 92BA ST -Y,R11
002F4 92AA ST -Y,R10
002F5 9508 RET
pop_xgsetF00C:
002F6 90A9 LD R10,Y+
002F7 90B9 LD R11,Y+
002F8 9149 LD R20,Y+
002F9 9159 LD R21,Y+
002FA 9169 LD R22,Y+
002FB 9179 LD R23,Y+
002FC 9508 RET
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -