单片机程序设计实践教程_第13章_简易数字信号发生器
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第十三讲 简易数字信号发生器
1
13.0 项目演示效果
图XP_13_01 步骤1-插接短接片连接示波器探针
2
图XP_13_02 步骤2-开机后系统默认进入正弦波发生模式3
图XP_13_03 步骤3-系统的三角波发生模式
4
图XP_13_04 步骤4-系统的锯齿波发生模式
5
图XP_13_05 步骤5-系统的方波发生模式
7
13.2 项目任务
图13-1 简易数字信号发生器项目的电路原理图
8
简易数字信号发生器项目的电路原理图如图13-1所示,简易数字信号发生器主 要是借助于DAC0832数模转换芯片来实现。数字量由STC89C52RC给出,通 过DAC0832转换为模拟量并由参考电压Vrbf端输出。通过示波器,可以观测到 由DAC0832的8脚产生的4种波形,这4种波形分别为正弦波、三角波、锯齿波 和方波。 可以通过开发板上的按键S2、S3和S4选择三角波、锯齿波和方波的输出波形, S1、S5~S16为正弦波选择按键,程序应实现按压S1~S16键时,在数码管的1和 2位置显示相应键值。即, 〃按压S1~S16键,数码管1和2位置显示'01',外接端子J3的1脚输出正弦波。 〃按压S2键,数码管1和2位置显示'02',外接端子J3的1脚输出三角波。 〃按压S3键,数码管1和2位置显示'03',外接端子J3的1脚输出锯齿波。 〃按压S4键,数码管1和2位置显示'04',外接端子J3的1脚输出方波。 外接端子J3的1脚输出波形可以通过引入示波器来检测和观察,请读者在项目 实践前准备好示波器。
23
图13-9 DAC0832的8位全0时T型电阻网络等效电路示意图
24
13.6.3 DAC0832总线地址确定
在图13-1所示电路原理图中,三八译码器74HC138的Pin12引 脚输出与DAC0832的nCS引脚相连,74HC138的Pin12引脚为 nY3输出,低电平有效。因此,要求74HC138译码输入端的CBA 编 码 为 011 , 则 STC89C52RC 的 P27 ~ P20 的 值 为 01111111B (7FH),P24~P20悬空应设为1;74HC373的地址引出脚A7~A0 的 选 取 与 DAC0832 的 地 址 确 定 无 关 , 取 值 为 11111111B (FFH),所以DAC0832的地址最终确定为0x7fffH。 由 第 8 章 内 容 可 知 , 对 DAC0832 进 行 总 线 控 制 前 , 必 须 使 STC89C52RC的P16 引脚设为低电平,该信号(CS138)使三八 译码器74HC138被选中。
29
图13-10 简易数字信号发生器项目的正弦波和三角波波形图
DAC0832是8位的D/A转换器,CMOS工艺,芯片内有 R-2R梯形电阻网络,用于对参考电压产生的电流进行分流完成 模数转换,转换结果以一组差动电流IOUT1和IOUT2输出。 以下为DAC0832的主要参数: •分辨率8位。 •D/A转换时间1μs。 •参考电压(Verf)为-10~+10V。 •单电源+5~+15V供电。 •满量程误差为-1~+11LSB,其中1LSB为Vref1/2n(n 是D/A转换的分辨率,此处为8位)。
9
13.3 系统板上硬件连线
简易数字信号发生器项目的连接插线设置见图13-2。
图13-2 简易数字信号发生器项目的连接插线设置
10
13.4 程序流程图
图13-3 简易数字信号发生器项目的C语言程序流程图
11
13.5 C语言源程序(略) 13.6 系统构成和程序分析
13.6.1 DAC0832内部引脚功能和受控方式
6
13.1 项目目标设计
1.掌握DAC0832的工作原理和控制方式; 2.熟练掌握STC89C52RC的总线控制方法; 3.掌握示波器的基本使用方法; 4.理解给出的C语言源程序的结构和各语句所起作用;
5.在达到以上四点目标之后,根据本章“项目扩展任务”
中提出的问题,以组或个人为单位,在规定时间里完成 扩展项目任务。
12
图13-4 DAC0832内部结构和引脚功能
13
DAC0832是20引脚的双列直插式器件【26】,引脚分配如图13-4所示。
各引脚的含义解释如下: •Vref 参考电压输入端,-10~+10V。 •VCC 工作电压输入端,+5~+15V。 •DI7~DI0 数字信号输入,其中DI0为最低位,DI7为最高位。 •IOUT1 模拟电流输出端1,当输入数字为全1时,输出电流最大;全0时,输出 电流为0。为了输出模拟电压,输出端须加I/V(电流/电压)转换电路。 •IOUT2 模拟电流输出端2,规定IOUT1+IOUT2=常数。 •Rfb 片内反馈电阻引脚,与运放配合构成I/V转换电路。 •ILE 输入锁存使能信号输入端,高电平有效。
28
按图13-1给出的原理图,通过引入示波器来观察外接 端子J3的1脚输出波形。给开发板上电后,程序默认是正 弦波输出,图13-10(a)给出了由示波器实测的波形图, 截图显示正弦波的频率在40.65Hz左右,最大幅值为 1.82V,最小为-140mV(包含测量误差),最大幅值 对应数字量FFH,即对应图13-8给出的情况;最小幅值 对应数字量0,对应图13-9给出的情况。 图13-10(b)和图13-11(a)所示分别三角波和锯 齿波截图,频率和幅值情况与正弦波一样。
状态,选通输入寄存器。图13-6给出了输入寄存器工作于受控状态,
17
图13-6 DAC0832的单缓冲控制方式
18
13.6.2 为什么模拟输出电压从参考电压输入端Vref引出
正常情况下,DAC0832转换后的模拟信号由IOUT1和IOUT2引
脚输出,为了得到输出模拟电压,输出端须加I/V转换电路,见图 13-5和图13-6所示。但是图13-1给出的开发板这一部分原理图中 并未采用上面提及的转换电路,而是直接从参考电压输入端Vref引 出了模拟输出电压,这是什么原因呢? 先来看看DAC0832内部是如何进行数模转换的,DAC0832内部 数模转换是由8位T型电阻网络完成的 【26】,其原理图如图13-7所 示。
•nCS 片选信号端,低电平有效。
•nWR1 写信号1端,低电平有效。 •nWR2 写信号2端,低电平有效。
•nXfer 传输控制信号输入端,低电平有效。
来自百度文库14
当ILE为高电平,nCS和nWR1同时为低电平时,8位数字量可 以通过DI0 ~DI7引脚输入寄存器;当nCS或nWR1由低变高时,数 据被锁存在输入寄存器的输出端。 对于DAC寄存器来讲,当nXfer和nWR2 同时为低电平时,DAC 寄存器中的数据与输入寄存器的输出数据一致;当nXfer或nWR2 由低变高时,输入寄存器的数据被锁存在DAC寄存器的输出端,即 可加到D/A转换器去进行转换。 图13-4还给出了DAC0832 内部结构功能图,在DAC0832 内 部有1个8位的输入寄存器和1个8位的DAC寄存器,根据前面给出 的分析,它们可以分别被选通。这样,CPU送来的数据先进入输入 寄存器(由nCS控制),在需要进行D/A转换时,再选通DAC 寄 存器(由nXfer控制),实现D/A转换,这种方式称为双缓冲方式。
19
图13-7 DAC0832的8位T型电阻网络工作原理图
20
由图13-7可以看出,解码网络电阻只有两种,即R和2R,且构 成T型,故又称为R-2RT型电阻网络DAC。其中,S0 ~S7 为模拟 开关,表示了8位二进制数DI0~DI7,当某一位数DIi=1,即表示Si 接1,这时相应电阻上通过电流Ii流向IOUT1;当DIi=0,即表示Si接 0,这时相应电阻上通过电流Ii流向IOUT2。 由于用作分流的电阻网络中各电阻值为R或2R,而IOUT1是流向运 算放大器的反相输入端,其“虚地”可以看作0V。因此,电阻网络 从各节点A、B、C、…、H向右看的二端网络的等效电阻为R,这 与开关Si接0还是接1无关,由任一个节点向右流出去的两个支路电 流Ii和ILi总是相等。 设基准电压源电压为Vref,则总电流为I=Vref/R,则流过各开关 支路(从左到右)的电流分别为I/2、I/4、…、I/128。经过计算 (此处省略),对于在图13-7电路中输入的每一个二进制数,均能 在其输出端Vout得到与之成正比的模拟电压。
25
13.6.4 定时器0和外部中断1的关系
在3.1小节和10.6小节中,已经对外部中断1的概念和程序进行 了详尽地介绍和分析,本项目中的外部中断1同样是用来检测由 ZLG7290发出的按键中断信号,当矩阵键盘中的任一键被按下时, ZLG7290不但能够记录键值,而且还发出按键中断信号,请读者 复习相关内容。 void time_t0() interrupt 1函数是定时器T0的中断服务子程序, 主要完成4个波形选择和采样计数的任务,定时时间间隔(装入值) 为: 装入值=65536-要计算的脉冲数。
26
对于程序中的TH0=(65536-div_value)/256,当div_value= 70时,16位定时器就是从(65536-70)=65466开始自加,加到 65536就计满,如果允许定时器中断,就会产生定时器T0的中断, 所以16位方式装入值的计算很简单。开发板的机器周期是12/晶振 值,如果外接晶振是12MHZ,那么机器周期是1μs,开发板的外接 晶振实际上是11.0592MHZ,机器周期是1.1μs左右,所以定时时 间间隔大约是77us,由于这个原因,用单片机自己的定时器做数 字钟设计,并不能准确计时,这里用11.0592MHZ的晶振主要是 为了串行通信中便于产生所需波特率。
27
13.6.5 项目结果分析
在本项目中用到了外部中断1和定时器T0的中断,外部中断1服 务子程序void INT1_SVC() interrupt 2中的2代表在MCS-51单片 机中外部中断1的优先级为第2级;同样,对于定时器T0中断服务 子程序中的1来说,就代表优先级为第1级。因此,定时器T0可以 打断外部中断1的正常执行而进行嵌套运行,而外部中断1却不能打 断定时器T0的运行。 这一点在将程序中的div_value值减小后将会显现。实验表明, 当div_value=50时,定时器T0中断间隔减小,加上定时器T0中断 服务程序的运行时间,4×4键盘所产生的外部中断1很难找到时间 使得CPU对其进行处理,几乎所有的系统资源都被定时器T0所占用, 有兴趣的读者可以修改给出的C语言程序源代码,观察开发板会出 现何种现象。
21
图13-8 DAC0832的8位全1时T型电阻网络等效电路示意图
22
在分析完DAC0832的内部解码原理之后,接着讨论图13-1给出 的DAC0832外部接法原理。按照开发板上的接法,讨论两个极端 的情况,即给出数字量FFH和0,对于前一种情况,实际上T型电 阻网络的8位二进制数DI0~DI7都为1,这时所有开关Si都接1,等 效电路见图13-8,反馈电阻Rfb与外接电阻R9并联,一端接电源 VCC,另一端接R10和其它8个2R电阻的一端,由电路分析【27】中 的基尔霍夫电流定律可以算出H点电流和电压值,该点电压即为 Vref输出电压值,此时为最大输出值。 当数字量为0时,所有开关Si都接0,等效电路见图13-9。此时 除了外接电阻R9、R10和反馈电阻Rfb中有电流流过之外,T型电阻 网络内无电流流过,因此H点电压值为0。 数字量FFH~0之间的电压输出呈线型变化,数字量中间值的T型 电阻网络原理图分析请读者自行完成。
15
图13-5 DAC0832的双缓冲控制方式
16
如图13-5为DAC0832的双缓冲控制方式构成示意图,地址译码
可以由74HC138来实现,当CS0832A和CS0832B片选信号被分 别给出,即可实现双缓冲控制方式。 DAC0832也可以工作在单缓冲方式,这种方式下可将输入寄存 器设为直通状态,选通DAC 寄存器;也可将DAC寄存器设为直通 DAC寄存器工作于直通状态的单缓冲控制方式,对照图13-1可以 看出PMY单片机开发板即采用了上述单缓冲控制方式。
1
13.0 项目演示效果
图XP_13_01 步骤1-插接短接片连接示波器探针
2
图XP_13_02 步骤2-开机后系统默认进入正弦波发生模式3
图XP_13_03 步骤3-系统的三角波发生模式
4
图XP_13_04 步骤4-系统的锯齿波发生模式
5
图XP_13_05 步骤5-系统的方波发生模式
7
13.2 项目任务
图13-1 简易数字信号发生器项目的电路原理图
8
简易数字信号发生器项目的电路原理图如图13-1所示,简易数字信号发生器主 要是借助于DAC0832数模转换芯片来实现。数字量由STC89C52RC给出,通 过DAC0832转换为模拟量并由参考电压Vrbf端输出。通过示波器,可以观测到 由DAC0832的8脚产生的4种波形,这4种波形分别为正弦波、三角波、锯齿波 和方波。 可以通过开发板上的按键S2、S3和S4选择三角波、锯齿波和方波的输出波形, S1、S5~S16为正弦波选择按键,程序应实现按压S1~S16键时,在数码管的1和 2位置显示相应键值。即, 〃按压S1~S16键,数码管1和2位置显示'01',外接端子J3的1脚输出正弦波。 〃按压S2键,数码管1和2位置显示'02',外接端子J3的1脚输出三角波。 〃按压S3键,数码管1和2位置显示'03',外接端子J3的1脚输出锯齿波。 〃按压S4键,数码管1和2位置显示'04',外接端子J3的1脚输出方波。 外接端子J3的1脚输出波形可以通过引入示波器来检测和观察,请读者在项目 实践前准备好示波器。
23
图13-9 DAC0832的8位全0时T型电阻网络等效电路示意图
24
13.6.3 DAC0832总线地址确定
在图13-1所示电路原理图中,三八译码器74HC138的Pin12引 脚输出与DAC0832的nCS引脚相连,74HC138的Pin12引脚为 nY3输出,低电平有效。因此,要求74HC138译码输入端的CBA 编 码 为 011 , 则 STC89C52RC 的 P27 ~ P20 的 值 为 01111111B (7FH),P24~P20悬空应设为1;74HC373的地址引出脚A7~A0 的 选 取 与 DAC0832 的 地 址 确 定 无 关 , 取 值 为 11111111B (FFH),所以DAC0832的地址最终确定为0x7fffH。 由 第 8 章 内 容 可 知 , 对 DAC0832 进 行 总 线 控 制 前 , 必 须 使 STC89C52RC的P16 引脚设为低电平,该信号(CS138)使三八 译码器74HC138被选中。
29
图13-10 简易数字信号发生器项目的正弦波和三角波波形图
DAC0832是8位的D/A转换器,CMOS工艺,芯片内有 R-2R梯形电阻网络,用于对参考电压产生的电流进行分流完成 模数转换,转换结果以一组差动电流IOUT1和IOUT2输出。 以下为DAC0832的主要参数: •分辨率8位。 •D/A转换时间1μs。 •参考电压(Verf)为-10~+10V。 •单电源+5~+15V供电。 •满量程误差为-1~+11LSB,其中1LSB为Vref1/2n(n 是D/A转换的分辨率,此处为8位)。
9
13.3 系统板上硬件连线
简易数字信号发生器项目的连接插线设置见图13-2。
图13-2 简易数字信号发生器项目的连接插线设置
10
13.4 程序流程图
图13-3 简易数字信号发生器项目的C语言程序流程图
11
13.5 C语言源程序(略) 13.6 系统构成和程序分析
13.6.1 DAC0832内部引脚功能和受控方式
6
13.1 项目目标设计
1.掌握DAC0832的工作原理和控制方式; 2.熟练掌握STC89C52RC的总线控制方法; 3.掌握示波器的基本使用方法; 4.理解给出的C语言源程序的结构和各语句所起作用;
5.在达到以上四点目标之后,根据本章“项目扩展任务”
中提出的问题,以组或个人为单位,在规定时间里完成 扩展项目任务。
12
图13-4 DAC0832内部结构和引脚功能
13
DAC0832是20引脚的双列直插式器件【26】,引脚分配如图13-4所示。
各引脚的含义解释如下: •Vref 参考电压输入端,-10~+10V。 •VCC 工作电压输入端,+5~+15V。 •DI7~DI0 数字信号输入,其中DI0为最低位,DI7为最高位。 •IOUT1 模拟电流输出端1,当输入数字为全1时,输出电流最大;全0时,输出 电流为0。为了输出模拟电压,输出端须加I/V(电流/电压)转换电路。 •IOUT2 模拟电流输出端2,规定IOUT1+IOUT2=常数。 •Rfb 片内反馈电阻引脚,与运放配合构成I/V转换电路。 •ILE 输入锁存使能信号输入端,高电平有效。
28
按图13-1给出的原理图,通过引入示波器来观察外接 端子J3的1脚输出波形。给开发板上电后,程序默认是正 弦波输出,图13-10(a)给出了由示波器实测的波形图, 截图显示正弦波的频率在40.65Hz左右,最大幅值为 1.82V,最小为-140mV(包含测量误差),最大幅值 对应数字量FFH,即对应图13-8给出的情况;最小幅值 对应数字量0,对应图13-9给出的情况。 图13-10(b)和图13-11(a)所示分别三角波和锯 齿波截图,频率和幅值情况与正弦波一样。
状态,选通输入寄存器。图13-6给出了输入寄存器工作于受控状态,
17
图13-6 DAC0832的单缓冲控制方式
18
13.6.2 为什么模拟输出电压从参考电压输入端Vref引出
正常情况下,DAC0832转换后的模拟信号由IOUT1和IOUT2引
脚输出,为了得到输出模拟电压,输出端须加I/V转换电路,见图 13-5和图13-6所示。但是图13-1给出的开发板这一部分原理图中 并未采用上面提及的转换电路,而是直接从参考电压输入端Vref引 出了模拟输出电压,这是什么原因呢? 先来看看DAC0832内部是如何进行数模转换的,DAC0832内部 数模转换是由8位T型电阻网络完成的 【26】,其原理图如图13-7所 示。
•nCS 片选信号端,低电平有效。
•nWR1 写信号1端,低电平有效。 •nWR2 写信号2端,低电平有效。
•nXfer 传输控制信号输入端,低电平有效。
来自百度文库14
当ILE为高电平,nCS和nWR1同时为低电平时,8位数字量可 以通过DI0 ~DI7引脚输入寄存器;当nCS或nWR1由低变高时,数 据被锁存在输入寄存器的输出端。 对于DAC寄存器来讲,当nXfer和nWR2 同时为低电平时,DAC 寄存器中的数据与输入寄存器的输出数据一致;当nXfer或nWR2 由低变高时,输入寄存器的数据被锁存在DAC寄存器的输出端,即 可加到D/A转换器去进行转换。 图13-4还给出了DAC0832 内部结构功能图,在DAC0832 内 部有1个8位的输入寄存器和1个8位的DAC寄存器,根据前面给出 的分析,它们可以分别被选通。这样,CPU送来的数据先进入输入 寄存器(由nCS控制),在需要进行D/A转换时,再选通DAC 寄 存器(由nXfer控制),实现D/A转换,这种方式称为双缓冲方式。
19
图13-7 DAC0832的8位T型电阻网络工作原理图
20
由图13-7可以看出,解码网络电阻只有两种,即R和2R,且构 成T型,故又称为R-2RT型电阻网络DAC。其中,S0 ~S7 为模拟 开关,表示了8位二进制数DI0~DI7,当某一位数DIi=1,即表示Si 接1,这时相应电阻上通过电流Ii流向IOUT1;当DIi=0,即表示Si接 0,这时相应电阻上通过电流Ii流向IOUT2。 由于用作分流的电阻网络中各电阻值为R或2R,而IOUT1是流向运 算放大器的反相输入端,其“虚地”可以看作0V。因此,电阻网络 从各节点A、B、C、…、H向右看的二端网络的等效电阻为R,这 与开关Si接0还是接1无关,由任一个节点向右流出去的两个支路电 流Ii和ILi总是相等。 设基准电压源电压为Vref,则总电流为I=Vref/R,则流过各开关 支路(从左到右)的电流分别为I/2、I/4、…、I/128。经过计算 (此处省略),对于在图13-7电路中输入的每一个二进制数,均能 在其输出端Vout得到与之成正比的模拟电压。
25
13.6.4 定时器0和外部中断1的关系
在3.1小节和10.6小节中,已经对外部中断1的概念和程序进行 了详尽地介绍和分析,本项目中的外部中断1同样是用来检测由 ZLG7290发出的按键中断信号,当矩阵键盘中的任一键被按下时, ZLG7290不但能够记录键值,而且还发出按键中断信号,请读者 复习相关内容。 void time_t0() interrupt 1函数是定时器T0的中断服务子程序, 主要完成4个波形选择和采样计数的任务,定时时间间隔(装入值) 为: 装入值=65536-要计算的脉冲数。
26
对于程序中的TH0=(65536-div_value)/256,当div_value= 70时,16位定时器就是从(65536-70)=65466开始自加,加到 65536就计满,如果允许定时器中断,就会产生定时器T0的中断, 所以16位方式装入值的计算很简单。开发板的机器周期是12/晶振 值,如果外接晶振是12MHZ,那么机器周期是1μs,开发板的外接 晶振实际上是11.0592MHZ,机器周期是1.1μs左右,所以定时时 间间隔大约是77us,由于这个原因,用单片机自己的定时器做数 字钟设计,并不能准确计时,这里用11.0592MHZ的晶振主要是 为了串行通信中便于产生所需波特率。
27
13.6.5 项目结果分析
在本项目中用到了外部中断1和定时器T0的中断,外部中断1服 务子程序void INT1_SVC() interrupt 2中的2代表在MCS-51单片 机中外部中断1的优先级为第2级;同样,对于定时器T0中断服务 子程序中的1来说,就代表优先级为第1级。因此,定时器T0可以 打断外部中断1的正常执行而进行嵌套运行,而外部中断1却不能打 断定时器T0的运行。 这一点在将程序中的div_value值减小后将会显现。实验表明, 当div_value=50时,定时器T0中断间隔减小,加上定时器T0中断 服务程序的运行时间,4×4键盘所产生的外部中断1很难找到时间 使得CPU对其进行处理,几乎所有的系统资源都被定时器T0所占用, 有兴趣的读者可以修改给出的C语言程序源代码,观察开发板会出 现何种现象。
21
图13-8 DAC0832的8位全1时T型电阻网络等效电路示意图
22
在分析完DAC0832的内部解码原理之后,接着讨论图13-1给出 的DAC0832外部接法原理。按照开发板上的接法,讨论两个极端 的情况,即给出数字量FFH和0,对于前一种情况,实际上T型电 阻网络的8位二进制数DI0~DI7都为1,这时所有开关Si都接1,等 效电路见图13-8,反馈电阻Rfb与外接电阻R9并联,一端接电源 VCC,另一端接R10和其它8个2R电阻的一端,由电路分析【27】中 的基尔霍夫电流定律可以算出H点电流和电压值,该点电压即为 Vref输出电压值,此时为最大输出值。 当数字量为0时,所有开关Si都接0,等效电路见图13-9。此时 除了外接电阻R9、R10和反馈电阻Rfb中有电流流过之外,T型电阻 网络内无电流流过,因此H点电压值为0。 数字量FFH~0之间的电压输出呈线型变化,数字量中间值的T型 电阻网络原理图分析请读者自行完成。
15
图13-5 DAC0832的双缓冲控制方式
16
如图13-5为DAC0832的双缓冲控制方式构成示意图,地址译码
可以由74HC138来实现,当CS0832A和CS0832B片选信号被分 别给出,即可实现双缓冲控制方式。 DAC0832也可以工作在单缓冲方式,这种方式下可将输入寄存 器设为直通状态,选通DAC 寄存器;也可将DAC寄存器设为直通 DAC寄存器工作于直通状态的单缓冲控制方式,对照图13-1可以 看出PMY单片机开发板即采用了上述单缓冲控制方式。