⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 adandda_intial.c

📁 电子设计训练课题
💻 C
字号:
#include "common.h"
#include"PCA.h"

sfr16  RCAP2 = 0xca;
sfr16  TMR2=0xcc;
extern bit isnewdata,flag;
extern int kk; 
extern int xdata realvol0[100];
unsigned char temppage;
idata unsigned char temp_Page;
extern	unsigned char Key_Value;
int count=0;
unsigned char number=0;
extern int da;
union tcfint16
{ 
	uint myword;
	struct{uchar hi;uchar low;}bytes;
}myint16;//用联合体定义16位操作

/*	
void DAC1_initial()
{
	SFRPAGE=0x01;
    REF0CN=0x03;
	DAC1CN|=0x80;
} 
*/
/*******************************************************************************/
/*函数说明:定时器2初始化                                                      */
/*******************************************************************************/
void t2_ini()
{
	
	SFRPAGE = 0x00;
	TMR2CF = 0x08;
	TMR2CN = 0x04;             // T2为16bit定时器模式,并启动定时器运行

}

/*******************************************************************************/
/*函数说明:因为是用定时器2益处,中断来启动adc转换                             */
/*入口参数:																   */
/*         t2reload------------------------------------------------定时脉冲数目*/
/*******************************************************************************/
void t2_baud(uint t2reload)
{                            //每隔t2reload个T2时钟,产生一次定时溢出
	SFRPAGE = 0x00;
	RCAP2 =~t2reload+1;      //相当于65536-t2reload
    TMR2  = RCAP2;

}
/*******************************************************************************/
/*函数说明:选择ADC输入的模拟通道    			                               */
/*入口参数:																   */
/*            source--------------------------------为ADC0通道选择(共有9个通道)*/
/*            type-------------------------------配置测量方式为差动还是单端输入*/
/*******************************************************************************/
void adc0_mux(uchar type,uchar source)
{
    SFRPAGE = 0x00;
	AMX0CF=type;     //AIN67IC,AIN45IC,AIN23IC,AIN01IC,0为单端输入。  
	AMX0SL=source;	 //选择AD输入通道的,有9个,其中第9通道是内部温度输入

}

void adc0_ini()
{
    SFRPAGE = 0x00;
	ADC0CF=0x0f;     //ADC0时钟为系统时钟2分频,PGA增益为0.5
	ADC0CN=0x8c;     //AD0TM=0,ADC0为连续跟踪模式,由T2溢出率启动ADC0
              	     //AD0LJST=0,数据存储格式右对齐,即ADC0H存放12bit高四位
	REF0CN&=0x0f;    //AD0VRS=0,ADC0参考电压为VREFA
	REF0CN|=0x07;    //TEMPE=1,内部温度传感器工作	
	/* 
	   REFBE=1,内部参考电平工作,电路部分须将VREF参考输出(C8051F40的第12管脚)与	VREF0(C8051F040的16管脚相连,
	   并最好并联一个4.7uF和0.1uF的旁路电容以电平滤波
	*/
		
	adc0_mux(0x00,0);//PORT3IC=1,ADC0 6、7通道为差动模式
	                 //AIN0.0-AIN0.3均为单端模式
	                 //选择AIN0.3为ADC0转化通道
	EIE2 |= 0x02;    //开ADC0中断
	t2_ini();
	t2_baud(100);   //每隔200个T2时钟产生一次ADC0采样
	SFRPAGE = 0x00;
	TR2=1;
}


void ADC0_ISR() interrupt 15  using 3
{
    SFRPAGE = 0x00;
	AD0INT=0;
	kk=ADC0VAL;
//  kk=ADC0H*256+ADC0L;
  	DAC0=kk;  
//	ad_value=(long)kk*ADJRATESE;
//  temp=(float)ad_value/100000;	
	isnewdata=1;	
}
/*******************************************************************************/
/*函数说明:产生锯齿波形                                                       */
/*******************************************************************************/

void DAC1_initial()
{
	
	SFRPAGE=0x01;
	DAC1L=DAC0L;
    DAC1H=DAC0H;
	REF0CN=0x03;
	DAC1CN|=0x80;
}
void int0_ISR() interrupt 0
{  //外部事件中断处理
	number++;
	if(number==2)
	{
	  flag=1;
	}
	SFRPAGE=temp_Page;
}

void t0ini(){
	EA=0;
	SFRPAGE=0x00;//这条指令很重要,否则以下操作无法写入相应寄存器,与MCS-51略有不同
	IT0=1;// /INT0中断在电平下降沿触发
	IE0=0;// 外部中断/INT0中断标志位清零,/INT0中断中可硬件清零
	EX0=1;//允许/INT0外部事件中断
	EA=1;//开启全局中断
}


void DAC0_initial()
{
	SFRPAGE=0x00;
    REF0CN=0x03;
	DAC0CN|=0x80;
}
 /*************************************************************************************/

 

void t3_ini()
{
	SFRPAGE = 0x01;
	TMR3CF = 0x08;  // T2时钟为系统时钟
	TMR3CN = 0x04;  // 开启T3定时器
    EIE2|=0x01;
    t3_baud(100);   //每隔500 T3时钟更新一次DAC1输出,此时T3尚未启动
	EA=1;
}
void t3_baud(uint t3reload)
{
	SFRPAGE = 0x01;
	RCAP3=65536-t3reload;
	TMR3=RCAP3;

	
}


void T3_ISR() interrupt 14
{                   //T3定时中断,更新DAC1输出,DAC1为锯齿波输出
	TF3=0;

	SFRPAGE=0x01;
	 da++;
	 DAC1=da; 

}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -