📄 正弦波.lst
字号:
__start:
__text_start:
006B E5CF LDI R28,0x5F
006C E0D4 LDI R29,4
006D BFCD OUT 0x3D,R28
006E BFDE OUT 0x3E,R29
006F 51C0 SUBI R28,0x10
0070 40D0 SBCI R29,0
0071 EA0A LDI R16,0xAA
0072 8308 STD Y+0,R16
0073 2400 CLR R0
0074 EEE1 LDI R30,0xE1
0075 E0F0 LDI R31,0
0076 E010 LDI R17,0
0077 3EE1 CPI R30,0xE1
0078 07F1 CPC R31,R17
0079 F011 BEQ 0x007C
007A 9201 ST R0,Z+
007B CFFB RJMP 0x0077
007C 8300 STD Z+0,R16
007D E5E4 LDI R30,0x54
007E E0F0 LDI R31,0
007F E6A0 LDI R26,0x60
0080 E0B0 LDI R27,0
0081 E010 LDI R17,0
0082 3DE5 CPI R30,0xD5
0083 07F1 CPC R31,R17
0084 F021 BEQ 0x0089
0085 95C8 LPM
0086 9631 ADIW R30,1
0087 920D ST R0,X+
0088 CFF9 RJMP 0x0082
0089 940E00B5 CALL _main
_exit:
008B CFFF RJMP _exit
_timer1:
008C 922A ST R2,-Y
008D 923A ST R3,-Y
008E 938A ST R24,-Y
008F 939A ST R25,-Y
0090 93EA ST R30,-Y
0091 93FA ST R31,-Y
0092 B62F IN R2,0x3F
0093 922A ST R2,-Y
FILE: 正弦波.c
(0001) /*******************************************************************
(0002) 实验名称:产生正弦波演示实验
(0003) 作者:王晓波
(0004) 晶振:外部 8M
(0005) 接线方法:
(0006) 1.PD5接低通滤波输入
(0007) 2.用示波器测其输出波形
(0008) *******************************************************************/
(0009) #include<iom16v.h>
(0010) #include <macros.h>
(0011) #include<signal.h>
(0012) #pragma interrupt_handler timer1:9
(0013) char auc_SinParam[128]={//128点正弦波样本值
(0014) 128,134,140,147,153,159,165,171,177,182,188,193,198,204,208,213,
(0015) 218,222,226,230,233,237,240,242,245,247,249,251,252,253,254,254,
(0016) 254,254,253,252,251,250,248,246,244,241,238,235,232,228,224,220,
(0017) 215,211,206,201,196,191,185,179,174,168,162,156,150,144,137,131,
(0018) 125,119,112,106,100,94,88,82,77,71,65,60,55,50,45,41,
(0019) 36,32,28,24,21,18,15,12,10,8,6,5,4,3,2,2,
(0020) 2,2,3,4,5,7,9,11,14,16,19,23,26,30,34,38,
(0021) 43,48,52,57,63,68,74,79,85,91,97,103,109,116,122,128
(0022) };
(0023) char x=0;
(0024) //T/C1溢出中断服务
(0025) void timer1(void)
(0026) {
(0027) x=x+1;
0094 918000E0 LDS R24,x
0096 5F8F SUBI R24,0xFF
0097 938000E0 STS x,R24
(0028) if (x>128)
0099 E880 LDI R24,0x80
009A 902000E0 LDS R2,x
009C 1582 CP R24,R2
009D F418 BCC 0x00A1
(0029) x=0;
009E 2422 CLR R2
009F 922000E0 STS x,R2
(0030) OCR1A=auc_SinParam[x];//auc_SinParam[x];//取样点指针到比较匹配寄存器
00A1 E680 LDI R24,0x60
00A2 E090 LDI R25,0
00A3 91E000E0 LDS R30,x
00A5 27FF CLR R31
00A6 0FE8 ADD R30,R24
00A7 1FF9 ADC R31,R25
00A8 8020 LDD R2,Z+0
00A9 2433 CLR R3
00AA BC3B OUT 0x2B,R3
00AB BC2A OUT 0x2A,R2
00AC 9029 LD R2,Y+
00AD BE2F OUT 0x3F,R2
00AE 91F9 LD R31,Y+
00AF 91E9 LD R30,Y+
00B0 9199 LD R25,Y+
00B1 9189 LD R24,Y+
00B2 9039 LD R3,Y+
00B3 9029 LD R2,Y+
00B4 9518 RETI
(0031) }
(0032) void main(void)
(0033) {
(0034) DDRD=0xff;//PB3输出方式,作为OC0输出PWM波
_main:
00B5 EF8F LDI R24,0xFF
00B6 BB81 OUT 0x11,R24
(0035) TIMSK=0x04; //中断屏蔽位,没有开启任何中断
00B7 E084 LDI R24,4
00B8 BF89 OUT 0x39,R24
(0036) TIFR=0; //中断标志位
00B9 2422 CLR R2
00BA BE28 OUT 0x38,R2
(0037) TCCR1A=0xA1; //开启PWM
00BB EA81 LDI R24,0xA1
00BC BD8F OUT 0x2F,R24
(0038) TCCR1B=0x09;//系统时钟
00BD E089 LDI R24,0x9
00BE BD8E OUT 0x2E,R24
(0039) SREG=0x80; //开启全局中断
00BF E880 LDI R24,0x80
00C0 BF8F OUT 0x3F,R24
(0040) OCR1A=128;//auc_SinParam[x];
FILE: <library>
00C1 2799 CLR R25
00C2 BD9B OUT 0x2B,R25
00C3 BD8A OUT 0x2A,R24
00C4 9508 RET
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -