📄 c8051f350.c
字号:
/************************************************************************************
* Copyright (c) 2007,Hangzhou Fenghe Shiyou Electronics Co.,Ltd
* All rights reserved.
* name: MAIN.C
* applicable component: C8051F350
* author: caixinlin
* edition: C
* amend data: 2007年8月18日
* complete data: 2007年月日
* 程序运行效果: 浅侧向调试,屏蔽深侧向 模拟电阻率0.2 1.0 2.0 5.0 10 20 50 100 200 1000,无穷大
都控制在3.536-3.746
深侧向调试,屏蔽深侧向 模拟电阻率0.2 1.0 2.0 5.0 10 20 50 100 200 1000,无穷大
都控制在3.487-3.556
输入波动太大,希望平滑上升或下降。控制速度比较慢
解决:电阻率将为50时,电流值超过5V的情况
*************************************************************************************/
#include "C8051F350.h"
#include "STDIO.h"
#include "math.h"
#include "string.h"
/*全局常量定义*/
#define uchar unsigned char
#define uint unsigned int
#define ul unsigned long
#define a 8
#define N 8
// #define k 89
// #define k_lld 89
// #define k_lls 126
#define c 300
#define b 300
#define e_h_area 2440
#define e_l_area 6
#define i_h_area 2440
#define i_l_area 6
ul data ADC[4];
ul data ADt[4];
ul data DATA_lld;
ul data DATA_lld_out;
uchar data X;
ul data DATA_lls;
ul data DATA_lls_out;
uint data ABSA;
uint data ABSB;
bit lab_d; // lld 阈值
bit lab_s; // lls 阈值
bit XXD; // lld dac current control (1:2.0mA 0:0.25mA)
bit XXS; // lls dac current control (1:2.0mA 0:0.25mA)
void DelayMs(uint n);
void SYSCLK_Init (void);
void PORT_Init (void); // I/O端口初始化
void ADC0_Init (void); // ADC0初始化
void DAC_Init (void); // DAC初始化
void ADC0_Conver (void);
void DAC0_Out_mV(uint v);
void DAC1_Out_mV(uint v);
void t0_ini();
void t0_rst();
void DelayMs(uint n) //delay
{uint i;
for(; n > 0; n--)
{for(i = 400; i > 0; i--);}
}
void SysClk_Init(void) // 配置系统时钟
{OSCICN = 0x82; // enable intosc SYSCLK=12.25MHZ
CLKSEL = 0x00; // select intosc as sysclk source
}
void System_Init (void) // 配置系统时钟
{ VDM0CN = 0x81; // enable VDD monitor
RSTSRC = 0x02; // enable VDD monitor reset sources
ADC0CN = 0x00; // 单极性 PGA=1
}
void PORT_Init (void)
{ P0MDIN = 0x00; // P0 全部设置为模拟输入P0MDIN= 0xF3;//P0.2 P0.3设置模拟输入
P1MDIN = 0x03; // P1.6 P1.7设置模拟输入 P1.0 P1.1设置数字输入
P0MDOUT = 0x00; // P0.4设置输出
P1MDOUT = 0xC0; // P1.6,P1.7设置为推挽方式(输出)P1MDOUT = 0x30;//P1.4 P1.5设置输出
P0SKIP = 0x0C; // P0全部跳过 P0SKIP= 0x0C;//跳过P0.2 P0.3
P1SKIP = 0XC0; // P1.6 P1.7跳过
XBR0 = 0x00; // UART TX0, RX0 连到端口引脚 P0.4 和 P0.5
XBR1 = 0x00; // T0连到端口引脚
}
//-----------------------------------------------------------------------------
// ADC0_Init extVREF Unipolar AIN0.0-AIN0.3
//-----------------------------------------------------------------------------
// This function initializes the ADC to measure across AIN0.0 and AIN0.3
// on the Target Board (Differential measurements, Unipolar codes)
void ADC0_Init (void)
{ //EA=0;
ADC0MD |= 0x81; // 全内部校准(偏移、斜率)
while (!AD0CALC); // 等待校准完成
DelayMs(2);
REF0CN |= 0x03; // (enable internal vref) 内部振荡器偏压,内部基准偏压 被使能 |:位或
// 内部振荡器偏压使能位由内部振荡器使能位决定
ADC0CN = 0x00; // 单极性 PGA=1
ADC0CF = 0x00; // interrupts upon SINC3 filter output and uses internal VREF ADC0CF:ADC0配置寄存器
// SINC3滤波器 使能内部电压基准(2.5V)
ADC0CLK= 4; // MDCLK = SYSCLK / (ADC0CLK + 1) MDCLK =2.4576MHZ
ADC0MD = 0x80; // 使能ADC0 ADC0=空闲模式 可以进行校准或转换
ADC0MUX= 0x08; // 选择AIN0作为ADC
ADC0DECL = 0X50; // set slowest OWR
ADC0DECH = 0X00; // set slowest OWR
ADC0STA = 0x00; // 清ADC0状态寄存器
EIE1 &= ~0x08; // 禁止ADC0中断(查询采样时使用)
// EA=1;
}
void DAC_Init(void) // DAC初始化;
{ REF0CN = 0x03; // 使用内部VREF发生器
IDA0CN = 0xF3; // 打开DAC0,设置模式 写IDA0触发DAC输出更新 满度输出电流2.0mA
IDA1CN = 0xF3; // 打开DAC1,设置模式,从VDD吸取的电流与IDA1输出字有关
}
void ADC0_Conver (void)
{ ul temp;
uchar i,j,n;
ul voltage;
for(j=0;j<N;j++)
{ for(i=0;i<4;i++)
{n = i<<4;
n &= 0xf0;
ADC0MUX = 0x08;
ADC0MUX |= n; // 选择AINx作为ADC
DelayMs(8);
AD0INT = 0; // 清除ADC转换完成标志
ADC0MD = 0x82; // startup conversion
while (!AD0INT); // wait conversion end
temp = ADC0H;
temp = (temp<<8) + ADC0M;
temp = (temp<<8) + ADC0L;
voltage = temp* 2450.0/16777215;
ADC[i] = voltage;
ADC[i] = (a-1)*ADC[i] +voltage;
ADC[i] = ADC[i]>>3;
}
}
}
void DAC0_Out_mV(uint v)
{ float x;
x = v / 2000.0 * 255;
v = x;
if(XXS==1) IDA0CN = 0xF3;
if(XXS==0) IDA0CN = 0xF0;
IDA0 = v;
}
void DAC1_Out_mV(uint v)
{ float x;
x = v / 2000.0 * 255;
v = x;
if(XXD==1) IDA1CN = 0xF3;
if(XXD==0) IDA1CN = 0xF0;
IDA1 = v;
}
void main(void)
{ DATA_lld=0;
DATA_lls=0;
PCA0MD &= ~0x40; // WDTE = 0 (clear watchdog timer enable)
SysClk_Init(); // 配置系统时钟
System_Init();
t0_ini();
PORT_Init();
// P1=0;
DAC_Init();
EA=0;
ADC0_Init();
TF0=0;
EA=1;
t0_rst();
DATA_lld_out=0;
DATA_lls_out=0;
DATA_lld=0;
DATA_lls=0;
XXD=1;
XXS=1;
DATA_lls=b;
DAC0_Out_mV(DATA_lls);
DATA_lls_out=b;
DATA_lld=c;
DAC1_Out_mV(DATA_lld);
DATA_lld_out=c;
DelayMs(1); // delay 1ms
while(1)
{
uchar i;
EA=0;
ADC0_Conver(); // ADC conversion
TF0=0;
EA=0;
t0_rst();
ADC0MD = 0x00; // ADC处于禁止状态
for(i=0;i<4;i++) // 防止高温时,ADC输出不稳定值
{if((ADC[i]<(ADt[i]-5))||(ADC[i]>(ADt[i]+5)))
ADt[i]=ADC[i];}
DelayMs(1); // 延时1ms 330us
// P1=0xff;
// if((P1&0x03)==0x03)
t0_rst();
// lld control
if((ADt[0]<=30)&&(ADt[1]<=30))
DATA_lld=150;
else
{ if(ADt[0]>ADt[1]) // ed>id low resistance rate
{ABSA=abs(ADt[0]-1750);
lab_d=0;
if(ABSA>=100) DATA_lld=DATA_lld_out*1750/ADt[0];
}
}
if(XXD==1)
{if((XXD==1)&&(DATA_lld<=230))// 2.0MA--0.25MA
{DATA_lld*=8;
// x = DATA_lld_out* 255/ 2000.0 ;
// IDA1CN = 0xF0;
// IDA1 = x;
XXD=0;
}
if((XXD==1)&&(DATA_lld>240))
{XXD=1;
// h = DATA_lld_out* 255/ 2000.0 ;
// IDA1CN = 0xF3;
// IDA1 = h;
}
}
else
{if((XXD==0)&&(DATA_lld<=1840))
{
// y = DATA_lld_out* 255/ 2000.0 ;
// IDA1CN = 0xF0;
// IDA1 = y;
XXD=0;
}
if((XXD==0)&&(DATA_lld>1920))
{
DATA_lld/=8;
// z = DATA_lld_out* 255/ 2000.0 ;
// IDA1CN = 0xF3;
// IDA1 = z;
XXD=1;
}
}
if(lab_d==1) X=4;
if(lab_d==0) X=4;
if((DATA_lld<(DATA_lld_out-X))||(DATA_lld>(DATA_lld_out+X)))
DATA_lld_out=DATA_lld;
if(DATA_lld_out>2000) DATA_lld_out=2000;
if(DATA_lld_out<0) DATA_lld_out=0;
DAC1_Out_mV(DATA_lld_out);
t0_rst();
if((ADt[2]<=30)&&(ADt[3]<=30))
DATA_lls=200;
else
{if(ADt[2]>ADt[3])
{ ABSB=abs(ADt[2]-1750);
lab_s=0;
if(ABSB>=100) DATA_lls=DATA_lls_out*1750/ADt[2];
}
if(ADt[2]<=ADt[3])
{ABSB=abs(ADt[3]-1750);
lab_s=1;
if(ABSB>=100) DATA_lls=DATA_lls_out*1750/ADt[3];
}}
if(XXS==1)
{if((XXS==1)&&(DATA_lls<=230))// 2.0MA--0.25MA
{DATA_lls*=8;
// x = DATA_lld_out* 255/ 2000.0 ;
// IDA1CN = 0xF0;
// IDA1 = x;
XXS=0;
}
if((XXS==1)&&(DATA_lls>240))
{XXS=1;
// h = DATA_lld_out* 255/ 2000.0 ;
// IDA1CN = 0xF3;
// IDA1 = h;
}
}
else
{if((XXS==0)&&(DATA_lls<=1840))
{
// y = DATA_lld_out* 255/ 2000.0 ;
// IDA1CN = 0xF0;
// IDA1 = y;
XXS=0;
}
if((XXS==0)&&(DATA_lls>1920)) // 0.25MA--2MA
{
DATA_lls/=8;
// z = DATA_lld_out* 255/ 2000.0 ;
// IDA1CN = 0xF3;
// IDA1 = z;
XXS=1;
}
}
if(lab_s==1) X=4;
if(lab_s==0) X=4;
if((DATA_lls<(DATA_lls_out-X))||(DATA_lls>(DATA_lls_out+X)))
DATA_lls_out=DATA_lls;
if(DATA_lls_out>2000) DATA_lls_out=2000;
if(DATA_lls_out<0) DATA_lls_out=0;
DAC0_Out_mV(DATA_lls_out);
DelayMs(10);
// t0_rst();
}
}
void T0_ISR() interrupt 1
{ TF0=0;
TH0=0XFA;
TL0=0X00;
RSTSRC=0X10;
}
void t0_rst()
{ EA=0;
TR0=0;
TF0=0;
TH0=0XFA;
TL0=0X00;
TR0=1;
EA=1;
}
void t0_ini()
{TMOD=0x01;
CKCON=0x02;
TH0=0XFA;
TL0=0X00;
EA=1;
TF0=0;
ET0=1;
TR0=1;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -