50赫兹同步锯齿波发生器

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;
	}
}
完了哦



猜你喜欢

转载自blog.csdn.net/qq_31131773/article/details/80611438
今日推荐