AT89C51单片机循迹小车程序(c语言)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
#include
#include
sbit in1=P2^0;
sbit in2=P2^1;
sbit ena=P2^2;
sbit in3=P2^3;
sbit in4=P2^4;
sbit enb=P2^5;
int resl_l=0;/*左*/resl_r=0;/*右*/
bit FLA_l=0,/*左*/FLA_r=0,/*中*/FLA_z=0;/*右*/ //标志位
void delayms(int x)
{
int i,j;
for(i=0;i for(j=0;j<1200;j++); } void adc_int(char x) { char y,k=0x01; y=x; while(x--) k=k<<1; P1ASF=k; ADC_CONTR=y; _nop_();_nop_();_nop_();_nop_(); AUXR1=0x00; } void adc_start() { ADC_CONTR|=0x80;//开电源 _nop_();_nop_();_nop_();_nop_(); ADC_CONTR|=0x08;//启动 _nop_();_nop_();_nop_();_nop_(); while(!(ADC_CONTR&0x10));//查询 ADC_CONTR&=0xef;//标志位清零 _nop_();_nop_();_nop_();_nop_(); } void main() { float vin=0; ena=1; enb=1; in1=0; in2=1; in3=0; in4=1; while(1) {adc_int(4); adc_start(); resl_l=ADC_RES; resl_l=(resl_l<<2)+ADC_RESL; vin=resl_l/1024.0*4.95; ADC_CONTR=0x00; P1ASF=0x00; if(vin<2)//白线 FLA_l=1; adc_int(5); adc_start(); resl_r=ADC_RES; resl_r=(resl_r<<2)+ADC_RESL; vin=resl_r/1024.0*4.95; ADC_CONTR=0x00; P1ASF=0x00; if(vin<2) FLA_r=1; while(FLA_l==1) {ena=0; enb=0;delayms(6);//减速 enb=1;delayms(5);//减速PWM调速FLA_l=0; adc_int(4); adc_start(); resl_l=ADC_RES; resl_l=(resl_l<<2)+ADC_RESL; vin=resl_l/1024.0*4.95; ADC_CONTR=0x00; P1ASF=0x00; if(vin<2) FLA_l=1; } ena=1; while(FLA_r==1) { enb=0; ena=0;delayms(6); ena=1;delayms(5); FLA_r=0; adc_int(5); adc_start(); resl_r=ADC_RES; resl_r=(resl_r<<2)+ADC_RESL; vin=resl_r/1024.0*4.95; ADC_CONTR=0x00; P1ASF=0x00; if(vin<2) FLA_r=1; } enb=1; ena=0; enb=0; delayms(8); ena=1; enb=1; delayms(3); } }