四路寻迹小车仿真,液晶显示小车行驶状态
包括直行,小右转,大右转,小左转,大左转
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
仿真界面
主程序流程图
单片机源程序如下:
- #include <reg52.h>//52头文件
- #include <lcd.h>//液晶显示配置文件
- unsigned char pwm_left_val; //左电机占空比值 取值范围0-170,0最快
- unsigned char pwm_right_val; //右电机占空比值取值范围0-170 ,0最快
- unsigned char pwm_t;//周期
- void delay(unsigned int z)//毫秒级延时
- {
- unsigned int x,y;
- for(x = z; x > 0; x--)
- for(y = 114; y > 0 ; y--);
- }
- /*小车前进*/
- int forward()
- {
- pwm_left_val=100;
- pwm_right_val=100;
- left_motor_go; //左电机前进
- right_motor_go; //右电机前进
- }
- /*小车小左转*/
- int xiaoleft_run()
- {
- pwm_left_val=170;
- pwm_right_val=100;
- left_motor_go; //左电机前进
- right_motor_go; //右电机前进
- }
- /*小车大左转*/
- void daleft_run()
- {
- left_motor_stops; //左电机停止
- right_motor_go; //右电机前进
- }
- /*小车小右转*/
- int xiaoright_run()
- {
- pwm_left_val=100;
- pwm_right_val=170;
- left_motor_go; //左电机前进
- right_motor_go; //右电机前进
- }
- /*小车大右转*/
- void daright_run()
- {
- right_motor_stops;//右电机停止
- left_motor_go; //左电机前进
- }
- //定时器0中断
- void timer0() interrupt 1
- {
- pwm_t++;//周期计时加
- if(pwm_t == 255)
- pwm_t = EN1 = EN2 = 0;
- if(pwm_left_val == pwm_t)//左电机占空比
- EN1 = 1;
- if(pwm_right_val == pwm_t)//右电机占空比
- EN2 = 1;
- }
- void main()
- {
- for(;;) //死循环
- {
- if(key == 0)// 实时检测S2按键是否被按下
- {
- delay(5); //软件消抖
- LCDInit();
- DisplayString(0x0,0,"Left's Go");
- break; //退出FOR死循环
- }
- }
- delay(1000);//延时1秒
- TMOD |= 0x02;//8位自动重装模块
- TH0 = 220;
- TL0 = 220;//11.0592M晶振下占空比最大比值是256,输出100HZ
- TR0 = 1;//启动定时器0
- ET0 = 1;//允许定时器0中断
- EA = 1;//总中断允许
- while(1)
- {
- //为0 没有识别到黑线 为1识别到黑线
- if(left2_led == right1_led)
- {
- forward();//前进
- WriteCmd(LCD_CLS);
- DisplayString(0x0,0,"forward");
- delay(200);
- }
- else if(left1_led == 0 && left2_led == 1 && right1_led== 0 && right2_led== 0 )//左边触线,小左转修正
- {
- xiaoleft_run();
- WriteCmd(LCD_CLS);
- DisplayString(0x0,0,"Turn Left small");
- delay(200);
- }
- else if(left1_led == 1 && left2_led == 1 && right1_led== 0 && right2_led== 0 )//最左边触线,大左转修正
- {
- daleft_run();
- WriteCmd(LCD_CLS);
- DisplayString(0x0,0,"Turn Left big");
- delay(200);
- }
- else if(left1_led == 0 && left2_led == 0 && right1_led== 1 && right2_led== 0 )//右边触线,小右转修正
- {
- xiaoright_run();
- WriteCmd(LCD_CLS);
- DisplayString(0x0,0,"Turn Right small");
- delay(200);
- }
- else if(left1_led == 0 && left2_led == 0 && right1_led== 1 && right2_led== 1 ) //最右边触线,大右转修正
- {
- daright_run();
- WriteCmd(LCD_CLS);
- DisplayString(0x0,0,"Turn Right big");
- delay(200);
- }
- }
- }
复制代码
所有资料51hei提供下载:
寻迹小车.rar
(132 KB, 下载次数: 195)
|