波形发生器的程序
- 格式:doc
- 大小:154.50 KB
- 文档页数:7
Verilog期末实验报告―波形发生器深圳大学实验报告课程名称: Verilog使用及其应用实验名称: 频率可变的任意波形发生器学院: 电子科学与技术学院专业:电子科学与技术班级: 2组号: 指导教师: 刘春平报告人: 陈昊学号: 2007160162 实验地点科技楼B115一、实验目的应用Verilog进行编写四种波形发生的程序,并结合DE2板与DVCC实验板上的D/A转换器在示波器显示出波形。
初步了解Verilog的编程及DE2板的应用,加强对其的实际应用操作能力。
二、实验原理实验程序分为三部分:第一、通过计数器实现内置信号分频,并通过外置开关调节频率来控制输出波形的频率。
第二、设定ROM中的数值,将波形数据存储到ROM中。
第三、设定波形选择开关。
总体设计方案及其原理说明:FPGA图 1-1 系统总体设计方案DDS是一种把数字信号通过数/模转换器转换成模拟信号的合成技术。
它由相位累加器、相幅转换函数表、D/A转换器以及内部时序控制产生器等电路组成。
参考频率f_clk为整个合成器的工作频率,输入的频率字保存在频率寄存器中,经,位相位累加器,累加一次,相位步进增加,经过内部ROM波形表得到相应的幅度值,经过D/A转换和低通滤波器得到合成的波形。
p为频率字,即相位增量;参考频率为,_clk;相位累加器的长度为,位,输出频率,_out为:f_out——输出信号的频率; N————相位累加器的位数;p———频率控制字(步长); f_clk——基准时钟频率。
图1-2 四种波形单周期的取样示意图段地址基地址 D7 D6 D5 D4 D3 D2 D1 D000 000 1000 001 1700 010 1500 011 1700 100 1000 101 300 110 500 111 301 000 301 001 301 010 301 011 301 100 101 101 101 110 101 111 110 000 010 001 510 010 1010 011 1510 100 2010 101 2510 110 3010 111 3511 000 3511 001 3011 010 2511 011 2011 100 1511 101 1011 110 511 111 0图1-3 函数查找表的设计三、实验内容程序编码:module dds(f_clk,p,choose,data);//端口设定 input [5:0] p; //频率控制字 input[1:0] choose; //波形选择 input f_clk; //内置晶振 output [7:0] data; wire [7:0]data;reg [5:0] addr,address; reg [5:0] i;reg f_out;initialbegini<=0;addr<=0;f_out<=0;endalways @(posedge f_clk) //利用计数器实现任意分频beginif(i==p) //设定频率控制字pbegini=0;f_out=~f_out;endelsei=i+1;endfunction [7:0] romout; //ROM的设定input[5:0] address; case(address) //各波形初值的预装入0 : romout = 10; //正弦波初值 1 : romout = 17;2 : romout = 15;3 : romout = 17;4 : romout = 10;5 : romout = 3;6 : romout = 5;7 : romout = 3;8 : romout = 3; //方波初值 9 : romout = 3;10: romout = 3;11: romout = 3;12: romout = 1;13: romout = 1;14: romout = 1;15: romout = 1;16 : romout = 0; //正三角波初值 17 : romout = 5;18 : romout = 10;19 : romout = 15;20 : romout = 20;21 : romout = 25;22 : romout = 30;23 : romout = 35;24 : romout = 35; //反三角波初值 25 : romout = 30;26 : romout = 25;27 : romout = 20;28 : romout = 15;29 : romout = 10;30 : romout = 5;31 : romout = 0; default : romout = 10'hxx; endcase endfunctionalways@(posedge f_out)beginif(addr==8) //波形数据切换addr=0;elseaddr=addr+1;case(choose) //波形选择开关设定0: address=addr;1: address=addr+8;2: address=addr+16;3: address=addr+24;endcaseendassign data = romout(address);//将ROM中对应数据传递输出端口data输出endmodule四、实验截图1.正弦波示意图:(choose=0时的波形数值)2.方波示意图:(choose=1时的波形数值)3.正三角波示意图:(choose=2时的波形数值)4.反三角波示意图:(choose=3时的波形数值)五、实验总结通过这次期末实验,更进一步认识了Verilog语言的使用,详细了解了整个设计制作和仿真流程,独立思考并通过一步步的调试,逐步摸索和进一步优化程序最终完成实验,锻炼了逻辑思维能力。
XXXX学院课程设计报告课程名称:单片机课程设计院系:电气与信息工程学院专业班级:自动化09102班学生姓名: X X指导教师: X X X完成时间: 2012年6月10日报告成绩:简易波形发生器简易波形发生器是一种常用的信号源,它广泛地应用在电子技术实验、自动控制系统和其他科研领域。
本系统能够准确产生方波、正弦波、锯齿波及三角波。
基于数模转换芯片DAC0832技术的简易波形发生器由六个部分组成:MCU模块、波形发生模块、静态LED 数码管显示模块、键盘输入模块、在线下载模块以及电源模块。
MCU模块采用STC89C51RC 单片机进行数据处理,波形发生模块采用DAC0832及LM324进行波形发生及变换,静态LED数码管显示模块利用3位八段共阳极数码管及3个74LS164显示当前波形频率,键盘模块采取外部中断方式扫描键值,在线下载模块选用MAX232芯片进行单片机程序下载,电源模块使用三端稳压器为系统提供能源。
运用Altium Designer软件绘制了单元电路以及总体电路图,借助Proteus仿真软件对电路进行了虚拟实验,通过仿真分析,满足了课题性能指标的要求,成功地实现了简易波形发生器的设计。
关键词波形发生器;DAC0832;STC89C51RC;静态显示Simple waveform generator is a common source, it is widely used in the experiment of electronic technology, automatic control system and other scientific fields. The system can accurately produce a square wave, sine wave, sawtooth wave and triangle wave. Based on the digital-analog conversion chip DAC0832 simple waveform generator consists of six parts: MCU module, waveform generator module, static LED digital display module, keyboard input module, the download module and power supply. The MCU STC89C51RC microcontroller is for data processing. The waveform generation module which made of DAC0832 and LM324 is used to generate waveform and transform. The static LED digital display module uses three eight out common anode digital and three 74LS164 to show the current waveform frequency. The keyboard module to take external interrupt the scan key. Download module use a MAX232 chip microcontroller program download. The power supply uses three-terminal regulator to provide energy for the system. Altium Designer were used to draw a unit circuit as well as the overall circuit. With Proteus simulation software to conduct virtual experiments on the circuit, simulation analysis, to meet the requirements of the subject of performance indicators, the successful implementation of a simple waveform generator design.Keywords waveform generator ;DAC0832;STC89C51RC; static LED digital display目录摘要 (I)Abstract (II)第一章简易波形发生器的方案设计 (1)1.1简易波形发生器的方案分析与比较 (1)1.1.1 基于数模转换芯片DAC0832的简易波形发生器的设计 (1)1.1.2 基于MAX038函数发生器的简易波形发生器的设计 (1)1.1.3 基于DDS波形发生技术的简易波形发生器的设计 (2)1.2 简易波形发生器的总体结构说明 (2)第二章简易波形发生器的电路设计 (3)2.1 MCU模块 (3)2.1.1 STC89C51RC单片机 (3)2.1.2 复位电路 (5)2.1.3 时钟电路 (5)2.2 DAC0832模块 (5)2.2.1 DAC0832芯片基本介绍 (6)2.2.2 DAC0832波形发生电路 (7)2.3 静态LED数码管显示模块 (7)2.3.1 移位寄存器74LS164 (7)2.3.2 静态显示电路 (8)2.4 键盘输入模块 (8)2.5 在线下载模块 (9)2.6 电源模块 (9)2.7 总体电路说明 (9)第三章简易波形发生器的程序设计 (10)3.1系统接口定义 (10)3.2 主程序 (10)3.3 外部总中断1中断服务程序 (11)第四章简易波形发生器仿真分析 (13)4.1初始界面 (13)4.2 波形发生仿真 (13)4.2.1 正弦波的仿真分析 (13)4.2.2 锯齿波发生仿真分析 (14)4.2.3 三角波发生仿真分析 (15)4.2.4 方波发生仿真分析 (17)总结 (19)参考文献 (20)致谢 (21)附录1:简易波形发生器原理图 (22)附录2:简易波形发生器Protues仿真图 (23)附录3:简易波形发生器元器件明细表 (24)附录4:简易波形发生器源程序 (25)第一章 简易波形发生器的方案设计简易波形发生器是一种常用的信号源,它广泛地应用在电子技术实验、自动控制系统和其他科研领域。
目录1 引言 (1)1.1 题目要求及分析 (1)1.1.1 示意图 (1)1.2 设计要求 (1)2 波形发生器系统设计方案 (2)2.1 方案的设计思路 (2)2.2 设计框图及系统介绍 (2)2.3 选择合适的设计方案 (2)3 主要硬件电路及器件介绍 (4)3.1 80C51单片机 (4)3.2 DAC0832 (5)3.3 数码显示管 (6)4 系统的硬件设计 (8)4.1 硬件原理框图 (8)4.2 89C51系统设计 (8)4.3 时钟电路 (9)4.4 复位电路 (9)4.5 键盘接口电路 (10)4.7 数模转换器 (11)5 系统软件设计 (12)5.1 流程图: (12)5.2 产生波形图 (12)5.2.1 正弦波 (12)5.2.2 三角波 (13)5.2.3 方波 (14)6 结论 (16)主要参考文献 (17)致谢....................................................... 错误!未定义书签。
1引言1.1题目要求及分析题目:基于51单片机的波形发生器设计,即由51单片机控制产生正弦波、方波、三角波等的多种波形。
1.1.1示意图图1:系统流程示意图1.2设计要求(1) 系统具有产生正弦波、三角波、方波三种周期性波形的功能。
(2) 用键盘控制上述三种波形(同周期)的生成,以及由基波和它的谐波(5次以下)线性组合的波形。
(3) 系统具有存储波形功能。
(4) 系统输出波形的频率范围为1Hz~1MHz,重复频率可调,频率步进间隔≤100Hz,非正弦波的频率按照10次谐波来计算。
(5) 系统输出波形幅度范围0~5V。
(6) 系统具有显示输出波形的类型、重复频率和幅度的功能。
2波形发生器系统设计方案设计并制作一个波形信号发生器,能够产生正弦波、方波、三角波的波形,其中不使用DDS和一些专用的波形产生芯片。
并让系统的频率范围在1Hz~1MHZ可调节,在频率范围在1HZ~10KHz时,步进小于或等于10Hz,在频率范围在10KHz~1MHz时,步进小于或等于100Hz,并且电压在0~5V范围,能够实时的显示波形的类型、频率和幅值。
VHDL多路波形发生器实验报告一、基本要求:1、对输入时钟信号进行分频,实现三路互差120°的信号。
2、实现输出信号的占空比控制clk: 输入时钟信号reset: 同步复位信号(低电平有效)div: 输入分频控制信号(注意:6n分频)ctrl: 占空比控制信号ctrl=1时, 占空比为1:1ctrl=2时, 占空比为1:2ctrl=3时, 占空比为2:1A,B,C: 三路输出信号二、设计思路:1.实验为6n分频,用变量s来控制,0~6n-1这六个数,当时钟信号每来一个上升沿时加1,当为6n-1时清零;2.定义N为常量,通过改变N的值改变分频;3.ctrl值不同时,占空比不同,用case语句控制,ctrl分别为01,10,11和其他;4.具体波形的实现用if语句,当占空比为1时,A输出信号在s=0和s=3*n时翻转,B输出信号在s=2*n和s=5*n时翻转,C输出信号在s=4*n和s=n的时候翻转。
当占空比为1:2时,A输出信号在s=0和s=2*n时翻转,B输出信号在s=2*n和s=4*n时翻转,C输出信号在s=4*n和s=0的时候翻转。
当占空比为2:1时,A输出信号在s=0和s=4*n时翻转,B输出信号在s=2*n和s=0时翻转,C输出信号在s=4*n和s=2*n的时候翻转;5.在占空比为1和1:2时,C输出信号应比B慢120度,但是实际输出超前B,所以要对C输出进行反相;同理,在占空比为2:1时,要对B、C分别进行反向。
6.用if语句判断是否复位,若非,则执行case语句。
三、流程图:四、源程序library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_arith.all;use ieee.std_logic_unsigned.all;entity top isport(clk,reset:in std_logic;ctrl:in std_logic_vector(1 downto 0);A,B,C:out std_logic);end top ;architecture rel of top issignal temp1,temp2,temp3,temp4,temp5 : std_logic; constant N: integer:=1;signal s:integer range 0 to 6*N-1 ;beginprocess(clk,reset,ctrl)beginif (reset='0') thentemp1<='0';temp2<='0';temp3<='0';temp4<='0';temp5<='0';s<=0;elsecase ctrl iswhen "01"=>if (clk 'event and clk='1') thenif s=6*N-1 thens<=0;elses <= s+1;end if;if s=0 thentemp1<= not temp1;end if;if s=3*N thentemp1<= not temp1;end if;if s=2*N thentemp2<= not temp2;end if;if s=5*N thentemp2<= not temp2;end if;if s=4*N thentemp4<= not temp4;end if;if s=N thentemp4<= not temp4;end if;end if;temp3<= not temp4;when "10"=>if (clk 'event and clk='1') thenif s=6*N-1 thens<=0;elses <= s+1;end if;if s=0 thentemp1<= not temp1;end if;if s=2*N thentemp1<= not temp1;end if;if s=2*N thentemp2<= not temp2;end if;if s=4*N thentemp2<= not temp2;end if;if s=4*N thentemp4<= not temp4;end if;if s=0 thentemp4<= not temp4;end if;end if;temp3<= not temp4;when "11"=>if (clk 'event and clk='1') thenif s=6*N-1 thens<=0;elses <= s+1;end if;if s=0 thentemp1<= not temp1;end if;if s=4*N thentemp1<= not temp1;end if;if s=2*N thentemp5<= not temp5;end if;if s=0 thentemp5<= not temp5;end if;if s=4*N thentemp4<= not temp4;end if;if s=2*N thentemp4<= not temp4;end if;end if;temp2<= not temp5;temp3<= not temp4;when others=>temp1<='0';temp2<='0';temp3<='0';end case;end if;end process;A<=temp1;B<=temp2;C<=temp3;end rel;五、仿真波形:整体波形:当ctrl=1 当ctrl=2 当ctrl=3复位当ctrl=其他:六、实验过程遇到的问题:在程序设计时,开始不知该怎样使A,B,C互差120度,开始是想通过定义一个变量,每来一个上升沿加1,从0开始,A路信号除3n 取余为0则翻转,B路信号除3n取余为1则翻转,C路信号除3n取余为2则翻转,我觉得这样的想法应该没有错,可是实际却调不出来,可能是某处逻辑有问题,后来就模仿老师给的6分频程序,设计了现在的程序。
波形发生器程序清单: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。
教师批阅波形发生器设计摘要波形发生器是一种常用的信号源,广泛地应用于电子电路、自动控制系统和教学实验等领域。
函数信号发生器是一种能够产生多种波形,函数信号发生器是一种能够产生多种波形,如三角波、如三角波、锯齿波、矩形波(含方波)、正弦波的电路。
函数信号发生器在电路实验和设备检测中具有十分广泛的用途。
通过对函数波形发生器的原理以及构成分析,可设计一个能变换出三角波、正弦波、方波的函数波形发生器。
目前使用的信号发生器大部分是函数信号发生器,且特殊波形发生器的价格昂贵。
所以本设计使用的是DAC0832芯片构成的发生器,可产生三角波、方波、正弦波等多种特殊波形和任意波形,波形的频率可用程序控制改变。
在单片机上加外围器件距阵式键盘,通过键盘控制波形频率的增减以及波形的选择,并用了LCD 显示频率大小。
在单片机的输出端口接DAC0832进行D/A 转换,再通过运放进行波形调整,最后输出波形接在示波器上显示。
本设计具有线路简单、结构紧凑、价格低廉、性能优越等优点。
波器上显示。
本设计具有线路简单、结构紧凑、价格低廉、性能优越等优点。
本设计制作的波形发生器,可以输出多种标准波形,如方波、正弦波、三角波、锯齿波等,还可以输出任意波形,如用鼠标创建的一个周期的非规则波形或用函数描述的波形等,输出的波形的频率、幅度均可调,且能脱机输出。
设计的人机界面不但清晰美观,而且操作方便。
人机界面不但清晰美观,而且操作方便。
关键词:波形发生器;:波形发生器;DAC0832DAC0832DAC0832;;单片机;波形调整教师批阅目录一、设计目的及意义 ............................................................................. - 3 -1.1设计目的 ........................................................................................ - 3 -1.2设计意义 ........................................................................................ - 3 -二、方案论证 ......................................................................................... - 4 -2.1设计要求 ........................................................................................ - 4 -2.2方案论证 ........................................................................................ - 4 -三、硬件电路设计 ................................................................................. - 5 -3.1设计思路、元件选型设计思路、元件选型 .................................................................... - 5 -3.2原理图 ............................................................................................ - 5 -3.3主要芯片介绍主要芯片介绍 ................................................................................ - 6 -3.4硬件连线图 .................................................................................. - 10 -四、软件设计 ....................................................................................... - 10 -4.1锯齿波的产生过程锯齿波的产生过程 ...................................................................... - 11 -4.2三角波产生过程三角波产生过程 .......................................................................... - 13 -4.3 方波的产生过程 ......................................................................... - 14 -4.4 正弦波的产生过程 ..................................................................... - 16 -4.5通过开关实现波形切换和调频、调幅通过开关实现波形切换和调频、调幅 ...................................... - 18 -五、调试与仿真 ................................................................................... - 20 -5.1仿真结果 ...................................................................................... - 21 -六、总结 ............................................................................................... - 22 -七、参考文献: ................................................................................... - 23 -教师批阅一、设计目的及意义1.1设计目的(1)利用所学微机的理论知识进行软硬件整体设计,锻炼学生理论联系实际、提高我们的综合应用能力。
基于单片机的波形发生器设计及实现一、设计方案波形发生器是一种能够产生不同频率、幅度和波形形式的信号的电路设备。
在本设计中,我们将采用单片机作为控制核心,利用其内部计时器和输出引脚来实现波形的产生。
具体的设计方案如下:1. 选择单片机:选用一款适合波形产生器设计的单片机,如ATmega328P等。
2.编程开发:利用单片机的C语言编程开发,在程序中实现波形发生器的控制逻辑,包括波形形状、频率、幅度等参数的设定和控制。
3.输出电路设计:设计适合单片机输出信号的电路,包括放大、滤波和隔离等功能,以确保输出信号的质量和稳定性。
4.外部控制接口:设计外部控制接口,包括旋钮、按键等,方便用户对波形发生器进行参数设定和调节。
5.功率供应:提供稳定的电源供应,确保波形发生器正常工作。
二、实现过程1.单片机编程:首先编写C语言程序,实现波形发生器的控制逻辑。
通过设置定时器的计数值和输出引脚的状态来产生不同形状的波形,如正弦波、方波、三角波等。
同时,通过按键和旋钮来实现频率和幅度的调节。
2.输出电路设计:设计一个简单的输出电路,将单片机的输出信号放大和滤波,以获得较为稳定和可靠的输出信号。
同时,通过隔离电路来防止单片机受到外部干扰。
3.外部控制接口:设计旋钮和按键的连接电路,将它们与单片机的GPIO引脚相连,实现参数的设定和调节。
通过旋钮来调节频率,通过按键来切换波形形状和设定幅度。
4.功率供应:设计一个合适的功率供应电路,为单片机和输出电路提供稳定的电源,以保证波形发生器的正常工作。
5.调试测试:将所有部件组装在一起,通过示波器等仪器对输出信号进行观测和测试,调节参数使得波形发生器产生符合要求的波形,并记录各种参数值,以便后续使用和改进。
三、实现效果经过上述步骤的设计和实现,我们成功地搭建了一个基于单片机的波形发生器。
该波形发生器可以产生多种波形形状,如正弦波、方波、三角波等,同时支持频率和幅度的调节。
通过外部控制接口,用户可以方便地对波形发生器进行参数的设定和调节,使得波形发生器具有较好的灵活性和易用性。
Arduino+Buck转换器,自制一个冷启动电池电压波形发生器摘要为了对车用电压预调节器进行测量,使用动态变化的输入电压源是常用的方法,这样可以确保它们即使在在冷启动造成的电池电压变化期间也能正常工作。
使用 Arduino 和大电流连续模式 Buck 转换器自制一个冷启动电池电压波形发生器并非难事,本文将对其需求和自制的方法进行详细描述。
1.概述在开发以车辆电池作为电源的车用电子产品过程中,电路设计师需要根据 ISO 16750-2 标准的要求使用具有各种电压曲线的电源对电子产品进行测试,其中最特别的当属车辆冷启动电池电压波形,它对各种应用来说可能都是致命的威胁,因为在此事件发生的时候,电池电压可能跌落得非常快,而且会跌落到很低的电压,会给它们的电源系统带来非常大的压力。
在通常情况下,可编程电源会被用来当作此类测试的信号发生器,但将以 MCU 为核心的 Arduino Nano 控制板和大电流 Buck 转换器如立锜科技的 RT8131BGQW 结合在一起来构成一个强大的电池电压曲线模拟器也是有可能的,本文就将说明这样一个电池电压曲线模拟器是如何设计、制作出来的,其程序设计和使用方法也将一一给出来供读者参考。
2.初步构想要对车用电子产品使用的电压预调节器进行测量,需要使用 ISO 16750-2 给出来的输入电压波动曲线,我们现在要考虑的是如何将此标准中描述的车用电池冷启动期间的电压波形模拟出来。
图 1图 1 给出的是一个实际测量获得的车用电池电压冷启动波形,它是在环境温度大约为 -5℃的冬天测得的。
从此图可以看出,由于寒冷,电池电压在开始的时候就已经低于 12V 了,车子启动的时候它更是掉到了 6.24V。
随着电池状态和其他负载状况的不同,电池电压可能掉得多一点或少一点。
当引擎被启动以后,发电机开始对电池充电,电池电压升高到了大约 14.5V。
ISO 16750 标准对冷启动期间电池电压的下坠是这样描述的:图 2典型的电池电压下降时间是 5ms,电压可以下降到不同的水平,然后就上升到一个中间水平,紧接着就是由于引擎启动而造成的一个电压振荡过程,最后再回到它最初的电压水平上。
1.函数波形发生器流程图主程序流程T0中断服务程序流程2. 255秒定时器流程主程序流程图INT0中断服务程序流程T1中断服务程序流程T0中断服务程序流程3. 比例电压变换器流程主程序流程图4. 模拟电压显示器流程主程序流程图注:P1口和P3.0-P3.3接12个LED 灯,其中P3.3接最高位灯L12,P1.0接最低位灯L0。
5. 脉冲计数器流程主程序流程图T1中断服务程序流程图T0中断服务程序流程图6. 水塔水位控制器流程主程序流程图T0中断服务程序流程图T1中断服务程序流程图7. 占空比可调的方波发生器流程主程序流程图T0中断服务程序流程图注:T0的中断服务程序编制过程中必须注意使程序所有流程的执行时间小于100μS 。
否则,输出波形的频率不符合题目的要求8. 双机通过串行接口互传数据流程主程序流程图T0中断服务程序流程图串口中断服务程序流程图9. 花样流水灯流程主程序流程图T0中断服务程序流程图注:在主程序中由于仅使用了8bit运算,故实际A/D采样值为255时,得到的延时时间间隔为1280mS。
若要完全符合题意,则需要使用16bit的算术运算才能满足要求。
10. 模拟电压比较器流程主程序流程图T0中断服务程序流程图T1中断服务程序流程图11. 利用PWM 信号实现直流小电机的调速流程主程序流程图注:在程序的编制过程中,必须仔细调整延时37微秒的延时子程序的延时时间,使输出波形的频率满足题目要求。
12. 调频信号发生器流程主程序流程图T0中断服务程序流程图注:该程序编制过程中须注意,T0中断服务程序与主程序均使用0区的工作寄存器。
另外,T0的中断服务程序中最长流程的执行时间必须小于50微秒13. 频率计主程序流程图T1中断服务程序流程图动态显示子程序流程图主程序流程图14. 电子钟T0中断服务程序流程图INT0中断服务程序流程图动态显示子程序流程图15. 数字电压表主程序流程图T0中断服务程序流程图动态显示子程序流程图16. 数字跑表主程序流程图INT0中断服务程序流程图T0中断服务程序流程图动态显示子程序流程图17. 步进电机驱动器主程序流程图INT0中断服务程序流程T0中断服务程序流程。
#include<reg52.h>#include<absacc.h>#define DAC0832 XBYTE[0x0fff] //DAC0832端口int pinlv=256; //改变频率的时延自变量sbit p20=P2^0;sbit p21=P2^1;sbit p22=P2^2;sbit p23=P2^3;sbit RS = P3^0;sbit RW= P3^1; //液晶显示的端口sbit E = P3^4;int j=0;unsigned char code TAB[ ]="0123456789msTIME:" ;unsigned char code TAB1[ ]="zhengxuanbofangbo sanjiaobo juchibo " ;unsigned char table[4];float code table2[]={ // 正弦波信号采点值0x80,0x83,0x85,0x88,0x8A,0x8D,0x8F,0x92,0x94,0x97,0x99,0x9B,0x9E,0xA0,0xA3,0xA5,0xA7,0xAA,0xAC,0xAE,0xB1,0xB3,0xB5,0xB7,0xB9,0xBB,0xBD,0xBF,0xC1,0xC3,0xC5,0xC7,0xC9,0xCB,0xCC,0xCE,0xD0,0xD1,0xD3,0xD4,0xD6,0xD7,0xD8,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF,0xE0,0xE1,0xE2,0xE3,0xE3,0xE4,0xE4,0xE5,0xE5,0xE6,0xE6,0xE7,0xE7,0xE7,0xE7,0xE7,0xE7,0xE7,0xE7,0xE6,0xE6,0xE5,0xE5,0xE4,0xE4,0xE3,0xE3,0xE2,0xE1,0xE0,0xDF,0xDE,0xDD,0xDC,0xDB,0xDA,0xD8,0xD7,0xD6,0xD4,0xD3,0xD1,0xD0,0xCE,0xCC,0xCB,0xC9,0xC7,0xC5,0xC3,0xC1,0xBF,0xBD,0xBB,0xB9,0xB7,0xB5,0xB3,0xB1,0xAE,0xAC,0xAA,0xA7,0xA5,0xA3,0xA0,0x9E,0x9B,0x99,0x97,0x94,0x92,0x8F,0x8D,0x8A,0x88,0x85,0x83,0x80,0x7D,0x7B,0x78,0x76,0x73,0x71,0x6E,0x6C,0x69,0x67,0x65,0x62,0x60,0x5D,0x5B,0x59,0x56,0x54,0x52,0x4F,0x4D,0x4B,0x49,0x47,0x45,0x43,0x41,0x3F,0x3D,0x3B,0x39,0x37,0x35,0x34,0x32,0x30,0x2F,0x2D,0x2C,0x2A,0x29,0x28,0x26,0x25,0x24,0x23,0x22,0x21,0x20,0x1F,0x1E,0x1D,0x1D,0x1C,0x1C,0x1B,0x1B,0x1A,0x1A,0x1A,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x1A,0x1A,0x1A,0x1B,0x1B,0x1C,0x1C,0x1D,0x1D,0x1E,0x1F,0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x28,0x29, 0x2A,0x2C,0x2D,0x2F,0x30,0x32,0x34,0x35, 0x37,0x39,0x3B,0x3D,0x3F,0x41,0x43,0x45, 0x47,0x49,0x4B,0x4D,0x4F,0x52,0x54,0x56, 0x59,0x5B,0x5D,0x60,0x62,0x65,0x67,0x69, 0x6C,0x6E,0x71,0x73,0x76,0x78,0x7B,0x7D};void delay(unsigned char ms);//延时函数void write_com(unsigned char com); //液晶写指令void write_data(unsigned char dat); // 液晶写数据void LCD1602_init(void) //液晶初始化{delay(15);write_com(0x38);delay(5);write_com(0x38);delay(5);write_com(0x38);write_com(0x38);write_com(0x08);write_com(0x01);write_com(0x06);write_com(0x0c);}void write_com(unsigned char com){E = 0; //复位初始为高电平RS = 0;RW = 0;P1 = com;delay(1);E = 1;delay(1);E = 0;}void write_data(unsigned char dat){E = 0; //复位初始为高电平RS = 1;RW = 0;P1 = dat;delay(1);E = 1;delay(1);E = 0;}void delay(unsigned char ms) // 晶振12MHz {unsigned char i;while(ms--){for(i=0;i<120;i++);}}void fang()//方波{DAC0832=0;delay(pinlv/2);DAC0832=0xff;delay(pinlv/2);}void jvchi()//锯齿波{unsigned char i;for(i=0;i<255;i++){DAC0832=i;delay(pinlv/256);}}void tran()//三角波{unsigned char i;for(i=0;i<255;i++){DAC0832=i;delay(pinlv/256);}for(i=255;i>0;i--){DAC0832=i;delay(pinlv/256);}}void sin()//正弦波{unsigned int i;for(i=0;i<256;i++){DAC0832=table2[i];delay(pinlv/256);}}void main(void)//主函数{IE=0x85; //外部中断设定改变频率TCON=0x05;LCD1602_init();table[0]=pinlv/1000; //计算周期作为输出table[1]=pinlv%1000/100;table[2]=pinlv%100/10;table[3]=pinlv%10;write_com(0x80+0x40); // 设置代写入数据的地址,写1602的第2行。
写出做产生波形的周期for(j=12;j<17;j++){write_data(TAB[ j ]);delay(1);}for(j=0;j<4;j++){write_data(TAB[table[ j ]]);delay(1);}write_data(TAB[10]);//在周期后面加上“MS”write_data(TAB[11]);while(1){if(p20==0) //方波{write_com(0x80); //写1602的第1行,写明产生的波形for(j=11;j<22;j++){write_data(TAB1[j]);}while(p20==0)fang();}if(p21==0){ //锯齿波write_com(0x80); //写1602的第2行?for(j=33;j<44;j++){write_data(TAB1[j]);}while(p21==0)jvchi();}if(p22==0){ // 三角波write_com(0x80); //写1602的第2行?for(j=22;j<33;j++){write_data(TAB1[j]);}while(p22==0)tran();}if(p23==0){ //正弦波write_com(0x80); //写1602的第2行?for(j=0;j<11;j++){write_data(TAB1[j]);}while(p23==0)sin();}}}void int0(void) interrupt 0 //中断0 减频{pinlv=pinlv*2; //频率减半table[0]=pinlv/1000;table[1]=pinlv%1000/100;table[2]=pinlv%100/10;table[3]=pinlv%10;write_com(0x80+0x40);//设置代写入数据的地址,写1602第2行。
for(j=12;j<17;j++){write_data(TAB[ j ]);delay(1);}for(j=0;j<4;j++){write_data(TAB[table[ j ]]);delay(1);}write_data(TAB[10]);write_data(TAB[11]);}void int1(void) interrupt 2 //中断2 加频{pinlv=pinlv/2;table[0]=pinlv/1000;table[1]=pinlv%1000/100;table[2]=pinlv%100/10;table[3]=pinlv%10;write_com(0x80+0x40); //设置代写入数据的地址,写1602第1行。
for(j=12;j<17;j++){write_data(TAB[ j ]);delay(1);}for(j=0;j<4;j++){write_data(TAB[table[ j ]]);delay(1);}write_data(TAB[10]);write_data(TAB[11]);}。