久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2892|回復: 0
打印 上一主題 下一主題
收起左側

自動避障紅外電動小車C51程序

[復制鏈接]
跳轉到指定樓層
樓主
ID:210992 發表于 2017-6-25 14:41 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
自動避障紅外電動小車C51程序

單片機源程序如下:
  1. #include"reg51.h"
  2. #include<intrins.h>
  3. #define uchar unsigned char
  4. #define uint  unsigned int
  5. #define left_infrare  0
  6. #define right_infrare 1
  7. #define dj_state1        0X5F      //前進
  8. #define dj_state2        0X4F      //右轉  
  9. #define dj_state3        0X1F      //左轉  
  10. #define dj_state4        0X0F      //后退  
  11. #define dj_state5        0XfF      //停車
  12. #define light_off        0x0f      //關轉向燈
  13. #define left_light       0X5F      //左轉向燈    兩個是5f
  14. #define right_light      0XaF      //右轉向燈0xaf,兩個是0xbf
  15. #define back_light       0XcF      //剎車燈即后燈
  16. #define front_light      0x3f      //前燈
  17. #define light_on         0xff      //開所有燈
  18. #define true  1
  19. #define false 0
  20. #define LCD_Data  P0
  21. #define Busy  0x80            //用于檢測LCD狀態字中的Busy標識
  22. sbit    c=P1^2;              //轉向燈使能端
  23. uchar code talk1[]={"backward"};
  24. uchar code talk2[]={"forward"};
  25. uchar code talk3[]={"Turnleft"};
  26. uchar code talk4[]={"Turn right"};
  27. uchar flage =0x00;
  28. sbit  ledcs=P1^2;         //74H573的片選信號
  29. //sbit  left_led=P0^2;     //左紅外發射管
  30. //sbit  right_led=P0^3;    //右紅外發射管

  31. sbit  LCD_RS = P1^5;     //LCD定義引腳
  32. sbit  LCD_RW = P1^6;     //
  33. sbit  LCD_E  = P1^7 ;
  34. void Delay5Ms(void)
  35. {
  36. uint TempCyc = 5552;
  37. while(TempCyc--);
  38. }
  39. //400ms延時
  40. void Delay400Ms(void)
  41. {uchar TempCycA = 5;
  42. uint TempCycB;
  43. while(TempCycA--)
  44.    { TempCycB=7269;
  45.      while(TempCycB--);
  46.     }
  47. }
  48. //LCD讀狀態
  49. unsigned char ReadStatusLCD(void)
  50. {
  51. LCD_Data = 0xFF;
  52. LCD_RS = 0;
  53. LCD_RW = 1;
  54. LCD_E = 0;
  55. LCD_E = 0;
  56. LCD_E = 1;
  57. while (LCD_Data & Busy);   //檢測忙信號
  58. return(LCD_Data);
  59. }
  60. //LCD寫數據
  61. void WriteDataLCD(unsigned char WDLCD )
  62. {
  63. ReadStatusLCD();  //檢測忙
  64. LCD_Data = WDLCD;
  65. LCD_RS=1;
  66. LCD_RW =0;
  67. LCD_E = 0; //若晶振速度太高可以在這后加小的延時
  68. LCD_E = 0; //延時 ,為了安全
  69. LCD_E = 0; //延時
  70. LCD_E = 1;
  71. }
  72. //LCD寫指令
  73. void WriteCommandLCD(unsigned char WCLCD,BuysC)
  74. {
  75. if (BuysC) ReadStatusLCD();   //根據需要檢測忙,BuysC為0時忽略忙檢測
  76. LCD_Data = WCLCD;
  77. LCD_RS= 0;
  78. LCD_RW= 0;
  79. LCD_E = 0;  //延時 ,為了安全
  80. LCD_E = 0;
  81. LCD_E = 0; //延時
  82. LCD_E = 1;
  83. }
  84. void LCDInit(void)         //LCD初始化
  85. {
  86. Delay400Ms();
  87. LCD_Data = 0;
  88. WriteCommandLCD(0x38,0);  //三次顯示模式設置,不檢測忙信號
  89. Delay5Ms();
  90. WriteCommandLCD(0x38,0);
  91. Delay5Ms();
  92. WriteCommandLCD(0x38,0);
  93. Delay5Ms();

  94. WriteCommandLCD(0x38,1); //顯示模式設置,開始要求每次檢測忙信號
  95. WriteCommandLCD(0x08,1); //關閉顯示
  96. WriteCommandLCD(0x01,1); //顯示清屏
  97. WriteCommandLCD(0x06,1); // 顯示光標移動設置
  98. WriteCommandLCD(0x0C,1); // 顯示開及光標設置
  99. }
  100. //按指定位置顯示一個字符
  101. void DisplayOneChar(uchar X, uchar Y, uchar DData)
  102. {
  103. Y &= 0x1;
  104. X &= 0xF;                 //限制X不能大于15,Y不能大于1
  105. if (Y)
  106. X |= 0x40;               //當要顯示第二行時地址碼+0x40;
  107. X |= 0x80;               // 算出LCD的指令碼
  108. WriteCommandLCD(X, 0);   //這里不檢測忙信號,發送地址碼
  109. WriteDataLCD(DData);
  110. }
  111. //按指定位置顯示一串字符(只能寫一行);
  112. void DisplayListChar(uchar X, uchar Y,uchar ListLength, uchar  *DData,uchar n)
  113. { uchar i;
  114. Y &= 0x01;
  115. X &= 0x0F;                 //限制X不能大于15,Y不能大于1
  116. for(i=0;i<ListLength;i++)
  117. { if (X <= 0x0F) //X坐標應小于0xF
  118.     {   DisplayOneChar(X, Y, DData[i]); //顯示單個字符
  119.          if(n==true)Delay400Ms();
  120.           X++;
  121.     }
  122.   }
  123. }
  124. /****************************
  125. 紅外線接收子程序,利用了中斷的下降沿觸發方式
  126. ****************************/
  127. void infrared_ray()interrupt 0  using 3
  128. {  uchar i=90;
  129.    flage=0x01;             //接受標志位
  130.    while(i--);            //減小靈敏度
  131.    EX0=0;               //關掉中斷,等到發射方波后才開啟,處于別動
  132. }
  133. // 延時子程序
  134. void delay(uint n)
  135. {
  136.   while(--n);
  137. }
  138. //中斷初始化
  139. void Init0(void)
  140. {  EA=1;
  141.    IT0=1;
  142.     }
  143. /***************************************
  144. /*原理是把中斷打開并 發射方波,
  145. 當有中斷時就轉到中斷產生中斷位為下一步轉向做準備,
  146. 當沒有是關閉中斷
  147. ****************************************/
  148. void seng_wave(uchar timer,bit n)//timer通過載波發射信號的時間,n->左右發射管的選擇
  149. {  uchar i;
  150.    P1 |= 0X04;      //ledcs=1為74ls573為11腳為高電平時數據直接輸出,為低時把數據鎖存住,即保持
  151.    IE |= 0X01;
  152.    P0 |=0x0c;   //04
  153.    for(i=timer;i>0;i--)
  154.      { if(n)P0^=0x08;                      // 右發射管通過載波發射信號//00
  155.         else P0^=0x04;                    // 左發射管通過載波發射信號//0c
  156.          delay(100);                     //這里控制著靈敏度(控制38khz的方波的多少)和距離
  157.       }                                     //timer*delay(x)即為發射管得到的平均電流
  158.     P1 &= 0Xfb;
  159.     IE &= 0Xfe;
  160. }
  161. //led轉向燈指示子程序
  162. void light_control(uchar deng)
  163. {   ledcs=1;
  164.     P0 =deng;
  165.     ledcs=0;  //11111011
  166. }
  167. //電機和燈光的控制部分
  168. void  control(uchar n,uchar dj_state,uchar light)
  169. {   uchar i;
  170.    // P1|=0x04;
  171.      light_control(light);    //led轉向指示燈
  172.      delay(100);
  173.      P2 =dj_state;              //電機的方向控制
  174.     WriteCommandLCD(0x01,1); //LCD顯示清屏

  175.           switch(dj_state)
  176.           { case dj_state2 :{ DisplayListChar(3,1,10,talk4,false);}break;
  177.             case dj_state3: { DisplayListChar(3,1,8,talk3,false);}break;
  178.             case dj_state4: { DisplayListChar(3,1,7,talk1,false); }break;
  179.              default :break;
  180.              }
  181.           for(i=n;i>0;i--)
  182.           {delay(2000);}
  183.            P2=dj_state5;               //停車
  184.          light_control(light_off);       //led關閉
  185.         WriteCommandLCD(0x01,1); //LCD顯示清屏
  186.          P2=dj_state1;                     //前進
  187.         if(dj_state1)
  188.            { P1|=0X04;          //ledcs=1;
  189.              P0=0x0f;
  190.              P1&=0XFB;
  191.              delay(100);
  192.              DisplayListChar(0,0,7,talk2,false);
  193.              }
  194.      }
  195. /****************************************
  196. 避障主要控制部分
  197. *****************************************/
  198. void move_car(void)
  199. {
  200.    uchar temp =0x00;
  201.    //左邊紅外管發射
  202.        seng_wave(1,left_infrare);     //向下為中斷開啟有關閉后,要執行的語句
  203.         if(flage==0x01){temp|=0x01;flage=0x00;}
  204.        //右邊紅外管發射
  205.          delay(30);
  206.         seng_wave(1,right_infrare);    //向下為中斷開啟有關閉后,要執行的語句
  207.         if(flage==0x01){temp|=0x02;flage=0x00;}

  208. ……………………

  209. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼

所有資料51hei提供下載:
自動避障紅外電動小車C51程序.rar (2.81 KB, 下載次數: 22)


分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 免费视频二区 | 又爽又黄axxx片免费观看 | 国产日韩欧美在线一区 | 欧美精品综合在线 | 日本天堂视频 | а天堂中文最新一区二区三区 | 看亚洲a级一级毛片 | 99精品视频在线观看免费播放 | 欧美在线a| 天天色图 | 在线免费观看一区二区 | 91社影院在线观看 | 天天综合操| 在线观看亚洲一区二区 | 91麻豆产精品久久久久久夏晴子 | 黄色大全免费看 | 精品一区二区免费视频 | 久久国产精品99久久久大便 | 日韩中文字幕网 | 国产精品免费大片 | 午夜在线观看视频 | 午夜激情在线 | 老妇激情毛片免费 | hsck成人网 | 久久久久亚洲av毛片大全 | 91精品在线播放 | 免费国产成人av | 亚洲一区视频在线播放 | 国产午夜精品视频 | 一级a性色生活片久久毛片 一级特黄a大片 | 久久99精品视频 | 荷兰欧美一级毛片 | 91精品www| 精品一区二区三区在线观看 | 美女黄视频网站 | 99精品欧美一区二区三区综合在线 | 特黄毛片 | 欧美日韩一区二区三区视频 | 男女羞羞在线观看 | 欧美aaa| 日本天堂视频在线观看 |