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

📄 电池放电器v2.lst

📁 这是一个电池放电器
💻 LST
📖 第 1 页 / 共 5 页
字号:
    03C9 C006      RJMP	0x03D0
(0019) 		    {
(0020) 			  a+=read_adc(0,1);//外部基准(1.024V),ADC1			 
    03CA E021      LDI	R18,1
    03CB 2700      CLR	R16
    03CC D0B6      RCALL	_read_adc
    03CD 0F60      ADD	R22,R16
    03CE 1F71      ADC	R23,R17
    03CF 94A3      INC	R10
    03D0 2D8A      MOV	R24,R10
    03D1 3081      CPI	R24,1
    03D2 F3B8      BCS	0x03CA
(0021) 			}
(0022) 	  BT_T=(a>>0);
    03D3 01AB      MOVW	R20,R22
(0023) 	  if(BT_T>65530)
    03D4 EF8A      LDI	R24,0xFA
    03D5 EF9F      LDI	R25,0xFF
    03D6 1786      CP	R24,R22
    03D7 0797      CPC	R25,R23
    03D8 F410      BCC	0x03DB
(0024) 	    BT_T=0;
    03D9 2744      CLR	R20
    03DA 2755      CLR	R21
(0025) 		return BT_T;
    03DB 018A      MOVW	R16,R20
    03DC DB52      RCALL	pop_gset3
    03DD 9508      RET
_T_BT1_V:
  BT_V                 --> R20
  a                    --> R22
  i                    --> R10
    03DE DB5A      RCALL	push_gset3
(0026) }
(0027) 
(0028) /*---------------------------------------------
(0029)         电池1电压测量程序
(0030)         最大测量电压:4.096V
(0031) 	    测量64次取平均数
(0032) ----------------------------------------------*/
(0033) unsigned int  T_BT1_V(void)
(0034) {
(0035)  unsigned char i;
(0036)  unsigned int a=0;
    03DF 2766      CLR	R22
    03E0 2777      CLR	R23
(0037)  unsigned int BT_V;//电池1电压
(0038)  i=read_adc(0,0);//第一次转换,不要
    03E1 2722      CLR	R18
    03E2 2700      CLR	R16
    03E3 D09F      RCALL	_read_adc
(0039)      for (i=0;i<16;i++)
    03E4 24AA      CLR	R10
    03E5 C006      RJMP	0x03EC
(0040) 		    {
(0041) 			  a+=read_adc(0,0);//外部基准(1.024V),ADC0			 
    03E6 2722      CLR	R18
    03E7 2700      CLR	R16
    03E8 D09A      RCALL	_read_adc
    03E9 0F60      ADD	R22,R16
    03EA 1F71      ADC	R23,R17
    03EB 94A3      INC	R10
    03EC 2D8A      MOV	R24,R10
    03ED 3180      CPI	R24,0x10
    03EE F3B8      BCS	0x03E6
(0042) 			}
(0043) 	  BT_V=(a>>4)*3;
    03EF 019B      MOVW	R18,R22
    03F0 9536      LSR	R19
    03F1 9527      ROR	R18
    03F2 9536      LSR	R19
    03F3 9527      ROR	R18
    03F4 9536      LSR	R19
    03F5 9527      ROR	R18
    03F6 9536      LSR	R19
    03F7 9527      ROR	R18
    03F8 E003      LDI	R16,3
    03F9 E010      LDI	R17,0
    03FA DB22      RCALL	empy16s
    03FB 01A8      MOVW	R20,R16
(0044) 	  if(BT_V>65530)
    03FC EF8A      LDI	R24,0xFA
    03FD EF9F      LDI	R25,0xFF
    03FE 1780      CP	R24,R16
    03FF 0791      CPC	R25,R17
    0400 F410      BCC	0x0403
(0045) 	    BT_V=0;
    0401 2744      CLR	R20
    0402 2755      CLR	R21
(0046) 		return BT_V;
    0403 018A      MOVW	R16,R20
    0404 DB2A      RCALL	pop_gset3
    0405 9508      RET
_T_BT1_I:
  BT_I                 --> R20
  a                    --> R22
  i                    --> R10
    0406 DB32      RCALL	push_gset3
(0047) } 
(0048) 
(0049) /*---------------------------------------------
(0050)         电池1电流测量程序
(0051)         最大测量电流:2.048A
(0052)         测量64次取平均数
(0053) ----------------------------------------------*/
(0054) unsigned int T_BT1_I(void)
(0055) {
(0056)  unsigned char i;
(0057)  unsigned int a=0;
    0407 2766      CLR	R22
    0408 2777      CLR	R23
(0058)  unsigned int BT_I;//电池1电流
(0059)  i=read_adc(0,3);//第一次转换,不要
    0409 E023      LDI	R18,3
    040A 2700      CLR	R16
    040B D077      RCALL	_read_adc
(0060)      for (i=0;i<16;i++)
    040C 24AA      CLR	R10
    040D C006      RJMP	0x0414
(0061) 		    {
(0062) 			  a+=read_adc(0,3);//外部基准(1.024V),ADC3			 
    040E E023      LDI	R18,3
    040F 2700      CLR	R16
    0410 D072      RCALL	_read_adc
    0411 0F60      ADD	R22,R16
    0412 1F71      ADC	R23,R17
    0413 94A3      INC	R10
    0414 2D8A      MOV	R24,R10
    0415 3180      CPI	R24,0x10
    0416 F3B8      BCS	0x040E
(0063) 			}
(0064) 	  BT_I=(a>>4)*50/49;//衰减1.2倍 1.1*1.1=1.21
    0417 019B      MOVW	R18,R22
    0418 9536      LSR	R19
    0419 9527      ROR	R18
    041A 9536      LSR	R19
    041B 9527      ROR	R18
    041C 9536      LSR	R19
    041D 9527      ROR	R18
    041E 9536      LSR	R19
    041F 9527      ROR	R18
    0420 E302      LDI	R16,0x32
    0421 E010      LDI	R17,0
    0422 DAFA      RCALL	empy16s
    0423 E321      LDI	R18,0x31
    0424 E030      LDI	R19,0
    0425 DA54      RCALL	div16u
    0426 01A8      MOVW	R20,R16
(0065) 	   return BT_I;
    0427 DB07      RCALL	pop_gset3
    0428 9508      RET
_init_devices:
    0429 9722      SBIW	R28,2
FILE: E:\刻录的\电子技术\项目\电池放电器\软件V2.0\system_init.c
(0001) #include <iom8v.h> //和单片机类型相对应的头文件,选择Atmega8做实验;
(0002) #include <macros.h>
(0003) #include "discharge.h"
(0004) #include <stdio.h>
(0005) #include "LCD_1602.h"
(0006) 
(0007) void init_devices(void)
(0008) {
(0009)  CLI(); //禁止所有中断
    042A 94F8      BCLR	7
(0010)  MCUCR  = 0x00;
    042B 2422      CLR	R2
    042C BE25      OUT	0x35,R2
(0011)  MCUCSR = 0x80;//禁止JTAG
    042D E880      LDI	R24,0x80
    042E BF84      OUT	0x34,R24
(0012)  GICR   = 0x00;
    042F BE2B      OUT	0x3B,R2
(0013)  port_init(); 
    0430 D013      RCALL	_port_init
(0014)  usart_init();
    0431 D01B      RCALL	_usart_init
(0015)  timer1_init(10,10,4000);//PWM上限 4000
    0432 EA80      LDI	R24,0xA0
    0433 E09F      LDI	R25,0xF
    0434 8399      STD	Y+1,R25
    0435 8388      STD	Y+0,R24
    0436 E02A      LDI	R18,0xA
    0437 E030      LDI	R19,0
    0438 E00A      LDI	R16,0xA
    0439 E010      LDI	R17,0
    043A D02A      RCALL	_timer1_init
(0016)  timer2_init();
    043B D01C      RCALL	_timer2_init
(0017)  AD_init(); 
    043C D03D      RCALL	_AD_init
(0018)  LCD_init();
    043D DC86      RCALL	_LCD_init
(0019)  delay_nms(10);
    043E E00A      LDI	R16,0xA
    043F E010      LDI	R17,0
    0440 D060      RCALL	_delay_nms
(0020)  SEI();//开全局中断
    0441 9478      BSET	7
    0442 9622      ADIW	R28,2
    0443 9508      RET
(0021) }
(0022) 
(0023) //端口初始化
(0024) void port_init(void)
(0025) {	 
(0026)    DDRB&=~(1<<0)|(1<<3)|(1<<4)|(1<<5);//KEY 输入
_port_init:
    0444 98B8      CBI	0x17,0
(0027)    PORTB|=(1<<0)|(1<<3)|(1<<4)|(1<<5);//KEY 开上拉
    0445 B388      IN	R24,0x18
    0446 6389      ORI	R24,0x39
    0447 BB88      OUT	0x18,R24
(0028)    DDRC|=(1<<4)|(1<<5);//LED_G  LED_R  
    0448 B384      IN	R24,0x14
    0449 6380      ORI	R24,0x30
    044A BB84      OUT	0x14,R24
(0029)    DDRB&=~(1<<1)|(1<<2);//PWMA PWMB 设为输入,即关闭
    044B 98B9      CBI	0x17,1
    044C 9508      RET
(0030) }
(0031) 
(0032) //串口通信初始化//38400kbps 
(0033) void usart_init(void)
(0034) {
(0035)  UCSRB = 0x00;//禁止中断
_usart_init:
    044D 2422      CLR	R2
    044E B82A      OUT	0x0A,R2
(0036)  UCSRA = 0x00;
    044F B82B      OUT	0x0B,R2
(0037)  UCSRC = BIT(URSEL) | 0x06;
    0450 E886      LDI	R24,0x86
    0451 BD80      OUT	0x20,R24
(0038)  UBRRL = 0x0C;
    0452 E08C      LDI	R24,0xC
    0453 B989      OUT	0x09,R24
(0039)  UBRRH = 0x00;
    0454 BC20      OUT	0x20,R2
(0040)  UCSRB = 0x18;
    0455 E188      LDI	R24,0x18
    0456 B98A      OUT	0x0A,R24
    0457 9508      RET
(0041) }
(0042) 
(0043) //定时器T2初始化
(0044) void timer2_init(void)
(0045) {
(0046)  TCCR2  = 0x00;//停止定时器
_timer2_init:
    0458 2422      CLR	R2
    0459 BC25      OUT	0x25,R2
(0047)  ASSR   = 0x00;//异步时钟模式
    045A BC22      OUT	0x22,R2
(0048)  TCNT2  = 0x06;//初始值
    045B E086      LDI	R24,6
    045C BD84      OUT	0x24,R24
(0049)  OCR2   = 0x05;//匹配值
    045D E085      LDI	R24,5
    045E BD83      OUT	0x23,R24
(0050)  TIMSK |= 0x40;//中断允许
    045F B789      IN	R24,0x39
    0460 6480      ORI	R24,0x40
    0461 BF89      OUT	0x39,R24
(0051)  TCCR2  = 0x06;//启动定时器
    0462 E086      LDI	R24,6
    0463 BD85      OUT	0x25,R24
    0464 9508      RET
(0052) }
(0053) 
(0054) //定时T1初始化
(0055) void timer1_init(unsigned int a,unsigned int b,unsigned int top)
(0056) {
(0057)  TCCR1B = 0x00;//停止定时器
_timer1_init:
  top                  --> Y+0
  b                    --> R18
  a                    --> R16
    0465 2422      CLR	R2
    0466 BC2E      OUT	0x2E,R2
(0058)  TIMSK |= 0x00;//中断允许
    0467 B629      IN	R2,0x39
    0468 BE29      OUT	0x39,R2
(0059)  TCNT1H = 0x00;
    0469 2422      CLR	R2
    046A BC2D      OUT	0x2D,R2
(0060)  TCNT1L = 0x00;//初始值
    046B BC2C      OUT	0x2C,R2
(0061)  OCR1A=a;//匹配A值
    046C BD1B      OUT	0x2B,R17
    046D BD0A      OUT	0x2A,R16
(0062)  OCR1B=b;//匹配B值
    046E BD39      OUT	0x29,R19
    046F BD28      OUT	0x28,R18
(0063)  ICR1=top-1;//输入捕捉匹配值
    0470 8188      LDD	R24,Y+0
    0471 8199      LDD	R25,Y+1
    0472 9701      SBIW	R24,1
    0473 BD97      OUT	0x27,R25
    0474 BD86      OUT	0x26,R24
(0064)  TCCR1A = 0x82;
    0475 E882      LDI	R24,0x82
    0476 BD8F      OUT	0x2F,R24
(0065)  TCCR1B = 0x19;//启动定时器 无分频
    0477 E189      LDI	R24,0x19
    0478 BD8E      OUT	0x2E,R24
    0479 9508      RET
(0066) }
(0067) /*
(0068) //定时器T0初始化
(0069) void timer0_init(void)
(0070) {
(0071)  TCCR0  = 0x00;//停止定时器
(0072)  TCNT0  = 0xFF;//初始值
(0073) }
(0074) 
(0075) void timer0_start(void)
(0076) {
(0077)   TCNT0  = 0xFF;//初始值
(0078)   TCCR0  = 0x05;//启动定时器
(0079) }
(0080) 
(0081) void timer0_stop(void)
(0082) {
(0083)   TCCR0  = 0x00;//停止定时器
(0084)   LCD_write_number(9,0,0,TCNT0,"us",0);//
(0085) }
(0086) */
(0087) void AD_init(void)
(0088) {   	
(0089)     ADCSRA=0X00; 
_AD_init:
    047A 2422      CLR	R2
    047B B826      OUT	0x06,R2
(0090) 	ACSR  =(1<<ACD);//关闭模拟比较器   
    047C E880      LDI	R24,0x80
    047D B988      OUT	0x08,R24
(0091)     ADMUX =(1<<REFS0)|(1&0x0F); //
    047E E481      LDI	R24,0x41
    047F B987      OUT	0x07,R24
(0092)     ADCSRA=(1<<ADEN)|(1<<ADSC)|(1<<ADPS2)|(1<<ADPS1);//ADC转换 64分频
    0480 EC86      LDI	R24,0xC6
    0481 B986      OUT	0x06,R24
    0482 9508      RET
_read_adc:
  adc_rel              --> R20
  m                    --> R22
  r                    --> R20
    0483 DAB7      RCALL	push_gset2
    0484 2F62      MOV	R22,R18
    0485 2F40      MOV	R20,R16
(0093) }
(0094) 
(0095) unsigned int read_adc (uchar r,uchar m)
(0096) {
(0097)  unsigned int adc_rel;
(0098)  ADMUX=0;
    0486 2422      CLR	R2
    0487 B827      OUT	0x07,R2
(0099)  ADMUX |=(m&0x0F);//选择通道
    0488 2F86      MOV	R24,R22
    0489 708F      ANDI	R24,0xF
    048A B027      IN	R2,0x07
    048B 2A28      OR	R2,R24
    048C B827      OUT	0x07,R2
(0100)  ADMUX |=(r<<6);//选择基准
    048D 2E24      MOV	R2,R20
    048E 0C22      LSL	R2
    048F 0C22      LSL	R2
    0490 0C22      LSL	R2
    0491 0C22      LSL	R2
    0492 0C22      LSL	R2
    0493 0C22      LSL	R2
    0494 B037      IN	R3,0x07
    0495 2832      OR	R3,R2
    0496 B837      OUT	0x07,R3
(0101)  ADCSRA|=(1<<ADSC);//启动AD转换
    0497 9A36      SBI	0x06,6
(0102)  delay_nus(125);
    0498 E70D      LDI	R16,0x7D
    0499 E010      LDI	R17,0
    049A D015      RCALL	_delay_nus
(0103)  adc_rel=ADC&0x3FF;
    049B B144      IN	R20,0x04
    049C B155      IN	R21,0x05
    049D 7053      ANDI	R21,3
(0104)   return(adc_rel);
    049E 018A      MOVW	R16,R20
    049F DA8D      RCALL	pop_gset2
    04A0 9508      RET
_delay_nms:
  i                    --> R20
  n                    --> R22
    04A1 DA99      RCALL	push_gset2
    04A2 01B8      MOVW	R22,R16
(0105) }
(0106) 
(0107) void delay_nms(unsigned int n)//延时n毫秒
(0108) {
(0109)   unsigned int i;
(0110)   for (i=0;i<n;i++)//执行n次1毫秒延时
    04A3 2744      CLR	R20
    04A4 2755      CLR	R21
    04A5 C005      RJMP	0x04AB

⌨️ 快捷键说明

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