摘 要
各种各样的信号是通信领域的重要组成部分,其中正弦波、三角波和方波等是较为常见的信号。在科学研究及教学实验中常常需要这几种信号的发生装置。为了实验、研究方便,研制一种灵活适用、功能齐全、使用方便的信号源是十分必要的。本文介绍的是利用AT89C51单片机和数模转换器件DAC0832产生所需不同信号的低频信号源,其信号幅度和频率都是可以按要求控制的。文中简要介绍了DAC0832数模转换器的结构原理和使用方法,AT89C51的基础理论,以及与设计电路有关的各种芯片。根据对课程设计的要求,文中着重介绍了如何利用单片机控制D/A转换器产生上述信号的硬件电路和软件编程。信号频率幅度也按要求可调。本次关于产生不同低频信号的信号源的设计方案,不仅在理论和实践上都能满足实验的要求,而且具有很强的可行性。该信号源的特点是:体积小、价格低廉、性能稳定、实现方便、功能齐全。
1 绪论
信号发生器是一类非常重要的电子仪器,在做实验、进行产品研制和调试以及系统测试中都是必不可少的,而一般的信号发生器是由硬件组成的,它的输出频率范围宽,各项指标高,性能优良,因而在对输出波形要求较高的地方被广泛采用。这种仪器的缺点是电路复杂,成本高,输出波形种类不多,不够灵活。在对波形指标要求不高、频率要求较低的场合,可以用单片机构成一个波形发生器,产生所需要的各种波形.这样的函数发生器靠软件产生各种波形,小巧灵活,便于修改,且成本低廉,容易实现。但受单片机工作频率的限制,它所构成的波形发生器的输出频率较低,各项指标也都不太高,只能用于对波形要求不高的场合。
2 系统主要硬件设计 2.1硬件电路构成
本电路的核心部件是 AT89C51 单片机, 此芯片是美国 ATMEL公司生产的低电压、高性能 CMOS 8 位单片机, 具有丰富的内部资源:4kB闪存、 128BRAM、 32 根 I/O口线、 2 个 16 位定时 / 计数器、 5 个向量两级中断结构、 2 个全双工的串行口, 具有 4.25~5.50V的电压工作范围和 0~24MHz工作频率, 使用 AT89C51 单片机时无须外扩存储器。另一主要部件是 DAC0832, 此芯片是 8 位分辨率 D/A转换集成芯片,与处理器完全兼容, 其价格低廉, 接口简单, 转换控制容易等优点, 因此在单片机应用系统中得到了广泛的应用。KA324 是四路独立的集成差分放大器。
图l 波形发生器的电路图
2.2 AT89C51单片机
由图2可见,在这一块芯片上,集成了一台微型计算机的主要组成部分,其中包括CPU、存储器、可编程I/O口、定时器/计数器、串行口等,各部分通过内部总线相连。下面介绍几个主要部分。
图2 AT89C51 功能方块图
1.管脚说明
ATMEL公司的AT89C51是一种高效微控制器。采用40引脚双列直插封装形式。AT89C51单片机是高性能单片机,因为受引脚数目的限制,所以有不少引脚具有第二功能。
VCC:供电电压。
GND:接地。
P0口:P0口为一个8位漏级开路双向I/O口,每脚可吸收8TTL门电流。当P1口的管脚第一次写1时,被定义为高阻输入。P0能够用于外部程序数据存储器,它可以被定义为数据/地址的第八位。在FIASH编程时,P0 口作为原码输入口,当FIASH进行校验时,P0输出原码,此时P0外部必须被拉高。
P1口:P1口是一个内部提供上拉电阻的8位双向I/O口,P1口缓冲器能接收输出4TTL门电流。P1口管脚写入1后,被内部上拉为高,可用作输入,P1口被外部下拉为低电平时,将输出电流,这是由于内部上拉的缘故。在FLASH编程和校验时,P1口作为第八位地址接收。
P2口:P2口为一个内部上拉电阻的8位双向I/O口,P2口缓冲器可接收,输出4个TTL门电流,当P2口被写“1”时,其管脚被内部上拉电阻拉高,且作为输入。并因此作为输入时,P2口的管脚被外部拉低,将输出电流。这是由于内部上拉的缘故。P2口当用于外部程序存储器或16位地址外部数据存储器进行存取时,P2口输出地址的高八位。在给出地址“1”时,它利用内部上拉优势,当对外部八位地址数据存储器进行读写时,P2口输出其特殊功能寄存器的内容。P2口在FLASH编程和校验时接收高八位地址信号和控制信号。
P3口:P3口管脚是8个带内部上拉电阻的双向I/O口,可接收输出4个TTL门电流。当P3口写入“1”后,它们被内部上拉为高电平,并用作输入。作为输入,由于外部下拉为低电平,P3口将输出电流(ILL)这是由于上拉的缘故。
P3口也可作为AT89C51的一些特殊功能口,如下表所示:
P3.0 RXD(串行输入口)
P3.1 TXD(串行输出口)
P3.2 /INT0(外部中断0)
P3.3 /INT1(外部中断1)
P3.4 T0(记时器0外部输入)
P3.5 T1(记时器1外部输入)
P3.6 /WR(外部数据存储器写选通)
P3.7 /RD(外部数据存储器读选通)
P3口同时为闪烁编程和编程校验接收一些控制信号。
RST:复位输入。当振荡器复位器件时,要保持RST脚两个机器周期的高电平时间。
ALE/PROG:当访问外部存储器时,地址锁存允许的输出电平用于锁存地址的地位字节。在FLASH编程期间,此引脚用于输入编程脉冲。在平时,ALE端以不变的频率周期输出正脉冲信号,此频率为振荡器频率的1/6。因此它可用作对外部输出的脉冲或用于定时目的。然而要注意的是:每当用作外部数据存储器时,将跳过一个ALE脉冲。如想禁止ALE的输出可在SFR8EH地址上置0。此时, ALE只有在执行MOVX,MOVC指令是ALE才起作用。另外,该引脚被略微拉高。如果微处理器在外部执行状态ALE禁止,置位无效。
PSEN:外部程序存储器的选通信号。在由外部程序存储器取指期间,每个机器周期两次/PSEN有效。但在访问外部数据存储器时,这两次有效的/PSEN信号将不出现。
EA/VPP:当/EA保持低电平时,则在此期间外部程序存储器(0000H-FFFFH),不管是否有内部程序存储器。注意加密方式1时,/EA将内部锁定为RESET;当/EA端保持高电平时,此间内部程序存储器。在FLASH编程期间,此引脚也用于施加12V编程电源(VPP)。
XTAL1:反向振荡放大器的输入及内部时钟工作电路的输入。
XTAL2:来自反向振荡器的输出。
3.振荡器特性:
XTAL1和XTAL2分别为反向放大器的输入和输出。该反向放大器可以配置为片内振荡器。石晶振荡和陶瓷振荡均可采用。如采用外部时钟源驱动器件,XTAL2应不接。有余输入至内部时钟信号要通过一个二分频触发器,因此对外部时钟信号的脉宽无任何要求,但必须保证脉冲的高低电平要求的宽度。
4.芯片擦除:
整个PEROM阵列和三个锁定位的电擦除可通过正确的控制信号组合,并保持ALE管脚处于低电平10ms 来完成。在芯片擦操作中,代码阵列全被写“1”且在任何非空存储字节被重复编程以前,该操作必须被执行。
此外,AT89C51设有稳态逻辑,可以在低到零频率的条件下静态逻辑,支持两种软件可选的掉电模式。在闲置模式下,CPU停止工作。但RAM,定时器,计数器,串口和中断系统仍在工作。在掉电模式下,保存RAM的内容并且冻结振荡器,禁止所用其他芯片功能,直到下一个硬件复位为止。
2.3 DAC0832转换电路设计
DAC0832芯片是8位D/A转换器芯片,转换时间为1 us。DAC0832输出为电流信号,因此需要外接运算发大器,才能得到模拟的电压输出。其内部哟两级锁存器:第一级为输入锁存器,第二级为DAC寄存器。由于芯片内有两级输入寄存器,使DAC0832具备双缓冲、单缓冲和直通三种输入方式,可通过一个高输入阻抗的线性运算放大器实现模拟信号的输出,同时还可以采集下一个数据,以便适于各种电路的需要,这样可以有效的提高转速和效率。
图3 D/A转换电路图
2.4 时钟电路的设计
XTAL1和XTAL2分别为反向放大器的输入和输出。该反向放大器可以配置为片内振荡器。石晶振荡和陶瓷振荡均可采用。如采用外部时钟源驱动器件,XTAL2应不接。
因为一个机器周期含有6个状态周期,而每个状态周期为2个振荡周期,所以一个机器周期共有12个振荡周期,如果外接石英晶体振荡器的振荡频率为12MHZ,一个振荡周期为1/12us,故而一个机器周期为1us[5]。如图4所示为时钟电路。
图4 时钟电路图
2.5 复位电路的设计
复位电路设计的核心是:在振荡器运行时,保证AT89C51的RST引脚上出现10ms以上稳定的高电平,这样可以使AT89C51可靠地复位。复位方法一般有上电自动复位和外部按键手动复位,单片机在时钟电路工作以后, 在RESET端持续给出2个机器周期的高电平时就可以完成复位操作。例如使用晶振频率为12MHz时,则复位信号持续时间应不小于2us。本设计采用的是外部手动按键复位电路。如图5示为复位电路。
图5 复位电路图
3 系统软件设计 3.1总体软件设计
1.软件主流程图如图6所示。
图6 主程序流程图
2.中断服务子程序流程图如图7所示。
图7 中断服务子程序流程图
3.2主程序设计
ORG 0000H
LJMP MAIN
ORG 0003H
LJMP CT0
ORG 0013H
LJMP CT1
ORG 0100H
MAIN:
KEYFDATA10 DATA 27H
KEYFDATA11 DATA 28H
KEYFDATA1 DATA 29H
KEYFDATA2 DATA 3AH
KEYADATA3 DATA 2BH
KEYNAME DATA 2CH
MOV P1 , #11100000B
PSUH PSW
MOV R7 ,#10H
LOOP1;MOV R6 ,#30H
LOOP2:DJNZ R6 LOOP2
DJNZ R7 LOOP1
POP PSW
MOV P1, #00000000B
MOV DPTR ,#8300H
MOV A,#10001001B
MOVX @DPTR,A
MOV R2,#05H
MOV DPTR ,#8100H
MOV A,#OOH
MOV R3,10H
LOOP:
MOVX @DPTR,A
ADD A,R3
DJNZ R2 LOOP
MOV DPTR ,#8200H
MOV A,#00001111B
MOVX @DPTR ,A
CLR ITO ;中断初始化
MOV A, IPH
ANL A ,#11111110B
ORL A , #00000001B
MOV IPH ,A
CLR PXO
SETB EXO
SETB EA
CLR IT1
MOV A,IPH
ANL A, #11111110B
ORL A, #00000001B
MOV IPH ,A
SETB PX1
SETB EX1
SETE EA
START:
MOX A ,#00000000B
MOV P1 ,A
PSUH PSW
SETB RS0
CLR RS1
MOV R7 ,#10H
LOOP3: MOV R6 ,#30H
LOOP4: DJNZ R6 LOOP4
DJNZ R7 LOOP3
POP PSW
MOV P1 ,A
XRL A.#00H
JZ STARD
XRL A ,#00000001B
JZ SQUAR
XRL A,#00000010B
JZ SINE
XRL A ,#00000100B
JZ RECT
LJMP ATRART
3.3子程序设计
1.正弦波发生子程序如下:
MOV DPTR,#SINTAB ;正弦表写入内部RAM6DH-7FH
MOV R0,#6DH
LOOP: CLR A
MOVC A,@A+DPTR
MOV @R0,A
INC DPTR
INC R0
CJNE R0,#80H,LOOP
MOV DPTR,#7FFFH ;设置D/A转换器的端口地址
MOV R0,#6DH ;设置正弦表指针
LOOP1: MOV A,@R0 ;查表
MOVX @DPTR,A ;D/A转换
ACALL DELAY ;延时,等待转换结束
DEC R0 ;正弦表位移量增量
CJNE R0 #6DH,LOOP1 ;第一象限输出完?
LOOP2: MOV A,@R0 ;查表
MOVX @DPTR,A ;D/A转换
ALCALL DELAY ;延时,等待转换结束
DEC R0 ;正弦表位移量减量
CJNE R0 #6DH,LOOP2 ;第二象限输出完?
LOOP3: MOV A,@R0 ;查表
CPLA ;表值取反
MOVX @DPTR,A ;D/A转换
ACLALL DELAY ;延时,等待转换结束
INC R0 ;正弦表位移量增量
CJNE R0,#7FH,LOOP3 ;第三象限输出完?
LOOP4:MOV A,@R0 ;查表
CPL A ;表值取反
MOVX @DPTR,A ;D/A转换
ALCALL DELAY ;延时,等待转换结束
DEC R0 ;正弦表位移量减量
CJNE R0,#6DH,LOOP4 ;第四象限输出完?
SJMP LOOP1
DELAY:MOV R7,#200 ; 延时50ms
DEL1:MOVR6,#123
NOP
DEL2:DJNZ R6,DEL2
DJNZ R7,DEL1
RET
SINTAB: DB 7FH,89H,94H,9FH,0AAH,0B4H,0C8H,0D1H,0D9H
DB 0E0H,0E7H,0EDH,0F2H,0F7H,0FAH,0FCH,,OFEH,0FFH
END
2.锯齿波发生子程序如下:
MOV DPTR,#7FFFH ;端口地址7FFFH—间址寄存器
MOV R7,#0 ;R7为0
DASAW:MOV A,R7 ;A清零
MOVX @DPTR,A ;写RAM
INC R7 ;R7寄存器加一
NOP ;空操作
NOP
NOP
SJMP DASAW ;转移
END
3.方波发生子程序:
MOV DPTR,#7FFFH ; 设置D/A转换器的端口地址
MOV R7,#FFH ;将#FFH送R7
FANGB:MOV A,R7 ;给A赋值
MOVX @DPTR,A ;写RAM
ACALL DELAY ;调用延时子程序
CPL A ;A取反
MOVX @DPTR,A ;写RAM
ACALL DELAY ;调用延时子程序
SJMP FANGB ;返回FANGB
DELAY:MOV R7,#200 ; 延时50ms
DEL1:MOVR6,#123
NOP
DEL2:DJNZ R6,DEL2
DJNZ R7,DEL1
RET
END ; 程序结束
4.三角波发生子程序如下:
MOV DPTR,#7FFFH ; 设置D/A转换器的端口地址
L1:MOV R7,#00H ;A清零
MOV A,R7
L2: MOVX @DPTR,A ;写外部存储器
NOP ;延时
NOP
NOP
INC A ;A加1
JNZ L1 ;不等与零则转L1
L3: MOVX @DPTR,A ;写外部存储器
结 论
信号发生器是一种能产生标准信号的电子仪器,是工业生产和电工、电子实验中经常使用的电子仪器之一。信号发生器种类较多,性能各有差别,但它们都可以产生不同频率的正弦波、调幅波调频波信号,以及各种频率的正弦波、方波、三角波、锯齿波等。本课程设计在AT89C51单片机的基础上,通过对时钟电路,复位电路,DAC0832转换电路的设计实现了正弦波、方波、三角波、锯齿波的输出,达到了设计的目的。