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

📄 18b20.lst

📁 一个不错的DS1820的程序
💻 LST
📖 第 1 页 / 共 3 页
字号:
__start:
__text_start:
      3C E5CF      LDI	R28,0x5F
      3D E0D4      LDI	R29,4
      3E BFCD      OUT	0x3D,R28
      3F BFDE      OUT	0x3E,R29
      40 51C0      SUBI	R28,0x10
      41 40D0      SBCI	R29,0
      42 EA0A      LDI	R16,0xAA
      43 8308      STD	Y+0,R16
      44 2400      CLR	R0
      45 E8E0      LDI	R30,0x80
      46 E0F0      LDI	R31,0
      47 E010      LDI	R17,0
      48 38E4      CPI	R30,0x84
      49 07F1      CPC	R31,R17
      4A F011      BEQ	0x004D
      4B 9201      ST	R0,Z+
      4C CFFB      RJMP	0x0048
      4D 8300      STD	Z+0,R16
      4E E5E8      LDI	R30,0x58
      4F E0F0      LDI	R31,0
      50 E6A0      LDI	R26,0x60
      51 E0B0      LDI	R27,0
      52 E010      LDI	R17,0
      53 E000      LDI	R16,0
      54 BF0B      OUT	0x3B,R16
      55 37E8      CPI	R30,0x78
      56 07F1      CPC	R31,R17
      57 F021      BEQ	0x005C
      58 95C8      LPM
      59 9631      ADIW	R30,1
      5A 920D      ST	R0,X+
      5B CFF9      RJMP	0x0055
      5C 940E 00EF CALL	_main
_exit:
      5E CFFF      RJMP	_exit
FILE: F:\单片机资料\AVR单片机\制作ds18b20\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:
      5F 0000      NOP
      60 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
      61 E706      LDI	R16,0x76
      62 E014      LDI	R17,4
      63 C002      RJMP	0x0066
      64 5001      SUBI	R16,1
      65 4010      SBCI	R17,0
      66 3000      CPI	R16,0
      67 0701      CPC	R16,R17
      68 F7D9      BNE	0x0064
      69 9508      RET
_delay_1s:
  i                    --> R20
      6A 934A      ST	R20,-Y
      6B 935A      ST	R21,-Y
(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
      6C EF4A      LDI	R20,0xFA
      6D E050      LDI	R21,0
      6E C003      RJMP	0x0072
(0038)    delay_1ms();
      6F DFF1      RCALL	_delay_1ms
      70 5041      SUBI	R20,1
      71 4050      SBCI	R21,0
      72 3040      CPI	R20,0
      73 0745      CPC	R20,R21
      74 F7D1      BNE	0x006F
(0039)    for(i=250;i>0;i--)
      75 EF4A      LDI	R20,0xFA
      76 E050      LDI	R21,0
      77 C003      RJMP	0x007B
(0040)    delay_1ms();
      78 DFE8      RCALL	_delay_1ms
      79 5041      SUBI	R20,1
      7A 4050      SBCI	R21,0
      7B 3040      CPI	R20,0
      7C 0745      CPC	R20,R21
      7D F7D1      BNE	0x0078
(0041)    for(i=250;i>0;i--)
      7E EF4A      LDI	R20,0xFA
      7F E050      LDI	R21,0
      80 C003      RJMP	0x0084
(0042)    delay_1ms();
      81 DFDF      RCALL	_delay_1ms
      82 5041      SUBI	R20,1
      83 4050      SBCI	R21,0
      84 3040      CPI	R20,0
      85 0745      CPC	R20,R21
      86 F7D1      BNE	0x0081
(0043)    for(i=250;i>0;i--)
      87 EF4A      LDI	R20,0xFA
      88 E050      LDI	R21,0
      89 C003      RJMP	0x008D
(0044)    delay_1ms();
      8A DFD6      RCALL	_delay_1ms
      8B 5041      SUBI	R20,1
      8C 4050      SBCI	R21,0
      8D 3040      CPI	R20,0
      8E 0745      CPC	R20,R21
      8F F7D1      BNE	0x008A
      90 9159      LD	R21,Y+
      91 9149      LD	R20,Y+
      92 9508      RET
_delay_us:
  i                    --> R20
  n                    --> R10
      93 940E 02B2 CALL	push_xgset300C
      95 0158      MOVW	R10,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--)
      96 01A5      MOVW	R20,R10
      97 C003      RJMP	0x009B
(0054)  delay_1us();
      98 DFC6      RCALL	_delay_1us
      99 5041      SUBI	R20,1
      9A 4050      SBCI	R21,0
      9B 3040      CPI	R20,0
      9C 0745      CPC	R20,R21
      9D F7D1      BNE	0x0098
      9E 940C 02B7 JMP	pop_xgset300C
_delay_ms:
  i                    --> R20
  n                    --> R10
      A0 940E 02B2 CALL	push_xgset300C
      A2 0158      MOVW	R10,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--)
      A3 01A5      MOVW	R20,R10
      A4 C003      RJMP	0x00A8
(0064)  delay_1ms();
      A5 DFBB      RCALL	_delay_1ms
      A6 5041      SUBI	R20,1
      A7 4050      SBCI	R21,0
      A8 3040      CPI	R20,0
      A9 0745      CPC	R20,R21
      AA F7D1      BNE	0x00A5
      AB 940C 02B7 JMP	pop_xgset300C
_delay_s:
  j                    --> R20
  i                    --> R22
  n                    --> R10
      AD 940E 02BC CALL	push_xgsetF00C
      AF 0158      MOVW	R10,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--)
      B0 01A5      MOVW	R20,R10
      B1 C026      RJMP	0x00D8
(0074)   {
(0075)    for(i=250;i>0;i--)   //250ms*4=1000ms
      B2 EF6A      LDI	R22,0xFA
      B3 E070      LDI	R23,0
      B4 C003      RJMP	0x00B8
(0076)    delay_1ms();
      B5 DFAB      RCALL	_delay_1ms
      B6 5061      SUBI	R22,1
      B7 4070      SBCI	R23,0
      B8 3060      CPI	R22,0
      B9 0767      CPC	R22,R23
      BA F7D1      BNE	0x00B5
(0077)    for(i=250;i>0;i--)
      BB EF6A      LDI	R22,0xFA
      BC E070      LDI	R23,0
      BD C003      RJMP	0x00C1
(0078)    delay_1ms();
      BE DFA2      RCALL	_delay_1ms
      BF 5061      SUBI	R22,1
      C0 4070      SBCI	R23,0
      C1 3060      CPI	R22,0
      C2 0767      CPC	R22,R23
      C3 F7D1      BNE	0x00BE
(0079)    for(i=250;i>0;i--)
      C4 EF6A      LDI	R22,0xFA
      C5 E070      LDI	R23,0
      C6 C003      RJMP	0x00CA
(0080)    delay_1ms();
      C7 DF99      RCALL	_delay_1ms
      C8 5061      SUBI	R22,1
      C9 4070      SBCI	R23,0
      CA 3060      CPI	R22,0
      CB 0767      CPC	R22,R23
      CC F7D1      BNE	0x00C7
(0081)    for(i=250;i>0;i--)
      CD EF6A      LDI	R22,0xFA
      CE E070      LDI	R23,0
      CF C003      RJMP	0x00D3
(0082)    delay_1ms();
      D0 DF90      RCALL	_delay_1ms
      D1 5061      SUBI	R22,1
      D2 4070      SBCI	R23,0
      D3 3060      CPI	R22,0
      D4 0767      CPC	R22,R23
      D5 F7D1      BNE	0x00D0
      D6 5041      SUBI	R20,1
      D7 4050      SBCI	R21,0
      D8 3040      CPI	R20,0
      D9 0745      CPC	R20,R21
      DA F6B9      BNE	0x00B2
      DB 940C 02C3 JMP	pop_xgsetF00C
FILE: F:\单片机资料\AVR单片机\制作ds18b20\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:
      DD 2422      CLR	R2
      DE BA2B      OUT	0x1B,R2
(0013)  DDRA  = 0x00;
      DF BA2A      OUT	0x1A,R2
(0014)  PORTB = 0x00;
      E0 BA28      OUT	0x18,R2
(0015)  DDRB  = 0x00;
      E1 BA27      OUT	0x17,R2
(0016)  PORTC = 0x00; //m103 output only
      E2 BA25      OUT	0x15,R2
(0017)  DDRC  = 0x00;
      E3 BA24      OUT	0x14,R2
(0018)  PORTD = 0x00;
      E4 BA22      OUT	0x12,R2
(0019)  DDRD  = 0x00;
      E5 BA21      OUT	0x11,R2
      E6 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:
      E7 94F8      BCLR	7
(0027)  port_init();
      E8 DFF4      RCALL	_port_init
(0028) 
(0029)  MCUCR = 0x00;
      E9 2422      CLR	R2
      EA BE25      OUT	0x35,R2
(0030)  GICR  = 0x00;
      EB BE2B      OUT	0x3B,R2
(0031)  TIMSK = 0x00; //timer interrupt sources
      EC BE29      OUT	0x39,R2
(0032)  SEI(); //re-enable interrupts
      ED 9478      BSET	7
      EE 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
      EF DFF7      RCALL	_init_devices
      F0 C008      RJMP	0x00F9
(0040)  while(1)
(0041)  {
(0042)  gettemp();
      F1 940E 014F CALL	_gettemp
(0043)  display(count,0); //补零模式显示温度
      F3 2722      CLR	R18
      F4 9100 0080 LDS	R16,count
      F6 2711      CLR	R17
      F7 940E 01F2 CALL	_display
      F9 CFF7      RJMP	0x00F1
      FA 9508      RET
FILE: F:\单片机资料\AVR单片机\制作ds18b20\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:
      FB 9ABC      SBI	0x17,4
(0014)     SET_OP_1WIRE;   
      FC 9AC4      SBI	0x18,4
(0015)     CLR_OP_1WIRE;  
      FD 98C4      CBI	0x18,4
(0016)     delay_us(480);    //480us以上  
      FE EE00      LDI	R16,0xE0
      FF E011      LDI	R17,1
     100 940E 0093 CALL	_delay_us
(0017)     SET_OP_1WIRE;  
     102 9AC4      SBI	0x18,4
(0018)     CLR_DIR_1WIRE;  
     103 98BC      CBI	0x17,4
(0019)     delay_us(20);     //15~60us  
     104 E104      LDI	R16,0x14
     105 E010      LDI	R17,0
     106 940E 0093 CALL	_delay_us
(0020)     while(CHECK_IP_1WIRE);  
     108 99B4      SBIC	0x16,4
     109 CFFE      RJMP	0x0108
(0021)     SET_DIR_1WIRE;  
     10A 9ABC      SBI	0x17,4
(0022)     SET_OP_1WIRE;  
     10B 9AC4      SBI	0x18,4
(0023)     delay_us(140);   //60~240us  
     10C E80C      LDI	R16,0x8C
     10D E010      LDI	R17,0
     10E 940C 0093 JMP	_delay_us
_write_1820:
  m                    --> R20
  x                    --> R10
     110 92AA      ST	R10,-Y
     111 934A      ST	R20,-Y
     112 2EA0      MOV	R10,R16
(0024) }  
(0025) void write_1820(unsigned char x)  
(0026) {     
(0027)      unsigned char m;  
(0028)     for(m=0;m<8;m++)  
     113 2744      CLR	R20
     114 C011      RJMP	0x0126
(0029)     {  
(0030)        CLR_OP_1WIRE;  
     115 98C4      CBI	0x18,4
(0031)        if(x&(1<<m))    //写数据了,先写低位的! 
     116 E001      LDI	R16,1
     117 2F14      MOV	R17,R20
     118 940E 0307 CALL	lsl8
     11A 2C2A      MOV	R2,R10
     11B 2220      AND	R2,R16
     11C F011      BEQ	0x011F
(0032)        SET_OP_1WIRE;  
     11D 9AC4      SBI	0x18,4
     11E C001      RJMP	0x0120
(0033)        else  
(0034)        {CLR_OP_1WIRE;}  
     11F 98C4      CBI	0x18,4
(0035)        delay_us(40);   //15~60us  
     120 E208      LDI	R16,0x28
     121 E010      LDI	R17,0
     122 940E 0093 CALL	_delay_us
(0036)        SET_OP_1WIRE;  
     124 9AC4      SBI	0x18,4
     125 9543      INC	R20
     126 3048      CPI	R20,0x8
     127 F368      BCS	0x0115
(0037)     }  
(0038)      SET_OP_1WIRE;  
     128 9AC4      SBI	0x18,4
     129 9149      LD	R20,Y+
     12A 90A9      LD	R10,Y+
     12B 9508      RET
_read_1820:
  temp                 --> R10
  k                    --> R22
  n                    --> R20
     12C 940E 02BC CALL	push_xgsetF00C
(0039) }  
(0040) unsigned char read_1820(void)  
(0041) {      
(0042)     unsigned char temp,k,n;  
(0043)     temp=0;  
     12E 24AA      CLR	R10
(0044)     for(n=0;n<8;n++)  
     12F 2744      CLR	R20
     130 C019      RJMP	0x014A
(0045)     {
(0046)       CLR_OP_1WIRE;  
     131 98C4      CBI	0x18,4
(0047)       SET_OP_1WIRE;  
     132 9AC4      SBI	0x18,4
(0048)       CLR_DIR_1WIRE;  
     133 98BC      CBI	0x17,4
(0049)       k=(CHECK_IP_1WIRE);    //读数据,从低位开始  
     134 B366      IN	R22,0x16
     135 7160      ANDI	R22,0x10
(0050)       if(k)  
     136 F031      BEQ	0x013D
(0051)       temp|=(1<<n);  
     137 E001      LDI	R16,1
     138 2F14      MOV	R17,R20
     139 940E 0307 CALL	lsl8
     13B 2AA0      OR	R10,R16
     13C C007      RJMP	0x0144
(0052)       else  
(0053)       temp&=~(1<<n);  
     13D E001      LDI	R16,1
     13E 2F14      MOV	R17,R20
     13F 940E 0307 CALL	lsl8
     141 2E20      MOV	R2,R16
     142 9420      COM	R2
     143 20A2      AND	R10,R2
(0054)       delay_us(50); //60~120us      
     144 E302      LDI	R16,0x32
     145 E010      LDI	R17,0
     146 940E 0093 CALL	_delay_us
(0055)       SET_DIR_1WIRE;  
     148 9ABC      SBI	0x17,4
     149 9543      INC	R20
     14A 3048      CPI	R20,0x8
     14B F328      BCS	0x0131
(0056)     }  
(0057)    return (temp);  
     14C 2D0A      MOV	R16,R10
     14D 940C 02C3 JMP	pop_xgsetF00C
_gettemp:
  wm3                  --> R12
  wm1                  --> R10
  wm0                  --> R20
  teml                 --> R12
  wm2                  --> R10
  temh                 --> R22
     14F 940E 02D8 CALL	push_xgsetF03C
(0058) }   
(0059) 
(0060) void gettemp(void)         //读取温度值 
(0061) {  
(0062)      unsigned char temh,teml,wm0,wm1,wm2,wm3;  
(0063)      init_1820();        //复位18b20  
     151 DFA9      RCALL	_init_1820
(0064)      write_1820(0xcc);   // 发出转换命令  
     152 EC0C      LDI	R16,0xCC
     153 DFBC      RCALL	_write_1820
(0065)      write_1820(0x44); 
     154 E404      LDI	R16,0x44
     155 DFBA      RCALL	_write_1820
(0066)  //  delay_nms(800);     //不延时也好使,不知道怎么回事! 
(0067)      init_1820();  
     156 DFA4      RCALL	_init_1820
(0068)      write_1820(0xcc);  //发出读命令  

⌨️ 快捷键说明

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