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

📄 18b20.lst

📁 一个关于AVR单片机的例程
💻 LST
📖 第 1 页 / 共 4 页
字号:
__start:
__text_start:
    0043 E5CF      LDI	R28,0x5F
    0044 E0D4      LDI	R29,4
    0045 BFCD      OUT	0x3D,R28
    0046 BFDE      OUT	0x3E,R29
    0047 51C0      SUBI	R28,0x10
    0048 40D0      SBCI	R29,0
    0049 EA0A      LDI	R16,0xAA
    004A 8308      STD	Y+0,R16
    004B 2400      CLR	R0
    004C E6E0      LDI	R30,0x60
    004D E0F0      LDI	R31,0
    004E E010      LDI	R17,0
    004F 36E4      CPI	R30,0x64
    0050 07F1      CPC	R31,R17
    0051 F011      BEQ	0x0054
    0052 9201      ST	R0,Z+
    0053 CFFB      RJMP	0x004F
    0054 8300      STD	Z+0,R16
    0055 E8E6      LDI	R30,0x86
    0056 E0F0      LDI	R31,0
    0057 E6A0      LDI	R26,0x60
    0058 E0B0      LDI	R27,0
    0059 E010      LDI	R17,0
    005A 38E6      CPI	R30,0x86
    005B 07F1      CPC	R31,R17
    005C F021      BEQ	0x0061
    005D 95C8      LPM
    005E 9631      ADIW	R30,1
    005F 920D      ST	R0,X+
    0060 CFF9      RJMP	0x005A
    0061 940E00F7  CALL	_main
_exit:
    0063 CFFF      RJMP	_exit
FILE: C:\DOCUME~1\administrator\桌面\教程\18B20\delay.c
(0001) /**********************************
(0002) ** file_name delay.c             **
(0003) ** describe  软件延时函数        **
(0004) ** auther    古欣 www.avrvi.com  **
(0005) ** Time      2007-1-31           **
(0006) ***********************************/
(0007) #include "config.h"
(0008) /***********************
(0009) ** 8M晶振下 1us
(0010) ** 也可以宏定义 8个asm("nop");
(0011) ** #define delay_1us asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");
(0012) ***********************/
(0013) void delay_1us(void)
(0014) {
(0015)  asm("nop");
_delay_1us:
    0064 0000      NOP
    0065 9508      RET
(0016) }
(0017) 
(0018) /***********************
(0019) **8M时为 1000.25us
(0020) **4M时为 999.5us
(0021) **xtal 为晶振频率,单位为Mhz
(0022) ************************/
(0023) void delay_1ms(void)
(0024) {
(0025)  unsigned int i;
(0026)  for(i=(xtal*143-2);i>0;i--)
_delay_1ms:
  i                    --> R16
    0066 E706      LDI	R16,0x76
    0067 E014      LDI	R17,4
    0068 C002      RJMP	0x006B
    0069 5001      SUBI	R16,1
    006A 4010      SBCI	R17,0
    006B 3000      CPI	R16,0
    006C 0701      CPC	R16,R17
    006D F7D9      BNE	0x0069
    006E 9508      RET
_delay_1s:
  i                    --> R20
    006F 940E034E  CALL	push_gset1
(0027)   ;
(0028) }
(0029) 
(0030) /***********************
(0031) ** 1S延时,误差可能稍大
(0032) ** 250ms*4=1000ms
(0033) ************************/
(0034) void delay_1s(void)
(0035) {
(0036)  unsigned int i;
(0037)    for(i=250;i>0;i--)   //250ms*4=1000ms
    0071 EF4A      LDI	R20,0xFA
    0072 E050      LDI	R21,0
    0073 C003      RJMP	0x0077
(0038)    delay_1ms();
    0074 DFF1      RCALL	_delay_1ms
    0075 5041      SUBI	R20,1
    0076 4050      SBCI	R21,0
    0077 3040      CPI	R20,0
    0078 0745      CPC	R20,R21
    0079 F7D1      BNE	0x0074
(0039)    for(i=250;i>0;i--)
    007A EF4A      LDI	R20,0xFA
    007B E050      LDI	R21,0
    007C C003      RJMP	0x0080
(0040)    delay_1ms();
    007D DFE8      RCALL	_delay_1ms
    007E 5041      SUBI	R20,1
    007F 4050      SBCI	R21,0
    0080 3040      CPI	R20,0
    0081 0745      CPC	R20,R21
    0082 F7D1      BNE	0x007D
(0041)    for(i=250;i>0;i--)
    0083 EF4A      LDI	R20,0xFA
    0084 E050      LDI	R21,0
    0085 C003      RJMP	0x0089
(0042)    delay_1ms();
    0086 DFDF      RCALL	_delay_1ms
    0087 5041      SUBI	R20,1
    0088 4050      SBCI	R21,0
    0089 3040      CPI	R20,0
    008A 0745      CPC	R20,R21
    008B F7D1      BNE	0x0086
(0043)    for(i=250;i>0;i--)
    008C EF4A      LDI	R20,0xFA
    008D E050      LDI	R21,0
    008E C003      RJMP	0x0092
(0044)    delay_1ms();
    008F DFD6      RCALL	_delay_1ms
    0090 5041      SUBI	R20,1
    0091 4050      SBCI	R21,0
    0092 3040      CPI	R20,0
    0093 0745      CPC	R20,R21
    0094 F7D1      BNE	0x008F
    0095 940E0351  CALL	pop_gset1
    0097 9508      RET
_delay_us:
  i                    --> R20
  n                    --> R22
    0098 940E034C  CALL	push_gset2
    009A 01B8      MOVW	R22,R16
(0045) }
(0046) 
(0047) /***********************
(0048) **微秒级延时
(0049) ************************/
(0050) void delay_us(unsigned int n)
(0051) {
(0052)  unsigned int i;
(0053)  for(i=n;i>0;i--)
    009B 01AB      MOVW	R20,R22
    009C C003      RJMP	0x00A0
(0054)  delay_1us();
    009D DFC6      RCALL	_delay_1us
    009E 5041      SUBI	R20,1
    009F 4050      SBCI	R21,0
    00A0 3040      CPI	R20,0
    00A1 0745      CPC	R20,R21
    00A2 F7D1      BNE	0x009D
    00A3 940E033D  CALL	pop_gset2
    00A5 9508      RET
_delay_ms:
  i                    --> R20
  n                    --> R22
    00A6 940E034C  CALL	push_gset2
    00A8 01B8      MOVW	R22,R16
(0055) }
(0056) 
(0057) /***********************
(0058) **毫秒级延时
(0059) ************************/
(0060) void delay_ms(unsigned int n)
(0061) {
(0062)  unsigned int i;
(0063)  for(i=n;i>0;i--)
    00A9 01AB      MOVW	R20,R22
    00AA C003      RJMP	0x00AE
(0064)  delay_1ms();
    00AB DFBA      RCALL	_delay_1ms
    00AC 5041      SUBI	R20,1
    00AD 4050      SBCI	R21,0
    00AE 3040      CPI	R20,0
    00AF 0745      CPC	R20,R21
    00B0 F7D1      BNE	0x00AB
    00B1 940E033D  CALL	pop_gset2
    00B3 9508      RET
_delay_s:
  j                    --> R20
  i                    --> R22
  n                    --> R22
    00B4 940E034C  CALL	push_gset2
    00B6 01B8      MOVW	R22,R16
(0065) }
(0066) 
(0067) /***********************
(0068) **秒级延时,太浪费资源,不建议使用
(0069) ************************/
(0070) void delay_s(unsigned int n)
(0071) {
(0072)  unsigned int i,j;
(0073)  for(j=n;j>0;j--)
    00B7 01AB      MOVW	R20,R22
    00B8 C026      RJMP	0x00DF
(0074)   {
(0075)    for(i=250;i>0;i--)   //250ms*4=1000ms
    00B9 EF6A      LDI	R22,0xFA
    00BA E070      LDI	R23,0
    00BB C003      RJMP	0x00BF
(0076)    delay_1ms();
    00BC DFA9      RCALL	_delay_1ms
    00BD 5061      SUBI	R22,1
    00BE 4070      SBCI	R23,0
    00BF 3060      CPI	R22,0
    00C0 0767      CPC	R22,R23
    00C1 F7D1      BNE	0x00BC
(0077)    for(i=250;i>0;i--)
    00C2 EF6A      LDI	R22,0xFA
    00C3 E070      LDI	R23,0
    00C4 C003      RJMP	0x00C8
(0078)    delay_1ms();
    00C5 DFA0      RCALL	_delay_1ms
    00C6 5061      SUBI	R22,1
    00C7 4070      SBCI	R23,0
    00C8 3060      CPI	R22,0
    00C9 0767      CPC	R22,R23
    00CA F7D1      BNE	0x00C5
(0079)    for(i=250;i>0;i--)
    00CB EF6A      LDI	R22,0xFA
    00CC E070      LDI	R23,0
    00CD C003      RJMP	0x00D1
(0080)    delay_1ms();
    00CE DF97      RCALL	_delay_1ms
    00CF 5061      SUBI	R22,1
    00D0 4070      SBCI	R23,0
    00D1 3060      CPI	R22,0
    00D2 0767      CPC	R22,R23
    00D3 F7D1      BNE	0x00CE
(0081)    for(i=250;i>0;i--)
    00D4 EF6A      LDI	R22,0xFA
    00D5 E070      LDI	R23,0
    00D6 C003      RJMP	0x00DA
(0082)    delay_1ms();
    00D7 DF8E      RCALL	_delay_1ms
    00D8 5061      SUBI	R22,1
    00D9 4070      SBCI	R23,0
    00DA 3060      CPI	R22,0
    00DB 0767      CPC	R22,R23
    00DC F7D1      BNE	0x00D7
    00DD 5041      SUBI	R20,1
    00DE 4050      SBCI	R21,0
    00DF 3040      CPI	R20,0
    00E0 0745      CPC	R20,R21
    00E1 F6B9      BNE	0x00B9
    00E2 940E033D  CALL	pop_gset2
    00E4 9508      RET
FILE: C:\DOCUME~1\administrator\桌面\教程\18B20\main.c
(0001) // ICC-AVR application builder : 2007-2-14 21:34:00
(0002) // Target : M16
(0003) // Crystal: 7.3728Mhz
(0004) // 18B20 演示程序
(0005) 
(0006) #include "config.h"
(0007) 
(0008) extern unsigned char count;
(0009) 
(0010) void port_init(void)
(0011) {
(0012)  PORTA = 0x00;
_port_init:
    00E5 2422      CLR	R2
    00E6 BA2B      OUT	0x1B,R2
(0013)  DDRA  = 0x00;
    00E7 BA2A      OUT	0x1A,R2
(0014)  PORTB = 0x00;
    00E8 BA28      OUT	0x18,R2
(0015)  DDRB  = 0x00;
    00E9 BA27      OUT	0x17,R2
(0016)  PORTC = 0x00; //m103 output only
    00EA BA25      OUT	0x15,R2
(0017)  DDRC  = 0x00;
    00EB BA24      OUT	0x14,R2
(0018)  PORTD = 0x00;
    00EC BA22      OUT	0x12,R2
(0019)  DDRD  = 0x00;
    00ED BA21      OUT	0x11,R2
    00EE 9508      RET
(0020) }
(0021) 
(0022) //call this routine to initialize all peripherals
(0023) void init_devices(void)
(0024) {
(0025)  //stop errant interrupts until set up
(0026)  CLI(); //disable all interrupts
_init_devices:
    00EF 94F8      BCLR	7
(0027)  port_init();
    00F0 DFF4      RCALL	_port_init
(0028) 
(0029)  MCUCR = 0x00;
    00F1 2422      CLR	R2
    00F2 BE25      OUT	0x35,R2
(0030)  GICR  = 0x00;
    00F3 BE2B      OUT	0x3B,R2
(0031)  TIMSK = 0x00; //timer interrupt sources
    00F4 BE29      OUT	0x39,R2
(0032)  SEI(); //re-enable interrupts
    00F5 9478      BSET	7
    00F6 9508      RET
(0033)  //all peripherals are now initialized
(0034) }
(0035) 
(0036) void main(void)
(0037) {
(0038)  unsigned int temp1;
(0039)  init_devices();
_main:
  temp1                --> Y+1
    00F7 DFF7      RCALL	_init_devices
    00F8 C008      RJMP	0x0101
(0040)  while(1)
(0041)  {
(0042)  gettemp();
    00F9 940E015A  CALL	_gettemp
(0043)  display(count,0); //补零模式显示温度
    00FB 2722      CLR	R18
    00FC 91000060  LDS	R16,count
    00FE 2711      CLR	R17
    00FF 940E0274  CALL	_display
    0101 CFF7      RJMP	0x00F9
    0102 9508      RET
FILE: C:\DOCUME~1\administrator\桌面\教程\18B20\18b20.c
(0001) /**************************************
(0002) ** Filename: 18b20.c
(0003) ** Describe: 18b20 温度传感器
(0004) ** Author : 古欣 www.avrvi.com
(0005) ** Time  :   2007-2-15
(0006) **************************************/
(0007) 
(0008) #include "config.h"
(0009) 
(0010) unsigned char wmh,wml,flag,count; //flag温度为负标志,count为实际温度
(0011) void init_1820(void)  
(0012) {  
(0013)     SET_DIR_1WIRE;      //设置PC2 为输出 
_init_1820:
    0103 9ABC      SBI	0x17,4
(0014)     SET_OP_1WIRE;   
    0104 9AC4      SBI	0x18,4
(0015)     CLR_OP_1WIRE;  
    0105 98C4      CBI	0x18,4
(0016)     delay_us(480);    //480us以上  
    0106 EE00      LDI	R16,0xE0
    0107 E011      LDI	R17,1
    0108 940E0098  CALL	_delay_us
(0017)     SET_OP_1WIRE;  
    010A 9AC4      SBI	0x18,4
(0018)     CLR_DIR_1WIRE;  
    010B 98BC      CBI	0x17,4
(0019)     delay_us(20);     //15~60us  
    010C E104      LDI	R16,0x14
    010D E010      LDI	R17,0
    010E 940E0098  CALL	_delay_us
(0020)     while(CHECK_IP_1WIRE);  
    0110 99B4      SBIC	0x16,4
    0111 CFFE      RJMP	0x0110
(0021)     SET_DIR_1WIRE;  
    0112 9ABC      SBI	0x17,4
(0022)     SET_OP_1WIRE;  
    0113 9AC4      SBI	0x18,4
(0023)     delay_us(140);   //60~240us  
    0114 E80C      LDI	R16,0x8C
    0115 E010      LDI	R17,0
    0116 940E0098  CALL	_delay_us
    0118 9508      RET
_write_1820:
  m                    --> R20
  x                    --> R22
    0119 940E034C  CALL	push_gset2
    011B 2F60      MOV	R22,R16
(0024) }  
(0025) void write_1820(unsigned char x)  
(0026) {     
(0027)      unsigned char m;  
(0028)     for(m=0;m<8;m++)  
    011C 2744      CLR	R20
    011D C011      RJMP	0x012F
(0029)     {  
(0030)        CLR_OP_1WIRE;  
    011E 98C4      CBI	0x18,4
(0031)        if(x&(1<<m))    //写数据了,先写低位的! 
    011F E001      LDI	R16,1
    0120 2F14      MOV	R17,R20
    0121 940E0382  CALL	lsl8
    0123 2E26      MOV	R2,R22
    0124 2220      AND	R2,R16
    0125 F011      BEQ	0x0128
(0032)        SET_OP_1WIRE;  
    0126 9AC4      SBI	0x18,4
    0127 C001      RJMP	0x0129
(0033)        else  
(0034)        {CLR_OP_1WIRE;}  
    0128 98C4      CBI	0x18,4
(0035)        delay_us(40);   //15~60us  
    0129 E208      LDI	R16,0x28
    012A E010      LDI	R17,0
    012B 940E0098  CALL	_delay_us
(0036)        SET_OP_1WIRE;  
    012D 9AC4      SBI	0x18,4
    012E 9543      INC	R20
    012F 3048      CPI	R20,0x8
    0130 F368      BCS	0x011E
(0037)     }  
(0038)      SET_OP_1WIRE;  
    0131 9AC4      SBI	0x18,4
    0132 940E033D  CALL	pop_gset2
    0134 9508      RET
_read_1820:
  temp                 --> R20
  k                    --> R22
  n                    --> R10
    0135 940E034A  CALL	push_gset3
(0039) }  
(0040) unsigned char read_1820(void)  
(0041) {      
(0042)     unsigned char temp,k,n;  
(0043)     temp=0;  
    0137 2744      CLR	R20
(0044)     for(n=0;n<8;n++)  
    0138 24AA      CLR	R10
    0139 C019      RJMP	0x0153
(0045)     {
(0046)       CLR_OP_1WIRE;  
    013A 98C4      CBI	0x18,4
(0047)       SET_OP_1WIRE;  
    013B 9AC4      SBI	0x18,4
(0048)       CLR_DIR_1WIRE;  
    013C 98BC      CBI	0x17,4
(0049)       k=(CHECK_IP_1WIRE);    //读数据,从低位开始  

⌨️ 快捷键说明

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