📄 电池放电器v2.lst
字号:
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 + -