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

📄 7135_finish.lst

📁 ad7135的avr16的源程序
💻 LST
📖 第 1 页 / 共 2 页
字号:
__start:
__text_start:
    002C E5CF      LDI	R28,0x5F
    002D E0D4      LDI	R29,4
    002E BFCD      OUT	0x3D,R28
    002F BFDE      OUT	0x3E,R29
    0030 51C0      SUBI	R28,0x10
    0031 40D0      SBCI	R29,0
    0032 EA0A      LDI	R16,0xAA
    0033 8308      STD	Y+0,R16
    0034 2400      CLR	R0
    0035 E6E3      LDI	R30,0x63
    0036 E0F0      LDI	R31,0
    0037 E010      LDI	R17,0
    0038 36E9      CPI	R30,0x69
    0039 07F1      CPC	R31,R17
    003A F011      BEQ	0x003D
    003B 9201      ST	R0,Z+
    003C CFFB      RJMP	0x0038
    003D 8300      STD	Z+0,R16
    003E E5E4      LDI	R30,0x54
    003F E0F0      LDI	R31,0
    0040 E6A0      LDI	R26,0x60
    0041 E0B0      LDI	R27,0
    0042 E010      LDI	R17,0
    0043 35E7      CPI	R30,0x57
    0044 07F1      CPC	R31,R17
    0045 F021      BEQ	0x004A
    0046 95C8      LPM
    0047 9631      ADIW	R30,1
    0048 920D      ST	R0,X+
    0049 CFF9      RJMP	0x0043
    004A 940E017E  CALL	_main
_exit:
    004C CFFF      RJMP	_exit
FILE: 7135_finish.c
(0001) //************************************************* 
(0002) //测试功能:7135的ad功能。将采集到的数据以四位由高到低发给上位机显示
(0003) //测试方法:注意:采集到的电压单位为mv
(0004) //测试结果:ok
(0005) //时钟频率:外部8m
(0006) //管脚分配:1脚(pb0)接7135的25,4脚(pb3)接7135的22
(0007) //16脚(pd2)接7135的21
(0008) //注意事项:基准电压为:1v.输入电压不大于2v
(0009) //完成时间:2009.03.22
(0010) //**************************************************
(0011) 
(0012) //************************************************** 
(0013) //头文件
(0014) //************************************************** 
(0015) #include <iom16v.h>
(0016) #include <macros.h>
(0017) //************************************************** 
(0018) 
(0019) 
(0020) //***************************************************** 
(0021) //全局变量定义
(0022) //*****************************************************
(0023) unsigned char N=0;//用来区别是第一次外部中断还是第二次中断
(0024) unsigned int T2OVF_NUM=0;//用来计定时器T2的溢出次数
(0025) unsigned long int T2_NUM;//T2计的总时钟的个数
(0026) unsigned int VIN;//测到的电压,单位为mv
(0027) 
(0028) //***************************************************** 
(0029) //函数声明
(0030) //*****************************************************
(0031) void DELAY_1MS(void);
(0032) void DELAY_NMS(unsigned int n);
(0033) void PORT_INIT(void);
(0034) void INT0_INIT(void);
(0035) void T2_INIT(void);
(0036) void T0_125K(void);
(0037) void USART_INIT(void);
(0038) void USART_TX(unsigned char data);
(0039) void DATA_DISPLAY(unsigned int data);
(0040) 
(0041) //***************************************************** 
(0042) //函数名称:void DELAY_1MS(void)
(0043) //函数功能:延时1ms
(0044) //注意事项:i=143*n-2
(0045) //*****************************************************
(0046) void DELAY_1MS(void)
(0047) {    
(0048) 	 unsigned int i;
(0049) 	 for(i=1142;i>0;i--)    
_DELAY_1MS:
  i                    --> R16
    004D E706      LDI	R16,0x76
    004E E014      LDI	R17,4
    004F C002      RJMP	0x0052
    0050 5001      SUBI	R16,1
    0051 4010      SBCI	R17,0
    0052 3000      CPI	R16,0
    0053 0701      CPC	R16,R17
    0054 F7D9      BNE	0x0050
    0055 9508      RET
_DELAY_NMS:
  n                    --> R20
    0056 940E024F  CALL	push_gset1
    0058 01A8      MOVW	R20,R16
(0050)      ;
(0051) }
(0052) //***************************************************** 
(0053) //函数名称:void DELAY_NMS(void)
(0054) //函数功能:延时Nms
(0055) //注意事项:
(0056) //*****************************************************
(0057) void DELAY_NMS(unsigned int n)
(0058) {	 
(0059) 	 for(;n>0;n--)
    0059 C003      RJMP	0x005D
(0060) 	      DELAY_1MS();
    005A DFF2      RCALL	_DELAY_1MS
    005B 5041      SUBI	R20,1
    005C 4050      SBCI	R21,0
    005D 3040      CPI	R20,0
    005E 0745      CPC	R20,R21
    005F F7D1      BNE	0x005A
    0060 940E0252  CALL	pop_gset1
    0062 9508      RET
(0061) }
(0062) //***************************************************** 
(0063) //函数名称:void INT0_INIT(void)  
(0064) //函数功能:int0初始化,上升沿产生中断,使能中断
(0065) //注意事项:未开总中断
(0066) //*****************************************************
(0067) void PORT_INIT(void)
(0068) {	 
(0069) 	 DDRB=0X09;
_PORT_INIT:
    0063 E089      LDI	R24,0x9
    0064 BB87      OUT	0x17,R24
(0070) 	 PORTB=0X00;
    0065 2422      CLR	R2
    0066 BA28      OUT	0x18,R2
(0071) 	 DDRD=0X00;
    0067 BA21      OUT	0x11,R2
(0072) 	 PORTD=0XFF;
    0068 EF8F      LDI	R24,0xFF
    0069 BB82      OUT	0x12,R24
    006A 9508      RET
(0073) }
(0074) 	 
(0075) //********************************************************** 
(0076) //函数名称:void T0_250K(void)   
(0077) //函数功能:t0工作于CTC模式,产生250k方波
(0078) //注意事项:一分频,pb3(oc0)接7135 clk
(0079) //********************************************************** 
(0080) void T0_125K(void)
(0081) {    
(0082) 	TCCR0=0X00;
_T0_125K:
    006B 2422      CLR	R2
    006C BE23      OUT	0x33,R2
(0083) 	TCNT0=0X00;
    006D BE22      OUT	0x32,R2
(0084) 	OCR0=31;
    006E E18F      LDI	R24,0x1F
    006F BF8C      OUT	0x3C,R24
(0085) 	TIMSK&=~(1<<OCIE0);
    0070 B789      IN	R24,0x39
    0071 7F8D      ANDI	R24,0xFD
    0072 BF89      OUT	0x39,R24
(0086) 	TCCR0=0X19;
    0073 E189      LDI	R24,0x19
    0074 BF83      OUT	0x33,R24
    0075 9508      RET
(0087) }
(0088) //***************************************************** 
(0089) //函数名称:void INT0_INIT(void)  
(0090) //函数功能:int0初始化,上升沿产生中断,使能中断
(0091) //注意事项:未开总中断
(0092) //*****************************************************
(0093) void INT0_INIT(void)
(0094) {	 
(0095) 	 MCUCR|=((1<<ISC01)|(1<<ISC00));
_INT0_INIT:
    0076 B785      IN	R24,0x35
    0077 6083      ORI	R24,3
    0078 BF85      OUT	0x35,R24
(0096) 	 GICR|=(1<<INT0);
    0079 B78B      IN	R24,0x3B
    007A 6480      ORI	R24,0x40
    007B BF8B      OUT	0x3B,R24
    007C 9508      RET
_INT0_INTERRUPT:
    007D 940E028B  CALL	push_lset
    007F 940E024D  CALL	push_gset2
(0097) }
(0098) //***************************************************** 
(0099) //函数名称:void INT0_INTERRUPT(void) 
(0100) //函数功能:中断处理,N+1
(0101) //注意事项: 
(0102) //*****************************************************
(0103) #pragma interrupt_handler INT0_INTERRUPT:2
(0104) void INT0_INTERRUPT(void)
(0105) {	 
(0106) 	 if(!N)
    0081 90200060  LDS	R2,N
    0083 2022      TST	R2
    0084 F449      BNE	0x008E
(0107) 	 {    
(0108) 	 	  TCCR2=0X01;//开始内部计数
    0085 E081      LDI	R24,1
    0086 BD85      OUT	0x25,R24
(0109) 		  MCUCR=0X02;//设置外部中断0下降沿产生中断
    0087 E082      LDI	R24,2
    0088 BF85      OUT	0x35,R24
(0110) 		  N++;
    0089 2D82      MOV	R24,R2
    008A 5F8F      SUBI	R24,0xFF
    008B 93800060  STS	N,R24
(0111) 	 }
    008D C076      RJMP	0x0104
(0112) 	 else
(0113) 	 {    
(0114) 	 	  TCCR2=0X00;//定时器t1停止工作
    008E 2422      CLR	R2
    008F BC25      OUT	0x25,R2
(0115) 		  CLI();//关中断,进行数据处理
    0090 94F8      BCLR	7
(0116) 		  //数据处理
(0117) 		  T2_NUM=T2OVF_NUM;
    0091 90200061  LDS	R2,T2OVF_NUM
    0093 90300062  LDS	R3,T2OVF_NUM+1
    0095 2444      CLR	R4
    0096 2455      CLR	R5
    0097 92300066  STS	T2_NUM+1,R3
    0099 92200065  STS	T2_NUM,R2
    009B 92500068  STS	T2_NUM+3,R5
    009D 92400067  STS	T2_NUM+2,R4
(0118) 		  T2_NUM=(T2_NUM*256+TCNT2);
    009F 90400067  LDS	R4,T2_NUM+2
    00A1 90500068  LDS	R5,T2_NUM+3
    00A3 90200065  LDS	R2,T2_NUM
    00A5 90300066  LDS	R3,T2_NUM+1
    00A7 E040      LDI	R20,0
    00A8 E051      LDI	R21,1
    00A9 E060      LDI	R22,0
    00AA E070      LDI	R23,0
    00AB 925A      ST	R5,-Y
    00AC 924A      ST	R4,-Y
    00AD 923A      ST	R3,-Y
    00AE 922A      ST	R2,-Y
    00AF 018A      MOVW	R16,R20
    00B0 019B      MOVW	R18,R22
    00B1 940E0214  CALL	empy32u
    00B3 0118      MOVW	R2,R16
    00B4 0129      MOVW	R4,R18
    00B5 B464      IN	R6,0x24
    00B6 2477      CLR	R7
    00B7 2488      CLR	R8
    00B8 2499      CLR	R9
    00B9 0C26      ADD	R2,R6
    00BA 1C37      ADC	R3,R7
    00BB 1C48      ADC	R4,R8
    00BC 1C59      ADC	R5,R9
    00BD 92300066  STS	T2_NUM+1,R3
    00BF 92200065  STS	T2_NUM,R2
    00C1 92500068  STS	T2_NUM+3,R5
    00C3 92400067  STS	T2_NUM+2,R4
(0119) 		  T2_NUM/=64;
    00C5 E086      LDI	R24,6
    00C6 E090      LDI	R25,0
    00C7 938A      ST	R24,-Y
    00C8 0181      MOVW	R16,R2
    00C9 0192      MOVW	R18,R4
    00CA 940E02B9  CALL	lsr32
    00CC 93100066  STS	T2_NUM+1,R17
    00CE 93000065  STS	T2_NUM,R16
    00D0 93300068  STS	T2_NUM+3,R19
    00D2 93200067  STS	T2_NUM+2,R18
(0120) 		  T2_NUM-=10001;
    00D4 E141      LDI	R20,0x11
    00D5 E257      LDI	R21,0x27
    00D6 E060      LDI	R22,0
    00D7 E070      LDI	R23,0
    00D8 0118      MOVW	R2,R16
    00D9 0129      MOVW	R4,R18
    00DA 1A24      SUB	R2,R20
    00DB 0A35      SBC	R3,R21
    00DC 0A46      SBC	R4,R22
    00DD 0A57      SBC	R5,R23
    00DE 92300066  STS	T2_NUM+1,R3
    00E0 92200065  STS	T2_NUM,R2
    00E2 92500068  STS	T2_NUM+3,R5
    00E4 92400067  STS	T2_NUM+2,R4
(0121) 		  VIN=T2_NUM/10;
    00E6 E04A      LDI	R20,0xA
    00E7 E050      LDI	R21,0
    00E8 E060      LDI	R22,0
    00E9 E070      LDI	R23,0
    00EA 937A      ST	R23,-Y
    00EB 936A      ST	R22,-Y
    00EC 935A      ST	R21,-Y
    00ED 934A      ST	R20,-Y
    00EE 0181      MOVW	R16,R2
    00EF 0192      MOVW	R18,R4
    00F0 940E01A3  CALL	div32u
    00F2 93100064  STS	VIN+1,R17
    00F4 93000063  STS	VIN,R16
(0122) 		  DATA_DISPLAY(VIN);
    00F6 D050      RCALL	_DATA_DISPLAY
(0123) 		  //数据处理结束
(0124) 		  T2OVF_NUM=0;
    00F7 2422      CLR	R2
    00F8 2433      CLR	R3
    00F9 92300062  STS	T2OVF_NUM+1,R3
    00FB 92200061  STS	T2OVF_NUM,R2
(0125) 		  TCNT2=0X00;
    00FD BC24      OUT	0x24,R2
(0126) 		  MCUCR|=((1<<ISC01)|(1<<ISC00));//设置外部上升沿中断
    00FE B785      IN	R24,0x35
    00FF 6083      ORI	R24,3
    0100 BF85      OUT	0x35,R24
(0127) 		  N=0;//
    0101 92200060  STS	N,R2
(0128) 		  PORTB&=~(1<<0);//上位机发0x01,测量一次,停止ad
    0103 98C0      CBI	0x18,0
(0129) 		  //SEI();先进行1次采样
(0130) 	 }
    0104 940E0244  CALL	pop_gset2
    0106 940E02A2  CALL	pop_lset
    0108 9518      RETI
(0131) }
(0132) //************************************************** 
(0133) //函数名称:void T1_INIT(void)  
(0134) //函数功能:内部定时
(0135) //注意事项,定时器未工作,定时器工作,需+TCCR1B=0X01;
(0136) //************************************************** 
(0137) /*void T1_INIT(void)
(0138) {	 
(0139) 	 TCCR1A=0X00;
(0140) 	 TCNT1=0X0000;
(0141) 	 TIMSK|=(1<<TOIE1);
(0142) }*/
(0143) //************************************************** 
(0144) //函数名称:void T1_INIT(void)  
(0145) //函数功能:内部定时
(0146) //注意事项,定时器未工作,定时器工作,需+TCCR1B=0X01;
(0147) //**************************************************
(0148) void T2_INIT(void)
(0149) {	 
(0150) 	 //TCCR1A=0X00;
(0151) 	 TCNT2=0X00;
_T2_INIT:
    0109 2422      CLR	R2
    010A BC24      OUT	0x24,R2
(0152) 	 TIMSK|=(1<<TOIE2);//使能t2溢出中断
    010B B789      IN	R24,0x39
    010C 6480      ORI	R24,0x40
    010D BF89      OUT	0x39,R24
(0153) 	 TCCR2=0X01;//普通模式,1倍频,定时器开始工作
    010E E081      LDI	R24,1
    010F BD85      OUT	0x25,R24
    0110 9508      RET
_T2_OVF:
    0111 938A      ST	R24,-Y
    0112 939A      ST	R25,-Y
    0113 B78F      IN	R24,0x3F
    0114 938A      ST	R24,-Y
(0154) }
(0155) //************************************************** 
(0156) //函数名称:void T1_OVF(void)  
(0157) //函数功能:ti溢出处理
(0158) //注意事项:
(0159) //**************************************************
(0160) #pragma interrupt_handler T2_OVF:5
(0161) void T2_OVF(void)
(0162) {	 
(0163) 	 T2OVF_NUM++;
    0115 91800061  LDS	R24,T2OVF_NUM
    0117 91900062  LDS	R25,T2OVF_NUM+1
    0119 9601      ADIW	R24,1
    011A 93900062  STS	T2OVF_NUM+1,R25
    011C 93800061  STS	T2OVF_NUM,R24
    011E 9189      LD	R24,Y+
    011F BF8F      OUT	0x3F,R24
    0120 9199      LD	R25,Y+
    0121 9189      LD	R24,Y+
    0122 9518      RETI
(0164) }
(0165) //************************************************** 
(0166) //函数名称:void T1_OVF(void)  
(0167) //函数功能:ti溢出处理
(0168) //注意事项:
(0169) //**************************************************
(0170) /*#pragma interrupt_handler T1_OVF:9
(0171) void T1_OVF(void)
(0172) {	 
(0173) 	 T2OVF_NUM++;
(0174) }*/
(0175) //***************************************************** 
(0176) //函数名称:void USART_INIT(void) 
(0177) //函数功能:8M,波特率9600
(0178) //注意事项:
(0179) //*****************************************************
(0180) void USART_INIT(void)
(0181) {	 
(0182) 	 UBRR=0X33;//fosc=8mhz,波特率9600
_USART_INIT:
    0123 E383      LDI	R24,0x33
    0124 B989      OUT	0x09,R24
(0183) 	 UCSRA=0X20;
    0125 E280      LDI	R24,0x20
    0126 B98B      OUT	0x0B,R24
(0184) 	 UCSRC=0X86;
    0127 E886      LDI	R24,0x86
    0128 BD80      OUT	0x20,R24
(0185) 	 UCSRB=0X98;
    0129 E988      LDI	R24,0x98
    012A B98A      OUT	0x0A,R24
    012B 9508      RET
_USART_TX:
  data                 --> R20
    012C 940E024F  CALL	push_gset1
    012E 2F40      MOV	R20,R16
(0186) }
(0187) //***************************************************** 
(0188) //函数名称:void USART_INIT(void) 
(0189) //函数功能:8M,波特率9600
(0190) //注意事项:
(0191) //*****************************************************
(0192) void USART_TX(unsigned char data)
(0193) {	 
(0194) 	 UDR=data;
    012F B94C      OUT	0x0C,R20
(0195) 	 while(!(UCSRA&(1<<TXC)))
    0130 9B5E      SBIS	0x0B,6
    0131 CFFE      RJMP	0x0130
(0196) 	 ;
(0197) 	 DELAY_NMS(1);
    0132 E001      LDI	R16,1
    0133 E010      LDI	R17,0
    0134 DF21      RCALL	_DELAY_NMS
    0135 940E0252  CALL	pop_gset1
    0137 9508      RET
_usart_receive:
  d                    --> R16
    0138 930A      ST	R16,-Y
    0139 B70F      IN	R16,0x3F
    013A 930A      ST	R16,-Y
(0198) }
(0199) //***************************************************** 
(0200) //函数名称:void USART_INIT(void) 
(0201) //函数功能:下位机收到0x01,则进行1次ad转换
(0202) //注意事项:
(0203) //*****************************************************
(0204) #pragma interrupt_handler usart_receive:12
(0205) void usart_receive(void)
(0206) {	 
(0207) 	 unsigned char d;
(0208) 	 d=UDR;
    013B B10C      IN	R16,0x0C
(0209) 	 if(d==0x01)
    013C 3001      CPI	R16,1
    013D F419      BNE	0x0141

⌨️ 快捷键说明

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