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

📄 dtmf.lst

📁 AVR单片机例程
💻 LST
字号:
__text_start:
__start:
    0054 E5CF      LDI	R28,0x5F
    0055 E0D2      LDI	R29,2
    0056 BFCD      OUT	P3D,R28
    0057 BFDE      OUT	P3E,R29
    0058 51C0      SUBI	R28,0x10
    0059 40D0      SBCI	R29,0
    005A EA0A      LDI	R16,0xAA
    005B 8308      STD	R16,0+Y
    005C 2400      CLR	R0
    005D E6E6      LDI	R30,0x66
    005E E0F0      LDI	R31,0
    005F E010      LDI	R17,0
    0060 36EA      CPI	R30,0x6A
    0061 07F1      CPC	R31,R17
    0062 F011      BEQ	0x0065
    0063 9201      ST	R0,Z+
    0064 CFFB      RJMP	0x0060
    0065 8300      STD	R16,0+Z
    0066 EAE2      LDI	R30,0xA2
    0067 E0F0      LDI	R31,0
    0068 E6A0      LDI	R26,0x60
    0069 E0B0      LDI	R27,0
    006A E010      LDI	R17,0
    006B 3AE8      CPI	R30,0xA8
    006C 07F1      CPC	R31,R17
    006D F021      BEQ	0x0072
    006E 95C8      LPM
    006F 9631      ADIW	R30,1
    0070 920D      ST	R0,X+
    0071 CFF9      RJMP	0x006B
    0072 D09D      RCALL	_main
_exit:
    0073 CFFF      RJMP	_exit
_ISR_T1_Overflow:
    0074 920A      ST	R0,-Y
    0075 922A      ST	R2,-Y
    0076 923A      ST	R3,-Y
    0077 924A      ST	R4,-Y
    0078 925A      ST	R5,-Y
    0079 930A      ST	R16,-Y
    007A 931A      ST	R17,-Y
    007B 932A      ST	R18,-Y
    007C 933A      ST	R19,-Y
    007D 938A      ST	R24,-Y
    007E 939A      ST	R25,-Y
    007F 93EA      ST	R30,-Y
    0080 93FA      ST	R31,-Y
    0081 B60F      IN	R0,P3F
    0082 920A      ST	R0,-Y
FILE: D:\ICC-AVR\examples.sl\DTMF\DTMF.c
(0000) /********************************************************
(0001)                    http://www.sl.com.cn
(0002)          双龙电子公司----双音频信号(DTMF)演示程序
(0003) 		 键盘布置图:
(0004) 		             1 2 3 A--PB4
(0005) 		             4 5 6 B--PB5
(0006) 					 7 8 9 C--PB6
(0007) 					 * 0 # D--PB7
(0008) 					 | | | |
(0009) 					 P P P P
(0010) 					 B B B B
(0011) 					 0 1 2 3
(0012) 		 喇叭接线图:PD5(OC1A)--1K电阻--喇叭			 
(0013) ********************************************************/ 
(0014) #include <io8515.h>
(0015) #include <macros.h>
(0016) #define  Xtal       8000000          // 系统时钟频率
(0017) #define  prescaler  1                // T1预分频系数
(0018) #define  N_samples  128              // 在查找表中的样本数
(0019) #define  Fck        Xtal/prescaler   // T1工作频率
(0020) #define  delaycyc   10               // 读取port C口延时循环数
(0021) #pragma interrupt_handler ISR_T1_Overflow:7
(0022) /*************************** 正弦表 *****************************
(0023)        样本表: 一个周期分成128个点,每点按7位进行量化
(0024) ****************************************************************/
(0025) flash unsigned char auc_SinParam [128] = {
(0026) 64,67,
(0027) 70,73,
(0028) 76,79,
(0029) 82,85,
(0030) 88,91,
(0031) 94,96,
(0032) 99,102,
(0033) 104,106,
(0034) 109,111,
(0035) 113,115,
(0036) 117,118,
(0037) 120,121,
(0038) 123,124,
(0039) 125,126,
(0040) 126,127,
(0041) 127,127,
(0042) 127,127,
(0043) 127,127,
(0044) 126,126,
(0045) 125,124,
(0046) 123,121,
(0047) 120,118,
(0048) 117,115,
(0049) 113,111,
(0050) 109,106,
(0051) 104,102,
(0052) 99,96,
(0053) 94,91,
(0054) 88,85,
(0055) 82,79,
(0056) 76,73,
(0057) 70,67,
(0058) 64,60,
(0059) 57,54,
(0060) 51,48,
(0061) 45,42,
(0062) 39,36,
(0063) 33,31,
(0064) 28,25,
(0065) 23,21,
(0066) 18,16,
(0067) 14,12,
(0068) 10,9,
(0069) 7,6,
(0070) 4,3,
(0071) 2,1,
(0072) 1,0,
(0073) 0,0,
(0074) 0,0,
(0075) 0,0,
(0076) 1,1,
(0077) 2,3,
(0078) 4,6,
(0079) 7,9,
(0080) 10,12,
(0081) 14,16,
(0082) 18,21,
(0083) 23,25,
(0084) 28,31,
(0085) 33,36,
(0086) 39,42,
(0087) 45,48,
(0088) 51,54,
(0089) 57,60};
(0090) 
(0091) //***************************  x_SW  *************************
(0092) //   x_SW 表(8倍): x_SW = ROUND(8*N_samples*f*510/Fck)
(0093) //************************************************************
(0094) 
(0095) //高频(列)
(0096) //1209hz  ---> x_SW = 79
(0097) //1336hz  ---> x_SW = 87
(0098) //1477hz  ---> x_SW = 96
(0099) //1633hz  ---> x_SW = 107
(0100) 
(0101) const unsigned char auc_frequencyH [4] = {
(0102) 107,96,
(0103) 87,79};
(0104) 
(0105) //低频(行)
(0106) //697hz  ---> x_SW = 46
(0107) //770hz  ---> x_SW = 50
(0108) //852hz  ---> x_SW = 56
(0109) //941hz  ---> x_SW = 61
(0110) 
(0111) const unsigned char auc_frequencyL [4] = {
(0112) 61,56,
(0113) 50,46};
(0114) 
(0115) 
(0116) //**************************  全局变量 ****************************
(0117) unsigned char x_SWa = 0x00;               // 高频信号脉冲宽度
(0118) unsigned char x_SWb = 0x00;               // 低频信号脉冲宽度
(0119) unsigned int  X_LUTaExt = 0;           	  
(0120) unsigned int  X_LUTbExt = 0;              
(0121) unsigned int  X_LUTa;                   
(0122) unsigned int  X_LUTb;                     
(0123) 
(0124) /*****************************************************************
(0125)                     定时器溢出中断服务程序
(0126) ******************************************************************/
(0127) void ISR_T1_Overflow (void)
(0128) { 
(0129)   X_LUTaExt += x_SWa;       
    0083 90200060  LDS	R2,0x60
    0085 2433      CLR	R3
    0086 90500063  LDS	R5,0x63
    0088 90400062  LDS	R4,0x62
    008A 0C42      ADD	R4,R2
    008B 1C53      ADC	R5,R3
    008C 92500063  STS	R5,0x63
    008E 92400062  STS	R4,0x62
(0130)   X_LUTbExt += x_SWb;
    0090 90200061  LDS	R2,0x61
    0092 2433      CLR	R3
    0093 90500065  LDS	R5,0x65
    0095 90400064  LDS	R4,0x64
    0097 0C42      ADD	R4,R2
    0098 1C53      ADC	R5,R3
    0099 92500065  STS	R5,0x65
    009B 92400064  STS	R4,0x64
(0131)             // 数据规格化
(0132)   X_LUTa  =  (char)(((X_LUTaExt+4) >> 3)&(0x007F)); 
    009D E023      LDI	R18,3
    009E E030      LDI	R19,0
    009F 91100063  LDS	R17,0x63
    00A1 91000062  LDS	R16,0x62
    00A3 5F0C      SUBI	R16,0xFC
    00A4 4F1F      SBCI	R17,0xFF
    00A5 D0AC      RCALL	lsr16
    00A6 2F80      MOV	R24,R16
    00A7 2F91      MOV	R25,R17
    00A8 778F      ANDI	R24,0x7F
    00A9 7090      ANDI	R25,0
    00AA 2E28      MOV	R2,R24
    00AB 2433      CLR	R3
    00AC 92300069  STS	R3,_X_LUTa+1
    00AE 92200068  STS	R2,_X_LUTa
(0133)   X_LUTb  =  (char)(((X_LUTbExt+4) >> 3)&(0x007F));
    00B0 E023      LDI	R18,3
    00B1 E030      LDI	R19,0
    00B2 91100065  LDS	R17,0x65
    00B4 91000064  LDS	R16,0x64
    00B6 5F0C      SUBI	R16,0xFC
    00B7 4F1F      SBCI	R17,0xFF
    00B8 D099      RCALL	lsr16
    00B9 2F80      MOV	R24,R16
    00BA 2F91      MOV	R25,R17
    00BB 778F      ANDI	R24,0x7F
    00BC 7090      ANDI	R25,0
    00BD 2E28      MOV	R2,R24
    00BE 2433      CLR	R3
    00BF 92300067  STS	R3,_X_LUTb+1
    00C1 92200066  STS	R2,_X_LUTb
(0134)            // 计算 PWM 值: 高频值 + 3/4 低频值
(0135)   OCR1A = (auc_SinParam[X_LUTa] + (auc_SinParam[X_LUTb]-(auc_SinParam[X_LUTb]>>2)));
    00C3 E18A      LDI	R24,0x1A
    00C4 E090      LDI	R25,0
    00C5 90300067  LDS	R3,_X_LUTb+1
    00C7 90200066  LDS	R2,_X_LUTb
    00C9 0E28      ADD	R2,R24
    00CA 1E39      ADC	R3,R25
    00CB 2DE2      MOV	R30,R2
    00CC 2DF3      MOV	R31,R3
    00CD 95C8      LPM
    00CE 2C20      MOV	R2,R0
    00CF 2433      CLR	R3
    00D0 E022      LDI	R18,2
    00D1 E030      LDI	R19,0
    00D2 2D02      MOV	R16,R2
    00D3 2D13      MOV	R17,R3
    00D4 D084      RCALL	asr16
    00D5 1A20      SUB	R2,R16
    00D6 0A31      SBC	R3,R17
    00D7 E18A      LDI	R24,0x1A
    00D8 E090      LDI	R25,0
    00D9 90500069  LDS	R5,_X_LUTa+1
    00DB 90400068  LDS	R4,_X_LUTa
    00DD 0E48      ADD	R4,R24
    00DE 1E59      ADC	R5,R25
    00DF 2DE4      MOV	R30,R4
    00E0 2DF5      MOV	R31,R5
    00E1 95C8      LPM
    00E2 2C40      MOV	R4,R0
    00E3 2455      CLR	R5
    00E4 0C42      ADD	R4,R2
    00E5 1C53      ADC	R5,R3
    00E6 9250004B  STS	R5,0x4B
    00E8 9240004A  STS	R4,0x4A
(0136) }
    00EA 9009      LD	R0,Y+
    00EB BE0F      OUT	P3F,R0
    00EC 91F9      LD	R31,Y+
    00ED 91E9      LD	R30,Y+
    00EE 9199      LD	R25,Y+
    00EF 9189      LD	R24,Y+
    00F0 9139      LD	R19,Y+
    00F1 9129      LD	R18,Y+
    00F2 9119      LD	R17,Y+
    00F3 9109      LD	R16,Y+
    00F4 9059      LD	R5,Y+
    00F5 9049      LD	R4,Y+
    00F6 9039      LD	R3,Y+
    00F7 9029      LD	R2,Y+
    00F8 9009      LD	R0,Y+
    00F9 9518      RETI
(0137) 
(0138) /***********************************************************
(0139)                         初始化
(0140) ***********************************************************/
(0141) void init (void)
(0142) {
(0143)   MCUCR=0x00;
_init:
    00FA 2422      CLR	R2
    00FB BE25      OUT	P35,R2
(0144)   TIMSK  = 0x80;                     // T1 溢出中断使能
    00FC E880      LDI	R24,0x80
    00FD BF89      OUT	P39,R24
(0145)   TCCR1A = (1<<COM1A1)+(1<<PWM10);   // 不翻转、8位PWM
    00FE E881      LDI	R24,0x81
    00FF BD8F      OUT	P2F,R24
(0146)   TCCR1B = (1<<CS10);                // 预分频系数为1、即CLK/1
    0100 E081      LDI	R24,1
    0101 BD8E      OUT	P2E,R24
(0147)   DDRD   = (1 <<PD5);               // PD5 (OC1A)用作输出
    0102 E280      LDI	R24,0x20
    0103 BB81      OUT	P11,R24
(0148)   _SEI();                     	     // 全局中断使能
    0104 9478      BSET	7
(0149) }
    0105 9508      RET
(0150) 
(0151) /*********************************************************************
(0152)       为从PORT C口读取稳定的按键数据,所必须的延时程序(消抖延时)
(0153) *********************************************************************/
(0154) void Delay (void)
(0155) {
(0156)   int i;
(0157)   for (i = 0; i < delaycyc; i++) _NOP();
_Delay:
  i                    --> R16
    0106 2700      CLR	R16
    0107 2711      CLR	R17
    0108 0000      NOP
    0109 5F0F      SUBI	R16,0xFF
    010A 4F1F      SBCI	R17,0xFF
    010B 300A      CPI	R16,0xA
    010C E0E0      LDI	R30,0
    010D 071E      CPC	R17,R30
    010E F3CC      BLT	0x0108
(0158) }
    010F 9508      RET
(0159) 
(0160) /********************************************************************
(0161)                             主程序
(0162)       从PORT C口读取按键数据(如:SL

⌨️ 快捷键说明

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