📄 wsh.lst
字号:
(0143)
(0144) }
(0145)
(0146) //--------------------------------
(0147) //-----湿度读取子程序 ------------
(0148) //--------------------------------
(0149) //----以下变量均为全局变量--------
(0150) //----温度高8位== U8T_data_H------
(0151) //----温度低8位== U8T_data_L------
(0152) //----湿度高8位== U8RH_data_H-----
(0153) //----湿度低8位== U8RH_data_L-----
(0154) //----校验 8位 == U8checkdata-----
(0155) //----调用相关子程序如下----------
(0156) //---- Delay();, Delay_10us();,COM();
(0157) //--------------------------------
(0158)
(0159) void RH(void)
(0160) {
(0161)
(0162) //主机拉低18ms
(0163) COM_OUT;
_RH:
00105 9AA4 SBI 0x14,4
(0164) COM_CLR;
00106 98AC CBI 0x15,4
(0165) DelaymS(1);
00107 E001 LDI R16,1
00108 E010 LDI R17,0
00109 DF58 RCALL _DelaymS
(0166) COM_IN;
0010A 98A4 CBI 0x14,4
(0167) COM_SET;
0010B 9AAC SBI 0x15,4
(0168)
(0169) //总线由上拉电阻拉高 主机延时20us
(0170) Delay_10us();
0010C DF6A RCALL _Delay_10us
(0171) Delay_10us();
0010D DF69 RCALL _Delay_10us
(0172) Delay_10us();
0010E DF68 RCALL _Delay_10us
(0173) Delay_10us();
0010F DF67 RCALL _Delay_10us
(0174) //主机设为输入 判断从机响应信号
(0175) //P2_0=1;
(0176)
(0177) //判断从机是否有低电平响应信号 如不响应则跳出,响应则向下运行
(0178) // if(!P2_0) //T !
(0179) if(COM_R)U8FLAG=1;
00110 9B9C SBIS 0x13,4
00111 C05D RJMP 0x016F
00112 E081 LDI R24,1
00113 9380 0072 STS U8FLAG,R24
00115 C059 RJMP 0x016F
(0180) while(!(COM_R))
(0181) {
(0182) U8FLAG=2;
00116 E082 LDI R24,2
00117 9380 0072 STS U8FLAG,R24
(0183) //判断从机是否发出 80us 的低电平响应信号是否结束
(0184) //while((!P2_0)&&U8FLAG++);
(0185) while((!(COM_R))&&U8FLAG++);
00119 999C SBIC 0x13,4
0011A C009 RJMP 0x0124
0011B 9020 0072 LDS R2,U8FLAG
0011D 2433 CLR R3
0011E 2D82 MOV R24,R2
0011F 5F8F SUBI R24,0xFF
00120 9380 0072 STS U8FLAG,R24
00122 2022 TST R2
00123 F7A9 BNE 0x0119
(0186) if(U8FLAG==1)break;
00124 9180 0072 LDS R24,U8FLAG
00126 3081 CPI R24,1
00127 F409 BNE 0x0129
00128 C048 RJMP 0x0171
(0187) U8FLAG=2;
00129 E082 LDI R24,2
0012A 9380 0072 STS U8FLAG,R24
(0188) //判断从机是否发出 80us 的高电平,如发出则进入数据接收状态
(0189) //while((P2_0)&&U8FLAG++);
(0190) while((COM_R)&&U8FLAG++);
0012C 9B9C SBIS 0x13,4
0012D C009 RJMP 0x0137
0012E 9020 0072 LDS R2,U8FLAG
00130 2433 CLR R3
00131 2D82 MOV R24,R2
00132 5F8F SUBI R24,0xFF
00133 9380 0072 STS U8FLAG,R24
00135 2022 TST R2
00136 F7A9 BNE 0x012C
(0191) if(U8FLAG==1)break;
00137 9180 0072 LDS R24,U8FLAG
00139 3081 CPI R24,1
0013A F409 BNE 0x013C
0013B C035 RJMP 0x0171
(0192) //数据接收状态
(0193) COM();
0013C DF81 RCALL _COM
(0194) if(U8FLAG==1)break;
0013D 9180 0072 LDS R24,U8FLAG
0013F 3081 CPI R24,1
00140 F409 BNE 0x0142
00141 C02F RJMP 0x0171
(0195) U8T_data_H_temp=U8comdata;
00142 9020 0064 LDS R2,U8comdata
00144 9220 0069 STS U8T_data_H_temp,R2
(0196) COM();
00146 DF77 RCALL _COM
(0197) if(U8FLAG==1)break;
00147 9180 0072 LDS R24,U8FLAG
00149 3081 CPI R24,1
0014A F409 BNE 0x014C
0014B C025 RJMP 0x0171
(0198) U8T_data_L_temp=U8comdata;
0014C 9020 0064 LDS R2,U8comdata
0014E 9220 0068 STS U8T_data_L_temp,R2
(0199) COM();
00150 DF6D RCALL _COM
(0200) if(U8FLAG==1)break;
00151 9180 0072 LDS R24,U8FLAG
00153 3081 CPI R24,1
00154 F409 BNE 0x0156
00155 C01B RJMP 0x0171
(0201) U8RH_data_H_temp=U8comdata;
00156 9020 0064 LDS R2,U8comdata
00158 9220 0067 STS U8RH_data_H_temp,R2
(0202) COM();
0015A DF63 RCALL _COM
(0203) if(U8FLAG==1)break;
0015B 9180 0072 LDS R24,U8FLAG
0015D 3081 CPI R24,1
0015E F409 BNE 0x0160
0015F C011 RJMP 0x0171
(0204) U8RH_data_L_temp=U8comdata;
00160 9020 0064 LDS R2,U8comdata
00162 9220 0066 STS U8RH_data_L_temp,R2
(0205) COM();
00164 DF59 RCALL _COM
(0206) if(U8FLAG==1)break;
00165 9180 0072 LDS R24,U8FLAG
00167 3081 CPI R24,1
00168 F409 BNE 0x016A
00169 C007 RJMP 0x0171
(0207) U8checkdata_temp=U8comdata;
0016A 9020 0064 LDS R2,U8comdata
0016C 9220 0065 STS U8checkdata_temp,R2
(0208) break;
0016E C002 RJMP 0x0171
0016F 9B9C SBIS 0x13,4
00170 CFA5 RJMP 0x0116
(0209) }//while
(0210) //P2_0=1;
(0211) COM_IN;
00171 98A4 CBI 0x14,4
(0212) COM_SET;
00172 9AAC SBI 0x15,4
(0213) //数据校验
(0214)
(0215) U8temp=(U8T_data_H_temp+U8T_data_L_temp+U8RH_data_H_temp+U8RH_data_L_temp);
00173 9020 0068 LDS R2,U8T_data_L_temp
00175 9030 0069 LDS R3,U8T_data_H_temp
00177 0C32 ADD R3,R2
00178 9020 0067 LDS R2,U8RH_data_H_temp
0017A 0C32 ADD R3,R2
0017B 9020 0066 LDS R2,U8RH_data_L_temp
0017D 0C32 ADD R3,R2
0017E 9230 006F STS U8temp,R3
(0216) if(U8temp==U8checkdata_temp)
00180 9020 0065 LDS R2,U8checkdata_temp
00182 1432 CP R3,R2
00183 F4A1 BNE 0x0198
(0217) {
(0218) U8RH_data_H=U8T_data_H_temp;
00184 9020 0069 LDS R2,U8T_data_H_temp
00186 9220 006C STS U8RH_data_H,R2
(0219) U8RH_data_L=U8T_data_L_temp;
00188 9020 0068 LDS R2,U8T_data_L_temp
0018A 9220 006B STS U8RH_data_L,R2
(0220) U8T_data_H=U8RH_data_H_temp;
0018C 9020 0067 LDS R2,U8RH_data_H_temp
0018E 9220 006E STS U8T_data_H,R2
(0221) U8T_data_L=U8RH_data_L_temp;
00190 9020 0066 LDS R2,U8RH_data_L_temp
00192 9220 006D STS U8T_data_L,R2
(0222) U8checkdata=U8checkdata_temp;
00194 9020 0065 LDS R2,U8checkdata_temp
00196 9220 006A STS U8checkdata,R2
(0223) }//fi
(0224)
(0225)
(0226) COM_IN;
00198 98A4 CBI 0x14,4
(0227) COM_SET;
00199 9AAC SBI 0x15,4
0019A 9508 RET
(0228)
(0229) }
(0230)
(0231) /*
(0232) 串口初始化函数
(0233) 系统频率:2MHz
(0234) 停止位:1
(0235) 波特率:9600
(0236) 数据长度:8
(0237) */
(0238) void Uart_Init(void) {
(0239) UCSRA = 0x02; /*2倍速 */
_Uart_Init:
0019B E082 LDI R24,2
0019C B98B OUT 0x0B,R24
(0240) UCSRB = 0x18; /*允许接收和发送*/
0019D E188 LDI R24,0x18
0019E B98A OUT 0x0A,R24
(0241) UCSRC = 0x06; /*8位数据 */
0019F E086 LDI R24,6
001A0 BD80 OUT 0x20,R24
(0242) UBRRH = 0x00;
001A1 2422 CLR R2
001A2 BC20 OUT 0x20,R2
(0243) //UBRRL = 47; /*9600 3.6864M */
(0244) //UBRRL = 95; /*9600 7.3728M */
(0245) UBRRL = 103; /*9600 8.0000M */
001A3 E687 LDI R24,0x67
001A4 B989 OUT 0x09,R24
001A5 9508 RET
(0246) }
(0247)
(0248) /*
(0249) 串数据发送
(0250) 查询方式发送
(0251) */
(0252) void Uart_Transmit(unsigned char i) {
(0253)
(0254) /* 等待发送缓冲器为空*/
(0255) while (!(UCSRA & (1<<UDRE)));
_Uart_Transmit:
i --> R16
001A6 9B5D SBIS 0x0B,5
001A7 CFFE RJMP _Uart_Transmit
(0256) /* 将数据放入缓冲器,发送数据*/
(0257) UDR = i;
001A8 B90C OUT 0x0C,R16
001A9 9508 RET
(0258) }
(0259)
(0260) /*
(0261) 串数据接收
(0262) 查询方式接收
(0263) */
(0264) unsigned char Uart_Receive( void ) {
(0265)
(0266) /* 等待接收数据*/
(0267) while (!(UCSRA & (1<<RXC)));
_Uart_Receive:
001AA 9B5F SBIS 0x0B,7
001AB CFFE RJMP _Uart_Receive
(0268) /* 从缓冲器中获取并返回数据*/
(0269) // Uart_Transmit(UDR);
(0270) return UDR;
001AC B10C IN R16,0x0C
001AD 9508 RET
(0271) }
(0272)
(0273) void init_devices(void)
(0274) {
(0275) unsigned char i;
(0276) CLI();
_init_devices:
i --> Y,+1
001AE 94F8 BCLR 7
(0277) port_init();
001AF DE9D RCALL _port_init
(0278) watchdog_init();
001B0 DEA8 RCALL _watchdog_init
(0279) Uart_Init();
001B1 DFE9 RCALL _Uart_Init
(0280) MCUCR = 0x03;
001B2 E083 LDI R24,3
001B3 BF85 OUT 0x35,R24
(0281) GICR = 0x00; //关外部中断0
001B4 2422 CLR R2
001B5 BE2B OUT 0x3B,R2
(0282) TIMSK = 0x00; //关定时器1中断
001B6 BE29 OUT 0x39,R2
(0283) SEI(); //re-enable interrupts
001B7 9478 BSET 7
001B8 9508 RET
(0284)
(0285) }
(0286) /**************************************************************************
(0287)
(0288)
(0289)
(0290) 主函数
(0291)
(0292)
(0293)
(0294)
(0295) **************************************************************************/
(0296)
(0297)
(0298) void main(void)
(0299) {
(0300)
(0301) init_devices() ;
_main:
001B9 DFF4 RCALL _init_devices
(0302) COM_IN;
001BA 98A4 CBI 0x14,4
(0303) COM_SET;
001BB 9AAC SBI 0x15,4
001BC C023 RJMP 0x01E0
(0304)
(0305) while(1)
(0306) {
(0307)
(0308) //读DHT21
(0309) RH();
001BD DF47 RCALL _RH
(0310)
(0311) //由串口发送数据
(0312) Uart_Transmit(U8RH_data_H);
001BE 9100 006C LDS R16,U8RH_data_H
001C0 DFE5 RCALL _Uart_Transmit
(0313) Uart_Transmit(U8RH_data_L);
001C1 9100 006B LDS R16,U8RH_data_L
001C3 DFE2 RCALL _Uart_Transmit
(0314) Uart_Transmit(U8T_data_H);
001C4 9100 006E LDS R16,U8T_data_H
001C6 DFDF RCALL _Uart_Transmit
(0315) Uart_Transmit(U8T_data_L);
001C7 9100 006D LDS R16,U8T_data_L
001C9 DFDC RCALL _Uart_Transmit
(0316) Uart_Transmit(U8checkdata);
001CA 9100 006A LDS R16,U8checkdata
001CC DFD9 RCALL _Uart_Transmit
(0317)
(0318)
(0319) Uart_Transmit(U8checkdata);
001CD 9100 006A LDS R16,U8checkdata
001CF DFD6 RCALL _Uart_Transmit
(0320) //延时2S
(0321) for(U8temp=0;U8temp<200;U8temp++)
001D0 2422 CLR R2
001D1 9220 006F STS U8temp,R2
001D3 C008 RJMP 0x01DC
(0322) {
(0323) DelaymS(10);
FILE: <library>
001D4 E00A LDI R16,0xA
001D5 E010 LDI R17,0
001D6 DE8B RCALL _DelaymS
001D7 9180 006F LDS R24,U8temp
001D9 5F8F SUBI R24,0xFF
001DA 9380 006F STS U8temp,R24
001DC 9180 006F LDS R24,U8temp
001DE 3C88 CPI R24,0xC8
001DF F3A0 BCS 0x01D4
001E0 CFDC RJMP 0x01BD
001E1 9508 RET
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -