- /*此系统如果不控制正反转引脚,那么一上电运转与程序无关,因为PWM引脚一上
- 电就为高电位*/
- #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转换寄存器
- Adc_Init(); //ADC初使化
- //Adc_Change(5); //启动P1.5进行AD转换
- P1M0=0x03;
- P1M1=0x00; //设置成强推挽输出
- mDelay(10000); //延时一段时间待电源稳定。
- pwm_Init(); //PWM初使化
- IE=0xa0; //开总中断,允许ADC中断执行
- while(1)
- {
- Adc_Change(5); //测量第五路ADC
- mDelay(100);
- Adc_Change(6); //测量第六路ADC
- mDelay(100);
- if(one_adc_value<118) //如果后退
- {
- L_R_Flag=1; //需要判断左右转向
- temp1=118-one_adc_value;
- temp1<<=1;
- }
- else if(one_adc_value>138) //前进
- {
- L_R_Flag=1; //需要判断左右转向
- temp1=one_adc_value-138;
- temp1<<=1;
- }
- else
- {
- FFW=1; //方向为前进
- L_Speed=0xff;
- R_Speed=0xff;
- }
- if(L_R_Flag) //如果有速度
- {
- L_R_Flag=0; //清除左右转标志位
- 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值转频率
- //Send_data(0x55);
- }
- }
- /*ADC中断只起一个发送串行数据的功*/
- /*中断函数不需要声明*/
- 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;
- }
- }
复制代码
|