📄 adandda_intial.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 + -