|
- /*此系統(tǒng)如果不控制正反轉(zhuǎn)引腳,那么一上電運(yùn)轉(zhuǎn)與程序無關(guān),因?yàn)镻WM引腳一上
- 電就為高電位*/
- #include "IAP15W4K61S4.h"
- #include "Adc_config.h"
- #include "delay_m.h"
- //#include "serial_xj.h"
- #include "pwm_contr.h"
- #include "stdio.h"
- #define uchar unsigned char
- #define uint unsigned int
- uchar one_adc_value=0xff, two_adc_value=0xff; //兩路ADC值
- sbit FFW=P3^5; //方向控制位
- uchar L_Speed=0, R_Speed=0, temp1=0, temp2=0; //左右兩路速度
- uint value1=0;
- bit L_R_Flag=0;
- void main()
- {
- //Serial1_Init(); //串口通信初使化
- ADC_RES=0; //ADC轉(zhuǎn)換寄存器
- Adc_Init(); //ADC初使化
- //Adc_Change(5); //啟動(dòng)P1.5進(jìn)行AD轉(zhuǎn)換
- P1M0=0x03;
- P1M1=0x00; //設(shè)置成強(qiáng)推挽輸出
- mDelay(10000); //延時(shí)一段時(shí)間待電源穩(wěn)定。
- pwm_Init(); //PWM初使化
- IE=0xa0; //開總中斷,允許ADC中斷執(zhí)行
- while(1)
- {
- Adc_Change(5); //測(cè)量第五路ADC
- mDelay(100);
- Adc_Change(6); //測(cè)量第六路ADC
- mDelay(100);
- if(one_adc_value<118) //如果后退
- {
- L_R_Flag=1; //需要判斷左右轉(zhuǎn)向
- temp1=118-one_adc_value;
- temp1<<=1;
- }
- else if(one_adc_value>138) //前進(jìn)
- {
- L_R_Flag=1; //需要判斷左右轉(zhuǎn)向
- temp1=one_adc_value-138;
- temp1<<=1;
- }
- else
- {
- FFW=1; //方向?yàn)榍斑M(jìn)
- L_Speed=0xff;
- R_Speed=0xff;
- }
- if(L_R_Flag) //如果有速度
- {
- L_R_Flag=0; //清除左右轉(zhuǎn)標(biāo)志位
- if(two_adc_value<118)
- {
- temp2=118-two_adc_value;
- value1=(((temp1*100)/118)*temp2)/100;
- temp2=(unsigned char)value1;
- R_Speed=0xff-temp1+temp2;
- L_Speed=0xff-temp1;
- }
- else if(two_adc_value>138)
- {
- temp2=two_adc_value-138;
- value1=(((temp1*100)/118)*temp2)/100;
- temp2=(unsigned char)value1;
- L_Speed=0xff-temp1+temp2;
- R_Speed=0xff-temp1;
- }
- else
- {
- L_Speed=0xff-temp1;
- R_Speed=0xff-temp1;
- }
- }
- pwm_Change(L_Speed, R_Speed); //ADC值轉(zhuǎn)頻率
- //Send_data(0x55);
- }
- }
- /*ADC中斷只起一個(gè)發(fā)送串行數(shù)據(jù)的功*/
- /*中斷函數(shù)不需要聲明*/
- void adc_inter() interrupt 5
- {
- static Count=0;
- ADC_CONTR &=!ADC_FLAG;
- if(Count==0)
- {
- Count=1;
- one_adc_value=ADC_RES;
- }
- else
- {
- Count=0;
- two_adc_value=ADC_RES;
- }
- }
復(fù)制代碼
|
|