找回密码
 立即注册

QQ登录

只需一步,快速开始

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

LDC1000循迹小车的单片机程序

[复制链接]
跳转到指定楼层
楼主
ID:389559 发表于 2018-8-26 15:40 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
金属循迹小车资料

单片机源程序如下:
  1. #include <reg51.h>
  2. #include <intrins.h>
  3. #include <math.h>       
  4. #include "lcd1602.h"
  5. #include "ldc1000.h"
  6. #include "move.h"
  7. #include "nvic.h"

  8. #define uchar unsigned char
  9. #define uint  unsigned int
  10. #define BASIC_VALUE1 723 //720
  11. #define BASIC_VALUE2 644 ///640
  12. #define COIN 290
  13. #define BASIC_SPEED 10         //10         //15

  14. sbit BEEP = P3^6 ;        //蜂鸣器
  15. sbit S1 = P3^5;        //按键1

  16. uint j=0;
  17. uchar i=0;
  18. long time=0,num=0;
  19. uchar flag=0;
  20. uint dvalue1=0,dvalue2=0;
  21. extern unsigned char code ASCII[12] =    {'0','1','2','3','4','5','6','7','8','9'};//字库
  22. unsigned short LDC_value1=0,LDC_value2=0;//返回值                        
  23. unsigned char disbuff[4]={0,0,0,0};//显示缓存       

  24. void Lcd_Show();
  25. void Turn_Left2();
  26. void Turn_Right2();
  27. uint Key_Scan();

  28. void main(void)
  29. {
  30.         InitLcd1602();                        //1602液晶初始化
  31.         FLOAT_LDC1_init();                //LDC1000模块1初始化
  32.         FLOAT_LDC2_init();                //LDC1000模块2初始化
  33.         Lcd_Show();                                   //lcd显示
  34.         Tim0_Init();                           //定时器0初始化
  35.         Exti0_Init();                        //外部中断0初始化
  36.         while(1)                                  
  37.         {
  38.                 LDC_value1=filter1()/10;//采样1
  39.                 LDC_value2=filter2()/10;//采样2
  40.                 dvalue1=abs(LDC_value1-BASIC_VALUE1);
  41.                 dvalue2=abs(LDC_value2-BASIC_VALUE2);
  42.                 if((dvalue1>COIN)||(dvalue2>COIN)){i++;if(i>1){flag=1;i=2;}Go(BASIC_SPEED);}        //硬币检测,第一次采样的值滤掉
  43.                 else
  44.                 if((dvalue1+dvalue2)<29)Go(BASIC_SPEED);        //判断是否走直线(重要阈值)
  45.                 else
  46.                 if(dvalue1>dvalue2)
  47.                 {
  48.                         Turn_Left();
  49.                 }
  50.                 else
  51.                 {
  52.                         Turn_Right();
  53.                 }
  54. /********* LDC1000数值显示 *********/
  55.                 disbuff[0]=LDC_value1/1000;
  56.                 disbuff[1]=LDC_value1%1000/100;
  57.                   disbuff[2]=LDC_value1%1000%100/10;
  58.             disbuff[3]=LDC_value1%1000%100%10;               
  59.                 DisplayOneChar(2, 1, ASCII[disbuff[0]]);
  60.                 DisplayOneChar(3, 1, ASCII[disbuff[1]]);
  61.                 DisplayOneChar(4, 1, ASCII[disbuff[2]]);
  62.                 DisplayOneChar(5, 1, ASCII[disbuff[3]]);
  63.                 disbuff[0]=LDC_value2/1000;
  64.                 disbuff[1]=LDC_value2%1000/100;
  65.                   disbuff[2]=LDC_value2%1000%100/10;
  66.             disbuff[3]=LDC_value2%1000%100%10;               
  67.                 DisplayOneChar(11, 1, ASCII[disbuff[0]]);
  68.                 DisplayOneChar(12, 1, ASCII[disbuff[1]]);
  69.                 DisplayOneChar(13, 1, ASCII[disbuff[2]]);
  70.                 DisplayOneChar(14, 1, ASCII[disbuff[3]]);
  71. /********* 行驶距离显示 *********/
  72.                 disbuff[0]=(int)(num/4*3)/1000;
  73.                 disbuff[1]=(int)(num/4*3)%1000/100;
  74.                   disbuff[2]=(int)(num/4*3)%1000%100/10;
  75.             disbuff[3]=(int)(num/4*3)%1000%100%10;               
  76.                 DisplayOneChar(2, 0, ASCII[disbuff[0]]);
  77.                 DisplayOneChar(3, 0, ASCII[disbuff[1]]);
  78.                 DisplayOneChar(4, 0,'.');
  79.                 DisplayOneChar(5, 0, ASCII[disbuff[2]]);
  80.                 DisplayOneChar(6, 0, ASCII[disbuff[3]]);
  81. /********* 运行时间显示 *********/
  82.                 DisplayTime(time);
  83.                 if(Key_Scan())        //行驶结束检测
  84.                 {
  85.                         TR0=0;
  86.                         EX0=0;
  87.                         EA=0;
  88.                         Stop();
  89.                         while(1)
  90.                         {
  91.                         Stop();
  92.                         }
  93.                 }
  94.         }
  95. }

  96. void Lcd_Show()
  97. {
  98.         DisplayOneChar(0, 0, 'S');
  99.         DisplayOneChar(1, 0, ':');
  100.         DisplayOneChar(7, 0, 'm');
  101.         DisplayOneChar(9, 0, 'T');
  102.         DisplayOneChar(10, 0,':');
  103.         DisplayOneChar(0, 1, 'L');
  104.         DisplayOneChar(1, 1, ':');
  105.         DisplayOneChar(9, 1, 'R');
  106.         DisplayOneChar(10, 1, ':');
  107. }
  108. void Tim0() interrupt 1                  //0.5ms定时器中断
  109. {
  110.         TH0=0xfe;
  111.            TL0=0x33;      //0.5ms定时
  112.         j++;
  113.         if(flag)BEEP=~BEEP;
  114.         if(j==2000)
  115.         {
  116.                 time++;j=0;flag=0;
  117.         }
  118. }

  119. void Exti0() interrupt 0        //外部中断0
  120. {
  121.         if(!(dvalue2>dvalue1))        num++;
  122. }
  123. /********** 小车控制函数 **********/
  124. void Turn_Left2()
  125. {
  126.         while(dvalue1>dvalue2)
  127.         {
  128.                 LDC_value1=filter1()/10;//采样1
  129.                 LDC_value2=filter2()/10;//采样2
  130.                 dvalue1=abs(LDC_value1-BASIC_VALUE1);
  131.                 dvalue2=abs(LDC_value2-BASIC_VALUE2);
  132.                 Left(-1);
  133.                 Right(1);
  134.                 Delay_ms(9);
  135.                 Stop();
  136.                 Delay_ms(16);
  137.         }
  138.         Go(BASIC_SPEED);
  139. }
  140. void Turn_Right2()
  141. {
  142.         while(!(dvalue1>dvalue2))
  143.         {
  144.                 LDC_value1=filter1()/10;//采样1
  145.                 LDC_value2=filter2()/10;//采样2
  146.                 dvalue1=abs(LDC_value1-BASIC_VALUE1);
  147.                 dvalue2=abs(LDC_value2-BASIC_VALUE2);
  148.                 Left(1);
  149.                 Right(-1);
  150.                 Delay_ms(9); //12
  151. ……………………

  152. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

所有资料51hei提供下载:
%LDC1000寻迹小车.rar (78.41 KB, 下载次数: 18)


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

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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