⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 1820.lst

📁 51单片驱动18b20的源代码程序!供设计者参考!
💻 LST
📖 第 1 页 / 共 3 页
字号:
     15C E090      LDI	R25,0
     15D 8399      STD	Y+1,R25
     15E 8388      STD	Y+0,R24
     15F 2D2C      MOV	R18,R12
     160 2D0A      MOV	R16,R10
     161 DF70      RCALL	_LCD_DisplayString
     162 9627      ADIW	R28,7
     163 940C 0283 JMP	pop_xgsetF0FC
_LCD_Displayasc:
  temp                 --> R20
  ascii                --> Y,+2
  asc                  --> Y,+10
  column               --> R12
  row                  --> R10
     165 940E 02B1 CALL	push_xgset303C
     167 2EC2      MOV	R12,R18
     168 2EA0      MOV	R10,R16
     169 9724      SBIW	R28,4
(0136) }
(0137) 
(0138) void LCD_Displayasc (char row, char column,  char asc)
(0139) { 
(0140)   unsigned char ascii[2],temp;
(0141)   temp=asc;
     16A 854A      LDD	R20,Y+10
(0142)   ascii[0]=temp+'0';
     16B 2F84      MOV	R24,R20
     16C 5D80      SUBI	R24,0xD0
     16D 838A      STD	Y+2,R24
(0143)   ascii[1]='\0';
     16E 2422      CLR	R2
     16F 822B      STD	Y+3,R2
(0144)   LCD_DisplayString(row,column,ascii);
     170 01CE      MOVW	R24,R28
     171 9602      ADIW	R24,2
     172 8399      STD	Y+1,R25
     173 8388      STD	Y+0,R24
     174 2D2C      MOV	R18,R12
     175 2D0A      MOV	R16,R10
     176 DF5B      RCALL	_LCD_DisplayString
     177 9624      ADIW	R28,4
     178 940C 02B8 JMP	pop_xgset303C
(0145) }
(0146) 
(0147) /****************************************************************************/
(0148) //////////////////////////////延时程序////////////////////////////////////////
(0149) /****************************************************************************/
(0150) #define XTAL 8                    //晶振频率,单位MHz
(0151) void delay_1us(void)                 //1us延时函数
(0152)   {
(0153)    asm("nop");
_delay_1us:
     17A 0000      NOP
     17B 9508      RET
_delay_nus:
  i                    --> R20
  n                    --> R10
     17C 940E 0299 CALL	push_xgset300C
     17E 0158      MOVW	R10,R16
(0154)   }
(0155) 
(0156) void delay_nus(unsigned int n)       //N us延时函数
(0157)   {
(0158)    unsigned int i=0;
     17F 2744      CLR	R20
     180 2755      CLR	R21
(0159)    for (i=0;i<n;i++)
     181 C003      RJMP	0x0185
(0160)    delay_1us();
     182 DFF7      RCALL	_delay_1us
     183 5F4F      SUBI	R20,0xFF
     184 4F5F      SBCI	R21,0xFF
     185 154A      CP	R20,R10
     186 055B      CPC	R21,R11
     187 F3D0      BCS	0x0182
     188 940C 029E JMP	pop_xgset300C
(0161)   }
(0162)   
(0163) void delay_1ms(void)                 //1ms延时函数
(0164)   {
(0165)    unsigned int i;
(0166)    for (i=0;i<(unsigned int)(XTAL*143-2);i++);
_delay_1ms:
  i                    --> R16
     18A 2700      CLR	R16
     18B 2711      CLR	R17
     18C C002      RJMP	0x018F
     18D 5F0F      SUBI	R16,0xFF
     18E 4F1F      SBCI	R17,0xFF
     18F E786      LDI	R24,0x76
     190 E094      LDI	R25,4
     191 1708      CP	R16,R24
     192 0719      CPC	R17,R25
     193 F3C8      BCS	0x018D
     194 9508      RET
_delay_nms:
  i                    --> R20
  n                    --> R10
     195 940E 0299 CALL	push_xgset300C
     197 0158      MOVW	R10,R16
(0167)   }
(0168)   
(0169) void delay_nms(unsigned int n)       //N ms延时函数
(0170)   {
(0171)    unsigned int i=0;
     198 2744      CLR	R20
     199 2755      CLR	R21
(0172)    for (i=0;i<n;i++)
     19A C003      RJMP	0x019E
(0173)    {
(0174)       delay_1ms();
     19B DFEE      RCALL	_delay_1ms
     19C 5F4F      SUBI	R20,0xFF
     19D 4F5F      SBCI	R21,0xFF
     19E 154A      CP	R20,R10
     19F 055B      CPC	R21,R11
     1A0 F3D0      BCS	0x019B
     1A1 940C 029E JMP	pop_xgset300C
_resetDS18B20:
  errTime              --> R10
     1A3 92AA      ST	R10,-Y
FILE: D:\DS18B20\ds18b20.h
(0001) #define	dq_clr	PORTB&=~(1<<PB7)    //数据线强制拉低
(0002) #define	dq_set	PORTB|=(1<<PB7)     //数据线强制拉高,上拉
(0003) #define	hold_dq	DDRB|=(1<<PB7)     //Mega16控制总线
(0004) #define	rls_dq	DDRB&=~(1<<PB7)     //释放总线
(0005) #define	stu_dq	PINB&(1<<PB7)  //数据线的状态
(0006) 
(0007) unsigned char resetDS18B20(void)
(0008) {
(0009)    unsigned char errTime=0;
     1A4 24AA      CLR	R10
(0010)    rls_dq;		   //释放总线
     1A5 98BF      CBI	0x17,7
(0011)    _NOP();
     1A6 0000      NOP
(0012)    hold_dq;		   //Maga16控制总线
     1A7 9ABF      SBI	0x17,7
(0013)    dq_clr;		   //强制拉低
     1A8 98C7      CBI	0x18,7
(0014)    delay_nus(480);	   
     1A9 EE00      LDI	R16,0xE0
     1AA E011      LDI	R17,1
     1AB DFD0      RCALL	_delay_nus
(0015)    //以上延时大于480us
(0016)    rls_dq;		   //释放总线,总线自动上拉
     1AC 98BF      CBI	0x17,7
(0017)    _NOP();
     1AD 0000      NOP
     1AE C009      RJMP	0x01B8
(0018)    while(stu_dq)
(0019)    {
(0020)       delay_nus(5);	   //5us
     1AF E005      LDI	R16,5
     1B0 E010      LDI	R17,0
     1B1 DFCA      RCALL	_delay_nus
(0021)       errTime++;
     1B2 94A3      INC	R10
(0022)       if(errTime>12)
     1B3 E08C      LDI	R24,0xC
     1B4 158A      CP	R24,R10
     1B5 F410      BCC	0x01B8
(0023)          return(0x00);	   //如果等带大于约 5*12就返回0x00,报告复位失败(实际上只要等待15-60us)
     1B6 2700      CLR	R16
     1B7 C010      RJMP	0x01C8
     1B8 99B7      SBIC	0x16,7
     1B9 CFF5      RJMP	0x01AF
(0024)    }
(0025)    errTime=0;
     1BA 24AA      CLR	R10
     1BB C009      RJMP	0x01C5
(0026)    while(!(stu_dq))
(0027)    {
(0028)       delay_nus(5);	   //5us
     1BC E005      LDI	R16,5
     1BD E010      LDI	R17,0
     1BE DFBD      RCALL	_delay_nus
(0029)       errTime++;
     1BF 94A3      INC	R10
(0030)       if(errTime>50)
     1C0 E382      LDI	R24,0x32
     1C1 158A      CP	R24,R10
     1C2 F410      BCC	0x01C5
(0031)          return(0x00);     //如果等带大于约 5us*50就返回0x00,报告复位失败(实际上只要等待60-240us)
     1C3 2700      CLR	R16
     1C4 C003      RJMP	0x01C8
     1C5 9BB7      SBIS	0x16,7
     1C6 CFF5      RJMP	0x01BC
(0032)    }
(0033)    return(0xff);
     1C7 EF0F      LDI	R16,0xFF
     1C8 90A9      LD	R10,Y+
     1C9 9508      RET
_readByteDS18B20:
  retVal               --> R20
  i                    --> R22
     1CA 934A      ST	R20,-Y
     1CB 936A      ST	R22,-Y
(0034) }
(0035) 
(0036) unsigned char readByteDS18B20(void)
(0037) {
(0038)    unsigned char i;
(0039)    unsigned char retVal=0;
     1CC 2744      CLR	R20
(0040)    rls_dq;		   //释放总线
     1CD 98BF      CBI	0x17,7
(0041)    for(i=8;i>0;i--)
     1CE E068      LDI	R22,0x8
     1CF C011      RJMP	0x01E1
(0042)    {
(0043)       retVal>>=1;
     1D0 9546      LSR	R20
(0044)       hold_dq;	   //Maga16控制总线
     1D1 9ABF      SBI	0x17,7
(0045)       dq_clr;	   //强制拉低
     1D2 98C7      CBI	0x18,7
(0046)       delay_nus(8);	   //延时大于1us
     1D3 E008      LDI	R16,0x8
     1D4 E010      LDI	R17,0
     1D5 DFA6      RCALL	_delay_nus
(0047)       dq_set;	   //释放总线,DS18B20会将总线强制拉低
     1D6 9AC7      SBI	0x18,7
(0048)      
(0049) 	  rls_dq;		//释放总线
     1D7 98BF      CBI	0x17,7
(0050)       if(stu_dq)
     1D8 9BB7      SBIS	0x16,7
     1D9 C001      RJMP	0x01DB
(0051)          retVal|=0x80;
     1DA 6840      ORI	R20,0x80
(0052)       delay_nus(30);	 	//30us
     1DB E10E      LDI	R16,0x1E
     1DC E010      LDI	R17,0
     1DD DF9E      RCALL	_delay_nus
(0053)       hold_dq;		//释放总线
     1DE 9ABF      SBI	0x17,7
(0054)       dq_set;	   //释放总线,DS18B20会将总线强制拉低
     1DF 9AC7      SBI	0x18,7
     1E0 956A      DEC	R22
     1E1 E080      LDI	R24,0
     1E2 1786      CP	R24,R22
     1E3 F360      BCS	0x01D0
(0055) 
(0056)    }
(0057)    delay_nus(5);	 	//2.71us(大于1us就行了)
     1E4 E005      LDI	R16,5
     1E5 E010      LDI	R17,0
     1E6 DF95      RCALL	_delay_nus
(0058)    return(retVal);
     1E7 2F04      MOV	R16,R20
     1E8 9169      LD	R22,Y+
     1E9 9149      LD	R20,Y+
     1EA 9508      RET
_writeByteDS18B20:
  temp                 --> R22
  i                    --> R20
  wb                   --> R10
     1EB 940E 02A3 CALL	push_xgsetF00C
     1ED 2EA0      MOV	R10,R16
(0059) }
(0060) 
(0061) void writeByteDS18B20(unsigned char wb)
(0062) {
(0063)    unsigned char i;
(0064)    unsigned char temp;
(0065)    rls_dq;	         	//释放总线
     1EE 98BF      CBI	0x17,7
(0066)    for(i=0;i<8;i++)
     1EF 2744      CLR	R20
     1F0 C017      RJMP	0x0208
(0067)    {
(0068)       hold_dq;		//Maga16控制总线
     1F1 9ABF      SBI	0x17,7
(0069)       dq_clr;		//强制拉低
     1F2 98C7      CBI	0x18,7
(0070)       delay_nus(4);	 	
     1F3 E004      LDI	R16,4
     1F4 E010      LDI	R17,0
     1F5 DF86      RCALL	_delay_nus
(0071)       temp=wb>>i;
     1F6 2D0A      MOV	R16,R10
     1F7 2F14      MOV	R17,R20
     1F8 940E 02DC CALL	lsr8
     1FA 2F60      MOV	R22,R16
(0072)       temp&=0x01;
     1FB 7061      ANDI	R22,1
(0073)       if(temp)
     1FC F011      BEQ	0x01FF
(0074)          dq_set;		//释放总线
     1FD 9AC7      SBI	0x18,7
     1FE C001      RJMP	0x0200
(0075)       else
(0076)          dq_clr;		//强制拉低
     1FF 98C7      CBI	0x18,7
(0077)       delay_nus(50);	 	
     200 E302      LDI	R16,0x32
     201 E010      LDI	R17,0
     202 DF79      RCALL	_delay_nus
(0078)       
(0079) 	  dq_set;		//释放总线
     203 9AC7      SBI	0x18,7
(0080)       delay_nus(4);	 	//(大于1us就行了)
     204 E004      LDI	R16,4
     205 E010      LDI	R17,0
     206 DF75      RCALL	_delay_nus
     207 9543      INC	R20
     208 3048      CPI	R20,0x8
     209 F338      BCS	0x01F1
     20A 940C 02AA JMP	pop_xgsetF00C
_readTempDS18B20:
  tempH                --> R12
  tempL                --> R10
  x                    --> R10
     20C 940E 0294 CALL	push_xgset003C
     20E 9722      SBIW	R28,2
(0081)    }
(0082) }
(0083) 
(0084) void readTempDS18B20(void)
(0085) {
(0086)    unsigned char tempL,tempH;
(0087)    unsigned int x;
(0088)    resetDS18B20();
     20F DF93      RCALL	_resetDS18B20
(0089)    writeByteDS18B20(0xcc); 	//跳过ROM
     210 EC0C      LDI	R16,0xCC
     211 DFD9      RCALL	_writeByteDS18B20
(0090)    writeByteDS18B20(0x44);	//启动温度转换
     212 E404      LDI	R16,0x44
     213 DFD7      RCALL	_writeByteDS18B20
(0091)    delay_nus(500);          //等待500us
     214 EF04      LDI	R16,0xF4
     215 E011      LDI	R17,1
     216 DF65      RCALL	_delay_nus
(0092)    resetDS18B20();
     217 DF8B      RCALL	_resetDS18B20
(0093)    writeByteDS18B20(0xcc);	//跳过ROM
     218 EC0C      LDI	R16,0xCC
     219 DFD1      RCALL	_writeByteDS18B20
(0094)    writeByteDS18B20(0xbe);	//读数据
     21A EB0E      LDI	R16,0xBE
     21B DFCF      RCALL	_writeByteDS18B20
(0095)    tempL=readByteDS18B20();
     21C DFAD      RCALL	_readByteDS18B20
     21D 2EA0      MOV	R10,R16
(0096)    tempH=readByteDS18B20();
     21E DFAB      RCALL	_readByteDS18B20
     21F 2EC0      MOV	R12,R16
(0097)    x=(tempH<<8)|tempL;
     220 2CBC      MOV	R11,R12
(0098)    resetDS18B20();
     221 DF81      RCALL	_resetDS18B20
(0099)    writeByteDS18B20(0xcc); 	//跳过ROM
     222 EC0C      LDI	R16,0xCC
     223 DFC7      RCALL	_writeByteDS18B20
(0100)    writeByteDS18B20(0x44);	//启动温度转换
     224 E404      LDI	R16,0x44
     225 DFC5      RCALL	_writeByteDS18B20
(0101)    x=x*0.625;
     226 E504      LDI	R16,0x54
     227 E010      LDI	R17,0
     228 940E 02C8 CALL	lpm32
     22A 0118      MOVW	R2,R16
     22B 0129      MOVW	R4,R18
     22C 0185      MOVW	R16,R10
     22D 940E 030E CALL	uint2fp
     22F 933A      ST	R19,-Y
     230 932A      ST	R18,-Y
     231 931A      ST	R17,-Y
     232 930A      ST	R16,-Y
     233 0181      MOVW	R16,R2
     234 0192      MOVW	R18,R4
     235 940E 0406 CALL	fpmule2
     237 940E 02E2 CALL	fpint
     239 0158      MOVW	R10,R16
(0102)    LCD_DisplayInt(2,3,x);   //未将温度值的小数点显示出
     23A 82B9      STD	Y+1,R11
     23B 82A8      STD	Y+0,R10
     23C E023      LDI	R18,3
     23D E002      LDI	R16,2
     23E DEA7      RCALL	_LCD_DisplayInt
     23F 9622      ADIW	R28,2
     240 940C 0277 JMP	pop_xgset003C
_main:
  temp                 --> R10
  i                    --> R10
     242 9722      SBIW	R28,2
FILE: D:\DS18B20\main.c
(0001) #include <iom16v.h>
(0002) #include <macros.h>
(0003) #include "lcd.h"
(0004) #include "ds18b20.h"
(0005) 
(0006) void main(void)
(0007) {
(0008)    unsigned char i=0;
     243 24AA      CLR	R10
(0009)    unsigned int  temp=0;
     244 24BB      CLR	R11
(0010)    CLI();
     245 94F8      BCLR	7
(0011)    LCD_init();
     246 DE0E      RCALL	_LCD_init
(0012)    SEI();
     247 9478      BSET	7
(0013)    LCD_DisplayString(1,4,"DS18B20");
     248 E683      LDI	R24,0x63
     249 E090      LDI	R25,0
     24A 8399      STD	Y+1,R25
     24B 8388      STD	Y+0,R24
     24C E024      LDI	R18,4
     24D E001      LDI	R16,1
     24E DE83      RCALL	_LCD_DisplayString
(0014)    LCD_DisplayString(2,1,"T=");
     24F E680      LDI	R24,0x60
     250 E090      LDI	R25,0
     251 8399      STD	Y+1,R25
     252 8388      STD	Y+0,R24
     253 E021      LDI	R18,1
     254 E002      LDI	R16,2
     255 DE7C      RCALL	_LCD_DisplayString
     256 C001      RJMP	0x0258
(0015)    while(1)
(0016)    {
(0017)      readTempDS18B20();
FILE: <library>
     257 DFB4      RCALL	_readTempDS18B20
     258 CFFE      RJMP	0x0257
     259 9622      ADIW	R28,2
     25A 9508      RET
mod16u:
     25B 9468      BSET	6
     25C C001      RJMP	xdiv16u
div16u:
     25D 94E8      BCLR	6
xdiv16u:
     25E 92EA      ST	R14,-Y
     25F 92FA      ST	R15,-Y
     260 938A      ST	R24,-Y
     261 24EE      CLR	R14
     262 24FF      CLR	R15
     263 E180      LDI	R24,0x10
     264 0F00      LSL	R16
     265 1F11      ROL	R17
     266 1CEE      ROL	R14
     267 1CFF      ROL	R15

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -