- #include<reg52.h>
- #include<intrins.h>
- sbit PWM_L1=P1^1;
- sbit PWM_L2=P1^2;
- sbit PWM_R1=P1^3;
- sbit PWM_R2=P1^4;
- sbit xl1=P2^0;//红外传感器
- sbit xl2=P2^1;
- sbit xr1=P2^2;
- sbit xr2=P2^3;
- sbit zj3=P2^4;
- sbit beep=P3^6;
- sbit leftled=P3^5;
- sbit rightled=P3^4;
- sfr AUXR=0x8E;
- sfr BRT=0x9c;
- int L1=0,L2=0,R1=0,R2=0,timing=0;//pwm值,pwm周期值
- unsigned char NUM;
- /***************************************************************************************/
- void set_pwm_duty_left(int l1,int l2);
- void set_pwm_duty_right(int r1,int r2);
- void xunji(void);
- void yanshizou();
- void xgo(void);
- void xback(void);
- void dazuozhuan(void);
- void dayouzhuan(void);
- void zuoxuan(void);
- void youxuan(void);
- void stop(void);
- void turnleft();
- void turnright();
- void xiaoyouzhuan(void);
- void xiaozuozhuan(void);
- /***************************************************************************************/
- void Delay100ms(); //@11.0592MHz
- /***************************************************************************************/
- void ConfigTimer0(void);
- void UartInit(void);//用于串口通信
- /***************************************************************************************/
- void main()
- {
- ConfigTimer0();//定时10ms 11.0592mhz晶振
- UartInit();
- beep=1;leftled=1;rightled=1;
- while(1)
- {
- switch(NUM)
- {
- case 'a':xgo();break;
- case 'b':xback();break;
- case 'c':dazuozhuan();break;
- case 'd':dayouzhuan();break;
- case 'e':turnleft();break;
- case 'f':turnright();break;
- case 'z':stop();break;
- case 'x':xunji();break;
- case 'g':zuoxuan();break;
- default:break;
- }
- }
- }
- /***************************************************************************************/
- void ConfigTimer0(void)
- {
- //配置TMOD:GATE=0,不受外部影响; C/T=0定时器;M1M0=01,16位计数
- TMOD &= 0xf0;
- TMOD |= 0x21;
- //计数器初值:设置100us中断 也就是计数100产生中断,所以初值是65536-100
- TH0=(65536-100)/256;
- TL0=(65536-100)%256;
- //TCON:TR0=1开计数器
- TR0=1;
- //开中断
- ET0=1;
- EA=1;
- }
- void UartInit(void) //9600bps@11.0592MHz
- {
- PCON &= 0x7F;
- SCON = 0x50;
- AUXR |= 0x04;
- BRT = 0xDC;
- AUXR |= 0x01;
- AUXR |= 0x10;
- ES=1;
- EA=1;
- PS=1;//必须加
- }
- /***************************************************************************************/
- void timer0() interrupt 1
- {
- TH0=(65536-100)/256;
- TL0=(65536-100)%256;
- if(timing<L1) // left 1
- PWM_L1=1;
- else
- PWM_L1=0;
-
- if(timing<L2) // left 2
- PWM_L2=1;
- else
- PWM_L2=0;
-
- if(timing<R1) // right 1
- PWM_R1=1;
- else
- PWM_R1=0;
-
- if(timing<R2) // right 2
- PWM_R2=1;
- else
- PWM_R2=0;
-
- timing++;
- if(timing>99)
- timing=0;
- }
- void ser() interrupt 4
- {
- NUM=SBUF;//出去接收到的数据
- RI = 0;//清除接收中断标志位
- SBUF=SBUF;
- while(!TI);
- TI=0;
- }
- /***************************************************************************************/
- void set_pwm_duty_left(int l1,int l2)//左电机
- {
- L1=l1;
- L2=l2;
- }
- void set_pwm_duty_right(int r1,int r2)//右电机
- {
- R1=r1;
- R2=r2;
- }
- /***************************************************************************************/
- void yanshizou()
- {
- set_pwm_duty_right(0,23);
- set_pwm_duty_left(0,20);
- }
- void dazuozhuan(void)
- {
- set_pwm_duty_right(0,60);
- set_pwm_duty_left(0,40);
- }
- void dayouzhuan(void)
- {
- set_pwm_duty_right(0,40);
- set_pwm_duty_left(0,60);
- }
- void xiaozuozhuan(void)
- {
- set_pwm_duty_right(0,40);
- set_pwm_duty_left(0,20);
- }
- void xiaoyouzhuan(void)
- {
- set_pwm_duty_right(0,20);
- set_pwm_duty_left(0,40);
- }
- void xgo(void)
- {
- set_pwm_duty_right(0,80);
- set_pwm_duty_left(0,83);
- }
- void zuoxuan(void)
- {
- set_pwm_duty_right(0,40);
- set_pwm_duty_left(45,0);
- }
- void xback(void)
- {
- set_pwm_duty_right(50,0);
- set_pwm_duty_left(51,0);
- }
- void stop(void)
- {
- set_pwm_duty_right(0,0);
- set_pwm_duty_left(0,0);
- }
- void turnleft()//直角
- {
- set_pwm_duty_right(0,50);//右进,左退
- set_pwm_duty_left(0,0);
- }
- void turnright()
- {
- set_pwm_duty_right(0,0);//右退左进
- set_pwm_duty_left(0,50);
- }
- /***************************************************************************************/
- void Delay100ms() //@11.0592MHz
- {
- unsigned char i, j, k;
- _nop_();
- _nop_();
- i = 5;
- j = 52;
- k = 195;
- do
- {
- do
- {
- while (--k);
- } while (--j);
- } while (--i);
- }
- /***************************************************************************************/
- void xunji(void)//高电平压线
- {
- int k=0;
- int l=0;
- while(l<2)
- {
- if(xl2==0&&xr1==0)//2,3不压线
- {
- yanshizou();
- }
- else if(xl1==0&&xl2==1&&xr1==0&&xr2==0)//2压线
- {
- xiaozuozhuan();
- }
- else if(xl1==0&&xl2==0&&xr1==1&&xr2==0)//3压线
- {
- xiaoyouzhuan();
- }
- else if(xl1==1&&xl2==0&&xr1==0&&xr2==0)//1压线
- {
- turnleft();
- }
- else if(xl1==0&&xl2==0&&xr1==0&&xr2==1)//4压线
- {
- turnright();
- }
- else if(xl1==1&&xl2==1&&xr1==1&&xr2==1)//十字路口
- {
- Delay100ms();
- beep=0;leftled=0;rightled=0;
- Delay100ms();
- beep=1;leftled=1;rightled=1;
- yanshizou();
- }
- else
- {
- yanshizou();
- }
- if(NUM=='z') l=3;
- }
- }
复制代码
|