?? control_angel.c
字號:
/////////////////////////////////////
// COPYRIGHT RESERVED BY DU //
/////////////////////////////////////
#include "c8051F020.h"
#include "intrins.h"
#include "CH452CMD.H" // 定義常用命令碼及外部子程序
#include "pin.h"
#include "math.h"
#include "key_display.h"
//定義端口
sbit LEDG = P3^4;
sbit BACK = P3^0;
sbit START = P3^2;
sbit IN0 = P0^5;
sbit IN1 = P0^6;
sbit IN2 = P0^7;
sbit IN3 = P1^0;
sbit IN4 = P1^1;
sbit IN5 = P1^2;
sbit IN6 = P1^3;
ulong xdata data0[15];
ulong avge=0,avge0=0;
uchar keykey=0,timein;
uchar times_of_overflow1=0;
uchar duty=80,duty0=0,duty1=0;
// Peripheral specific initialization functions,
void Port_IO_Init()
{
// P0.0 - CEX0 (PCA), Open-Drain, Digital
// P0.1 - CEX1 (PCA), Open-Drain, Digital
XBR0 = 0x10; /*CEX0-->P0.0,CEX1-->P0.1*/
XBR2 = 0x40;
}
void Interrupts_Init()
{
IE = 0x08;
IP = 0x08;
EIE1 = 0x08; //使能PCA0中斷
EIE2 = 0x20;
EIP2 = 0x20;
}
// Initialization function for device,
// Call Init_Device() from your main program
void Init_Device(void)
{
Reset_Sources_Init();
ADC_Init();
PCA_Init();
Timer_Init();
Oscillator_Init();
Voltage_Reference_Init();
Port_IO_Init();
Interrupts_Init();
}
ulong pingjun (void)
{ uchar i;
ulong avgad1=0,avgad=0,state=0;
state=AD_IN();
for(i=0;i<12;i++)
{
data0[i]=state;
avgad+=data0[i];
//delayms(10);
}
avgad=avgad/12;
for(i=0;i<12;i++)
{
data0[i]=state;
avgad1+=data0[i];
//delayms(10);
}
avgad1=avgad1/12;
avge=(avgad+avgad1)/4;
return(avge);
}
//定時n秒。不要放在循環(huán)語句中調(diào)用
void timecontrol(float n)
{
timein=(uchar)(n*10);
TR1=1;
//TR0=1;
}
//改變占空比 i=0控制右輪 i=1控制左輪
void speedchange(uchar duty,uchar i)
{
if(i==0) PCA0CPH0 =(uchar)((100-duty)*2.56); //把duty值轉(zhuǎn)換,賦值給控制占空比的寄存器
if(i==1) PCA0CPH1=(uchar)((100-duty)*2.56);
}
uchar judgeblack_ft(void)
{
uchar a,b,c,left=0,right=0;
IN0=1;
IN1=1;
IN2=1;
a=IN0;
b=IN1;
c=IN2;
if((a==0&&b==1&&c==0))
{
EA =0;
left=0;
right=0;
PCA0CPH0 = 0x80;
PCA0CPH1 = 0x80;
return(1);
EA =1;
}
else if((a==1&&b==0&&c==0)||(a==1&&b==1&&c==0))
{
EA =0;
left=1;
right=0;
duty1=duty-60;
speedchange(duty1,1);
return(0);
EA =1;
}
else if((a==0&&b==0&&c==1)||(a==0&&b==1&&c==1))
{
EA =0;
left=0;
right=1;
duty0=duty-60;
speedchange(duty0 ,0);
return(0);
EA =1;
}
else if (a==0&&b==0&&c==0)
{
if(left==1)
{
EA =0;
duty1=duty-60;
speedchange(duty1,1);
return(1);}
else if(right==1)
{
EA =0;
duty0=duty-60;
speedchange(duty0 ,0);
return(1);}
else
{
EA =0;
PCA0CPH0 = 0x80;
PCA0CPH1 = 0x80;
return(0);}
EA =1;
}
else
{
EA =0;
PCA0CPH0 = 0x80;
PCA0CPH1 = 0x80;
EA =1;
return(0);
}
}
//主函數(shù)main
void main(void)
{
uchar ret;
uchar chazhi=12,chazhi1;
Init_Device();
CH452_Init(); /* CH452初始化 */
LEDG=0;
//EA=1;
START=0;
while(1)
{
LEDG=~LEDG;
EA=1;
avge=pingjun();
BCDdisplay_l(avge-200);
if(keykey==1)
{
ret=judgeblack_ft();
if(ret==1)
{
chazhi1=abs((int)(avge-avge0));
if(chazhi1>=20)
{
START=1;
if(avge>(avge0+chazhi-2))
{
BACK=0;
}
if(avge<(avge0-chazhi))
{
BACK=1;
}
ret=judgeblack_ft();
}
else if((chazhi1<20)&&(chazhi1>10))
{
if(avge>(avge0+chazhi))
{
START=1;
BACK=0;
}
if(avge<(avge0-chazhi))
{
START=1;
BACK=1;
}
ret=judgeblack_ft();
}
else if(chazhi1<=10)
{
START=0;
ret=judgeblack_ft();
}
else;
}
if(ret==0)
{
ret=judgeblack_ft();
}
//AMX0SL = 0x03;
//state=(AD_IN(1,1));
//result=(int)state;
//BCDdisplay(result);
//delayms(20);
}
}
}
/*PCA中斷子程序*/
void PCA_ISR (void) interrupt 9
{
CCF0 = 0; /*清匹配中斷標志*/
}
/*鍵盤中斷子程序*/
void led(void) interrupt 19
{
uchar key;
EA=0;
key=CH452_Read();
if(0x62==key)
{
delayms(2);
avge0=avge;
keykey=1;
BCDdisplay_h(avge0-200);
}
EA=1;
//if(0x63==key)
// {
// delayms(2);
//avga=pingjun();
//CH452_Write(CH452_DIG1|b);
//CH452_Write(CH452_DIG0|c);
// BCDdisplay(avga);
// }
}
/*定時器中斷子程序
void TIMER1_ISR (void) interrupt 3 using 1
{
TR1=0;
TF1=0;
TH1=0x7D ;
TL1=0xFB ;
if(times_of_overflow1 < timein)
{
times_of_overflow1 ++ ;
TR1=1;
}
else
{ TR1=0;
//TR0=0;
//Frequence=TH0*0x100+TL0;
times_of_overflow1=0;
TH1=0x7D ;
TL1=0xFB ;
//JIA+=(float)timein/10 ;
//BCDdisplay_l(JIA);
//TH0=0;
//TL0=0;
//TR0=1;
}
} */
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -