找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4461|回复: 1
打印 上一主题 下一主题
收起左侧

基于单片机循迹小车Proteus仿真+程序

[复制链接]
跳转到指定楼层
楼主
分享一个简单的循迹小车的程序
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)


单片机源程序如下:
  1. //----------------------------------------------------------
  2. //----文件:自动循迹小车源代码
  3. //----直流电机的开环控制keil c51 源代码
  4. //----------------------------------------------------------
  5. //--------------------调用库函数----------------
  6. #include        <AT89X52.h>
  7. #include        <xiaoche.h>
  8. #include        <xunji.c>
  9. #include        <stop.c>
  10. #include        <keyboard.c>
  11. #include        <bizhang.c>
  12. #include        <pwmout.c>

  13. //----------------------------------------------------------
  14. //函数名称:main      
  15. //用户主函数               
  16. //函数功能:主函数
  17. //----------------------------------------------------------
  18. void main()
  19. {
  20.           WDT_CONTR=0x3b;
  21.           timer_init();                //初始化
  22.           while(1)
  23.         {
  24.           keyboard();                //键盘扫描
  25.           jieshou();                //遥控信号检测,要与传感器实物连接才能正常使用.
  26.           xunji();                        //循迹检测
  27.           bizhang();                //避碍物检测
  28.           stop();                        //目标站点检测
  29.           WDT_CONTR=0x3b;          //喂狗
  30.         }
  31. }
复制代码
  1. //-------------------------------------------------------
  2. //----函数名称: timer_init
  3. //----函数功能: 初始化设置定时器
  4. //-------------------------------------------------------
  5. void timer_init()
  6. {
  7.                 flag=0;flag3=0;
  8.                 key=0xFF;
  9.             TMOD=0x20;                                                //定时器1为模式2(8位自动重装)
  10.                 TF1=0;                                                        //清中断标志
  11.                 TH1=timer_data;                                        //保证定时时长为0.1ms
  12.                 TL1=TH1;
  13.                 ET1=1;                                                        //允许T0中断
  14.                 TR1=1;                                                        //开始计数
  15.                 EA=1;                                                        //中断允许
  16.                 ENA=0;                                                        //电机禁止
  17.             PWM_t=PWM_t0;                                        //看门狗复位后速度恢复
  18.             flag=flag4;                                                //看门狗复位后小车状态恢复
  19. }
  20. //----------------------------------------------------------
  21. //----函数名称: intTime0
  22. //----函数功能: 定时器中断处理程序
  23. //----------------------------------------------------------
  24. void IntTime1()interrupt 3        using        2
  25. {
  26.       time_count++;
  27.                   if(flag3)number++;
  28.                 if(number==6000){number=0;number1++;}
  29.                 if(number1==8){flag3=0;number1=0;flag=flag2;}        
  30.                   if(flag==0)ENA=0;                                //小车停止,flag=0,小车停止标志
  31.                 if(flag==1)                                                //小车前进,flag=1,小车前进标志
  32.         {
  33.                 ENA=1;                                                        //PWM波输出使能
  34.                 DR=0;                                                        //直流电机一端接低电平
  35.                 DR2=0;                                                        //直流电机一端接低电平
  36.                 if(kind==0)                                                //没有传感器检测到黑线,走直线
  37.         {        if(time_count<PWM_t)
  38.                 {PWM=1;PWM2=1;}
  39.                 else
  40.                 {PWM=0;PWM2=0;}
  41.                 }
  42.                 if(kind==1)                                                //左边第一个传感器检测到黑线
  43.         {        
  44.                         if(time_count<(PWM_t-20))
  45.                 {PWM=1;}
  46.                 else
  47.                 {PWM=0;}                        
  48.                         if(time_count<PWM_t)
  49.                 {PWM2=1;}
  50.                 else
  51.                 {PWM2=0;}
  52.                 }
  53.                 if(kind==2)                                                //左边第二个传感器检测到黑线
  54.         {        
  55.                         if(time_count<3)
  56.                 {PWM=1;}
  57.                 else
  58.                 {PWM=0;}                        
  59.                         if(time_count<PWM_t)
  60.                 {PWM2=1;}
  61.                 else
  62.                 {PWM2=0;}
  63.                 }
  64.                 if(kind==3)                                                //右边第一个传感器检测到黑线
  65.         {        
  66.                         if(time_count<(PWM_t-20))
  67.                 {PWM2=1;}
  68.                 else
  69.                 {PWM2=0;}                        
  70.                         if(time_count<PWM_t)
  71.                 {PWM=1;}
  72.                 else
  73.                 {PWM=0;}
  74.                 }
  75.                 if(kind==4)                                                //右边第二个传感器检测到黑线
  76.         {        
  77.                         if(time_count<3)
  78.                 {PWM2=1;}
  79.                 else
  80.                 {PWM2=0;}                        
  81.                         if(time_count<PWM_t)
  82.                 {PWM=1;}
  83.                 else
  84.                 {PWM=0;}
  85.                 }
  86.         }
  87.                 if(flag==2)                                                //小车倒退,flag=2,小车倒退标志
  88.         {
  89.                 ENA=1;
  90.                 PWM=0;
  91.                 PWM2=0;
  92.                 if(kind==0)                                                //没有传感器检测到黑线,走直线
  93.             {        if(time_count<PWM_t)
  94.                         {DR=1;DR2=1;}
  95.                         else
  96.                         {DR=0;DR2=0;}
  97.                 }
  98.                 if(kind==1)                                                //左边第一个传感器检测到黑线
  99.             {        
  100.                         if(time_count<(PWM_t-20))
  101.                 {DR=1;}
  102.                 else
  103.                 {DR=0;}                        
  104.                         if(time_count<PWM_t)
  105.                 {DR2=1;}
  106.                 else
  107.                 {DR2=0;}
  108.                 }
  109.                 if(kind==2)                                                //左边第二个传感器检测到黑线
  110.             {        
  111.                         if(time_count<3)
  112.                 {DR=1;}
  113.                 else
  114.                 {DR=0;}                        
  115.                         if(time_count<PWM_t)
  116.                 {DR2=1;}
  117.                 else
  118.                 {DR2=0;}
  119.                 }
  120.                 if(kind==3)                                                   //右边第一个传感器检测到黑线
  121.             {        
  122.                         if(time_count<(PWM_t-20))
  123.                 {DR2=1;}
  124.                 else
  125.                 {DR2=0;}                        
  126.                         if(time_count<PWM_t)
  127.                 {DR=1;}
  128.                 else
  129.                 {DR=0;}
  130.                 }
  131.                 if(kind==4)                                                  //右边第二个传感器检测到黑线
  132.             {        
  133.                         if(time_count<3)
  134.                 {DR2=1;}
  135.                 else
  136.                 {DR2=0;}                        
  137.                         if(time_count<PWM_t)
  138.                 {DR=1;}
  139.                 else
  140.                 {DR=0;}
  141.                 }
  142.         }
  143.       if(time_count >= PWM_T)                          //每输出一个PWM波计数器清一次零,也即PWM波周期长度
  144.         {
  145.          time_count=0;
  146.         }
  147. }
复制代码

Proteus7.5版本的dsn文件与Keil2代码 51hei附件下载:
pwm.7z (377.47 KB, 下载次数: 91)

评分

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

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏3 分享淘帖 顶1 踩
回复

使用道具 举报

沙发
ID:908826 发表于 2021-12-7 09:53 | 只看该作者
妈耶,你这是怎么改的背景,好科幻的样子
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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