找回密码
 立即注册

QQ登录

只需一步,快速开始

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

自动避障红外电动小车C51程序

[复制链接]
跳转到指定楼层
楼主
ID:358709 发表于 2018-11-9 15:40 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
程序注释解释清楚明了

单片机源程序如下:
  1. //??????????C51??
  2. #include"reg51.h"
  3. #include<intrins.h>
  4. #define uchar unsigned char
  5. #define uint  unsigned int
  6. #define left_infrare  0
  7. #define right_infrare 1
  8. #define dj_state1        0X5F      //??
  9. #define dj_state2        0X4F      //??  
  10. #define dj_state3        0X1F      //??  
  11. #define dj_state4        0X0F      //??  
  12. #define dj_state5        0XfF      //??
  13. #define light_off        0x0f      //????
  14. #define left_light       0X5F      //????    ???5f
  15. #define right_light      0XaF      //????0xaf,???0xbf
  16. #define back_light       0XcF      //??????
  17. #define front_light      0x3f      //??
  18. #define light_on         0xff      //????
  19. #define true  1
  20. #define false 0
  21. #define LCD_Data  P0
  22. #define Busy  0x80            //????LCD?????Busy??
  23. sbit    c=P1^2;              //??????
  24. uchar code talk1[]={"backward"};
  25. uchar code talk2[]={"forward"};
  26. uchar code talk3[]={"Turnleft"};
  27. uchar code talk4[]={"Turn right"};
  28. uchar flage =0x00;
  29. sbit  ledcs=P1^2;         //74H573?????
  30. //sbit  left_led=P0^2;     //??????
  31. //sbit  right_led=P0^3;    //??????

  32. sbit  LCD_RS = P1^5;     //LCD????
  33. sbit  LCD_RW = P1^6;     //
  34. sbit  LCD_E  = P1^7 ;
  35. void Delay5Ms(void)
  36. {
  37. uint TempCyc = 5552;
  38. while(TempCyc--);
  39. }
  40. //400ms??
  41. void Delay400Ms(void)
  42. {uchar TempCycA = 5;
  43. uint TempCycB;
  44. while(TempCycA--)
  45.    { TempCycB=7269;
  46.      while(TempCycB--);
  47.     }
  48. }
  49. //LCD???
  50. unsigned char ReadStatusLCD(void)
  51. {
  52. LCD_Data = 0xFF;
  53. LCD_RS = 0;
  54. LCD_RW = 1;
  55. LCD_E = 0;
  56. LCD_E = 0;
  57. LCD_E = 1;
  58. while (LCD_Data & Busy);   //?????
  59. return(LCD_Data);
  60. }
  61. //LCD???
  62. void WriteDataLCD(unsigned char WDLCD )
  63. {
  64. ReadStatusLCD();  //???
  65. LCD_Data = WDLCD;
  66. LCD_RS=1;
  67. LCD_RW =0;
  68. LCD_E = 0; //?????????????????
  69. LCD_E = 0; //?? ,????
  70. LCD_E = 0; //??
  71. LCD_E = 1;
  72. }
  73. //LCD???
  74. void WriteCommandLCD(unsigned char WCLCD,BuysC)
  75. {
  76. if (BuysC) ReadStatusLCD();   //???????,BuysC?0??????
  77. LCD_Data = WCLCD;
  78. LCD_RS= 0;
  79. LCD_RW= 0;
  80. LCD_E = 0;  //?? ,????
  81. LCD_E = 0;
  82. LCD_E = 0; //??
  83. LCD_E = 1;
  84. }
  85. void LCDInit(void)         //LCD???
  86. {
  87. Delay400Ms();
  88. LCD_Data = 0;
  89. WriteCommandLCD(0x38,0);  //????????,??????
  90. Delay5Ms();
  91. WriteCommandLCD(0x38,0);
  92. Delay5Ms();
  93. WriteCommandLCD(0x38,0);
  94. Delay5Ms();

  95. WriteCommandLCD(0x38,1); //??????,???????????
  96. WriteCommandLCD(0x08,1); //????
  97. WriteCommandLCD(0x01,1); //????
  98. WriteCommandLCD(0x06,1); // ????????
  99. WriteCommandLCD(0x0C,1); // ????????
  100. }
  101. //???????????
  102. void DisplayOneChar(uchar X, uchar Y, uchar DData)
  103. {
  104. Y &= 0x1;
  105. X &= 0xF;                 //??X????15,Y????1
  106. if (Y)
  107. X |= 0x40;               //???????????+0x40;
  108. X |= 0x80;               // ??LCD????
  109. WriteCommandLCD(X, 0);   //????????,?????
  110. WriteDataLCD(DData);
  111. }
  112. //???????????(?????);
  113. void DisplayListChar(uchar X, uchar Y,uchar ListLength, uchar  *DData,uchar n)
  114. { uchar i;
  115. Y &= 0x01;
  116. X &= 0x0F;                 //??X????15,Y????1
  117. for(i=0;i<ListLength;i++)
  118. { if (X <= 0x0F) //X?????0xF
  119.     {   DisplayOneChar(X, Y, DData[i]); //??????
  120.          if(n==true)Delay400Ms();
  121.           X++;
  122.     }
  123.   }
  124. }
  125. /****************************
  126. ????????,?????????????
  127. ****************************/
  128. void infrared_ray()interrupt 0  using 3
  129. {  uchar i=90;
  130.    flage=0x01;             //?????
  131.    while(i--);            //?????
  132.    EX0=0;               //????,??????????,????
  133. }
  134. // ?????
  135. void delay(uint n)
  136. {
  137.   while(--n);
  138. }
  139. //?????
  140. void Init0(void)
  141. {  EA=1;
  142.    IT0=1;
  143.     }
  144. /***************************************
  145. /*????????? ????,
  146. ????????????????????????,
  147. ????????
  148. ****************************************/
  149. void seng_wave(uchar timer,bit n)//timer???????????,n->????????
  150. {  uchar i;
  151.    P1 |= 0X04;      //ledcs=1?74ls573?11????????????,?????????,???
  152.    IE |= 0X01;
  153.    P0 |=0x0c;   //04
  154.    for(i=timer;i>0;i--)
  155.      { if(n)P0^=0x08;                      // ????????????//00
  156.         else P0^=0x04;                    // ????????????//0c
  157.          delay(100);                     //????????(??38khz??????)???
  158.       }                                     //timer*delay(x)????????????
  159.     P1 &= 0Xfb;
  160.     IE &= 0Xfe;
  161. }
  162. //led????????
  163. void light_control(uchar deng)
  164. {   ledcs=1;
  165.     P0 =deng;
  166.     ledcs=0;  //11111011
  167. }
  168. //??????????
  169. void  control(uchar n,uchar dj_state,uchar light)
  170. {   uchar i;
  171.    // P1|=0x04;
  172.      light_control(light);    //led?????
  173.      delay(100);
  174.      P2 =dj_state;              //???????
  175.     WriteCommandLCD(0x01,1); //LCD????

  176.           switch(dj_state)
  177.           { case dj_state2 :{ DisplayListChar(3,1,10,talk4,false);}break;
  178.             case dj_state3: { DisplayListChar(3,1,8,talk3,false);}break;
  179.             case dj_state4: { DisplayListChar(3,1,7,talk1,false); }break;
  180.              default :break;
  181.              }
  182.           for(i=n;i>0;i--)
  183.           {delay(2000);}
  184.            P2=dj_state5;               //??
  185.          light_control(light_off);       //led??
  186.         WriteCommandLCD(0x01,1); //LCD????
  187.          P2=dj_state1;                     //??
  188.         if(dj_state1)
  189.            { P1|=0X04;          //ledcs=1;
  190.              P0=0x0f;
  191.              P1&=0XFB;
  192.              delay(100);
  193.              DisplayListChar(0,0,7,talk2,false);
  194.              }
  195.      }
  196. /****************************************
  197. ????????
  198. *****************************************/
  199. void move_car(void)
  200. {
  201.    uchar temp =0x00;
  202.    //???????
  203.        seng_wave(1,left_infrare);     //???????????,??????
  204.         if(flage==0x01){temp|=0x01;flage=0x00;}
  205.        //???????
  206.          delay(30);
  207.         seng_wave(1,right_infrare);    //???????????,??????
  208.         if(flage==0x01){temp|=0x02;flage=0x00;}

  209.       //??????,??
  210.      if(temp==0x01){control(2,dj_state2,left_light); temp =0x00;}
  211.       //??????,??
  212.       else if(temp==0x02) {control(2,dj_state3,right_light ); temp =0x00;}
  213.        //?????????,??,??
  214.         else if(temp==0x03) {control(10,dj_state4,back_light );
  215.               control(5,dj_state2,right_light ); temp =0x00;}      

  216.     }
  217. void main(void)
  218. {  Init0();       //?????
  219.    P1 |= 0X04;    //????????
  220.    P0 = 0xFf;     //??????
  221.    P1&=0XFB;      //????????
  222.    LCDInit();     //LCD???
  223.    WriteCommandLCD(0x01,1);   //????
  224.    delay(100);
  225.    P2=dj_state1;
  226.    DisplayListChar(0,0,8,talk2,false);
  227. while(1)
  228.    {    move_car();  //??????
  229.         delay(200000);//??
  230.     }
  231. }
复制代码

所有资料51hei提供下载:
自动避障红外电动小车C51程序.rar (2.81 KB, 下载次数: 7)


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

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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