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

📄 jdbh.lst

📁 AVR单片机系统开发经典实例部分源程序
💻 LST
📖 第 1 页 / 共 2 页
字号:
__start:
__text_start:
    0046 EFCF      LDI	R28,0xFF
    0047 E1D0      LDI	R29,0x10
    0048 BFCD      OUT	0x3D,R28
    0049 BFDE      OUT	0x3E,R29
    004A 51C0      SUBI	R28,0x10
    004B 40D0      SBCI	R29,0
    004C EA0A      LDI	R16,0xAA
    004D 8308      STD	Y+0,R16
    004E 2400      CLR	R0
    004F E0E0      LDI	R30,0
    0050 E0F1      LDI	R31,1
    0051 E011      LDI	R17,1
    0052 32EA      CPI	R30,0x2A
    0053 07F1      CPC	R31,R17
    0054 F011      BEQ	0x0057
    0055 9201      ST	R0,Z+
    0056 CFFB      RJMP	0x0052
    0057 8300      STD	Z+0,R16
    0058 E8EC      LDI	R30,0x8C
    0059 E0F0      LDI	R31,0
    005A E0A0      LDI	R26,0
    005B E0B1      LDI	R27,1
    005C E010      LDI	R17,0
    005D 38EC      CPI	R30,0x8C
    005E 07F1      CPC	R31,R17
    005F F021      BEQ	0x0064
    0060 95C8      LPM
    0061 9631      ADIW	R30,1
    0062 920D      ST	R0,X+
    0063 CFF9      RJMP	0x005D
    0064 940E0195  CALL	_main
_exit:
    0066 CFFF      RJMP	_exit
_SIGNALA:
  temp_data            --> R20
  i                    --> R20
  SIG_UART0_RECV       --> R16
    0067 940E01C4  CALL	push_gset1
FILE: C:\AVR\AD\main.c
(0001) #include <iom128v.h>
(0002) #include <stdlib.h>
(0003) 
(0004) //全局变量////////////////////////////
(0005) 
(0006) unsigned int  global_flag_serie;//通信状态标志
(0007) unsigned int  global_ad_counter;//AD转换计数器
(0008) unsigned int  global_start_sample_flag;//采样开始标志
(0009) unsigned int  global_sample_mode_flag;//采样方式标志:手动或自动
(0010) unsigned int  global_operation_detected_flag;//检测到动作标志
(0011) unsigned int  global_detect_close[5];//用于检测合闸动作开始
(0012) unsigned int  global_detect_trip[5];//用于检测分闸动作开始
(0013) unsigned int  global_channel_flag;//通道标志
(0014) unsigned int  global_close_counter;//合闸线圈地址计数器
(0015) unsigned int  global_trip_counter;//分闸线圈地址计数器
(0016) unsigned int  global_motor_counter;//打压电机地址计数器
(0017) unsigned int  global_voltage_counter;//操作电压地址计数器
(0018) unsigned int  global_ad_finish_flag;//AD转换结束标志
(0019) 
(0020) //串口接收中断////////////////////////
(0021) SIGNALA(SIG_UART0_RECV)
(0022) {
(0023) //变量定义
(0024) 	unsigned int temp_data;
(0025) 	unsigned int i;
(0026) //关全局中断
(0027)  //   cli();
(0028) //等待接收到数据标志被置位
(0029) 	//loop_until_bit_is_set(UCSR0A,RXC0);
(0030) //对接收到的字节进行判断
(0031) 	temp_data=UDR0;//读取接收的字节
    0069 B14C      IN	R20,0x0C
    006A 2755      CLR	R21
(0032) 	if(temp_data!=0)//如果接收到非零
    006B 3040      CPI	R20,0
    006C 0745      CPC	R20,R21
    006D F409      BNE	0x006F
    006E C04E      RJMP	0x00BD
(0033) 	{
(0034) 		if(global_flag_serie==0)//如果接收到的为第一字节
    006F 90200128  LDS	R2,global_flag_serie
    0071 90300129  LDS	R3,global_flag_serie+1
    0073 2022      TST	R2
    0074 F559      BNE	0x00A0
    0075 2033      TST	R3
    0076 F549      BNE	0x00A0
(0035) 		{
(0036) 			switch (temp_data)
    0077 3140      CPI	R20,0x10
    0078 E0E0      LDI	R30,0
    0079 075E      CPC	R21,R30
    007A F0B9      BEQ	0x0092
    007B E180      LDI	R24,0x10
    007C E090      LDI	R25,0
    007D 1784      CP	R24,R20
    007E 0795      CPC	R25,R21
    007F F02C      BLT	0x0085
    0080 3042      CPI	R20,2
    0081 E0E0      LDI	R30,0
    0082 075E      CPC	R21,R30
    0083 F031      BEQ	0x008A
    0084 C038      RJMP	0x00BD
    0085 3242      CPI	R20,0x22
    0086 E0E0      LDI	R30,0
    0087 075E      CPC	R21,R30
    0088 F081      BEQ	0x0099
    0089 C033      RJMP	0x00BD
(0037) 			{
(0038) 				case 2://接到本机地址
(0039) 					global_flag_serie=1;//准备接收第二字节数据
    008A E081      LDI	R24,1
    008B E090      LDI	R25,0
    008C 93900129  STS	global_flag_serie+1,R25
    008E 93800128  STS	global_flag_serie,R24
(0040) 					UCSR0A&=~(1<<MPCM0);//清零MPCM0,允许继续接收数据包
    0090 9858      CBI	0x0B,0
(0041) 					break;
    0091 C02B      RJMP	0x00BD
(0042) 			//	case 0://接到复位命令
(0043) 			//		global_start_sample_flag=0xff;//复位开始
(0044) 			//		break;
(0045) 				case 0x10://接到采集命令
(0046) 					global_start_sample_flag=0;//开始采集数据
    0092 2422      CLR	R2
    0093 2433      CLR	R3
    0094 92300125  STS	global_start_sample_flag+1,R3
    0096 92200124  STS	global_start_sample_flag,R2
(0047) 				//	sbi(PORTG,3);//测试用///////////////
(0048) 					break;
    0098 C024      RJMP	0x00BD
(0049) 			//	case 17://接到采集结束命令
(0050) 				//	global_start_sample_flag=0xff;//结束采集数据
(0051) 			//		break;
(0052) 				case 0x22://接收到自动测试信号
(0053) 					global_sample_mode_flag=0;
    0099 2422      CLR	R2
    009A 2433      CLR	R3
    009B 92300123  STS	global_sample_mode_flag+1,R3
    009D 92200122  STS	global_sample_mode_flag,R2
(0054) 					break;
(0055) 				default:
(0056) 					break;
(0057) 			}
(0058) 		}
    009F C01D      RJMP	0x00BD
(0059) 		else if((global_flag_serie==1)&&(temp_data<=32))//如果接收的是第二字节
    00A0 91800128  LDS	R24,global_flag_serie
    00A2 91900129  LDS	R25,global_flag_serie+1
    00A4 3081      CPI	R24,1
    00A5 E0E0      LDI	R30,0
    00A6 079E      CPC	R25,R30
    00A7 F4A9      BNE	0x00BD
    00A8 E280      LDI	R24,0x20
    00A9 E090      LDI	R25,0
    00AA 1784      CP	R24,R20
    00AB 0795      CPC	R25,R21
    00AC F080      BCS	0x00BD
(0060) 		{
(0061) 			for(i=0;i<0xfff;i++){;}//延时等待
    00AD 2744      CLR	R20
    00AE 2755      CLR	R21
    00AF C002      RJMP	0x00B2
    00B0 5F4F      SUBI	R20,0xFF
    00B1 4F5F      SBCI	R21,0xFF
    00B2 3F4F      CPI	R20,0xFF
    00B3 E0EF      LDI	R30,0xF
    00B4 075E      CPC	R21,R30
    00B5 F3D0      BCS	0x00B0
(0062) 		//	SEND_ONE_PACKAGE(temp_data);//发送数据包,temp_data为包序号
(0063) 		//	if(temp_data==17){sbi(PORTG,3);}//测试用////////////
(0064) 			global_flag_serie=0;
    00B6 2422      CLR	R2
    00B7 2433      CLR	R3
    00B8 92300129  STS	global_flag_serie+1,R3
    00BA 92200128  STS	global_flag_serie,R2
(0065) 			UCSR0A|=(1<<MPCM0);//准备接收地址
    00BC 9A58      SBI	0x0B,0
(0066) 		}
(0067)     }
    00BD 940E01C7  CALL	pop_gset1
    00BF 9508      RET
_SIGNAL:
  i                    --> Y+1
  temp2                --> R22
  temp1                --> R22
  int16_temp1          --> R20
  SIG_INTERRUPT7       --> R16
    00C0 940E01C2  CALL	push_gset2
(0068) 	//cbi(PORTE,2);//改为接收状态
(0069) 	//sei();
(0070) }
(0071) 
(0072) //AD转换结束中断int7//////////////////
(0073) SIGNAL(SIG_INTERRUPT7)
(0074) {
(0075) //变量定义
(0076) 	unsigned int int16_temp1;
(0077) 	unsigned int temp1,temp2,i;
(0078) //关中断
(0079) 	//cli();
(0080) //读取ad转换结果
(0081) 	//int16_temp1=AD7891_READ();
(0082) //如果是需要保存到RAM的采样
(0083) 	if(global_sample_mode_flag==0xFF)
    00C2 91800122  LDS	R24,global_sample_mode_flag
    00C4 91900123  LDS	R25,global_sample_mode_flag+1
    00C6 3F8F      CPI	R24,0xFF
    00C7 E0E0      LDI	R30,0
    00C8 079E      CPC	R25,R30
    00C9 F009      BEQ	0x00CB
    00CA C03C      RJMP	0x0107
(0084) 	{
(0085) 	//AD7891 deselect,否则数据总线与RAM冲突
(0086) 		//sbi(PORTD,5);
(0087) 	//AD转换结果存入RAM
(0088) 		temp1=int16_temp1/256;
    00CB 01BA      MOVW	R22,R20
    00CC 2F67      MOV	R22,R23
    00CD 2777      CLR	R23
(0089) 		temp2=int16_temp1%256;
    00CE 01BA      MOVW	R22,R20
    00CF 7070      ANDI	R23,0
(0090) 	//保存数据
(0091) 		switch(global_channel_flag)
    00D0 9180010A  LDS	R24,global_channel_flag
    00D2 9190010B  LDS	R25,global_channel_flag+1
    00D4 3081      CPI	R24,1
    00D5 E0E0      LDI	R30,0
    00D6 079E      CPC	R25,R30
    00D7 F049      BEQ	0x00E1
    00D8 3082      CPI	R24,2
    00D9 E0E0      LDI	R30,0
    00DA 079E      CPC	R25,R30
    00DB F079      BEQ	0x00EB
    00DC 3083      CPI	R24,3
    00DD E0E0      LDI	R30,0
    00DE 079E      CPC	R25,R30
    00DF F0A9      BEQ	0x00F5
    00E0 C01D      RJMP	0x00FE
(0092) 		{
(0093) 			case 1://保存合闸线圈电流
(0094) 				//SRAM_1M_8_WRITE(global_close_counter,temp1);//高位字节
(0095) 				//SRAM_1M_8_WRITE(global_close_counter+1,temp2);//低位字节
(0096) 				global_close_counter+=2;
    00E1 91800108  LDS	R24,global_close_counter
    00E3 91900109  LDS	R25,global_close_counter+1
    00E5 9602      ADIW	R24,2
    00E6 93900109  STS	global_close_counter+1,R25
    00E8 93800108  STS	global_close_counter,R24
(0097) 				break;
    00EA C013      RJMP	0x00FE
(0098) 			case 2://保存分闸线圈电流
(0099) 				//SRAM_1M_8_WRITE(global_trip_counter,temp1);//高位字节
(0100) 				//SRAM_1M_8_WRITE(global_trip_counter+1,temp2);//低位字节
(0101) 				global_trip_counter+=2;
    00EB 91800106  LDS	R24,global_trip_counter
    00ED 91900107  LDS	R25,global_trip_counter+1
    00EF 9602      ADIW	R24,2
    00F0 93900107  STS	global_trip_counter+1,R25
    00F2 93800106  STS	global_trip_counter,R24
(0102) 				break;
    00F4 C009      RJMP	0x00FE
(0103) 			case 3://保存操作电压
(0104) 			//	SRAM_1M_8_WRITE(global_motor_counter,temp1);//高位字节
(0105) 			//	SRAM_1M_8_WRITE(global_motor_counter+1,temp2);//低位字节
(0106) 				//SRAM_1M_8_WRITE(global_voltage_counter,temp1);//高位字节
(0107) 				//SRAM_1M_8_WRITE(global_voltage_counter+1,temp2);//低位字节
(0108) 				global_voltage_counter+=2;
    00F5 91800102  LDS	R24,global_voltage_counter
    00F7 91900103  LDS	R25,global_voltage_counter+1
    00F9 9602      ADIW	R24,2
    00FA 93900103  STS	global_voltage_counter+1,R25
    00FC 93800102  STS	global_voltage_counter,R24
(0109) 			//	global_motor_counter+=2;
(0110) 				break;
(0111) 		//	case 4://保存操作电压
(0112) 			//	SRAM_1M_8_WRITE(global_voltage_counter,temp1);//高位字节
(0113) 			//	SRAM_1M_8_WRITE(global_voltage_counter+1,temp2);//低位字节
(0114) 			//	global_voltage_counter+=2;
(0115) 			//	break;
(0116) 			default:
(0117) 				break;
(0118) 		}
(0119) 	//计数器自加
(0120) 		global_ad_counter++;
    00FE 91800126  LDS	R24,global_ad_counter
    0100 91900127  LDS	R25,global_ad_counter+1
    0102 9601      ADIW	R24,1
    0103 93900127  STS	global_ad_counter+1,R25
    0105 93800126  STS	global_ad_counter,R24
(0121) 	}
(0122) //如果是检测动作是否开始的采样
(0123) 	if(global_sample_mode_flag==0x00)
    0107 90200122  LDS	R2,global_sample_mode_flag
    0109 90300123  LDS	R3,global_sample_mode_flag+1
    010B 2022      TST	R2
    010C F009      BEQ	0x010E
    010D C07E      RJMP	0x018C
    010E 2033      TST	R3
    010F F009      BEQ	0x0111
    0110 C07B      RJMP	0x018C
(0124) 	{

⌨️ 快捷键说明

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