渣渣为了凑积分,发一个以前做过的小玩意
单片机源程序如下:
- #include<reg51.h>
- #include<intrins.h>
- #define uchar unsigned char
- #define uint unsigned int
- /*****电机驱动*****/
- sbit IN1=P1^0;
- sbit IN2=P1^1;
- sbit IN3=P1^2;
- sbit IN4=P1^3;
- /*****红外寻迹*****/
- sbit RSEN1=P2^1;
- sbit RSEN2=P2^2;
- sbit LSEN1=P2^3;
- sbit LSEN2=P2^4;
- /*****使能A、B*****/
- sbit ENA=P1^4;
- sbit ENB=P1^5;
- /*****电机驱动*****/
- #define Left_moto_go {IN1=1,IN2=0;}
- #define Left_moto_back {IN1=0,IN2=1;}
- #define Right_moto_go {IN3=1,IN4=0;}
- #define Right_moto_back {IN3=0,IN4=1;}
- #define Left_moto_s {IN1=0,IN2=0;}
- #define Right_moto_s {IN3=0,IN4=0;}
- uchar M; //从串口接收的数据
- uchar pwm_val_left =0;//变量定义
- uchar push_val_left=4; //左电机占空比N/20
- uchar pwm_val_right =0;
- uchar push_val_right=4;//右电机占空比N/20
- bit Right_moto_stop=1;
- bit Left_moto_stop =1;
- /********************************************
- 毫秒延时函数
- **********************************************/
- void Delay_ms(uint x) //12.000MHz
- {
- uchar a,b;
- for(a=x;a>0;a--)
- for(b=199;b>0;b--);
- }
- /*****延时*****/
- void delay50ms(void) //误差 0us
- {
- unsigned char a,b;
- for(b=173;b>0;b--)
- for(a=143;a>0;a--);
- }
- /********************************************************************
- * 名称 : Com_Init()
- * 功能 : 串口初始化,晶振12,波特率2400,使串口中断
- * 输入 : 无
- * 输出 : 无
- ***********************************************************************/
- void Com_Init(void)
- {
- PCON &= 0x00; //波特率不倍速
- SCON = 0x50; //8位数据,可变波特率
- //AUXR &= 0xBF; //定时器1时钟为Fosc/12,即12T
- //AUXR &= 0xFE; //串口1选择定时器1为波特率发生器
- TMOD &= 0x0F; //清除定时器1模式位
- TMOD |= 0x20; //设定定时器1为8位自动重装方式
- TL1 = 0xF3; //设定定时初值
- TH1 = 0xF3; //设定定时器重装值
- ET1 = 0; //禁止定时器1中断
- TR1 = 1; //启动定时器1
- SM0 = 0;
- SM1 = 1;
- REN = 1;
- EA = 1;
- ES = 1;
- }
- /*****前进*****/
- void go()
- {
- Left_moto_go ;
- Right_moto_go ;
- }
- /*****后退*****/
- void back()
- {
- Left_moto_back ;
- Right_moto_back ;
- }
- /*****左转*****/
- void turn_left()
- {
- Left_moto_back;
- Right_moto_go ;
- }
- /*****右转*****/
- void turn_right()
- {
- Left_moto_go;
- Right_moto_back;
- }
- /*****急停*****/
- void stop()
- {
- Left_moto_s;
- Right_moto_s;
- }
- /*****PWM左电机*****/
- void pwm_out_left_moto(void)
- {
- if(Left_moto_stop)
- {
- if(pwm_val_left<=push_val_left)
- ENA=1;
- else
- ENA=0;
- if(pwm_val_left>=20)
- pwm_val_left=0;
- }
- else ENA=0;
- }
- /*****PWM右电机*****/
- void pwm_out_right_moto(void)
- {
- if(Right_moto_stop)
- {
- if(pwm_val_right<=push_val_right)
- ENB=1;
- else
- ENB=0;
- if(pwm_val_right>=20)
- pwm_val_right=0;
- }
- else ENB=0;
- }
- /********************************************************************
- * 名称 : Com_Int()
- * 功能 : 串口中断子函数
- * 输入 : 无
- * 输出 : 无
- ***********************************************************************/
- void Com_Int(void) interrupt 4
- {
- EA = 0;
- if(RI) //当硬件接收到一个数据时,RI会置位
- {
- M = SBUF;
- RI = 0;
- }
- EA = 1;
- }
- /*TIMER0中断服务子函数产生PWM信号*/
- void timer0()interrupt 1 using 2
- {
- TH0=0XFC; //1ms定时
- TL0=0X18;
- pwm_val_left++;
- pwm_val_right++;
- pwm_out_left_moto();
- pwm_out_right_moto();
- }
- /*****循迹函数*****/
- void xunji()
- {
- uchar flag;
- if((RSEN1==0)&&(RSEN2==0)&&(LSEN1==0)&&(LSEN2==0))
- { flag=0; }//*******直行*******//
- else if((RSEN1==0)&&(RSEN2==1)&&(LSEN1==0)&&(LSEN2==0))
- { flag=1;} //***右偏,左转***//
- else if((RSEN1==0)&&(RSEN2==0)&&(LSEN1==1)&&(LSEN2==0))
- { flag=2;} //***左偏,右转***//
- else if((RSEN1==1)&&(RSEN2==0)&&(LSEN1==0)&&(LSEN2==0))
- { flag=1;} //***右偏,左转***//
- else if((RSEN1==0)&&(RSEN2==0)&&(LSEN1==0)&&(LSEN2==1))
- { flag=2;} //***左偏,右转***//
- else if((RSEN1==1)&&(RSEN2==1)&&(LSEN1==0)&&(LSEN2==0))
- { flag=1;} //***右偏,左转***//
- else if((RSEN1==0)&&(RSEN2==0)&&(LSEN1==1)&&(LSEN2==1))
- { flag=2;} //***左偏,右转***//
- else if((RSEN1==1)&&(RSEN2==1)&&(LSEN1==1)&&(LSEN2==1))
- { flag=3; }//*******急停*******//
- switch (flag)
- {
- case 0:go();break;
- case 1:turn_left();delay50ms();break;
- case 2:turn_right();delay50ms();break;
- case 3:stop();delay50ms();break;
- default: break;
- }
- }
- /********循迹模式*******/
- void tracing()
- {
- while(1)
- {
- TMOD|=0X01;
- TH0=0XFC;//1ms定时
- TL0=0X18;
- TR0=1;
- ET0=1;
- EA =1;
- if(M == '1')
- break;
- while(1)/*无限循环*/
- {
- xunji();
- if(M == '1')
- break;
- }
- }
- }
- void main()
- {
- Delay_ms(100);
- Com_Init();//串口初始化
- while(1)
- {
- switch(M)
- {
- case 'A': go();Delay_ms(100); break;
- case 'B': back();Delay_ms(100); break;
- case 'C': turn_left();Delay_ms(100); break;
- case 'D': turn_right();Delay_ms(100); break;
- case 'F': stop();Delay_ms(100); break;
- case '2': tracing(); break;
- case '3': push_val_left =4;push_val_right =4; break;
- case '4': push_val_left =10;push_val_right =10; break;
- case '5': push_val_left =20;push_val_right =20; break;
- default:break;
- }
- }
- }
复制代码
所有资料51hei提供下载:
蓝牙寻迹终极.zip
(1.86 KB, 下载次数: 20)
|