微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 51单片机实现光源的跟踪

51单片机实现光源的跟踪

时间:11-27 来源:互联网 点击:
AD采集两路电压,并比较,控制电机转动方向,并将数据传至上位机

西安理工大学--自动化与信息工程学院

邹艺良 编写(2014.08.25)

邮箱:262276047@qq.com

//*******************************

//西安理工大学--自动化与信息工程学院--邹艺良

//*******************************

#include

#include

#include

void ADC_init();

int get_ADC_result(char ch);

unsigned int show_ADC_result_ch0();

unsigned int show_ADC_result_ch1();

void Send(unsigned char dat);

void uart_init();

void delay(unsigned int a);

void delay_10ms();

sbit P2_0=P2^0;

sbit P2_1=P2^1;

sbit P1_3=P1^3;

void positive_turn(unsigned int count); //顺时针

void negative_turn(unsigned int count); //逆时针

void stop_turn();

void main()

{

unsigned int ch0,ch1;

int value,chazhi,z1,z2,z3,z4,gap;

gap=30;

while(1)

{

uart_init();

ADC_init();

//显示左右两传感器电压

ch0=show_ADC_result_ch0();//通道ch0电压

Send(0x20); //四个空格符

Send(0x20);

Send(0x20);

Send(0x20);

ch1=show_ADC_result_ch1();//通道ch1电压

Send(0x20); //四个空格符

Send(0x20);

Send(0x20);

Send(0x20);

//显示差值电压

value=ch0-ch1;

if(ch0>ch1)

{chazhi=ch0-ch1;}

else

{chazhi=ch1-ch0;}

z1=chazhi/1000;

z2=chazhi00/100;

z3=chazhi000/10;

z4=chazhi000;

Send(0x43);//C

Send(0x3D);//=

if(ch0

{Send(0x2D);}

else

{Send(0x2B);}

Send(z1+48);

Send(0x2E);//.

Send(z2+48);

Send(z3+48);

Send(z4+48);

if((ch0+gap)

{Send(0x52);}

if(ch0>(ch1+gap))

{Send(0x4C);}

if(-gap<(ch0-ch1) || (ch0-ch1)

{Send(0x20);}

//Send(0xD); //回车

//Send(0xA); //换行

//光源跟踪

if(-gap

stop_turn();

else if(value<-gap)

negative_turn(10);

else if(value>gap)

positive_turn(10);

//for(p=0;p<50;p++) //延时1s刷新一次

//{delay_10ms();}

}

}

void ADC_init()

{

P1ASF=0x03;//设置P1.0,P1.1为AD转换口

ADC_CONTR=0x80;//打开AD电源、选择转换速度、

ADC_RES=0;

ADC_RESL=0;

AUXR1&=0xfb; //设置AD转换结果存放方式,此设为10位

delay(5);

}

int get_ADC_result(char ch)

{

unsigned int result;

ADC_CONTR=0x88|ch;//开启AD,选择通道

_nop_();

_nop_();

_nop_();

_nop_();

while(!(ADC_CONTR & 0x10));//等待转换完成,FLAG标志位置位

ADC_CONTR&=0x67; //关AD,清FLAG01100111

result=ADC_RES*4+ADC_RESL; //获取10位结果

return(result);

}

unsigned int show_ADC_result_ch0()

{

unsigned long int VCC1;

unsigned int A1,B1,C1,D1,i;

VCC1=0;

for(i=0;i<8;i++)

{

VCC1=VCC1+get_ADC_result(0);}

VCC1=VCC1/8;

VCC1=get_ADC_result(0);

VCC1=(long int)VCC1*10000/1024*5;

A1=VCC1/10000;

B1=VCC1000/1000;

C1=VCC100000/100;

D1=VCC1000000/10;

Send(0x56);//V

Send(0x31); //1

Send(0x3D);//=

Send(A1+48);

Send(0x2E);//.

Send(B1+48);

Send(C1+48);

Send(D1+48);

//Send(0xD); //回车

//Send(0xA); //换行

return(A1*1000+B1*100+C1*10+D1);

}

unsigned int show_ADC_result_ch1()

{

long int VCC2;

unsigned int A2,B2,C2,D2,i;

VCC2=0;

for(i=0;i<8;i++)

{

VCC2=VCC2+get_ADC_result(1);}

VCC2=VCC2/8;

VCC2=get_ADC_result(1);

VCC2=(long int)VCC2*10000/1024*5;

A2=VCC2/10000;

B2=VCC2000/1000;

C2=VCC200000/100;

D2=VCC2000000/10;

Send(0x56);//V

Send(0x32); //1

Send(0x3D);//=

Send(A2+48);

Send(0x2E);//.

Send(B2+48);

Send(C2+48);

Send(D2+48);

//Send(0xD); //回车

//Send(0xA); //换行

return(A2*1000+B2*100+C2*10+D2);

}

void uart_init()

{

TMOD=0x20; //TMOD=0010 0000B,定时器T1工作于方式2

SM0=0; //选择串行口工作方式1

SM1=1;

TH1=0xfa; //根据规定给定时器T1赋初值9600波特率

TL1=0xfa; //根据规定给定时器T1赋初值

TR1=1; //启动定时器T1

}

void Send(unsigned char dat)

{

SBUF=dat;

while(TI==0);

TI=0;

}

void positive_turn(unsigned int count)

{

P2_0=1;

P2_1=0;

CMOD = 0x00;//设置PCA时钟周期 系统时钟12分频 fosc/12

CL = 0x00; //初值设置

CH = 0x00;

CCAP0L = count; //设置初始占空比为25%

CCAP0H = count;//占空比 设置的是低电平的时间

CCAPM0 = 0X42;//PWM模式

CR = 1;//开启PCA计数器

}

void negative_turn(unsigned int count)

{

P2_0=0;

P2_1=1;

CMOD = 0x00;//设置PCA时钟周期 系统时钟12分频 fosc/12

CL = 0x00; //初值设置

CH = 0x00;

CCAP0L = count; //设置初始占空比为25%

CCAP0H = count;//占空比 设置的是低电平的时间

CCAPM0 = 0X42;//PWM模式

CR = 1;//开启PCA计数器

}

void

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top