50赫兹同步锯齿波发生器
一、 任务
利用0832同步输出两个频率为50赫兹的锯齿波(硬件电路参见DA_BUF2_1.DSN)。
二、 设计参考:
① 锯齿波算法:设定时周期为200us,在定时时间到后,将当前DA输出值在前次输出值上增加某固定值(例如1),当20ms累计时间到后,DA输出值清零。
if(TIME<20ms)
DAVAL++ ;
else
DAVAL = 0 ;
OUTPUT(DAVAL);
② 同步输出方法:先分别向2个0832的第1级缓冲寄存器送DA值,然后同时向0832的第2级缓冲寄存器送值(因2个0832的第2级控制信号是并联的),及可实现同步转换输出。
③ 0832地址分配:
1#第1级缓冲寄存器 2000H
2#第1级缓冲寄存器 2400H
第2级缓冲寄存器 3C00H
#include <reg51.h> //宏定义 #define DA1_PreConvert(d) (*((unsigned char volatile xdata *) 0x2000) = d) // #1通道DA预转换(第1级缓冲) #define DA2_PreConvert(d) (*((unsigned char volatile xdata *) 0x2400) = d) // #2通道DA预转换(第1级缓冲) #define DA_Convert() (*((unsigned char volatile xdata *) 0x3C00) = 0) // 所有通道DA转换(第2级缓冲) unsigned char count = 0; unsigned char DA_Val = 0; int num=0; /*********************************************************************** ** 函数名称: main() ** 功 能: 程序入口 ** 入口参数: 无 ** 出口参数: 无 ***********************************************************************/ void main(void) { // 初始化 TMOD = 0x10; TH1 = 0xFF; TL1 = 0x38; // 此处添加中断设置的语句(ET1, PT1, IT1, EX1, PX1) ET1 = 1; PT1 = 0; // 此处添加启动内部定时的语句(TR1) TR1 = 1; // 开中断 EA = 1; // 主循环 while( 1 ) { DA1_PreConvert(DA_Val); DA2_PreConvert(DA_Val); DA_Convert(); } } /*********************************************************************** ** 函数名称: INT_T1() ** 功 能: T1中断服务程序,使用工作寄存器组1 ** 入口参数: 无 ** 出口参数: 无 ***********************************************************************/ void INT_T1() interrupt 3 { TH1 = 0xFF; TL1 = 0x38; count++; DA_Val++; if(count == 100) { DA_Val = 0; count = 0; } }完了哦