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

📄 zuopin.lst

📁 18b20的程序
💻 LST
字号:
__text_start:
__start:
    0013 E5CF      LDI	R28,0x5F
    0014 E0D4      LDI	R29,4
    0015 BFCD      OUT	0x3D,R28
    0016 BFDE      OUT	0x3E,R29
    0017 51C0      SUBI	R28,0x10
    0018 40D0      SBCI	R29,0
    0019 EA0A      LDI	R16,0xAA
    001A 8308      STD	Y+0,R16
    001B 2400      CLR	R0
    001C E6E0      LDI	R30,0x60
    001D E0F0      LDI	R31,0
    001E E010      LDI	R17,0
    001F 36E0      CPI	R30,0x60
    0020 07F1      CPC	R31,R17
    0021 F011      BEQ	0x0024
    0022 9201      ST	R0,Z+
    0023 CFFB      RJMP	0x001F
    0024 8300      STD	Z+0,R16
    0025 E2E6      LDI	R30,0x26
    0026 E0F0      LDI	R31,0
    0027 E6A0      LDI	R26,0x60
    0028 E0B0      LDI	R27,0
    0029 E010      LDI	R17,0
    002A 32E6      CPI	R30,0x26
    002B 07F1      CPC	R31,R17
    002C F021      BEQ	0x0031
    002D 95C8      LPM
    002E 9631      ADIW	R30,1
    002F 920D      ST	R0,X+
    0030 CFF9      RJMP	0x002A
    0031 D088      RCALL	_main
_exit:
    0032 CFFF      RJMP	_exit
FILE: K:\作品\新建文件夹\zuopin.c
(0001) // Target : M8
(0002) // Crystal: 8.0000Mhz    //8M晶振
(0003) #include <iom8v.h> 
(0004) #include <macros.h> 
(0005) 
(0006) void delay_us()     //微秒延时程序(1us)
(0007) {
(0008)  asm("nop");
_delay_us:
    0033 0000      NOP
    0034 9508      RET
_delay:
  time                 --> R20
    0035 D09B      RCALL	push_gset1
    0036 01A8      MOVW	R20,R16
(0009) }	
(0010) void delay(unsigned int time)    
(0011) {
    0037 C003      RJMP	0x003B
(0012) while(time)
(0013)   { delay_us();
    0038 DFFA      RCALL	_delay_us
(0014)     time--;
    0039 5041      SUBI	R20,1
    003A 4050      SBCI	R21,0
    003B 3040      CPI	R20,0
    003C 0745      CPC	R20,R21
    003D F7D1      BNE	0x0038
    003E D095      RCALL	pop_gset1
    003F 9508      RET
(0015)    }
(0016) }	
(0017)    
(0018) void init_1820()    //初始化18b20
(0019) {
(0020)   PORTD|=0X80;   //总线置1
_init_1820:
    0040 9A97      SBI	0x12,7
(0021)   delay(10);
    0041 E00A      LDI	R16,0xA
    0042 E010      LDI	R17,0
    0043 DFF1      RCALL	_delay
(0022)   PORTD&=~0x80;  //总线置0 
    0044 9897      CBI	0x12,7
(0023)   delay(1200);    // 延时等待
    0045 EB00      LDI	R16,0xB0
    0046 E014      LDI	R17,4
    0047 DFED      RCALL	_delay
(0024)   DDRD&=~0x80;  
    0048 988F      CBI	0x11,7
(0025)   PORTD|=0x80;   //总线置1
    0049 9A97      SBI	0x12,7
(0026)   delay(50);   
    004A E302      LDI	R16,0x32
    004B E010      LDI	R17,0
    004C DFE8      RCALL	_delay
(0027)   DDRD|=0x80; 
    004D 9A8F      SBI	0x11,7
(0028)   PORTD|=0x80; 
    004E 9A97      SBI	0x12,7
(0029)   delay(200);   
    004F EC08      LDI	R16,0xC8
    0050 E010      LDI	R17,0
    0051 DFE3      RCALL	_delay
    0052 9508      RET
_write_1820:
  i                    --> R20
  temp                 --> R22
    0053 D07B      RCALL	push_gset2
    0054 2F60      MOV	R22,R16
(0030) } 
(0031) void write_1820(unsigned char temp)   //写数据
(0032) {   
(0033)   unsigned char i=0; 
    0055 2744      CLR	R20
(0034)   for(;i<8;i++) 
    0056 C00F      RJMP	0x0066
(0035)   { 
(0036)     PORTD&=~0X80; 
    0057 9897      CBI	0x12,7
(0037)     if(temp&(1<<i))   //写数据,从低位开始 
    0058 E001      LDI	R16,1
    0059 2F14      MOV	R17,R20
    005A D08D      RCALL	lsl8
    005B 2E26      MOV	R2,R22
    005C 2220      AND	R2,R16
    005D F011      BEQ	0x0060
(0038)     PORTD|=0X80; 
    005E 9A97      SBI	0x12,7
    005F C001      RJMP	0x0061
(0039)     else 
(0040)     PORTD&=~0X80; 
    0060 9897      CBI	0x12,7
(0041)     delay(50);  
    0061 E302      LDI	R16,0x32
    0062 E010      LDI	R17,0
    0063 DFD1      RCALL	_delay
(0042)     PORTD|=0X80; 
    0064 9A97      SBI	0x12,7
    0065 9543      INC	R20
    0066 3048      CPI	R20,0x8
    0067 F378      BCS	0x0057
(0043)   } 
(0044)   PORTD|=0X80; 
    0068 9A97      SBI	0x12,7
    0069 D05B      RCALL	pop_gset2
    006A 9508      RET
_read_1820:
  n                    --> R20
  m                    --> R22
  i                    --> R10
    006B D061      RCALL	push_gset3
(0045) } 
(0046) 
(0047) unsigned char read_1820() //读数据
(0048) {   
(0049)  unsigned char m,i=0,n=0;     
    006C 24AA      CLR	R10
    006D 2744      CLR	R20
(0050)   for(;i<8;i++) 
    006E C019      RJMP	0x0088
(0051)     { 
(0052)     PORTD&=~0X80;
    006F 9897      CBI	0x12,7
(0053) 	delay(5); 
    0070 E005      LDI	R16,5
    0071 E010      LDI	R17,0
    0072 DFC2      RCALL	_delay
(0054)     PORTD|=0X80; 
    0073 9A97      SBI	0x12,7
(0055)     DDRD&=~0X80; 
    0074 988F      CBI	0x11,7
(0056)     m=(PIND&0X80);   //读数据,从低位开始 
    0075 B360      IN	R22,0x10
    0076 7860      ANDI	R22,0x80
(0057)     if(m) 
    0077 F029      BEQ	0x007D
(0058)     n|=(1<<i); 
    0078 E001      LDI	R16,1
    0079 2D1A      MOV	R17,R10
    007A D06D      RCALL	lsl8
    007B 2B40      OR	R20,R16
    007C C006      RJMP	0x0083
(0059)     else 
(0060)     n&=~(1<<i); 
    007D E001      LDI	R16,1
    007E 2D1A      MOV	R17,R10
    007F D068      RCALL	lsl8
    0080 2E20      MOV	R2,R16
    0081 9420      COM	R2
    0082 2142      AND	R20,R2
(0061)     delay(80); 
    0083 E500      LDI	R16,0x50
    0084 E010      LDI	R17,0
    0085 DFAF      RCALL	_delay
(0062)     DDRD|=0X80; 
    0086 9A8F      SBI	0x11,7
    0087 94A3      INC	R10
    0088 2D8A      MOV	R24,R10
    0089 3088      CPI	R24,0x8
    008A F320      BCS	0x006F
(0063)   } 
(0064)   return (n); 
    008B 2F04      MOV	R16,R20
    008C D03A      RCALL	pop_gset3
    008D 9508      RET
_temperature_read:
  tempture             --> Y+1
  teml                 --> R22
  temh                 --> R20
  i                    --> R20
    008E D040      RCALL	push_gset2
(0065) } 
(0066) void temperature_read()  //读取温度值
(0067) {
(0068)   unsigned char tempture;
(0069)   unsigned char i,temh,teml; 
(0070)   init_1820();     //复位18b20 
    008F DFB0      RCALL	_init_1820
(0071)   write_1820(0xcc);   // 发出转换命令 
    0090 EC0C      LDI	R16,0xCC
    0091 DFC1      RCALL	_write_1820
(0072)   write_1820(0x44);    //启动温度转换
    0092 E404      LDI	R16,0x44
    0093 DFBF      RCALL	_write_1820
(0073)   delay(400); 
    0094 E900      LDI	R16,0x90
    0095 E011      LDI	R17,1
    0096 DF9E      RCALL	_delay
(0074)   init_1820();    
    0097 DFA8      RCALL	_init_1820
(0075)   write_1820(0xcc); //发出读命令 
    0098 EC0C      LDI	R16,0xCC
    0099 DFB9      RCALL	_write_1820
(0076)   write_1820(0xbe);  //读数据
    009A EB0E      LDI	R16,0xBE
    009B DFB7      RCALL	_write_1820
(0077)   teml=read_1820(); 
    009C DFCE      RCALL	_read_1820
    009D 2F60      MOV	R22,R16
(0078)   temh=read_1820(); 
    009E DFCC      RCALL	_read_1820
    009F 2F40      MOV	R20,R16
(0079)   UDR=teml;
    00A0 B96C      OUT	0x0C,R22
(0080)   delay(150);
    00A1 E906      LDI	R16,0x96
    00A2 E010      LDI	R17,0
    00A3 DF91      RCALL	_delay
(0081)   UDR=temh;
    00A4 B94C      OUT	0x0C,R20
(0082)   for(i=0;i<100;i++)   //延时等待
    00A5 2744      CLR	R20
    00A6 C004      RJMP	0x00AB
(0083)   delay(500);     
    00A7 EF04      LDI	R16,0xF4
    00A8 E011      LDI	R17,1
    00A9 DF8B      RCALL	_delay
    00AA 9543      INC	R20
    00AB 3644      CPI	R20,0x64
    00AC F3D0      BCS	0x00A7
    00AD D017      RCALL	pop_gset2
    00AE 9508      RET
(0084) }
(0085) //UART0 initialize
(0086) // desired baud rate: 9600
(0087) // actual: baud rate:9615 (0.2%)
(0088) // char size: 8 bit
(0089) // parity: Disabled
(0090) void uart0_init(void)     //初始化uart
(0091) {
(0092)  UCSRB = 0x00; //disable while setting baud rate
_uart0_init:
    00AF 2422      CLR	R2
    00B0 B82A      OUT	0x0A,R2
(0093)  UCSRA = 0x00;
    00B1 B82B      OUT	0x0B,R2
(0094)  UCSRC = BIT(URSEL) | 0x06;
    00B2 E886      LDI	R24,0x86
    00B3 BD80      OUT	0x20,R24
(0095)  UBRRL = 0x33; //set baud rate lo
    00B4 E383      LDI	R24,0x33
    00B5 B989      OUT	0x09,R24
(0096)  UBRRH = 0x00; //set baud rate hi
    00B6 BC20      OUT	0x20,R2
(0097)  UCSRB = 0x18;
    00B7 E188      LDI	R24,0x18
    00B8 B98A      OUT	0x0A,R24
    00B9 9508      RET
(0098) }
(0099) 
(0100) void main(void) //主函数 
(0101) { 
(0102) delay(1000); 
_main:
    00BA EE08      LDI	R16,0xE8
    00BB E013      LDI	R17,3
    00BC DF78      RCALL	_delay
(0103) DDRD=0Xff; 
    00BD EF8F      LDI	R24,0xFF
    00BE BB81      OUT	0x11,R24
(0104) PORTD=0Xff; 
    00BF BB82      OUT	0x12,R24
(0105) uart0_init();
    00C0 DFEE      RCALL	_uart0_init
    00C1 C001      RJMP	0x00C3
(0106) while(1)    
(0107)   temperature_read();
FILE: <library>
    00C2 DFCB      RCALL	_temperature_read
    00C3 CFFE      RJMP	0x00C2
    00C4 9508      RET
pop_gset2:
    00C5 E0E2      LDI	R30,2
    00C6 C00E      RJMP	pop
pop_gset3:
    00C7 E0E4      LDI	R30,4
    00C8 C00C      RJMP	pop
push_gset5:
    00C9 92FA      ST	R15,-Y
    00CA 92EA      ST	R14,-Y
push_gset4:
    00CB 92DA      ST	R13,-Y
    00CC 92CA      ST	R12,-Y
push_gset3:
    00CD 92BA      ST	R11,-Y
    00CE 92AA      ST	R10,-Y
push_gset2:
    00CF 937A      ST	R23,-Y
    00D0 936A      ST	R22,-Y
push_gset1:
    00D1 935A      ST	R21,-Y
    00D2 934A      ST	R20,-Y
    00D3 9508      RET
pop_gset1:
    00D4 E0E1      LDI	R30,1
pop:
    00D5 9149      LD	R20,Y+
    00D6 9159      LD	R21,Y+
    00D7 FDE0      SBRC	R30,0
    00D8 9508      RET
    00D9 9169      LD	R22,Y+
    00DA 9179      LD	R23,Y+
    00DB FDE1      SBRC	R30,1
    00DC 9508      RET
    00DD 90A9      LD	R10,Y+
    00DE 90B9      LD	R11,Y+
    00DF FDE2      SBRC	R30,2
    00E0 9508      RET
    00E1 90C9      LD	R12,Y+
    00E2 90D9      LD	R13,Y+
    00E3 FDE3      SBRC	R30,3
    00E4 9508      RET
    00E5 90E9      LD	R14,Y+
    00E6 90F9      LD	R15,Y+
    00E7 9508      RET
lsl8:
    00E8 2311      TST	R17
    00E9 F019      BEQ	0x00ED
    00EA 0F00      LSL	R16
    00EB 951A      DEC	R17
    00EC CFFB      RJMP	lsl8
    00ED 9508      RET

⌨️ 快捷键说明

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