波形发生器汇编语言程序

合集下载

波形发生器程序制作

波形发生器程序制作
use ieee.std_logic_unsigned.all;
entity sjbmk is
port(clk,reset: in std_logic;
q :out std_logic_vector(7 downto 0));
end if;
end process;
process(clk,ff)
begin
if clk'event and clk='1' then
if ff='1'then
q<=255;
else
q<=0;
end if;
end bxfsq;
architecture a of bxfsq is
begin
process(num)
begin
case num is
when "0001"=>q<=312;
when "0010"=>q<=155;
when 33=>d<=1;when 34=>d<=4;when 35=>d<=8;
when 36=>d<=13;when 37=>d<=19;when 38=>d<=26;
when 39=>d<=34;when 40=>d<=43;when 41=>d<=53;
num:=a-1;
b:='1';
else
if num=1 then
b:='0';
d:=not d;

基于DSP的正弦波信号发生器(汇编语言)

基于DSP的正弦波信号发生器(汇编语言)

正弦波信号发生器一、实验目的1.了解用泰勒级数展开法计算角度正弦值和余弦值;2.了解产生正弦信号的方法;3.熟悉使用汇编语言编写较复杂的程序;4.熟悉在CCS 环境下计算角度正弦值和余弦值及产生正弦波的方法;二、实验原理泰勒级数展开法是根据泰勒展开式进行计算来实现正弦信号,它能精确地计算出一个角度的正弦和余弦值,且只需要较小的存储空间。

正弦函数和余弦函数可以展开成泰勒级数,其表达式:递推公式: sin()2cos()sin[(1)]sin[(2)]cos()2cos()sin[(1)]cos[(2)]nx x n x n x nx x n x n x =---=--- 由递推公式可以看出,在计算正弦和余弦值时,需要已知cos(x )、sin(n -1)x 、sin(n -2)x 和cos(n -2)x 。

用这种方法求少数点还可以,如产生连续正弦波、余弦波,则积累误差太大,不可取。

下面主要用泰勒级数展开法求正弦和余弦值,以及产生正弦波的方法。

三、实验内容与步骤1.用泰勒级数展开法计算sin(x)的值;(1)在 CCS 中新建项目:sinx.pjt ,建立文件sinx.asm 、vectors.asm 和sinx.cmd 。

并将此三个文件加入到项目中。

******************************************************* 用泰勒级数开展开式计算一个角度的正弦值 **sin(x)=x(1-x*x/2*3(1-x*x/4*5(1-x*x/6*7(1-x*x/8*9))))*******************************************************.title "sinx.asm".mmregs .def startSTACK: .usect "STACK",10start: STM #STACK+10,SPLD #d_x,DPST #6487H,d_x ;x-->d_x CALLsin_start end:B end sin_start:35792222sin()3!5!7!9! 111123456789(((())))x x x x x x x x x x x =-+-+=----⨯⨯⨯⨯24682222cos()12!4!6!8! 11112345678((()))x x x x x x x x x =-+-+=----⨯⨯⨯.def sin_startd_coeff .usect "coeff",4.datatable: .word 01C7H ;c1=1/(8*9).word 030BH ;c2=1/(6*7).word 0666H ;c3=1/(4*5).word 1556H ;c4=1/(2*3)d_x .usect "sin_vars",1d_squr_x .usect "sin_vars",1d_temp .usect "sin_vars",1d_sinx .usect "sin_vars",1c_1 .usect "sin_vars",1.textSSBX FRCTSTM #d_coeff,AR5RPT #3MVPD #table,*AR5+STM #d_coeff,AR3STM #d_x,AR2STM #c_1,AR4ST #7FFFH,c_1SQUR *AR2+,A ;A=x^2ST A,*AR2 ;(AR2)=x^2||LD *AR4,B ;B=1MASR *AR2+,*AR3+,B,A ;A=1-x^2/72,T=x^2MPYA A ;A=T*A=x^2(1-x^2/72)STH A,*AR2 ;(d_temp)=x^2(1-x^2/72)MASR *AR2-,*AR3+,B,A ;A=1-x^2/42(1-x^2/72),T=x^2(1-x^2/72)MPYA *AR2+ ;B=x^2(1-x^2/42(1-x^2/72))ST B,*AR2 ;(d_temp)=x^2(1-x^2/42(1-x^2/72))||LD *AR4,B ;B=1MASR *AR2-,*AR3+,B,A ;A=1-x^2/20(1-x^2/42(1-x^2/72))MPYA *AR2+ ;B=x^2(1-x^2/20(1-x^2/42(1-x^2/72)))ST B,*AR2 ;(d_temp)=B||LD *AR4,B ;B=1MASR *AR2-,*AR3+,B,A ;A=1-x^2/6(1-x^2/20(1-x^2/42(1-x^2/72)))MPYA d_x ;B=x(1-x^2/6(1-x^2/20(1-x^2/42(1-x^2/72))))STH B,d_sinx ;sin(theta)RET.end*******************************************************中断向量文件vectors.asm******************************************************.title "vectors.asm".ref start.sect ".vectors"B start.end*******************************************************链接命令文件******************************************************vectors.objsinx.obj-O sinx.out-m sinx.map-estartMEMORY{PAGE 0:EPROM: org=0090H,len=0F70HVECS: org=0080H,len=0010HPAGE 1:SPRAM: org=1000H,len=1000HDARAM: org=2000H,len=2000H}SECTIONS{.text :>EPROM PAGE 0.data :>EPROM PAGE 0STACK :>SPRAM PAGE 1sin_vars :>DARAM PAGE 1coeff :>DARAM PAGE 1.vectors :>VECS PAGE 0}(2)编译、链接项目文件sinx.pjt。

C语言_源代码-波形发生器_程序清单

C语言_源代码-波形发生器_程序清单

波形发生器程序清单:ORG 0000HAJMP MAINORG 0000BHLJMP TOINTORG 0030HMAIN:MOV A,#30HMOV SP, AMOV 40H, #00H ;波形显初值MOV 41H,#00H ;频率显示初值MOV 42H,#00HMOV 43H,#00HMOV 44H,#00HMOV 45H,#00H ;参考电压显示初值MOV 46H,#00H ;设置标志初值MOV DPTR,#7FFCH ;初始化8255MOV A, #90HMOVX @DPTR,A;…………………LED显示子程序……………………………………………………;DISPLAY:MOV R2,H06H ;显示子程序MOV R1,#80HMOV R0,#40HDIS1:MOV DPTR,#7FFEH ;指向B口MOV A,R1MOVX @DPTR, ARR A ;形成下一次位选信号MOV R1 AMOV A,@R0 ;取显示数字MOV DPTR,#DISPLAYTABMOVC A,@A+DPTR ;由数字转换成显示段码MOV DPTR,#7EFFH ;指向A口MOV @DPTR, A ;送段码到A口LCALL DELAY ;显示延时INC R0DJNZ R2, DIS1 ;判断是否显示6次MOV A, #00HMOV P1, A ;熄灭波形指示灯AJMP KEYSPAN ;转到键盘管理子程序DELAY:MOV R3,#80H ;延时LOOP1:MOV R4,#0A0HDJNZ R4,$DJNZ R3,LOOP1RETDISPLAYTAB:DB 3FH,06H,5BH,4FH,66H ;0 1 2 3 4DB 6DH,7DH,07H,7FH,6FH ;5 6 7 8 9DB 40H ;—;…………………键盘管理子程序……………………………………………………;KEY SPAN:MOV A,#F0HCLR P2.7MOV R0, #FDH ;指向C口MOVX @R0, A ;输出列扫描查询码MOV A,@R0 ;读入行状态CJNE A,F0H,KEY1 ;有键闭合、转KEY1LJMP KEYSPANEND ;无键闭合、退出KEY1:LCALL DELAY10ms ;延时、去抖动CLR IE ;关闭定时中断MOV R1,#FEHKEY2:MOV A,R1CLR P2.7MOVX @R0, A ;输出列扫描码MOVX A,@R0 ;读入行状态和列状态ANL A,#F0H ;保留行状态CJNE A,#F0H,KEY3 ;有键闭合、转KEY3,无键闭合形成下一次列扫描码,并判断是否扫描四次MOV A,R1RL AMOV R1, AJB ACC.3,KEY2LJMP KEYSPANEND ;四次列扫描完毕,退出KEY3:MOV R2, A ;行码送R2中保存MOV A,R1 ;扫描码送A中ANL A,#0FH ;保留列码(低4位)ORL A,R2 ;列码在低4位,行码在高4位MOV R2, A ;列行码值保存在R2MOV DPTR,#KEYTAB ;指向键特征值表MOV R1,#00H ;从键值0开始比对KEY4:CLR AMOVC A,@A+DPTR ;取特征值XRL A,R2 ;列行码值与特征值比对JZ KEY5 ;A=0找到键特征值,转KEY5INC R1 ;形成下一个键值INC DPTR ;形成下一个特征值地址CJNE R1,#10H,KEY4 ;判断是否比对了16次,R1≠10H,转KEY4,否则,顺序执行LJMP KEYSPANEND ;退出KEY5:MOV A,#F0HCLR P2.7MOVC @R0, A ;输出查询码MOVC A,@R0 ;读入状态SETB P2.7CJNE A, #F0H, KEY5 ;等待键释放LCALL KEYPROCESS ;调用键功能子程序KEYSPANEND:LJMP DISPLAY ;返回到LED显示子程序开始处DELAY10ms:MOV R3,#0C8HLOOP2:MOV R4,#0A0HDJNZ R4,$DJNZ R3,LOOP2RET;…………………………键特征值表…………………………………………………………;KEYTAB:DB EEH,EDH,EBH,E7H ;0 1 2 3 DB DEH,DDH,DBH,D7H ;4 5 6 7DB CEH,CDH,CBH,C7H ;8 9 EN CLDB 7EH,7DH,7BH,77H ;W F V .;………………………键功能散转………………………………………………………;KWYREOCESS:MOV A,R1RL AMOV DPTR,#KEYPROTABJMP @A+DPTRKEYPROTAB: AJMP KEY_0_PROAJMP KEY_1_PROAJMP KEY_2_PROAJMP KEY_3_PROAJMP KEY_4_PROAJMP KEY_5_PROAJMP KEY_6_PROAJMP KEY_7_PROAJMP KEY_8_PROAJMP KEY_9_PROAJMP KEY_EN_PROAJMP KEY_CL_PROAJMP KEY_W_PROAJMP KEY_F_PROAJMP KEY_V_PROAJMP KEY_·_PRO;………………………………键功能处理子程序………………………………………………;KEY_0_PRO:MOV A,46H ;“0”键处理子程序CJNE A,#00H,D01SJMP D0ENDD01:CJNE A,#01H,D0ENDCJNE R5,#43H,D02SJMP D0ENDD02:MOV @R5,#0HINC R5D0END:RETKEY_1_PRO:MOV A,#46H ;“1”键处理子程序CJNE A,#00H,D11AJMP D1ENDD11:CJNE A,#01H,D12CJNE R5,#43H,F1AJMP D1ENDF1:MOV @R5,#01HINC R5AJMP D1ENDD12:CJNE A,#02H,D13MOV 45H,#01HSJMP D1ENDD13:MOV 40H,#01HD1END:RETKEY_2_PRO:MOV A,#46H ;“2”键处理子程序CJNE A,#00H,D21AJMP D2ENDD21:CJNE A,#01H,D22CJNE R5,#43H,F2AJMP D2ENDF2:MOV @R5,#02HINC R5AJMP D2ENDD22:CJNE A,#02H,D23MOV 45H,#02HSJMP D2ENDD23:MOV 40H,#02HD2END:RETKEY_3_PRO:MOV A,#46H ;“3”键处理子程序CJNE A,#00H,D31AJMP D3ENDD31:CJNE A,#01H,D32CJNE R5,#43H,F3AJMP D3ENDF3:MOV @R5,#03HINC R5AJMP D3ENDD32:CJNE A,#02H,D33MOV 45H,#03HSJMP D3ENDD33:MOV 40H,#03HD3END:RETKEY_4_PRO:MOV A,#46H :“4”键处理子程序CJNE A,#00H,D41AJMP D4ENDD41:CJNE A,#01H,D42CJNE R5,#43H,F4AJMP D4ENDF4:MOV @R5,#04HINC R5AJMP D4ENDD42:CJNE A,#02H,D43MOV 45H,#04HSJMP D4ENDD43:MOV 40H,#04HD4END:RETKEY_5_PRO:MOV A,46H ;“5”键处理子程序CJNE A,#00H,D51AJMP D5ENDD51: CJNE A, #01H, D52CJNE R7, #44H, F5AJMP D5ENDF5:MOV @R5, #00HINC R5AJMP D5ENDD52:CJNE A,#02H,D53MOV 45,#05HD53:RETKEY_6_PRO:RET ;“6”键处理子程序KEY_7_PRO:RET ;“7”键处理子程序KEY_8_PRO:RET ;“8”键处理子程序KEY_9_PRO:RET ;“9”键处理子程序KEY_EN_PRO:MOV A,40HCJNE A,#00H,EN1AJMP ENENDEN1:MOV A,45HCJNE A,#00H,VREFAJMP ENENDVREF:DPTR,#VREFTABMOVC A,@A+DPTRMOV R0, #FFHCLR P2.5 ;选中0832(1)MOCX @R0, A ;向0832(1)送参考电压编码MOV A,41HORL A,42HORL A,43HCJNE A,#00H,1KHZAJMP ENEND1KHZ:MOV A,41H ;1KHZ设置定时初值CJNE A,#01H,500HZMOV TMOD,#00HMOV TLO,#01HMOV THO,#0FFHAJMP OPEN_TI0500HZ:MOV A,42H ;500HZ设置定时初值CJNE A,#05H,200HZMOV TMOD,#00HMOV TLO,#01HMOV THO,#0FEHAJMP OPEN_TI0200HZ:CJNE A,#02H,100HZ ;200HZ设置定时初值MOV TMOD,#00HMOV TLO,#03HMOV THO,#0FBHAJMP OPEN_TI0100HZ:CJNE A,#01H,50HZ ;100HZ设置定时初值MOV TMOD,#00HMOV TLO,#08HMOV THO,#0F6HAJMP OPEN_TI050HZ:MOV A,43H ;50HZ设置定时初值CJNE A,#05H,20HZMOV TMOD,#00HMOV TLO,#0FHMOV THO,#0ECHAJMP OPEN_TI020HZ:CJNE A,#02H,10HZ ;20HZ设置定时初值MOV TMOD,#00HMOV TLO,#16HMOV THO,#90HAJMP OPEN_TI010HZ:CJNE A,#01H,ENEND ;10HZ设置定时初值MOV TMOD,#00HMOV TLO,#0BHMOV THO,#9EHAJMP OPEN_TI0OPEN_TI0:MOV TCON,#10H ;定时器0工作,运行位TR控制MOV IE,82H ;中断允许总控制,定时器0中断允许MOV R6,#00H ;样值初始编号ENEND:RETVREFTAB:DB 32H,68H,A2H,CDH,FFH ;1V 2V 3V 4V 5VKEY_CL_PRO:MOV A,#00H ;“CL”键处理子程序MOV R0,#40HCL1:MOV @R0, #40HINC R0CJNE R0, #46H, CL1MOV R5, AMOV TL0, #00HMOV TH0, #00HCLR TR0RETKEY_F_PRO:MOV A, #01H;“F”处理子程序MOV 46H, A ;(46H)=01H表示频率设置MOV R5, 42HMOV 41H #0AH ;频率LED位显示“- - - 0”MOV 42H #0AHMOV 43H #0AHRETKEY_V_PRO:MOV A, #02H ;“V”处理子程序MOV 46H, A ;(46H)=02H表示参考电压设置MOV 45H #0AH ;电压LED位显示“—”RETKEY_W_PRO:MOV A, #03H ;“W”处理子程序MOV 46H, A ;(46H)=03H表示波形选择MOV 40H #0AH ;波形LED位显示“—”RETKEY_·_PRO:RET ;“·”处理子程序;…………………………定时中断服务程序……………………………………………………;TOINT:PUSH PSWPUSH ACCPUSH DPHPUSH DPLPUSH R0PUSH R1PUSH R2PUSH R3PUSH R4 ;保护现场MOV R7, 40HLCALL WA VE1;调用波形产生子程序POP R4POP R3POP R2POP R1POP R0POP DPLPOP DPHPOP ACCPOP PSW;恢复现场RETI;返回断点处,执行主程序;…………………………波形产生子程序……………………………………………………;WA VE1:CJNE R7, #01H, W A VE2CLR P1.0MOV DPTR, #W_TAB1 ;指向方波表首址MOV A, R6MOVC A, @A+DPTRMOV DPTR, #0AFFFH ;指向DAC0832(2)MOVX @DPTR, AMOV A, R6INC AMOV R6, A ;指向下一个样值CJNE A, #32, W_ENDMOV R6, #00HAJMP W_ENDWA VE2:CJNE R7, #02H, W A VE3CLR P1.1MOV DPTR, #W_TAB2 ;指向正弦波表首址MOV A, R6MOVC A, @A+DPTRMOV DPTR, #0AFFFH ;指向DAC0832(2)MOVX @DPTR, AMOV A, R6INC AMOV R6, A ;指向下一个样值CJNE A, #32, W_ENDMOV R6, #00HAJMP W_ENDWA VE3:CJNE R7, #03H, W A VE4CLR P1.2MOV DPTR, #W_TAB3 ;指向三角波表首址MOV A, R6MOVC A, @A+DPTRMOV DPTR, #0AFFFH ;指向DAC0832(2)MOVX @DPTR, AMOV A, R6INC AMOV R6, A ;指向下一个样值CJNE A, #32, W_ENDMOV R6, #00HAJMP W_ENDWA VE4:CJNE R7, #04H, W_ENDCLR P1.3MOV DPTR, #W_TAB4 ;指向锯齿波表首址MOV A, R6MOVC A, @A+DPTRMOV DPTR, #0AFFFH ;指向DAC0832(2)MOVX @DPTR, AMOV A, R6INC AMOV R6, A ;指向下一个样值CJNE A, #32, W_ENDMOV R6, #00HW_END :RET ;返回中断服务程序执行;……………………………波形样值表……………………………………………………;W_TAB1:DB 0FFH, FFH, FFH, FFH, FFH, FFH, FFH, FFHDB 0FFH, FFH, FFH, FFH, FFH, FFH, FFH, FFHDB 00H, 00H, 00H, 00H, 00H, 00H, 00H, 00HDB 00H, 00H, 00H, 00H, 00H, 00H, 00H, 00HW_TAB2:DB 98H, B0H, C6H, D9H, E9H, F5H, FCH, FFHDB FCH, F5H, E9H, D9H, C6H, B0H, 98H, 7FHDB 66H, 4EH, 38H, 25H, 15H, 0AH, 02H, 00HDB 02H, 0AH, 15H, 25H, 38H, 4EH, 66H, 7FHW_TAB3:DB 8FH, 9FH, 0AFH, BFH, CFH, DFH, EFH, FFHDB EFH, DFH, CFH, BFH, AFH, 9FH, 8FH, 7FHDB 6FH, 5FH, 4FH, 3FH, 2FH, 1FH, 0FH, 00HDB 0FH, 1FH, 2FH, 3FH, 4FH, 5FH, 6FH, 7FHW_TAB4:DB 0FH, 17H, 1FH, 27H, 2FH, 37H, 3FH, 47HDB 4FH, 57H, 5FH, 67H, 6FH, 77H, 7FH, 87HDB 8FH, 97H, 9FH, A7H, AFH, B7H, BFH, C7HDB CFH, D7H, DFH, E7H, EFH, F7H, FFH, 07HEND。

基于51单片机汇编程序波形发生器实训报告

基于51单片机汇编程序波形发生器实训报告

单片机实训报告(波形发生器)一、设计方案(1)、硬件基本设计思路本设计方案采用8051单片机和DAC0832将数字信号转化成模拟信号,并通过LM324运算放大器将信号进行处理,最终得到各种波形。

其中,波形的切换采用矩阵键盘通过外部中断0来实现。

(2)、软件基本设计思路首先,将基本波形通过程序进行编写,并调试成功;其次,再编写按键扫描子程序;最后,将按键程序放入中断中,并进行整体调试,直到调通为止。

(3)、程序说明略二、原理图波形发生器原理图三、程序JUCHI E QU 50HSANJI EQU 51HFANGB EQU 52HTIXIN EQU 53HKU EQU 55HORG 0000H ;程序入口AJMP MAIN ;指向主程序ORG 0003H ;主程序入口地址AJMP INTT0 ;指向按键中断程序ORG 0030H ;中断程序入口地址MAIN: ;主程序MOV P2,#00H ;将P2口初始化为0SETB EA ;开总中断SETB EX0 ;开启外部中断0SETB IT0 ;将外部中断0设置为下降沿有效MOV DPTR,#00FFH ;设置输入寄存器地址MOV JUCHI,#00H ;初始化MOV SANJI,#00HMOV FANGB,#00H;***************************************************START:MOV A,KU ;将键码送累加器ACJNE A,#00H,W1 ;将累加器A和00H比较,如果相等,则00键按下顺序执行,否则跳到W1再判断01键是否按下MOV SANJI,#00H ;屏蔽其他波形MOV FANGB,#00HMOV TIXIN,#00HAJMP JCB ;跳转到锯齿波形W1: CJNE A,#01H,W2 ;判断01键是否按下MOV JUCHI,#00H ;屏蔽其他波形MOV FANGB,#00HMOV TIXIN,#00HAJMP SJB ;跳转到三角波形W2: CJNE A,#02H,W3 ;判断02键是否按下MOV TIXIN,#00HMOV JUCHI,#00H ;屏蔽其他波形MOV SANJI,#00HAJMP FB ;跳转到方波W3: CJNE A,#03H,W4 ;判断03键是否按下,没有按下,跳转回去继续循环扫描MOV JUCHI,#00H ;屏蔽其他波形MOV FANGB,#00HAJMP TXB ;跳转到梯形波W4: AJMP START;**********************************************INTT0: ;中断程序;***********键盘扫描子程序KEY*****************KEY: ACALL KS ;调按键查询子程序,判断是否有键按下JNZ K1 ;有键按下,转移 WEI1跳转ACALL DELAY ;无键按下,调延时程序去抖AJMP K4 ;继续查询按键;***********键盘逐列扫描程序***********************************K1: ACALL DELAYACALL KS ;再次判别是否有键按下JNZ K2 ;有键按下,转移AJMP K4K2: MOV R3,#0FEH ;首列扫描字送R3MOV R4,#00H ;首列号送R4K3: MOV A,R3MOV P2,A ;列扫描字送P2口MOV P1,#0FFH ;初始化P1口MOV A,P1 ;读取行扫描值JB ACC.0,L1 ;第零行无键按下转查第一行为1跳转MOV A,#00H ;第零行有键按下,行首键号送AAJMP LK ;转求键号L1: JB ACC.1,NEXT ;第一行无键按下,转查下一列MOV A,#03HAJMP LK ;键扫描结束,返回;************************************************************NEXT:INC R4 ;修改列号MOV A,R3JNB ACC.2,KEY ;三列扫描完返回按键查询状态RL A ;未扫描完,改为下列扫描字MOV R3,A ;扫描字暂存R3AJMP K3 ;转列扫描程序LK: ADD A,R4 ;形成键码送AMOV KU,APUSH ACC ;键码入栈保护;**********************************************K4:ACALL KS ;等待键释放JNZ K4POP ACC ;键释放,弹栈送ARETI ;中断返回;**********按键查询子程序**************************************KS: ;MOV A,#00HMOV P2,#00H ;全扫描字送p2口MOV P1,#0FFHMOV A,P1 ;读入P1口状态CPL A ;变正逻辑,高电平表示有键按下ANL A,#0FH ;屏蔽高四位RET ;子程序返回;****************锯齿波***********************JCB:MOV A,JUCHI ;转换初值WW: MOVX @DPTR,A ;D/A转换INC A ;A自加1NOP ;延时CJNE A,#255,WW ;判断A是否加到255,若没有返回到WW继续加MOV JUCHI,AAJMP START;******************三角波********************SJB:MOV A,SANJI ;转换初值EE: MOVX @DPTR,A ;D/A转换INC ANOPCJNE A,#255,EEDEC AQQ: MOVX @DPTR,ADEC ANOPCJNE A,#00,QQMOV SANJI,AAJMP START;******************方波********************* FB:MOV A,FANGBMOVX @DPTR,AACALL DELAY3ACALL DELAY3CPL AMOVX @DPTR,AACALL DELAY3ACALL DELAY3MOV FANGB,APOP ACCAJMP START;***************梯形波**********************TXB:MOV A,TIXINSS: MOVX @DPTR,AINC AACALL DELAY3CJNE A,#255,SSACALL DELAY3ACALL DELAY3DEC AZZ: MOVX @DPTR,ADEC AACALL DELAY3CJNE A,#00,ZZACALL DELAY3ACALL DELAY3MOV TIXIN,AAJMP START;*******************************************************1ms DELAY3: MOV R0,#7DHDEL7: NOPNOPDJNZ R0,DEL7RET;*******************************************50毫秒延时子程序DELAY2: MOV R0,#05DEL5: MOV R1,#10DEL4: MOV R2,7DHDEL3: NOPNOPDJNZ R2,DEL3DJNZ R1,DEL4DJNZ R0,DEL5RET;******************************************END四、实训总结通过两周的实训,我们对单片机有了一个基本的认识和了解,我们学到了怎样从一个设计课题入手去编写相关程序,并通过硬件实现。

波形发生器(VHDL)

波形发生器(VHDL)

华南理工大学广州学院数字系统设计(VHDL)课程报告题目:波形发生器姓名:学号:序号:学院:班级:指导老师:完成时间: 2014-1-1 __题目:波形发生器一、 功能及原理介绍1、功能介绍此波形发生器,通过选择“00”、“01”、“10”、“11”,这四种模式来选择相应的波形输出,除此之外,它还可以产生一些其它的波形,利用MIF 文件生成器产生波形的MIF 文件,由此产生各种波形。

这个波形发生器可以用作信号发生器,产生一些自己所需要的信号。

2、原理介绍正弦信号发生器的结构由 3 部分组成:数据计数器或地址发生器、数据 ROM 和 D/A 。

性能良好的正弦信 号发生器的设计要求此 3 部分具有高速性能,且数据 ROM 在高速条件下,占用最少的逻辑资源,设计流程最便捷,波 形数据获最方便。

顶层文件any_bo.VHD 在FPGA 中实现,包含2 个部分:ROM 的地址 信号发生器由7 位计数器担任,和正弦数据ROM ,拒此,ROM 由LPM_ROM 模块构成能达到最优设计,LPM_ROM 底层是FPGA 中的EAB 或ESB 等。

地址发生器的时钟CLK 的输入频率 f0 与每周期的波形数据点数(在此选择 128 点)。

2.1.MIF 文件生成器的使用方法mif 文件就是存储器初始化文件,即memory initialization file ,用来配置RAM 或ROM 中的数据。

而产生MIF 文件的在这里有三种方法:(1)利用Quartus 自带的mif 编辑器、(2)利用mif 软件来生成、(3)用C 语言或者matlab 语言等来生成,而我就利用MIF 文件生成器MIF_Maker 2010来产生MIF 文件。

① 双击打开MIF_Maker 2010,如图选择模式00 0110 117位计数器(地址发生器)7位计数器(地址发生器)7位计数器(地址发生器)7位计数器(地址发生器)正弦波数据 存储ROM三角波数据 存储ROM方波数据 存储ROM锯齿波数据 存储ROM正弦波输出 三角波输出 方波输出 锯齿波输出首先我们对所需要的MIF文件对应的波形参数进行设置,如上图,在“查看”,并于此下拉菜单中选择“全局参数设置”,如选择波形参数:数据长度128,输出数据位宽8,数据格式十六进制(有的情况下需要选择符号类型),初始相位0度,按“确定”后,将会出现一波形编辑窗。

基于Verilog的DDS波形发生器程序

基于Verilog的DDS波形发生器程序
output reg [31:0] length;
output reg [1:0] wavemode;
reg [31:0]fredata;
reg [2:0]key;
reg switch;
integer single_state= 1;
reg [32:0] single_frc;
case(A1)
4'd1: sm_db0 <= seg1;
4'd2: sm_db0 <= seg2;
4'd3: sm_db0 <= seg3;
4'd4: sm_db0 <= seg4;
end
else if(DW == 5'b10000) begin
single_frc = 32'd28633115;
end
else begin single_frc = 32'd28; end;
case(key)
3'b001:begin
end
endcase
single_state= single_state+1;
end
3'b100:begin
if(switch==1)
begin
2'b10:wavevalue= wavevalue2;
2'b11:wavevalue= wavevalue3;
endcase
endmodule
module counter(clk,fre_word,address);
input clk;
output reg [9:0] address;

波形发生器程序2

波形发生器程序2

#include <reg52.h>#define uchar unsigned char#define uint unsigned intuchar code tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88}; uchar code sin_tab[256]={0x80,0x86,0x8D,0x93,0x99,0x9F,0xA5,0xAB,0xB1,0xB7,0xBC,0xC2,0xC7,0xCC,0xD1,0xD6,0xDA,0xDF,0xE3,0xE7,0xEA,0xEE,0xF1,0xF4,0xF6,0xF8,0xFA,0xFC,0xFD,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xFD,0xFB,0xF9,0xF7,0xF5,0xF2,0xEF,0xEC,0xE9,0xE5,0xE1,0xDD,0xD8,0xD4,0xCF,0xCA,0xC5,0xBF,0xBA,0xB4,0xAE,0xA8,0xA2,0x9C,0x96,0x90,0x89,0x83,0x80,0x79,0x72,0x6C,0x66,0x60,0x5A,0x55,0x4E,0x48,0x43,0x3D,0x38,0x33,0x2E,0x29,0x25,0x20,0x1C,0x18,0x15,0x11,0x0E,0x0B,0x09,0x07,0x05,0x03,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x02,0x04,0x06,0x08,0x0A,0x0D,0x10,0x13,0x16,0x1A,0x1E,0x22,0x27,0x2B,0x30,0x35,0x3A,0x40,0x45,0x4C,0x51,0x57,0x5D,0x63,0x69,0x6F,0x76,0x7C,};sbit fd =P1^0;sbit sind=P1^1;sbit sand=P1^2;sbit fang=P1^3;sbit sin=P1^4;sbit san=P1^5;sbit pl_jia=P3^2;sbit pl_jian=P3^3;sbit led1=P3^4;sbit led2=P3^5;sbit led3=P3^6;sbit led4=P3^7;sbit dacs=P3^0;sbit dawr=P3^1;uchar ledplay0,ledplay1,ledplay2,ledplay3;uint waveth,wavetl,frecount=500; //频率计数uint k,key;void timeinit(); //定义子函数void led();void dalayms(int xms) //延时程序{uint i,j;for(i=xms;i>0;i--)for(j=110;j>0;j--);}void main() //主程序{timeinit(); /* 定时、中断初始化 */while(1) // 循环等待{led();}}void timeinit(){TMOD = 0x01; // T0使用定时模式,工作模式0,无门控位TH0 =waveth=(65536-57600/frecount)/256; // 为T0填入初值,定时时间TL0 =wavetl=(65536-57600/frecount)%256; // (65536-初值)*12/f=定时时长 EA = 1; // CPU开放中断ET0 = 1; // 允许定时器0中断TR0 = 1; // 启动T0}void led() //显示电路{ledplay0=frecount/1000; //千位ledplay1=frecount%1000/100; //百位ledplay2=frecount%100/10; //十位ledplay3=frecount%10;led1=1;P0=tab[ledplay0];dalayms(5);led1=0;led2=1;P0=tab[ledplay1];dalayms(5);led2=0;led3=1;P0=tab[ledplay2];dalayms(5);led3=0;led4=1;P0=tab[ledplay3];dalayms(5);led4=0;}void timer0_int () interrupt 1 // T0中断{bit flag;TH0 =(65536-57600/frecount)/256;TL0 =(65536-57600/frecount)%256; // 初值=晶振f/12/频率dacs=0;dawr=0;if(fang==0){ dalayms(10);if(fang==0) //方波{fd=0;sind=1;sand=1;k+=8;if(k<=128) P2=0;if(k>128&&k<256) P2=255;if(k>=256) k=0;}}if(sin==0){dalayms(10);if(sin==0) //正弦波{sind=0;fd=1;sand=1;k+=8;if(k>=256)k=0;P2=sin_tab[k];}}if(san==0){dalayms(10);if(san==0) //三角波{sand=0;fd=1;sind=1;if(flag==0){k=k+8;if(k<=128)flag=1;P2=k;}if (flag==1){k=256-k;if(k==0)flag=0;P2=k;}}}if(pl_jia==0) //频率减小{frecount-=10;if(frecount==0)frecount=1000;waveth=(65536-57600/frecount)/256;wavetl=(65536-57600/frecount)%256;}if(pl_jian==0) //频率增加{frecount+=10;if(frecount==1000)frecount=0;waveth=(65536-57600/frecount)/256; wavetl=(65536-57600/frecount)%256;。

波形发生器代码(有显示)

波形发生器代码(有显示)
void scnaner() interrupt 0{
if(flag_add == 0)
{
flag += 1;
if(flag>=5)flag=1;
}
else if(flag_sub == 0)
{
flag -= 1;lcd_mesg003(IC_DAT1);
{
time_control -= 1;
if(time_control <=1)time_control=1;
}
if(flag==1)lcd_mesg003(IC_DAT);
if(flag==2)lcd_mesg003(IC_DAT1);
void TransferData(char data1,bit DI);
void delayms(unsigned int n);
void delay(unsigned int m);
void lcd_mesg003(unsigned char code *addr1);
unsigned char code IC_DAT1[]={
0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x02,0x03,0x03,0x04,
0x05,0x06,0x07,0x08,0x09,0x0a,0x0c,0x0d,0x0e,0x10,0x12,0x13,
0x15,0x17,0x18,0x1a,0x1c,0x1e,0x20,0x23,0x25,0x27,0x29,0x2c,
#include <absacc.h> //定义绝对地址访问
#include <stdio.h>
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

波形发生器汇编语言程序:
;T0832-5.asm
IOY0 EQU 0DA00H ;片选IOY0对应的端口始地址
DA0832 EQU IOY0+00H*4 ;DA0832的端口地址
DANUM EQU 0FFH
STACK1 SEGMENT STACK
DW 256 DUP(?)
STACK1 ENDS
DATA SEGMENT
STR1 DB '1. Triangle SQUARE Wave ',0AH,0DH,'$' ;定义显示的字符串方波STR2 DB '2. Triangle DELTA Wave ', 0AH,0DH,'$' ;定义显示的字符串三角波STR3 DB '3. Triangle SAWTOOTH Wave ', 0AH,0DH,'$' ;定义显示的字符串锯齿波STR4 DB '4. Triangle SINE Wave ', 0AH,0DH,'$' ;定义显示的字符串正弦波STR5 DB '5. EXIT ',0AH,0DH,'$' ;定义显示的字符串退出FLAG DB 0
SIN DB 00H,02H,05H,09H,0FH,15H,1DH,25H
DB 2EH,38H,43H,4FH,5AH,67H,73H,7FH
DB 80H,8CH,98H,0A5H,0B0H,0BCH,0C7H,0D1H
DB 0DAH,0E2H,0EAH,0F0H,0F6H,0FAH,0FDH,0FFH
DB 0FFH,0FDH,0FAH,0F6H,0F0H,0EAH,0E2H,0DAH
DB 0D1H,0C7H,0BCH,0B0H,0A5H,98H,8CH,80H
DB 7FH,73H,67H,5AH,4FH,43H,38H,2EH
DB 25H,1DH,15H,0Fh,09H,05H,02H,00H
CODE SEGMENT USE16
ASSUME CS:CODE,DS:DATA,SS:STACK1
START: MOV AX,DATA
MOV DS,AX
MOV AX,STACK1
MOV SS,AX
MOV DX,OFFSET STR1 ;显示字符串1
MOV AH,9
INT 21H
MOV DX,OFFSET STR2 ;显示字符串2
MOV AH,9
INT 21H
MOV DX,OFFSET STR3 ;显示字符串3
MOV AH,9
INT 21H
MOV DX,OFFSET STR4 ;显示字符串4
MOV AH,9
INT 21H
MOV DX,OFFSET STR5 ;显示字符串5
MOV AH,9
INT 21H
LOOP1:
MOV AH,1 ;判断是否有按键按下
INT 16H
JZ LOOP2 ;无按键则跳回继续循环,有则退出
MOV AH,0 ;读键盘
INT 16H
CMP AL,31H
JZ SQUARE
CMP AL,32H
JZ DELTA
CMP AL,33H
JZ SAWTOOTH
CMP AL,34H
JNZ L05
JMP SINE
L05: CMP AL,35H
JNZ LOOP2
JMP QUIT
LOOP2:
CMP FLAG,1
JZ SQUARE
CMP FLAG,2
JZ DELTA
CMP FLAG,3
JZ SAWTOOTH
CMP FLAG,4
JZ SINE
JMP LOOP1
SQUARE:
MOV FLAG,1
MOV DX,DA0832 ;写00H,输出低电平
MOV AL,00H
OUT DX,AL
MOV CX,DANUM
L03: CALL DALLY
LOOP L03
MOV DX,DA0832 ;写0FH,输出高电平 MOV AL,DANUM
OUT DX,AL
MOV CX,DANUM
L04: CALL DALLY
LOOP L04
JMP LOOP1
DELTA:
MOV FLAG,2
MOV AL,00H ;D/A转换起始值UP: MOV DX,DA0832 ;启动D/A转换
OUT DX,AL
CALL DALLY
INC AL
CMP AL,DANUM
JNE UP
DOWN: MOV DX,DA0832
OUT DX,AL
CALL DALLY
DEC AL
CMP AL,00H
JNE DOWN
JMP LOOP1
SAWTOOTH:
MOV FLAG,3
MOV AL,00H ;D/A转换起始值
L01: MOV DX,DA0832 ;启动D/A转换
OUT DX,AL
CALL DALLY
INC AL
CMP AL,DANUM
JNE L01
JMP LOOP1
SINE:
MOV FLAG,4
MOV SI,OFFSET SIN ;SI指向SIN
MOV CL,64 ;数据数为64个
L02: MOV AL,[SI]
MOV DX,DA0832 ;输入0832数据口 OUT DX,AL
CALL DALLY
INC SI ;指向下一个数据 DEC CL ;数据数减1
JNZ L02
JMP LOOP1
QUIT: MOV AX,4C00H ;返回到DOS
INT 21H
DALLY PROC NEAR ;软件延时子程序 PUSH CX
PUSH AX
MOV CX,0010H
D1: MOV AX,0100H
D2: DEC AX
JNZ D2
LOOP D1
POP AX
POP CX
RET
DALLY ENDP
CODE ENDS
END START。

相关文档
最新文档