📄 dc_current_souce.c
字号:
#include<reg52.H>
#include<absacc.h>
#include<intrins.h>
#define uchar unsigned char
sbit CS=P1^0;
sbit CLK=P1^1;
sbit DIO=P1^2;
unsigned char KeyCode; //键盘值
char dispbuff[8]; //显示缓存
unsigned int volatile keybuf[4]; //键盘读数频率值
char volatile i; //位标志
bit volatile set,up_down; //设置键标志
unsigned char num;
int volatile control; //频率字
unsigned char keycontrol; //频率缓存
unsigned int cc;
char xdata *max530_ad;
char ReadKB(); //读键盘
void sent(unsigned char sent_buf); //向7289发数据
void delay(unsigned char time); //延时
void display(unsigned char k)reentrant; //显示
void transkey1(void); //将所设定的数值转化为控制字(10进制转16进制)
void dis_control(unsigned char keycontrol)reentrant; //显示控制如:左移,右移,显示setting
void dacconvent(void)reentrant; //da转换
void xiuzheng(void); //对电流的误差进行分段修正,让电流更加准确
void KeyBoard() interrupt 2 //键盘辨别
{ EX1=0;
KeyCode=ReadKB(); //读键盘
if(KeyCode==0x0f) //======判断是否是设置键按下
{ i=0;
set=1;
keycontrol=0xa4; //复位
dis_control(keycontrol);
dispbuff[6]=0x0d;
display(6);
goto loop1;
}
else if(set) //======只有当设置键按下才判断
{
if(KeyCode==0x0e) //确定键
{ set=0;
if(i) //只有当I不为0时才发送
{
transkey1(); //将所设定的数值转化为控制字(10进制转16进制)
dacconvent();
keycontrol=0xa4; //复位
dis_control(keycontrol);
goto loop1;
}
goto loop1;
}
if((KeyCode<=9)&&(KeyCode>=0)&&(i<4))
{
keycontrol=0xa0;
dis_control(keycontrol); //显示左移一位
keybuf[i]=KeyCode;
dispbuff[7]=keybuf[i];
display(7);
i++;
goto loop1;
}
if((KeyCode==0x0d)&&(i>0)) //删除一位,
{
keycontrol=0xa1; //第一个显示变黑,右移一位
dis_control(keycontrol);
i--;
goto loop1;
}
goto loop1;
}
if(KeyCode==0x0c) // 步进选择(up_down=1为1ma步进,=0时为10ma步进)
{
up_down=!up_down;
goto loop1;
}
if((KeyCode<=9)&&(KeyCode>=1)) //选择步进系数即:数字*1ma,数字*10ma
{
num=KeyCode;
goto loop1;
}
if(KeyCode==0x0b) //加
{
if(up_down)
control=control+num;
else control=control+10*num;
goto loop1;
}
if(KeyCode==0x0a) // 减
{
if(up_down)
control=control-num;
else control=control-10*num;
goto loop1;
}
loop1: EX1=1;
if(control<=0)
control=0;
if(control>2000)
control=2000;
dacconvent();
}
main()
{
unsigned int time;
char m;
EX1=1;
EA=1;
IT1=1;
set=0;
i=0;
control=500; //初始化电流500ma
up_down=0; //初始化步进10ma档
num=1; //初始化步进系数1
keycontrol=0xa4; //复位
dis_control(keycontrol);
dispbuff[2]=0x09;
display(2);
dispbuff[3]=0x00;
display(3);
dispbuff[4]=0x00;
display(4);
dispbuff[5]=0x0D;
display(5);
for(time=0;time<800;time++)
delay(100);
dacconvent();
while(1)
{
if(!set)
{ keycontrol=0xa4; //复位
dis_control(keycontrol);
dispbuff[1]=num;
display(1);
if(up_down==0)
{
dispbuff[2]=0;
display(2);
}
if(control<2000)
{
if((control/1000))
{
cc=control;
dispbuff[4]=cc/1000;
display(4);
m=dispbuff[4];
cc=cc-1000*m;
dispbuff[5]=cc/100;
display(5);
m=dispbuff[5];
cc=cc-100*m;
dispbuff[6]=cc/10;
display(6);
m=dispbuff[6];
cc=cc-10*m;
dispbuff[7]=cc;
display(7);
}
else if((control/100))
{
cc=control;
dispbuff[5]=cc/100;
display(5);
m=dispbuff[5];
cc=cc-100*m;
dispbuff[6]=cc/10;
display(6);
m=dispbuff[6];
cc=cc-10*m;
dispbuff[7]=cc;
display(7);
}
else if((control/10))
{
cc=control;
dispbuff[6]=cc/10;
display(6);
m=dispbuff[6];
cc=cc-10*m;
dispbuff[7]=cc;
display(7);
}
else
{
dispbuff[7]=control;
display(7);
}
}
else if(control==2000)
{
dispbuff[7]=0;
display(7);
dispbuff[6]=0;
display(6);
dispbuff[5]=0;
display(5);
dispbuff[4]=2;
display(4);
}
}
dacconvent();
for(time=0;time<200;time++)
delay(200);
}
}
char ReadKB() //读键盘
{ char kb=0,j;
CS=1;
CLK=0;
delay (50);
sent(0x15);//发送读键盘指令
delay(10);
DIO=1; //要读dio的值,必须先对其置一。
CLK=1;
delay(50);
for(j=0;j<8;j++)
{CLK=0;
kb=kb*2+(char)DIO;//读1位数据
delay(10);
CLK=1;
delay(10);
}
CS=1;
return(kb);
}
void sent(unsigned char sent_buf) //发送数据
{
char j;
CLK=0; /*置SPI时钟线为低*/
CS=0; /*置SPI片选线为低*/
delay (50); /*延时50us*/
for(j=0;j<8;j++) /*发送8位数据*/
{
sent_buf=sent_buf<<1; /*从数据最高位开始,将要发发送的数据位移入进位位CY*/
DIO=CY; /*数据位送数据线*/
CLK=1; /* 置SPI时钟线为高*/
delay (10); /*延时10us*/
CLK=0; /* 置SPI时钟线为低,发送完1位数据*/
delay (10);/*延时10us*/
}
DIO=0;//为何dio清零??
}
void delay(unsigned char time) //延时
{
unsigned char j;
for(j=0;j<time;j++);
}
void display(unsigned char k)reentrant //显示
{
CS=1;
sent(0xc8+k);
sent(dispbuff[k]);
CS=1;
}
void transkey1(void) //将所设定的数值转化为控制字(10进制转16进制)
{ unsigned char y;
control=0;
for(y=0;y<i;y++)
{
control=control*10;
control=control+keybuf[y];
}
if(control>2000)
control=2000;
}
void dis_control(unsigned char keycontrol)reentrant //控制显示函数(可再入)
{
sent(keycontrol);
CS=1;
}
void dacconvent(void)reentrant //da转换采用ldac/=0的接法,先发送低八位数据,再发送高八位数据
{
unsigned int voltage; //电流变量
unsigned char nh4,nl8;
voltage=control*2;
nh4=voltage/256;
nl8=voltage%256;
max530_ad=0x0000; ; //cs0地址片选(高四位)
*max530_ad=nl8;
max530_ad=0x0003; //cs0地址片选(低八位)
*max530_ad=nh4;
}
void xiuzheng(void) //对电流的误差进行分段修正,让电流更加准确
{
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -