

已阅读5页,还剩30页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
单片机原理及其接口技术课程设计总结报告课题波形发生器指导教师波形发生器一、设计任务:设计制作一个简易的波形发生器,该波形发生器能产生正弦波、锯齿波、三角波,通过按键控制可以改变输出信号的频率和幅度。二、设计指标:基本要求:1、 能产生正弦波、锯齿波、三角波3种周期波形2、 通过按键p3.0实现选波形3、 通过按键p3.1实现调频加,通过按键p3.2实现调频减4、 通过按键p3.3实现调幅加,通过按键p3.4实现调幅减三、系统框图:各种波形输出运放d/a转换at89c51开关 四、方案设计与论证:利用韦福wave6000系列仿真系统实现。主要利用其中8051,d/a0832,按键等模块实现波形发生器的各类要求。1、 波形选择:像c语言一样,在wave6000编程中设置一个变量,利用按键的控制使它在00h-02h之间变化,三种变化分别对应三种波形,利用8051实时地对p3.0口进行扫描,一旦检测到此按键为“0”,就对此变量加1,而后跳到对应的波形子程序上去。2、 三种波形的实现: 正弦波:(1) 给r3赋值#03h,代表每调用一次,就输出三个周期后返回,这样在最低频时也能保证每秒钟检测三次按键,确保了键盘的灵敏度。再低的话由各程序初始化带来的误差会更明显。(2) 正弦波低频表容量r1:100,正弦波高频表容量r1:16, r1为正弦波表容量-1,-1是由算法决定的。程序通过查表描点输出近似连贯的正弦波形。(3) 通过对p3.1p3.4的按键控制可以实现调频、调幅。三角波:(1)给r3赋值#03h,代表每调用一次,就输出三个周期后返回,这样在最低频时也能保证每秒钟检测三次按键,确保了键盘的灵敏度。再低的话由各程序初始化带来的误差会更明显。(2)三角波低频表容量r1:100,三角波高频表容量r1:19, r1为三角波表容量-1,-1是由算法决定的。程序通过查表描点输出近似连贯的三角波形。(3)通过对p3.1p3.4的按键控制可以实现调频、调幅。锯齿波:(1)给r3赋值#06h,代表每调用一次,就输出六个周期后返回,这样在最低频时也能保证每秒钟检测六次按键,确保了键盘的灵敏度。再低的话由各程序初始化带来的误差会更明显。(2)锯齿波低频表容量r1:50,正弦波高频表容量r1:10, r1为锯齿波表容量-1,-1是由算法决定的。程序通过查表描点输出近似连贯的锯齿波形。(3)通过对p3.1p3.4的按键控制可以实现调频、调幅。3、 频率调节: 在21h单元中赋值#13h,频率加、减子程序中变化范围:01h14h(十进制为20),通过按键p3.1和p3.2可以实现频率加和频率减,步长为1.4、 幅度调节:在22h单元中赋值#01h,幅度加、减子程序中变化范围:00h0ah(十进制为10),通过按键p3.3和p3.4可以实现幅度加和幅度减,步长为1.五、系统电路板接线图:接线:(1)由p2.7控制dac0832的cs端(所以其dptr的地址最高位应该是0);(2)p3.0、p3.1、p3.2、p3.3、p3.4分别接至开关k1、k2、k3、k4、k5;(3)运放输出端接示波器输入端,示波器另一端接地。六、各个模块程序流程图及程序:1.主程序流程图:开始初始化(设置各变量)主程序调用按键检测子程序yn调用延时子程序主程序:判断选波调用相应波子程序调用频率子程序ret1.主程序:org 0000hljmp main;*0.初始化*电阻选用10k,电容120nf,电容最好不要超过200nfmain: mov 20h,#01h ;a.波形标号,0-2分别为正弦波,三角波,锯齿波 mov 21h,#13h ;b.频率参数,变化范围1-20 mov 22h,#01h ;c.幅值参数,变化范围1-10 本程序幅值的变化是通过查表实现的;*主程序*本段的作用是处理各种参数,并判断该执行哪种波形子程序 start: lcall readkey ;调用检测按键程序 mov a,20h ;判断波形 cjne a,#00h,next0 ;载入波形标号,根据不同的变量值调用不同的子程序 lcall sifunc ;然后再跳回主程序,根据readkey刷新后的各种参数重新计算数据 ljmp start ;循环 next0: mov a,20h cjne a,#01h,next1 lcall trfunc ljmp start next1: lcall safunc ljmp start 2.按键检测子程序流程图:主程序调用p3.0=0?波形变换控制变量p3.1=0?p3.2=0?p3.3=0?p3.4=0?nyynnnnyyy频率变化步长加1频率变化步长减1幅度变化步长加1幅度变化步长减1延时子程序延时子程序延时子程序延时子程序延时子程序2.按键检测子程序:readkey: mov a,p3 ;判断按键状态 jnb acc.0,rp10 jnb acc.1,rp11 jnb acc.2,rp12 jnb acc.3,rp13 jnb acc.4,rp14 done:ret rp10:ljmp prom0 rp11:ljmp prom1 rp12:ljmp prom2 rp13:ljmp prom3 rp14:ljmp prom4 prom0: ;/改变各种参数,调用延时delay inc 20h mov a,20h cjne a,#03h,delay mov a,#00h mov 20h,a ljmp delay prom1: inc 21h mov a,21h cjne a,#14h,delay mov a,#01h mov 21h,a ljmp delay prom2: dec 21h mov a,21h cjne a,#00h,delay mov a,#13h mov 21h,a ljmp delayprom3: inc 22h mov a,22h cjne a,#0bh,delay mov 22h,#01h ljmp delay prom4: dec 22h mov a,22h cjne a,#00h,delay mov 22h,#0ah ljmp delay3.延时子程序流程图:主程序调用延时1s按键检测子程序延时时间计算步骤:t=8*250*250*2us=1s8:6个nop指令+djnz2字节指令2个250:双层djnz循环嵌套,每一层都是十进制250个2us:8051机械周期3.延时子程序:delay: ;延时防抖,防止重复输入,执行500000个机器周期,1秒 mov 30h,#0fah mov 31h,#0fah dllp: nop nop nop nop nop nop djnz 30h,dllp mov 30h,#0fah djnz 31h,dllp ljmp readkey4.正弦波子程序流程图:主程序调用低频段?y调用按键程序n高频段程序查相应段表描点输出正弦波形p3.1p3.4=0?y低频段程序np3.0=0?ny相应波形子程序4.正弦波子程序:sifunc: ;*正弦波mov a,21hcjne a,#10,looploop:jnc sifunc1ljmp sifunc2sifunc1: mov r3,#03h ;r3代表每调用一次,就输出三个周期后返回,这样在最低频时也能保证每秒钟检测三次按键,确保了键盘的灵敏度.再低的话由各程序初始化带来的误差会更明显 mov r1,#100 ;r1为正弦表容量-1,-1是由算法决定的 mov r2,#00h ;载入表容量 slp: ;*输出下降段波形,这里slp中的p只代表查得的值是上升段,输出的波形自然就是下降段 mov dptr,#sine mov a,r2 ;载入表内指针 movc a,a+dptr ;查表 mov b,#10 div ab mov 24h,b mov b,22h mul ab mov 25h,a mov a,22h mov b,24h mul ab mov b,#10 div ab add a,25h mov dptr,#0000h movx dptr,a lcall freq2 ;调用频率函数(在此函数中描点) inc r2 ;调整指针 djnz r1,slp ;判断表是否查完 mov r1,#80 ;重新初始化,准备反向查表 mov r2,#00h djnz r3,slp ret sine: ;低频段表db 080h,08ah,094h,09dh,0a7h,0b0h,0bah,0c2hdb 0cbh,0d3h,0dah,0e1h,0e7h,0edh,0f2h,0f6hdb 0f9h,0fch,0feh,0ffh,0ffh,0ffh,0feh,0fchdb 0f9h,0f6h,0f2h,0edh,0e7h,0e1h,0dah,0d3hdb 0cbh,0c3h,0bah,0b1h,0a7h,09eh,094h,08ahdb 080h,076h,06ch,062h,058h,04fh,046h,03dhdb 034h,02dh,025h,01eh,018h,013h,0eh,09hdb 06h,03h,01h,00h,00h,00h,01h,03hdb 06h,09h,0dh,012h,018h,01eh,025h,02chdb 034h,03ch,045h,04eh,058h,061h,06bh,075h,07ch sifunc2: mov r3,#03h ;r3代表每调用一次,就输出三个周期后返回,这样在最低频时也能保证每秒钟检测三次按键,确保了键盘的灵敏度.再低的话由各程序初始化带来的误差会更明显 mov r1,#10h ;r1为正弦表容量-1,-1是由算法决定的 mov r2,#00h slp1: mov dptr,#sine1 mov a,r2 ;载入表内指针 movc a,a+dptr ;查表 mov b,#10 div ab mov 24h,b mov b,22h mul ab mov 25h,a mov a,22h mov b,24h mul ab mov b,#10 div ab add a,25h mov dptr,#0000h movx dptr,a lcall freq1 ;调用频率函数(在此函数中描点) inc r2 ;调整指针 djnz r1,slp1 ;判断表是否查完 mov r1,#10h ;重新初始化,准备反向查表 mov r2,#00h djnz r3,slp1 ret sine1: ;高频段表db 080h,0b0h,0dah,0f6h,0ffh,0f6h,0dah,0b1hdb 080h,04fh,025h,09h,00h,09h,025h,04eh,05fh5.三角波子程序流程图:主程序调用低频段?y调用按键程序n高频段程序查相应段表描点输出三角波形p3.1p3.4=0?y低频段程序np3.0=0?ny相应波形子程序5.三角波子程序:trfunc: ;*三角波mov a,21hcjne a,#10,loop1loop1:jnc trfunc1ljmp trfunc2trfunc1: mov r3,#03h ;r3代表每调用一次,就输出三个周期后返回,这样在最低频时也能保证每秒钟检测三次按键,确保了键盘的灵敏度.再低的话由各程序初始化带来的误差会更明显 mov r1,#100 ;r1为正弦表容量-1,-1是由算法决定的 mov r2,#00h tlp: mov dptr,#tran mov a,r2 movc a,a+dptr ; mov b,#10 div ab mov 24h,b mov b,22h mul ab mov 25h,a mov a,22h mov b,24h mul ab mov b,#10 div ab add a,25h mov dptr,#0000h movx dptr,a ; lcall freq2 ; inc r2 djnz r1,tlp mov r2,#00h mov r1,#100 djnz r3,tlp ret tran: ;低频段表 db 0,5,10,15,20,25,30,35,40,45,50,55,60,65,70,75,80,85,90,95,100,105,110,115,120,125,130,135,140,145,150,155,160,165,170,175,180,185,190,195,200,205,210,215,220,225,230,235,240,245,250,245,240,235,230,225 db 220,215,210,205,200,195,190,185,180,175,170,165,160,155,150,145,140,135,130,125,120,115,110,105,100,95,90,85,80,75,70,65,60,55,50,45,40,35,30,25,20,15,10,5,0trfunc2: mov r3,#03h ;r3代表每调用一次,就输出三个周期后返回,这样在最低频时也能保证每秒钟检测三次按键,确保了键盘的灵敏度.再低的话由各程序初始化带来的误差会更明显 mov r1,#19 ;r1为正弦表容量-1,-1是由算法决定的 mov r2,#00h tlp1: mov dptr,#tran1 mov a,r2 movc a,a+dptr ; mov b,#10 div ab mov 24h,b mov b,22h mul ab mov 25h,a mov a,22h mov b,24h mul ab mov b,#10 div ab add a,25h mov dptr,#0000h movx dptr,a ; lcall freq1 ; inc r2 djnz r1,tlp1 mov r2,#00h mov r1,#19 djnz r3,tlp1 ret tran1: ;高频段表 db 0,24,48,72,96,120,144,168,192,216,240,216,192,168,144,120,96,72,48,24 6.锯齿波子程序流程图:主程序调用低频段?y调用按键程序n高频段程序查相应段表描点输出锯齿波形p3.1p3.4=0?y低频段程序np3.0=0?ny相应波形子程序6.锯齿波子程序:safunc: ;*锯齿波mov a,21hcjne a,#10,loop2loop2:jnc safunc1ljmp safunc2safunc1: mov r3,#06h ;r3代表每调用一次,就输出六个周期后返回,这样在最低频时也能保证每秒钟检测六次按键,确保了键盘的灵敏度.再低的话由各程序初始化带来的误差会更明显 mov r1,#50 ;r1为正弦表容量-1,-1是由算法决定的 mov a,#00h mov r2,a ;r2为表内指针,此程序幅值的调整是通过查不同的表实现的 mov 29h,a ;锯齿波会将r2的表内指针起始地址额外存入29h,这样输出一个周期后就不需要重复计算r2的值了 alp: ;锯齿波只使用一个循环,输出结束后从29h再载入当初r2的值,其他的波形会逐次将r2改回原来的值,所以只有锯齿波需要额外的29h地址 mov dptr,#tran ;锯齿波用的是三角波的表 mov a,r2 movc a,a+dptr mov b,#10 div ab mov 24h,b mov b,22h mul ab mov 25h,a mov a,22h mov b,24h mul ab mov b,#10 div ab add a,25h mov dptr,#0000h movx dptr,a lcall freq2 inc r2 djnz r1,alp mov r1,#50 mov r2,29h djnz r3,alp ret safunc2: mov r3,#06h ;r3代表每调用一次,就输出三个周期后返回,这样在最低频时也能保证每秒钟检测三次按键,确保了键盘的灵敏度.再低的话由各程序初始化带来的误差会更明显,仿真证明每次调用波形子程序都会产生一个小毛刺 mov r1,#10 ;r1为正弦表容量-1,-1是由算法决定的 mov a,#00h ;|载入表容量=19 mov r2,a ;|*r2为表内指针,此程序幅值的调整是通过查不同的表实现的,所以改变幅值意味着表指针跳跃19个 mov 29h,a ;锯齿波会将r2的表内指针起始地址额外存入29h,这样输出一个周期后就不需要重复计算r2的值了 alp1: ;锯齿波只使用一个循环,输出结束后从29h再载入当初r2的值,其他的波形会逐次将r2改回原来的值,所以只有锯齿波需要额外的29h地址 mov dptr,#tran1 ;锯齿波用的是三角波的表 mov a,r2 movc a,a+dptr mov b,#10 div ab mov 24h,b mov b,22h mul ab mov 25h,a mov a,22h mov b,24h mul ab mov b,#10 div ab add a,25h mov dptr,#0000h movx dptr,a lcall freq1 inc r2 djnz r1,alp1 mov r1,#10 mov r2,29h djnz r3,alp1 ret7.频率子程序流程图:主程序调用高频?y程序1程序2延时回相应波子程序n7.频率子程序:;*频率函数*freq1: mov r5,21h delay1:djnz r5,delay1retfreq2: mov a,21h subb a,#9 mov b,#10h mul ab mov r5,a delay2:djnz r5,delay2ret end七、总实验程序:org 0000hljmp main;*0.初始化*电阻选用10k,电容120nf,电容最好不要超过200nfmain: mov 20h,#01h ;a.波形标号,0-2分别为正弦波,三角波,锯齿波 mov 21h,#13h ;b.频率参数,变化范围1-20 mov 22h,#01h ;c.幅值参数,变化范围1-10 本程序幅值的变化是通过查表实现的;*主程序*本段的作用是处理各种参数,并判断该执行哪种波形子程序 start: lcall readkey ;调用检测按键程序 mov a,20h ;判断波形 cjne a,#00h,next0 ;载入波形标号,根据不同的变量值调用不同的子程序 lcall sifunc ;然后再跳回主程序,根据readkey刷新后的各种参数重新计算数据 ljmp start ;循环 next0: mov a,20h cjne a,#01h,next1 lcall trfunc ljmp start next1: lcall safunc ljmp start ;*按键判断* 本段的作用是检测各键位的状态,并改变相应参数,同时自带延时防抖功能readkey: mov a,p3 ;判断按键状态 jnb acc.0,rp10 jnb acc.1,rp11 jnb acc.2,rp12 jnb acc.3,rp13 jnb acc.4,rp14 done:ret rp10:ljmp prom0 rp11:ljmp prom1 rp12:ljmp prom2 rp13:ljmp prom3 rp14:ljmp prom4 prom0: ;/改变各种参数,调用延时delay inc 20h mov a,20h cjne a,#03h,delay mov a,#00h mov 20h,a ljmp delay prom1: inc 21h mov a,21h cjne a,#14h,delay mov a,#01h mov 21h,a ljmp delay prom2: dec 21h mov a,21h cjne a,#00h,delay mov a,#13h mov 21h,a ljmp delayprom3: inc 22h mov a,22h cjne a,#0bh,delay mov 22h,#01h ljmp delay prom4: dec 22h mov a,22h cjne a,#00h,delay mov 22h,#0ah ljmp delay delay: ;延时防抖,防止重复输入,执行500000个机器周期,1秒 mov 30h,#0fah mov 31h,#0fah dllp: nop nop nop nop nop nop djnz 30h,dllp mov 30h,#0fah djnz 31h,dllp ljmp readkey;*波形子程序*sifunc: ;*正弦波mov a,21hcjne a,#10,looploop:jnc sifunc1ljmp sifunc2sifunc1: mov r3,#03h ;r3代表每调用一次,就输出三个周期后返回,这样在最低频时也能保证每秒钟检测三次按键,确保了键盘的灵敏度.再低的话由各程序初始化带来的误差会更明显 mov r1,#100 ;r1为正弦表容量-1,-1是由算法决定的 mov r2,#00h ;载入表容量 slp: ;*输出下降段波形,这里slp中的p只代表查得的值是上升段,输出的波形自然就是下降段 mov dptr,#sine mov a,r2 ;载入表内指针 movc a,a+dptr ;查表 mov b,#10 div ab mov 24h,b mov b,22h mul ab mov 25h,a mov a,22h mov b,24h mul ab mov b,#10 div ab add a,25h mov dptr,#0000h movx dptr,a lcall freq2 ;调用频率函数(在此函数中描点) inc r2 ;调整指针 djnz r1,slp ;判断表是否查完 mov r1,#80 ;重新初始化,准备反向查表 mov r2,#00h djnz r3,slp ret sine: ;低频段表db 080h,08ah,094h,09dh,0a7h,0b0h,0bah,0c2hdb 0cbh,0d3h,0dah,0e1h,0e7h,0edh,0f2h,0f6hdb 0f9h,0fch,0feh,0ffh,0ffh,0ffh,0feh,0fchdb 0f9h,0f6h,0f2h,0edh,0e7h,0e1h,0dah,0d3hdb 0cbh,0c3h,0bah,0b1h,0a7h,09eh,094h,08ahdb 080h,076h,06ch,062h,058h,04fh,046h,03dhdb 034h,02dh,025h,01eh,018h,013h,0eh,09hdb 06h,03h,01h,00h,00h,00h,01h,03hdb 06h,09h,0dh,012h,018h,01eh,025h,02chdb 034h,03ch,045h,04eh,058h,061h,06bh,075h,07ch sifunc2: mov r3,#03h ;r3代表每调用一次,就输出三个周期后返回,这样在最低频时也能保证每秒钟检测三次按键,确保了键盘的灵敏度.再低的话由各程序初始化带来的误差会更明显 mov r1,#10h ;r1为正弦表容量-1,-1是由算法决定的 mov r2,#00h slp1: mov dptr,#sine1 mov a,r2 ;载入表内指针 movc a,a+dptr ;查表 mov b,#10 div ab mov 24h,b mov b,22h mul ab mov 25h,a mov a,22h mov b,24h mul ab mov b,#10 div ab add a,25h mov dptr,#0000h movx dptr,a lcall freq1 ;调用频率函数(在此函数中描点) inc r2 ;调整指针 djnz r1,slp1 ;判断表是否查完 mov r1,#10h ;重新初始化,准备反向查表 mov r2,#00h djnz r3,slp1 ret sine1: ;高频段表db 080h,0b0h,0dah,0f6h,0ffh,0f6h,0dah,0b1hdb 080h,04fh,025h,09h,00h,09h,025h,04eh,05fh trfunc: ;*三角波mov a,21hcjne a,#10,loop1loop1:jnc trfunc1ljmp trfunc2trfunc1: mov r3,#03h ;r3代表每调用一次,就输出三个周期后返回,这样在最低频时也能保证每秒钟检测三次按键,确保了键盘的灵敏度.再低的话由各程序初始化带来的误差会更明显 mov r1,#100 ;r1为正弦表容量-1,-1是由算法决定的 mov r2,#00h tlp: mov dptr,#tran mov a,r2 movc a,a+dptr ; mov b,#10 div ab mov 24h,b mov b,22h mul ab mov 25h,a mov a,22h mov b,24h mul ab mov b,#10 div ab add a,25h mov dptr,#0000h movx dptr,a ; lcall freq2 ; inc r2 djnz r1,tlp mov r2,#00h mov r1,#100 djnz r3,tlp ret tran: ;低频段表 db 0,5,10,15,20,25,30,35,40,45,50,55,60,65,70,75,80,85,90,95,100,105,110,115,120,125,130,135,140,145,150,155,160,165,170,175,180,185,190,195,200,205,210,215,220,225,230,235,240,245,250,245,240,235,230,225 db 220,215,210,205,200,195,190,185,180,175,170,165,160,155,150,145,140,135,130,125,120,115,110,105,100,95,90,85,80,75,70,65,60,55,50,45,40,35,30,25,20,15,10,5,0trfunc2: mov r3,#03h ;r3代表每调用一次,就输出三个周期后返回,这样在最低频时也能保证每秒钟检测三次按键,确保了键盘的灵敏度.再低的话由各程序初始化带来的误差会更明显 mov r1,#19 ;r1为正弦表容量-1,-1是由算法决定的 mov r2,#00h tlp1: mov dptr,#tran1 mov a,r2 movc a,a+dptr ; mov b,#10 div ab mov 24h,b mov b,22h m
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 行政效能评估指标构建试题及答案
- 2025年货物购销合同范本
- 行政管理服务优化途径与实践试题及答案
- 老年义诊政策解读
- 2025停车场租赁合同范本
- 行政管理视角下的试题及答案总结
- 2025建筑工程混凝土采购合同
- 行政管理实务中的法律意识试题及答案
- 2025年梅阁村莲花山地块及地上相关资产租赁合同
- 2025企业单位员工劳动合同模板「版」
- 学校食堂用餐信息公开制度
- GB/T 23444-2024金属及金属复合材料吊顶板
- 《人格权法》课程教学大纲
- 【语文课件】徐霞客徐霞客和《徐霞客游记》课件
- 奇异的仿生学学习通超星期末考试答案章节答案2024年
- 代理招商合作合同样本
- 《阻燃材料与技术》课件 第1讲 绪论
- 化工厂设备安装施工方案
- 国家电网公司招聘高校毕业生应聘登记表
- (危大工程)基坑工程安全管理措施
- JJF 2159-2024零气发生器校准规范
评论
0/150
提交评论