📄 tyngz.c
字号:
#include"AT89x51.h"
char tp=0;
unsigned char ad_result_data[10];
unsigned char ad_result_low2[10];
unsigned char ad_result_total[10];
unsigned char ad_average_result;
unsigned char r_4,r_5,r_6,r_7;
void get_ad_result();
char delay(char t);
/*void init()
{
} */
//////////////////////////////////////////////////延时子程序
char delay(char t) //160微秒
{
unsigned char m,n,s
for(s=10;s>0;s--)
{
for(m=t;m>0;m--);
for(n=2;n>0;n--);
}
}
////////////////////////////////////////////////////////////
void ADC_Power_On()
{
ADC_CONTR|=0x80;
delay(5);
}
////////////////////////////////////////////////////////////
//取AD结果函数,它是十位AD转换,每十次平均,最后取低八位作为AD采样数据
void get_ad_result()
{
int i,q=0;
for(i=0;i<10;i++)
{
tp=0;
ADC_DATA=0; //高八位数据清零
ADC_LOW2=0; //低两位清零
ADC_CONTR|=0x08; //启动AD转换
while(!tp) //判断AD转换是否完成
{
tp=0x10;
tp&=ADC_CONTR;
}
ADC_CONTR&=0xe7;
ADC_DATA=ADC_DATA<<2; //高八位左移两位
ADC_LOW2 &=0x03;
ad_average_result=ADC_DATA+ADC_LOW2;
q=q+ad_average_result;
}
ad_average_result=q/10;
}
/************************************************************
P1口AD转换程序
*************************************************************/
void P10()
{
P1M0|=0x01; //设P1_0为开漏模式 如: P1_1= #00000010B
P1M1|=0x01;
ADC_CONTR=0xe0; //设置通道x, 格式如: P1_x= 0xeX
delay(2);
get_ad_result();
r_4=ad_average_result;
send_ad_result(r_4);
}
///////////////////////////
void P11()
{
P1M0|=0x02;
P1M1|=0x02;
ADC_CONTR=0xe1;
delay(2);
get_ad_result();
r_5=ad_average_result;
send_ad_result(r_5);
}
///////////////////////////
void P12()
{
P1M0|=0x04;
P1M1|=0x04; //设为开漏模式
ADC_CONTR=0xe2;
delay(2);
get_ad_result();
r_6=ad_average_result;
send_ad_result(r_6);
}
///////////////////////////
void P13()
{
P1M0|=0x08;
P1M1|=0x08; //设为开漏
ADC_CONTR=0xe3; //设置通道3 20--200微秒
delay(1);
get_ad_result(); //取P13结果
r_7=ad_average_result;
send_ad_result(r_7); // 把结果送到串口
}
********************************************************/
/****************** 云台水平转动 *****************************/
void qxzhuan_L() //强行左转
{
P10();
P12();
while((r_6-7)>r_4) //如果右大于左
{
P1_4=1; //强行左转
P1_5=0;
}
}
void qxzhuan_R() //强行右转
{
P10();
P12();
while((r_4-7)>r_6) //如果左大于右
{
P1_4=0; //强行右转
P1_5=1;
}
}
void zhuan_L() //左转
{
P10();
P12();
while((r_4-7)>r_6) //如果左大于右
{
if(P2_2==1) //如果触动了左限位开关,则强行向右回转
{qxzhuan_R();}
else
P1_4=1; //左转
P1_5=0; //右不转
}
}
void zhuan_R() //右转
{
P10();
P12();
while((r_6-7)>r_4) //如果右大于左
{
if(P2_3==1) //如果触动了右限位开关,则强行向左回转
{qxzhuan_L();}
else
P1_4=0; //左不转
P1_5=1; //右转
}
}
void shuiping()
{
P10(); //水平光强的采样
P12();
if((r_4-7)>r_6) //如果左大于右
{
zhuan_L();
}
else if((r_6-7)>r_4) //如果右大于左
{
zhuan_R();
}
else
P1_4=0; //左不转
P1_5=0; //右不转
}
/*************************云台垂直转动***************************/
void zhuan_U() //上转
{
P11();
P13();
while((r_5-7)>r_7) //如果上大于下
{
else
P1_6=1; //上转
P1_7=0; //下不转
}
}
void zhuan_D() //下转
{
P11();
P13();
while((r_7-7)>r_5) //如果下大于上
{
P1_6=0; //上不转
P1_7=1; //下转
}
}
void chuizhi()
{
P11(); //垂直方向光强的采样
P13();
if((r_5-7)>r_7) //如果上大于下
{
zhuan_U();
}
else if((r_7-7)>r_5) //如果下大于上
{
zhuan_D();
}
else
P1_6=0; //上不转
P1_7=0; //下不转
}
/****************************************************
主程序
****************************************************/
main()
{
// AD_initiate();
ADC_Power_On();
P1_4=0; //电机控制端口初始化
P1_5=0;
P1_6=0;
P1_7=0;
while(1)
{
shuiping();
chuizhi();
} //向上旋转
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -