找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 6583|回复: 8
收起左侧

单片机寻迹小车PROTEUS仿真及代码

  [复制链接]
ID:687441 发表于 2020-3-28 01:07 | 显示全部楼层 |阅读模式
四路寻迹小车仿真,液晶显示小车行驶状态
包括直行,小右转,大右转,小左转,大左转
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)

仿真界面

仿真界面

主程序流程图

主程序流程图


单片机源程序如下:
  1. #include <reg52.h>//52头文件
  2. #include <lcd.h>//液晶显示配置文件
  3. unsigned char pwm_left_val; //左电机占空比值 取值范围0-170,0最快
  4. unsigned char pwm_right_val; //右电机占空比值取值范围0-170 ,0最快
  5. unsigned char pwm_t;//周期

  6. void delay(unsigned int z)//毫秒级延时
  7. {
  8.         unsigned int x,y;
  9.         for(x = z; x > 0; x--)
  10.                 for(y = 114; y > 0 ; y--);
  11. }       
  12. /*小车前进*/
  13. int forward()
  14. {
  15.         pwm_left_val=100;
  16.         pwm_right_val=100;
  17.         left_motor_go; //左电机前进
  18.         right_motor_go; //右电机前进
  19. }
  20. /*小车小左转*/
  21. int xiaoleft_run()
  22. {
  23.         pwm_left_val=170;
  24.         pwm_right_val=100;
  25.         left_motor_go; //左电机前进
  26.         right_motor_go; //右电机前进
  27. }
  28. /*小车大左转*/
  29. void daleft_run()
  30. {
  31.         left_motor_stops; //左电机停止
  32.         right_motor_go; //右电机前进
  33. }
  34. /*小车小右转*/
  35. int xiaoright_run()
  36. {
  37.         pwm_left_val=100;
  38.         pwm_right_val=170;
  39.         left_motor_go; //左电机前进
  40.         right_motor_go; //右电机前进
  41. }
  42. /*小车大右转*/
  43. void daright_run()
  44. {
  45.         right_motor_stops;//右电机停止
  46.         left_motor_go;    //左电机前进
  47. }
  48. //定时器0中断
  49. void timer0() interrupt 1
  50. {
  51.         pwm_t++;//周期计时加
  52.         if(pwm_t == 255)
  53.                 pwm_t = EN1 = EN2 = 0;
  54.         if(pwm_left_val == pwm_t)//左电机占空比       
  55.                 EN1 = 1;               
  56.         if(pwm_right_val == pwm_t)//右电机占空比
  57.                 EN2 = 1;                         
  58. }
  59. void main()
  60. {
  61.         for(;;)        //死循环
  62.         {
  63.                 if(key == 0)// 实时检测S2按键是否被按下
  64.                 {
  65.                         delay(5); //软件消抖
  66.                         LCDInit();
  67.               DisplayString(0x0,0,"Left's Go");
  68.                   break;                //退出FOR死循环
  69.                 }
  70.         }
  71.         delay(1000);//延时1秒
  72.         TMOD |= 0x02;//8位自动重装模块
  73.         TH0 = 220;
  74.         TL0 = 220;//11.0592M晶振下占空比最大比值是256,输出100HZ
  75.         TR0 = 1;//启动定时器0
  76.         ET0 = 1;//允许定时器0中断
  77.         EA        = 1;//总中断允许
  78.         while(1)
  79.         {
  80.                 //为0 没有识别到黑线 为1识别到黑线
  81.                 if(left2_led == right1_led)
  82.                 {
  83.                         forward();//前进
  84.                         WriteCmd(LCD_CLS);
  85.                         DisplayString(0x0,0,"forward");
  86.                         delay(200);
  87.                 }
  88.                 else if(left1_led == 0 && left2_led == 1 && right1_led== 0 && right2_led== 0 )//左边触线,小左转修正
  89.                         {
  90.                                 xiaoleft_run();
  91.                                 WriteCmd(LCD_CLS);
  92.                             DisplayString(0x0,0,"Turn Left small");
  93.                             delay(200);
  94.                         }
  95.                 else if(left1_led == 1 && left2_led == 1 && right1_led== 0 && right2_led== 0 )//最左边触线,大左转修正
  96.                         {
  97.                             daleft_run();
  98.                                 WriteCmd(LCD_CLS);
  99.                             DisplayString(0x0,0,"Turn Left big");
  100.                             delay(200);
  101.                         }
  102.                 else if(left1_led == 0 && left2_led == 0 && right1_led== 1 && right2_led== 0 )//右边触线,小右转修正
  103.                         {
  104.                             xiaoright_run();
  105.                                 WriteCmd(LCD_CLS);
  106.                             DisplayString(0x0,0,"Turn Right small");
  107.                             delay(200);
  108.                         }       
  109.            else if(left1_led == 0 && left2_led == 0 && right1_led== 1 && right2_led== 1 ) //最右边触线,大右转修正
  110.                     {
  111.                             daright_run();
  112.                                 WriteCmd(LCD_CLS);
  113.                             DisplayString(0x0,0,"Turn Right big");
  114.                             delay(200);
  115.                     }       
  116.                 }               
  117.         }
复制代码

所有资料51hei提供下载:
寻迹小车.rar (132 KB, 下载次数: 189)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:721016 发表于 2020-4-15 15:26 | 显示全部楼层
我想问一下proteus仿真的时候怎么判断是不是在执行循迹啊。显示屏上一直显示直行按开关也没反应。还是说proteus看不到这样的效果
回复

使用道具 举报

ID:728133 发表于 2020-5-1 23:08 | 显示全部楼层
搞好了,没有问题
回复

使用道具 举报

ID:753887 发表于 2020-5-22 09:31 来自手机 | 显示全部楼层
没有电路图啊
回复

使用道具 举报

ID:772902 发表于 2021-4-25 15:51 | 显示全部楼层
这个寻迹是采用光电还是红外传感器啊
回复

使用道具 举报

ID:912376 发表于 2021-4-28 17:38 | 显示全部楼层
这个仿真图里没有寻迹模块,只是在用开关控制小车前进、左转、右转
回复

使用道具 举报

ID:940368 发表于 2021-6-19 12:11 | 显示全部楼层
请问这个头文件和液晶显示配置文件在压缩包有吗
回复

使用道具 举报

ID:938892 发表于 2021-6-19 13:25 | 显示全部楼层

搞好了,没有问题
回复

使用道具 举报

ID:945628 发表于 2021-6-28 21:14 | 显示全部楼层
能两个轮子一起动吗?好多程序都是只能一个轮子动
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表