?? datacurrent.c
字號:
/*數控恒流源*/
#include<reg51.h>
#include<absacc.h>
#include <intrins.h>
#define uchar unsigned char
#define JP373 XBYTE[0x87ff]
#define DM373 XBYTE[0x97ff]
#define WM373 XBYTE[0xa7ff]
#define R62256 XBYTE[0X0000]
#define DAC0832 XBYTE[0Xefff]
sbit P1_6=P1^6;
sbit P3_2=P3^2;
sbit CS=P1^4;
sbit SID=P1^5;
sbit CLK=P1^7;
void delay10ms(unsigned char time);
uchar ksp(void);
void int0_jp(void);
uchar keyscan(void);
void increase(void);
void reduce(void);
void enter(void);
void int1_jp(void);
void write_ad7705( unsigned char temp);
unsigned int ADRAD(void);
void PROCESS(void);
void measure(void);
void clear(void);
void compare(void);
void SendByte(uchar ucSendData);
void Write_Command(uchar ucCommand);
void Write_Data(uchar ucData);
void Lcd_Display(uchar data1);
void Lcd_Initial();
void lcdmain(uchar qw, uchar bw, uchar sw, uchar gw);
uchar ucBuffer;
uchar data a,d;
uchar key,temp,THUN,HUN,TEN,ONE;
uchar qw,bw,sw,gw;
uchar I,J;
uchar l=0X10,m=0X10,n=0X10;
unsigned int sum,k;
unsigned int dout;
double res;
code unsigned char tab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};/*代碼段數組*/
void main (void) //主程序
{
d=1;
while(1)
{
IE=0X81;
IP=0X01;
TCON=0X00;
P1=0Xf0;
while(d);
compare();
while(1)
{ P0=JP373;
P0&=0x0f;
delay10ms(10);
if(P0==0x0f) break;
}
EA=1;
d=1;
}
}
void Delay() //40ms
{
uchar i,j;
for(i=0x0ff;i>0;i--)
for(j=0x0ff;j>0;j--);
}
void delay10ms(unsigned char time)//延時10ms
{unsigned char i;
while(time--)
{for(i=0;i<120;i++);}
}
uchar ksp(void) //去抖動
{uchar temp;
P1=0XF0;
P0=JP373;
temp=P0;
temp&=0x0f;
return temp;
}
void int0_jp(void)interrupt 0 //處理中斷0
{ I=ksp();
if(I==0x0f)
{ while(1);}
I=ksp();
if(I==0x0f) {while(1);}
d=0;
EA=0;
}
uchar keyscan(void) //按鍵掃描子程序
{ P1=0XFE;
P0=JP373;
temp=P0;
temp&=0x0F;
switch(temp)
{case 0x0E: {key=0; return key;} break;
case 0x0D: {key=4; return key;} break;
case 0X0B: {key=8; return key;} break;
case 0X07: {key=12;return key;} break;
default:break;
}
P1=0XFD;
P0=JP373;
temp=P0;
temp&=0x0F;
switch(temp)
{case 0x0E: {key=1; return key;} break;
case 0x0D: {key=5; return key;} break;
case 0X0B: {key=9; return key;} break;
case 0X07: {key=13;return key;} break;
default:break;
}
P1=0XFB;
P0=JP373;
temp=P0;
temp&=0x0F;
switch(temp)
{case 0x0E: {key=2; return key;} break;
case 0x0D: {key=6; return key;} break;
case 0X0B: {key=10;return key;} break;
case 0X07: {key=14;return key;} break;
default:break;
}
P1=0XF7;
P0=JP373;
temp=P0;
temp&=0x0F;
switch(temp)
{case 0x0E: {key=3; return key;} break;
case 0x0D: {key=7; return key;} break;
case 0X0B: {key=11;return key;} break;
case 0X07: {key=15;return key;} break;
default:break;
}
}
void increase(void)
{if((l!=0X10)||(m!=0x10)||(n!=0x10))
if(sum<200)
{sum+=1;}
R62256=sum;
DAC0832=sum;
measure();
}
void reduce(void)
{if((l!=0X10)||(m!=0x10)||(n!=0x10))
if(sum>=1)
{sum-=1;}
R62256=sum;
DAC0832=sum;
measure();
}
void enter(void)
{if((l!=0x10)||(m!=0x10)||(n!=0x10))
{if((l!=0x10) && (m!=0x10 )&& (n!=0x10) ) //三位數
{sum=l*100+m*10;
sum+=n;
}
else if((l!=0x10) && (m!=0x10 ) && (n==0x10 )) //兩位數
{sum=l*10+m;}
else if((l==0x10) && (m!=0x10) && ( n!=0x10)) //兩位數
{sum=m*10+n;}
else if((l!=0x10) &&( m==0x10) &&( n==0x10)) //一位數
{sum=l;}
else if ((l==0x10) &&(m!=0x10) &&(n==0x10)) //一位數
{sum=m;}
R62256=sum;
DAC0832=sum;
measure();
}
}
void SendByte(uchar ucSendData)
{
uchar i;
for(i=8;i>0;i--)
{
CLK=0;//上升沿發送數據
if(ucSendData&0x80)//如果是1
SID=1;
else
SID=0;
CLK=1;
ucSendData=_crol_(ucSendData,1);//左移一位
}
}
void Write_Command(uchar ucCommand) //按時序操作
{
uchar temp=0xf8;//write command
delay10ms(1);
CS=1;//使能
SendByte(temp);//send command,the first byte
temp=ucCommand&0xf0;
SendByte(temp);//send the second byte
temp=_crol_(ucCommand,4)&0xf0;
SendByte(temp);//send the third byte
CS=0;
}
void Write_Data(uchar ucData)
{delay10ms(1);
CS=1;
ucBuffer=0xfa;//數據從MCU到LCD,所寫數據為顯示數據
SendByte(ucBuffer);//the first byte
ucBuffer=ucData&0xf0;//高四位
SendByte(ucBuffer);//the second byte
ucBuffer=_crol_(ucData,4)&0xf0;//低四位
SendByte(ucBuffer);//the third byte
CS=0;
}
void Lcd_Display(uchar data1)
// data1--字符編碼
{ Write_Data(data1);
}
void Lcd_Initial()
{
Delay();//延時40MS
Write_Command(0x30);//功能設定:8位數據,基本指令30
Write_Command(0x04);//點設定:畫面右移
Write_Command(0x0f);//lcd開,光標開
Write_Command(0x01);//清屏
Write_Command(0x02);//地址歸位
}
void lcdmain(uchar qw, uchar bw, uchar sw, uchar gw)
{
Lcd_Initial();
Write_Command(0x90);//設定DDRAM起始地址
Lcd_Display(0xca); //輸
Lcd_Display(0xe4);
Lcd_Display(0xb3); //出
Lcd_Display(0xf6);
Lcd_Display(0xb5); //電
Lcd_Display(0xe7);
Lcd_Display(0xc1); //流
Lcd_Display(0xf7);
Write_Command(0X94);
Lcd_Display(0x3a);// :
Lcd_Display(qw);
Lcd_Display(bw);
Lcd_Display(sw);
Lcd_Display(gw);
}
void int1_jp(void) interrupt 2 //處理外中斷1
{EA=0X00;
a=0;
}
void write_ad7705( unsigned char temp)
{
ACC=temp;
TI=0;
SBUF=ACC;
while(!TI);
}
unsigned int ADRAD(void)
{
while(RI==0);
RI=0;
ACC=SBUF;
I=ACC;
while(RI==0);
RI=0;
ACC=SBUF;
J=ACC;
temp=I>>7;
temp+=(I&0X40)>>5;
temp+=(I&0X20)>>3;
temp+=(I&0X10)>>1;
temp+=(I&0X08)<<1;
temp+=(I&0X04)<<3;
temp+=(I&0X02)<<5;
temp+=I<<7;
I=temp;
k=I;
temp=J>>7;
temp+=(J&0X40)>>5;
temp+=(J&0X20)>>3;
temp+=(J&0X10)>>1;
temp+=(J&0X08)<<1;
temp+=(J&0X04)<<3;
temp+=(J&0X02)<<5;
temp+=J<<7;
J=temp;
k=k<<8;
k+=J;
return k;
}
void PROCESS(void)
{
dout=ADRAD();
res=1000*2.06*dout/(65535.0*0.5*2*1.17); //增益為1時的放大倍數為1.17*2
THUN=(int)res/1000;
HUN=(int)res%1000/100;
TEN=(int)res%100/10;
ONE=(int)res%10;
qw=0X30+THUN;
bw=0X30+HUN;
sw=0X30+TEN;
gw=0X30+ONE;
lcdmain(qw,bw,sw,gw);
d=1;
while(1)
{
DM373=tab[THUN];
WM373=0X01;
WM373=0X00;
DM373=tab[HUN];
WM373=0X02;
WM373=0X00;
DM373=tab[TEN];
WM373=0X04;
WM373=0X00;
DM373=tab[ONE];
WM373=0X08;
WM373=0X00;
IE=0X81;
IP=0X01;
TCON=0X00;
P1=0Xf0;
if(d==0)
{ break;}
}
}
void measure (void)
{ IP=0X04;
TCON=0X00;
a=1;
SCON=0X00;
P1_6=0;
delay10ms(1);
P1_6=1;
write_ad7705(0x04); //選擇時鐘寄存器
write_ad7705(0x30); //送時鐘控制命令,晶振選2.4567MHZ,時鐘分頻
write_ad7705(0x08); //選擇SET UP寄存器
write_ad7705(0x22); //自校準,增益為1,單極性輸入,無緩沖模式
IE=0X84;
while(a);
write_ad7705(0x1c); //選擇數據寄存器,并讀數據
SCON=0X10; //允許接收數據
PROCESS();
}
void clear(void)
{ l=0X10;m=0X10;n=0X10;
sum=0;
DAC0832=sum;
measure();
}
void compare(void)
{ I=keyscan();
switch(I)
{ case 0:
{if((l==0x10)&&(m==0x10)) {l=I;}
else if(m==0X10) {m=I;}
else if(n==0X10) {n=I;}
} break;
case 1:
{if((l==0X10)&&(m==0x10) ) l=I;
else if(m==0X10) m=I;
else if(n==0X10) n=I;
} break;
case 2:
{
if((l==0X10)&&(m==0x10)) l=I;
else if(m==0X10) m=I;
else if((n==0X10) && (l!=2) ) n=I;
} break;
case 3:
{
if(m==0X10 ) m=I;
else if(n==0X10) n=I;
} break;
case 4:
{
if(m==0X10)
{ m=I;}
else if(n==0X10) {n=I;}
} break;
case 5:
{
if(m==0X10 ) m=I;
else if(n==0X10) n=I;
}break;
case 6:
{
if(m==0X10 ) m=I;
else if(n==0X10 ) n=I;
}break;
case 7:
{
if(m==0X10 ) m=I;
else if(n==0X10 ) n=I;
}break;
case 8:
{
if(m==0X10) m=I;
else if(n==0X10) n=I;
}break;
case 9:
{
if(m==0X10 ) m=I;
else if(n==0X10) n=I;
}break;
case 10:
{increase();}break;
case 11:
{reduce();} break;
case 12:
{enter();} break;
case 13:
{measure();} break;
case 14:
{clear();} break;
default:break;
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -