1、简易信号发生器摘要:这次课设的主要目的自己动手做一个可以实现简易信号发生器的设计,在设计中考虑到波形可以在一定范围里的频率和幅值的调整和不同波形的变换,可以准确地将信号在示波器中显示出来。信号发生器应用广泛,种类繁多,性能各异,分类也不尽一致。按照频率范围分类可以分为:超低频信号发生器、低频信号发生器、视频信号发生器、高频波形发生器、甚高频波形发生器和超高频信号发生器。按照输出波形分类可以分为:正弦信号发生器和非正弦信号发生器。非正弦信号发生器又包括:脉冲信号发生器、函数信号发生器、扫频信号发生器、数字序列波形发生器、图形信号发生器、噪声信号发生器等。按照信号发生器性能指标可以分为一般信号发生
2、器和标准信号发生器。前者指对输出信号的频率、幅度的准确度和稳定度以及波形失真等要求不高的一类信号发生器。后者是指其输出信号的频率、幅度、调制系数等在一定范围内连续可调,并且读数准确、稳定、屏蔽良好的中、高档信号发生器。此次的简易信号发生器的设计,将采用单片机编程方式,通过数模转换来实现正弦波、三角波、锯齿波、方波的输出。在程序运行中,当接收到来自外界的命令,可按实际的需要调整信号波的频率幅值及波形,需要输出某种波形时再调用相应的中断服务子程序和波形发生程序,经电路的数/模转换器和运算放大器处理后,从信号发生器的输出端口输出。第 28 页 共 28 页目录一、 总体方案论述.6 1.1任务分析.
3、6 1.2方案对比.6 1.3系统总设计.6二、 硬件电路.7 2.1主控电路.7 2.2按键电路.7 2.3显示电路.8三、 软件设计.11 3.1正弦波.11 3.2方波.13 3.3锯齿波.14 3.4三角波.15 3.5延时程序.16 3.6总程序.17四、 系统调试结果.18 4.1Keil软件调试应用.18 4.2Proteus软件仿真过程.18 4.3仿真结果.19五、 总结与体会.24 5.1收获与体会.24 5.2不足与改进.24附录.25参考文献.30一、 总体方案论述1. 1任务分析(1) 可产生频率可调的正弦波(64个点)、方波、锯齿波或三角波。我们设想将频率可调功能通
4、过按键来显示,正弦波、方波、锯齿波或三角波可以用单片机汇编语言程序写出并通过数模转换显示出来。(2) 显示出仿真波形。通过片外数模转换显示。(3) 通过按键选择输出波形的种类。可设置外部中断使得通过按键来从容地切换各种波形。(4) 在此基础上使输出波形的幅值可控。可通过按键来实现。1.2方案对比 在设计的过程中,我们产生了如下方案:方案一:用四个按键来代表四个波形,然后用四个按键来代表各自波形的调频功能,再用四个按键来代表各自波形的调幅功能。方案二:用四个按键来代表四个波形,然后用一个按键来控制四个波形的频率,再用一个按键来控制除正弦波外其他波形的幅值。通过比较两个方案,方案一器件较多,连线繁
5、琐,方案二较方案一简单,也降低了写代码的难度。由于正弦波本身的特殊性,此次设计我们放弃了对正弦波幅值的调控。1.3系统总设计调频按键调幅按键四个波形按键输入输入 输入单片机输出输出波形D/A转换器图1.3.1系统总图总体设想是:将调频按键、调幅按键、波形按键作为输入信号输入到单片机内来调用各自的程序通过D/A转换器显示出来。二、 硬件设计2.1主控电路将总中断EA接高电平,将四个波形按键通过四端输入与门接入P3.2即外部中断0,说明此次程序设计我们要用到外部中断0了。图2.1.1主控电路图2.2按键电路由图可知,正弦波按键、方波按键、三角波按键、锯齿波按键分别接入单片机的P2.1、P2.2、P
6、2.3、P2.4,当按下去时对应的接口为低电平,即当检测到某个接口为低电平时,就调用对应的波形程序。调幅按键、调频按键分别接入单片机的P2.6、P2.5,当按下去时对应的接口为低电平,即当检测到某个接口为低电平时,就调用对应的调幅调频程序。图2.2.1按键电路图2.3显示电路由图可知,单片机的P0.0P0.7接入DAC0832的Dl0D17并接入上拉电阻,单片机的P2.0接入DAC0832的1、2、17、18号引脚,即此数模转换器的地址为#0FEFFH。图2.3.1显示电路图DAC0832芯片简介:(1)DAC0832的特性DAC0832是采用CMOS/Si-Cr工艺制作而成的8位D/A转换器
7、。它可直接与AT89C51单片机相连,其主要特性如下: 分辨率为8位。 电流输出,建立时间为1s。 可双缓冲输入、单缓冲输入或直接数字输入。 单一电源供电(+5+15V)。 低功耗,20mW。(2) DAC0832的内部结构及外部引脚DAC0832有一个8位输入寄存器、一个8位DAC寄存器和一个8位D/A转换器3个部分组成,它的两个寄存器实现了输入数据的两级缓冲,D/A转换器采用E-2RT形电阻网络。DAC0832的内部结构如图2.3.2所示。“8位输入寄存器”用于存放单片机送来的数字量,由LE2控制;“8位D/A转换器”受“8位DAC寄存器”输出的数字量控制,能输出和数字量成正比的模拟电流。
8、因此,DAC0832通常需要外接有运算放大器组成的I/V转换电路,才能得到模拟输出电压。图2.3.2DAC0832采用的是双列直插式封装,其引脚布置如图2.3.3所示,其各引脚的功能如下。DI0DI7:8位数字信号输入端,可与单片机的数据总线PO口相连,用于接收单片机送来的待转换为模拟量的数字量。CS:片选端,当CS为低电平时,本芯片被选中。ILE:数据锁存允许端,高电平有效。WR1:第一级输入寄存器写选通控制端,低电平有效,当CS=0,ILE=1,WR1=0时,待转换的数据信号被锁存到第一级8位输入寄存器中。WR2:DAC寄存器写选通控制端,低电平有效。当XFER=0,WR2=0时,输入寄存
9、器中待转换的数据传入8位DAC寄存器中。XFER:数据传送控制信号,低电平有效。在XFER和WR2都有效时,LE2上产生正脉冲,LE2的负跳变将输入寄存器内容打入DAC寄存器。 图2.3.3VREF:基准电压输入,它与DAC内的电阻网络相连。VREF可在+10V范围内调节。IOUT1:D/A转换器电流输出1端,输入数字量全为1时,IOUT1最大;输入数字量全为0时,IOUT1最小。IOUT2:D/A转换器电流输出2端,IOUT2+IOUT1=常数。Rfb:外部反馈信号输入端,内部已有反馈电阻Rfb,根据需要也可外接反馈电阻。VCC:电源输入端。DGND:数字信号地。AGND:模拟信号地,最好与
10、基准电压共地。本次使用的单缓冲方式。如图2.3.4所示,由于DAC0832的CS和XFER都与P2.0相连,故DAC0832的输入寄存器和DAC寄存器地址都为FEFFH。而WR1和WR2同时与AT89C51的WR引脚相连,因此,AT89C51单片机指向如下两条指令就可在CS和XFER上同时产生低电平信号,并在WR1和WR2端同时得到来自WR的负脉冲,进而是DAC0832接收AT89C51送来的数字量。 图2.3.4MOV DPTR,#0FEFFH ;DAC端口地址FEFFH DPTRMOV DPTR,A ;启动D/A转换。三、 软件设计3.1正弦波正弦波外部地址累加器A正弦波表位寻址查表是按键
11、是否按下开始通过64个16进制的立即数所组成的点来显示正弦波形,这64个点可通过查表方式获取。否图3.1.1正弦波程序流程图正弦波程序: ZX: MOV R3,#00H LOOP0:MOV A,R3 MOV DPTR,#TABLE /查表 MOVC A,A+DPTR MOV DPTR,#0FEFFH /定义DAC0832地址 MOVX DPTR,A /读数据 INC R3 CJNE R3,#255,LOOP0 MOV R3,#00H AJMP ZX /产生正弦波代码 TABLE:DB080h,083h,086h,089h,08ch,090h,093h,096h,099h,09ch,09fh,0
12、a2h,0a5h,0a8h,0abh,0aehDB0b1h,0b3h,0b6h,0b9h,0bch,0bfh,0c1h,0c4h,0c7h,0c9h,0cch,0ceh,0d1h,0d3h,0d5h,0d8hDB0dah,0dch,0deh,0e0h,0e2h,0e4h,0e6h,0e8h,0eah,0ebh,0edh,0efh,0f0h,0f1h,0f3h,0f4hDB0f5h,0f6h,0f8h,0f9h,0fah,0fah,0fbh,0fch,0fdh,0fdh,0feh,0feh,0feh,0ffh,0ffh,0ffhDB0ffh,0ffh,0ffh,0ffh,0feh,0feh,0f
13、eh,0fdh,0fdh,0fch,0fbh,0fah,0fah,0f9h,0f8h,0f6hDB0f5h,0f4h,0f3h,0f1h,0f0h,0efh,0edh,0ebh,0eah,0e8h,0e6h,0e4h,0e2h,0e0h,0deh,0dchDB0dah,0d8h,0d5h,0d3h,0d1h,0ceh,0cch,0c9h,0c7h,0c4h,0c1h,0bfh,0bch,0b9h,0b6h,0b3hDB0b1h,0aeh,0abh,0a8h,0a5h,0a2h,09fh,09ch,099h,096h,093h,090h,08ch,089h,086h,083hDB080h,07d
14、h,07ah,077h,074h,070h,06dh,06ah,067h,064h,061h,05eh,05bh,058h,055h,052hDB04fh,04dh,04ah,047h,044h,041h,03fh,03ch,039h,037h,034h,032h,02fh,02dh,02bh,028hDB026h,024h,022h,020h,01eh,01ch,01ah,018h,016h,015h,013h,011h,010h,00fh,00dh,00chDB00bh,00ah,008h,007h,006h,006h,005h,004h,003h,003h,002h,002h,002h,
15、001h,001h,000hDB000h,000h,001h,001h,002h,002h,002h,003h,003h,004h,005h,006h,006h,007h,008h,00ahDB00bh,00ch,00dh,00fh,010h,011h,013h,015h,016h,018h,01ah,01ch,01eh,020h,022h,024hDB026h,028h,02bh,02dh,02fh,032h,034h,037h,039h,03ch,03fh,041h,044h,047h,04ah,04dhDB04fh,052h,055h,058h,05bh,05eh,061h,064h,0
16、67h,06ah,06dh,070h,074h,077h,07ah,07dh3.2方波外部地址后半周期波形延时上限电平数值下限电平数值累加器A延时前半周期波形外部地址累加器A否按键是否按下开始分别设大数值和小数值作为方波的上限电平数值和下限电平数值,并分别延时一段时间,就形成方波。-图3.2.1方波程序流程图方波程序: FB:MOVDPTR,#0FEFFH MOVA,#0CCH /方波高电平幅值 MOVXDPTR,A LCALLD200US /延时 MOVA,#5 /方波低电平幅值 MOVXDPTR,A LCALLD200US /延时 AJMPFB3.3锯齿波#00H开始输入数字量从0开始,逐
17、次加1进行D/A转换。当(A)等于某个值时,将(A)清零,重复上述过程,如此循环,便成锯齿波。累加器A寄存器R3输出波形外部地址寄存器R3加1累加器AA是否等于#0FFH否是图3.3.1锯齿波程序流程图锯齿波程序: JUC: MOV R3,#00H LOOP11:MOV A,R3 MOV DPTR,#0FEFFH MOVX DPTR,A INC R3 MOVA,R3 CJNE A,#0FFH,LOOP11 /与最高值比较 AJMP JUC3.4三角波否后半周期波形A是否等于#00H输入数字量从0开始,逐次加1进行D/A转换。当(A)等于指定值时,逐次减1进行D/A转换直至为零,再重复上述内容,
18、如此循环,便成三角波。开始#00H累加器A寄存器R3外部地址寄存器R3加1累加器A前半周期波形累加器A否A是否等于#0FFH是寄存器R3减1外部地址累加器A外部地址是图3.4.1三角波程序流程图三角波程序: SJ: MOV R3,#00H LOOP6:MOV A,R3 MOV DPTR,#0FEFFH MOVX DPTR,A INC R3 MOV A,R3 CJNEA,#0FFH,LOOP6 /与给定值比较 LOOP9:DEC R3 MOV A,R3 MOV DPTR,#0FEFFH MOVX DPTR,A CJNE R3,#00H,LOOP9/与最小值比较 AJMP SJ3.5延时程序延时2
19、00S计算式:1+1+(50*2+2)*2=206程序: D200US:MOV R1,#2 /200s延时 MOV R2,#50 L5: DJNZ R2,$ DJNZ R1,L5 RET 延时50S计算式:1+1(23*1+1)*2=50程序: D50US:MOV R1,#1 /50s延时 MOV R2,#23 L6: DJNZ R2,$ DJNZ R1,L6 RET 开始3.6总程序是输出调频后的波形是否调频按键是否按下否输出调幅后的波形是否调幅按键是否按下检测按下的按键是否按下其他波形按键检测按下的按键产生外部中断按下波形按键输出对应的波形图3.6.1总程序流程图总程序:见附录四、 系统调
20、试结果4.1Keil软件调试应用1、图4.1.1图4.1.2因为SJMP JUC在第26行,JUC程序在第102行,超出了SJMP所执行的地址范围。改正:将SJMP改为LJMP。2、设置函数的标号时,由于整个程序设置的标号数量比较多 ,则经常会出现设置标号错误或者设置重复的问题,使得调试的结果无法达到自己预先设计好的结果执行。3、指令代码的输入格式错误,在编程的过程中,写了一句指令。CJNE A,R7,LOOP11,编译时报错,出现“EXPRESSION TYPE DOES NOT MATCH INSTRUCTION”。则表明所写指令的格式发生错误。4.2Proteus软件仿真过程调出元器件:
21、序号元器件名称元器件型号数目1单片机芯片AT89C5112数模转换器DAC083213单刀单掷开关24复位开关45示波器16电阻5k87四端输入与门74LS2118运算放大器UA7411表4.2.1按照原理图画出芯片、接线。 图4.2.1接入代码:在Keil上运行代码,代码运行无误会生成HEX文件,然后再protues上双基单片机模型,会弹出一个如下对话框。点击文件按钮,选择所需要的程序文件(.HEX)。选择合适的工作频率即可确认。然后运行调试 图4.2.24.3仿真结果正弦波正常波形: 图4.3.1正弦波调频后的波形: 图4.3.2方波正常波形: 图4.3.3方波调频后波形: 图4.3.4方
22、波调幅后波形: 图4.3.5三角波正常波形: 图4.3.6三角波调频后波形: 图4.3.7三角波调幅后波形: 图4.3.8锯齿波正常波形: 图4.3.9锯齿波调频后波形: 图4.3.10锯齿波调幅后波形: 图4.3.11五、 总结与体会5.1收获与体会这次单片机课设历时数天,我们选的课题是简易信号发生器。可以说是呕心沥血,苦尽甘来。但是这让我们学到了很多东西,巩固了以前的知识,特别是汇编语言的使用,以前上课的时候对汇编语言一知半解,但通过此次课设之后,我对汇编语言的了解更深了,运用更加熟练了。通过本次课设,锻炼了自己独立设计程序的能力。在本次课程设计中,我们很重视功能的划分和各个模块之间的联系
23、,分成了多个模块,即三角波、正弦波、锯齿波、方波模块,这样便于程序的检测和修改。通过本次课设,使我们懂得了理论与实际的结合是很重要的。只有把理论知识和实践相结合,才能真正为社会服务,从而提高自己的实践动手能力和独立思考能力。谢谢老师给我们这一个宝贵的锻炼的机会。5.2不足与改进此次简易信号发生器的设计最终所显示出来的效果总体能满足老师的要求,但是还是有点瑕疵和遗憾,首先由于时间的紧迫和正弦波本身的特性,我们没能实现对正弦波调幅的功能。此前我们曾经想过将正弦波的表里面的值修改一下,但出来的正弦波形已然失真,于是乎被迫放弃,对于改进此类问题,我们想过重新制作一个正弦波的表,其幅值与之前的正弦波的表
24、不一样,便可实现正弦波的调幅功能,但制作这张表涉及大量计算,迫于时间压力,所以这一块我们被迫放弃。至于其他方法,我们目前没有想出来,甚是遗憾。除此之外,我们对调幅调频的值有其他的想法:可以增加调频或调幅的值,我们设想通过查表的方法使调出更多的幅值和频率,但由于我们担心如果这样写将增加代码量,调试过程中会出现技术性问题,所以被迫放弃。不过总体来说,我们所设计的简易信号发生器实现了老师所指定的功能,还是值得欣慰的。,附录: ORG 0000H LJMP MAIN ;主程序 ORG 0003H LJMP INT01 ORG 0030HMAIN: MOV P0,#0FFH ;给P0口高电平 MOV S
25、P,#60H ;设置堆栈指针ZC : MOV R6,#01H MOV R7,#0FH CLR IT0;外部中断设置为低电平触发 SETB EX0 ;开启外部中断0 SETB EA ;开启总中断 START:;确保每个波形能够循环输出 CJNE R7,#00H,LLL0 SJMP ZX SJMP STARTLLL0: CJNE R7,#01H,LLL1 SJMP FB SJMP STARTLLL1: CJNE R7,#02H,LLL2 SJMP SJ SJMP STARTLLL2: CJNE R7,#03H,LLL3 LJMP JUCLLL3: SJMP START INT01: ;产生外部中断
26、0,检测对应的按钮输出对应的波形 JB P2.1,LL0 MOV R7,#00H SJMP LL3LL0: JB P2.2,LL1 MOV R7,#01H SJMP LL3LL1: JB P2.3,LL2MOV R7,#02HSJMP LL3LL2: JB P2.4,LL3MOV R7,#03HSJMP LL3LL3: RETIZX: MOV R3,#00H ;产生正弦波LOOP0: MOV A,R3 MOV DPTR,#TABLE ;查表 MOVC A,A+DPTR MOV DPTR,#0FEFFH ;定义DAC0832地址 MOVX DPTR,A ;读数据 INC R3 JB P2.5,L
27、OOP1 ;正弦波调频 LCALL D50USLOOP1: CJNE R3,#255,LOOP0 MOV R3,#00H CJNE R7,#00H,START ;检测键是否按下 AJMP ZXFB:MOVDPTR,#0FEFFH;产生方波JBP2.6,LOOP2 ;检测调幅按钮调幅MOVA,#0CCH ;方波高电平幅值1SJMP LOOP3LOOP2: MOV A,#055H ;方波高电平幅值2LOOP3: MOVXDPTR,ALCALLD200US ;延时JBP2.5,LOOP4 ;方波前半周期调频LCALL D200USLOOP4: MOV A,#5 ;方波低电平幅值MOVXDPTR,AL
28、CALLD200US ;延时JB P2.5,LOOP5 ;方波后半周期调频LCALL D200USLOOP5: CJNER7,#01H,START ;检测键是否按下AJMPFBSJ: MOV R3,#00H;产生三角波 LOOP6: MOV A,R3 MOV DPTR,#0FEFFH MOVX DPTR,A INC R3 ;波形上升 MOV A,R3 JBP2.5,LOOP7 ;三角波前半周期调频 LCALLD50USLOOP7: JBP2.6,LOOP8;三角波调幅 CJNEA,#0FFH,LOOP6 ;幅值1 SJMP LOOP9LOOP8: CJNE A,#055H,LOOP6 ;幅值2
29、 LOOP9: DEC R3 ;波形下降 JBP2.5,LOOP10;三角波后半周期调频 LCALLD50USLOOP10: MOV A,R3 MOV DPTR,#0FEFFH MOVX DPTR,A CJNE R3,#00H,LOOP9 CJNE R7,#02H,SJOUT ;检测键是否按下 AJMP SJSJOUT: LJMPSTARTJUC: MOV R3,#00H;产生锯齿波LOOP11: MOV A,R3 MOV DPTR,#0FEFFH MOVX DPTR,A INC R3 ;波形上升 MOVA,R3 JBP2.5,LOOP12 ;锯齿波调频 LCALLD50USLOOP12: J
30、B P2.6,LOOP13 ;锯齿波调幅 CJNE A,#0FFH,LOOP11 ;幅值1 SJMPLOOP14LOOP13: CJNEA,#055H,LOOP11;幅值2LOOP14: CJNE R7,#03H,JUCOUT ;检测键是否按下 AJMP JUCJUCOUT: LJMP STARTD200US: MOV R1,#2 ;200s延时 MOV R2,#50L5: DJNZ R2,$ DJNZ R1,L5 RET D50US: MOV R1,#1 ;50s延时 MOV R2,#23L6: DJNZ R2,$ DJNZ R1,L6 RET TABLE:DB 080h,083h,086h
31、,089h,08ch,090h,093h,096h,099h,09ch,09fh,0a2h,0a5h,0a8h,0abh,0aeh;产生正弦波代码 DB 0b1h,0b3h,0b6h,0b9h,0bch,0bfh,0c1h,0c4h,0c7h,0c9h,0cch,0ceh,0d1h,0d3h,0d5h,0d8h DB 0dah,0dch,0deh,0e0h,0e2h,0e4h,0e6h,0e8h,0eah,0ebh,0edh,0efh,0f0h,0f1h,0f3h,0f4h DB 0f5h,0f6h,0f8h,0f9h,0fah,0fah,0fbh,0fch,0fdh,0fdh,0feh,0f
32、eh,0feh,0ffh,0ffh,0ffh DB 0ffh,0ffh,0ffh,0ffh,0feh,0feh,0feh,0fdh,0fdh,0fch,0fbh,0fah,0fah,0f9h,0f8h,0f6h DB 0f5h,0f4h,0f3h,0f1h,0f0h,0efh,0edh,0ebh,0eah,0e8h,0e6h,0e4h,0e2h,0e0h,0deh,0dch DB 0dah,0d8h,0d5h,0d3h,0d1h,0ceh,0cch,0c9h,0c7h,0c4h,0c1h,0bfh,0bch,0b9h,0b6h,0b3h DB 0b1h,0aeh,0abh,0a8h,0a5h,
33、0a2h,09fh,09ch,099h,096h,093h,090h,08ch,089h,086h,083h DB 080h,07dh,07ah,077h,074h,070h,06dh,06ah,067h,064h,061h,05eh,05bh,058h,055h,052h DB 04fh,04dh,04ah,047h,044h,041h,03fh,03ch,039h,037h,034h,032h,02fh,02dh,02bh,028h DB 026h,024h,022h,020h,01eh,01ch,01ah,018h,016h,015h,013h,011h,010h,00fh,00dh,0
34、0ch DB 00bh,00ah,008h,007h,006h,006h,005h,004h,003h,003h,002h,002h,002h,001h,001h,000h DB 000h,000h,001h,001h,002h,002h,002h,003h,003h,004h,005h,006h,006h,007h,008h,00ah DB 00bh,00ch,00dh,00fh,010h,011h,013h,015h,016h,018h,01ah,01ch,01eh,020h,022h,024h DB 026h,028h,02bh,02dh,02fh,032h,034h,037h,039h,03ch,03fh,041h,044h,047h,04ah,04dh DB 04fh,052h,055h,058h,05bh,05eh,061h,064h,067h,06ah,06dh,070h,074h,077h,07ah,07dh END 参考文献1单片机课程设计实例指导.李光飞.北京航空航天大学出版社.2单片机课程设计.蔡明文.华中科技出版社.3电子设计自动化Proteus在电子电路与51单片机中的应用.4单片微机原理及应用.徐春辉.北京:电子工业出版社,2013.8.忽略此处.