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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

51單片機智能小車紅外避障循跡程序

[復制鏈接]
跳轉到指定樓層
樓主
ID:801290 發表于 2020-7-10 22:04 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
51單片機智能小車紅外避障程序以及文檔
  1. #include"car_psb.h"
  2. #define uint unsigned int                //用uint代替無字符整形數據的名稱
  3. #define uchar unsigned char
  4. sbit A1 = P0^3;
  5. sbit A2 = P0^2;//A1為L293芯片2腳(IN1),A2為L293芯片7腳(IN2),控制右電機
  6. sbit B1 = P0^1;
  7. sbit B2 = P0^0;
  8. sbit key1 = P0^6;//按鈕s1
  9. sbit key2 = P3^5;//按鈕s2
  10. sbit key3 = P3^6;//按鈕s3
  11. sbit key4 = P3^7;//按鈕s4
  12. sbit u4_out1 = P1^0;//左紅外循跡
  13. sbit u4_out2 = P1^1;//右紅外循跡
  14. #define c_stop  {A1=0;A2=0;B1=0;B2=0;}//小車停止
  15. #define c_go    {A1=1;A2=0;B1=1;B2=0;}//小車向前
  16. #define c_bask  {A1=0;A2=1;B1=0;B2=1;}//小車后退
  17. #define c_left  {A1=1;A2=0;B1=0;B2=1;}//小車向左
  18. #define c_right {A1=0;A2=1;B1=1;B2=0;}//小車向右
  19. uchar shu;

  20. void delayms(uint xms);//延時xms毫秒;

  21. bit start;
  22. void delayms(uint xms);//延時xms毫秒;
  23. void main(void)
  24. {
  25.         c_init();//每次都需要先調用此函數
  26. c_stop;//單片機上電先讓電機停止。
  27.         while(1)//進入死循環,一直循環{}里的程序
  28.         {
  29.                 if(key1==0)//如果檢測到key1為0,測判斷按鍵被按下
  30.                 {
  31.                         delayms(5);//延時大約5ms防止按鍵振動產生影響
  32.                         if(key1==0)//延時5ms后key1為0,測確定按鍵被按下,執行按鈕按下后的程序
  33.                         {
  34.                                 c_right;//小車向右
  35.                                 delayms(3000) ;
  36.                                 c_left;//小車向左
  37.                                 delayms(3000) ;
  38.                                 c_bask;//小車向后
  39.                                 delayms(3000) ;
  40.                                 c_go;//小車向前
  41.                                 delayms(3000) ;
  42.                                  c_stop;
  43. //                                while(key1==0);//等待按鈕被松開
  44.                         }
  45.                 }
  46.                
  47.                 if(key2==0)//如果檢測到key2為0,測判斷按鍵被按下
  48.                 {
  49.                         delayms(5);//延時大約5ms防止按鍵振動產生影響
  50.                         if(key2==0)//延時5ms后key2為0,測確定按鍵被按下,執行按鈕按下后的程序
  51.                         {
  52.                                 c_bask;
  53.                                 delayms(2000);//小車后退
  54.                                 c_stop;
  55.                                
  56.                                 while(key2==0);//等待按鈕被松開
  57.                         }
  58.                 }
  59.                
  60.                 if(key3==0)//如果檢測到key3為0,測判斷按鍵被按下
  61.                 {
  62.                         delayms(5);//延時大約5ms防止按鍵振動產生影響
  63.                         if(key3==0)//延時5ms后key3為0,測確定按鍵被按下,執行按鈕按下后的程序
  64.                         {
  65.                                   shu++;
  66.                                   if(shu==3)
  67.                                    shu=0;
  68.                                   if(shu==2)
  69.                                   {
  70.                                           start = ~start;
  71.                                   }

  72.                                 while(key3==0);//等待按鈕被松開
  73.                                         if(start == 0)//停止
  74.                 {
  75.                         c_stop;
  76.                 }
  77.                
  78.                 else if(start == 1)//開始紅外循跡
  79.                 {
  80.                          while(1)
  81.                          {
  82.                         if((u4_out1==0)&(u4_out2==1))//當右循跡等于1時,說明小車右循跡在循跡線上,小車需左轉
  83.                         {
  84.                                 c_left;
  85.                                 delayms(50);
  86.                                 c_go;
  87.                                 delayms(10);
  88.                                 c_stop;
  89.                                 delayms(50);
  90.                         }
  91.                         else if((u4_out1==1)&(u4_out2==0))//當左循跡等于1時,說明小車左循跡在循跡線上,小車需要右轉
  92.                         {
  93.                                 c_right;
  94.                                 delayms(50);
  95.                                 c_go;
  96.                                 delayms(10);
  97.                                 c_stop;
  98.                                 delayms(50);
  99.                         }
  100.                         else if(((u4_out1==0)&(u4_out2==0))|((u4_out1==1)&(u4_out2==1)))//當小車左右兩邊的循跡一致時,小車直走
  101.                         {
  102.                                 c_go;
  103.                                 delayms(50);
  104.                                 c_stop;
  105.                                 delayms(30);
  106.                         }
  107.                 }
  108.                         }
  109.                         }
  110.                 }
  111.                
  112.         }
  113. }
復制代碼
  1. #include"car_psb.h"
  2. #define smg P2

  3. sbit b = P0^4;//蜂鳴器驅動三極管B管腳

  4. sbit u3_en = P4^4;//u3的使能管腳
  5. sbit u4_en = P4^5;//u4芯片的使能管腳
  6. sbit u5_en = P4^6;//u5芯片的使能管腳

  7. sbit key1 = P0^6;//s1按鈕
  8. sbit key2 = P3^5;//s2按鈕
  9. sbit key3 = P3^6;//s3按鈕
  10. sbit key4 = P3^7;//s4按鈕

  11. sbit DQ = P0^5;//ds18b20數據線

  12. sbit DATA=P4^7;   //雙向數據線
  13. sbit RST=P1^7;    //使能線
  14. sbit SCLK=P0^7;   //時鐘線

  15. sbit A1 = P0^3;
  16. sbit A2 = P0^2;//A1為L293芯片2腳(IN1),A2為L293芯片7腳(IN2),控制右電機
  17. sbit B1 = P0^1;
  18. sbit B2 = P0^0;//B1為L293芯片10腳(IN3),B2為L293芯片15腳(IN4),控制左電機
  19.                                                          //注意芯片使能管腳1腳(E1)和9腳(E2)已接vcc高電平,
  20.                                                          //所以不需要單片機控制輸出高電平使能

  21. sbit u5_out2 = P1^6;//右光敏電阻
  22. sbit u5_out1 = P1^4;//左光敏電阻

  23. sbit u4_out3 = P1^2;//左紅外避障
  24. sbit u4_out4 = P1^3;//右紅外避障

  25. sbit u4_out1 = P1^0;//右紅外循跡
  26. sbit u4_out2 = P1^1;//左紅外循跡

  27. sbit Echo  = P3^3;//超聲波信號反饋端
  28. sbit Tring = P3^4;//超聲波信號發送端

  29. sbit Rt = P3^2;//紅外接收管腳,單片機中斷0管腳

  30. unsigned char a[4];//保存紅外遙控器的四位數據
  31. unsigned char code tab1[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};//數碼管位選
  32. unsigned char code ds1302_w[]={0x80,0x82,0x84,0x86,0x88,0x8a,0x8c};//ds1302芯片寫字節
  33. unsigned char code ds1302_r[]={0x81,0x83,0x85,0x87,0x89,0x8b,0x8d};//ds1302芯片寫字節

  34. /*************************************************************/
  35. //函數名稱:void delayms(unsigned int xms)
  36. //函數功能:延時xms毫秒
  37. //xms取值為0-65535
  38. //調用:為內部調用函數
  39. /************************************************************/
  40. void delayms(unsigned int xms)
  41. {
  42.         unsigned int x,y;
  43.         for(x=xms;x>0;x--)
  44.                 for(y=1100;y>0;y--);
  45. }

  46. /*************************************************************/
  47. //函數名稱:void c_stop(void)
  48. //函數功能:小車停止
  49. //調用:為內部調用函數
  50. /************************************************************/
  51. void c_stop(void)  
  52. {A1=0;A2=0;B1=0;B2=0;}//小車停止

  53. /*************************************************************/
  54. //函數名稱:void c_go(void)
  55. //函數功能:小車向前
  56. //調用:為內部調用函數
  57. /************************************************************/
  58. void c_go(void)   
  59. {A1=1;A2=0;B1=1;B2=0;}//小車向前

  60. /*************************************************************/
  61. //函數名稱:void c_bask(void)
  62. //函數功能:小車后退
  63. //調用:為內部調用函數
  64. /************************************************************/
  65. void c_bask(void)  
  66. {A1=0;A2=1;B1=0;B2=1;}//小車后退

  67. /*************************************************************/
  68. //函數名稱:void c_left(void)
  69. //函數功能:小車向左
  70. //調用:為內部調用函數
  71. /************************************************************/
  72. void c_left(void)  
  73. {A1=1;A2=0;B1=0;B2=1;}//小車向左

  74. /*************************************************************/
  75. //函數名稱:void c_right(void)
  76. //函數功能:小車向右
  77. //調用:為內部調用函數
  78. /************************************************************/
  79. void c_right(void)
  80. {A1=0;A2=1;B1=1;B2=0;}//小車向右


  81. /*************************************************************/
  82. //函數名稱:void bell(unsigned int x,unsigned int time)
  83. //函數功能:蜂鳴器驅動函數,讓蜂鳴器循環響停X次
  84. //                                (蜂鳴器響time毫秒,停time毫秒為一次)
  85. //x取值為0-65535,time取值為0-65535
  86. //調用:為外部調用函數
  87. /************************************************************/
  88. void bell(unsigned int x,unsigned int time)
  89. {
  90.         unsigned int i;
  91.         for(i=x;i>0;i--)
  92.         {
  93.                 b = ~b;
  94.                 delayms(time);
  95.         }
  96.         b = 1;
  97. }

  98. /*********************數碼管****************************************/

  99. /*************************************************************/
  100. //函數名稱:void display_init()
  101. //函數功能:0-7位的數碼管顯示,初始化程序
  102. //調用:為外部調用函數
  103. /************************************************************/
  104. void display_init(void)
  105. {
  106.         P4SW = 0x70;
  107.         smg = 0xff;
  108. }

  109. /*************************************************************/
  110. //函數名稱:void display_07(unsigned char x,unsigned char dat)
  111. //函數功能:0-7位的數碼管顯示
  112. //x取值為0-7,dat取值為0-0xff
  113. //調用:為外部調用函數
  114. //調用時如:display_07(0,0xc0);則讓0位數碼管顯示0,(0xc0是共陽數碼管“0”的編碼)
  115. /************************************************************/
  116. void display_07(unsigned char cmd,unsigned dat)
  117. {
  118.         u5_en = 0;
  119.         u3_en = 0;
  120.         u4_en = 0;//先將兩個芯片不使能,數據不能改變
  121.         smg = dat;//將段選的數據賦予P2
  122.         u3_en = 1;//u3使能,數據輸入
  123.         u3_en = 0;//稍作延時后將u3不使能
  124.         smg = tab1[cmd];//將需要點亮的數碼管數據賦予P2
  125.         u4_en = 1;//u4使能,P2數據進入u4
  126.         delayms(2);//u4使能后稍作延時
  127.         smg = 0x00;
  128.         u3_en = 0;
  129.         u4_en = 0;//將兩個芯片不使能,數據不能改變結束一輪數據的輸入
  130.         u5_en = 0;
  131. }


  132. /*********************led驅動****************************************/

  133. /*************************************************************/
  134. //函數名稱:void display_led(unsigned char dat)
  135. //函數功能:8位led的顯示
  136. //dat取值為0-0xff
  137. //調用:為外部調用函數
  138. /************************************************************/
  139. void display_led(unsigned char dat)
  140. {
  141.         u5_en = 0;
  142.         u3_en = 0;
  143.         u4_en = 0;//先將兩個芯片不使能,數據不能改變
  144.         smg = dat;//將段選的數據賦予P2
  145.         u5_en = 1;//u5使能,數據輸入
  146.         u5_en = 0;//稍作延時后將u5不使能
  147. }

  148. /*********************按鈕驅動****************************************/

  149. /*************************************************************/
  150. //函數名稱:bit k1()
  151. //函數功能:返回一位數據,當按鈕按下時返回1,沒有按下時返回0
  152. //調用:為外部調用函數
  153. /************************************************************/
  154. bit k1(void)
  155. {
  156.         bit dat;
  157.         if(key1==0)
  158.         {
  159.                 delayms(2);
  160.                 if(key1==0)
  161.                 {
  162.                         dat = 1;
  163.                 }
  164.         }
  165.         else if(key1==1)
  166.         {
  167.                 dat = 0;
  168.         }
  169.        
  170.         return dat;
  171. }

  172. /*************************************************************/
  173. //函數名稱:bit k2()
  174. //函數功能:返回一位數據,當按鈕按下時返回1,沒有按下時返回0
  175. //調用:為外部調用函數
  176. /************************************************************/
  177. bit k2(void)
  178. {
  179.         bit dat;
  180.         if(key2==0)
  181.         {
  182.                 delayms(2);
  183.                 if(key2==0)
  184.                 {
  185.                         dat = 1;
  186.                 }
  187.         }
  188.         else if(key2==1)
  189.         {
  190.                 dat = 0;
  191.         }
  192.        
  193.         return dat;
  194. }

  195. /*************************************************************/
  196. //函數名稱:bit k3()
  197. //函數功能:返回一位數據,當按鈕按下時返回1,沒有按下時返回0
  198. //調用:為外部調用函數
  199. /************************************************************/
  200. bit k3(void)
  201. {
  202.         bit dat;
  203.         if(key3==0)
  204.         {
  205.                 delayms(2);
  206.                 if(key3==0)
  207.                 {
  208.                         dat = 1;
  209.                 }
  210.         }
  211.         else if(key3==1)
  212.         {
  213.                 dat = 0;
  214.         }
  215.        
  216.         return dat;
  217. }

  218. /*************************************************************/
  219. //函數名稱:bit k4()
  220. //函數功能:返回一位數據,當按鈕按下時返回1,沒有按下時返回0
  221. //調用:為外部調用函數
  222. /************************************************************/
  223. bit k4(void)
  224. {
  225.         bit dat;
  226.         if(key4==0)
  227.         {
  228.                 delayms(2);
  229.                 if(key4==0)
  230.                 {
  231.                         dat = 1;
  232.                 }
  233.         }
  234.         else if(key4==1)
  235.         {
  236.                 dat = 0;
  237.         }
  238.        
  239.         return dat;
  240. }


  241. /*********************DS18B20溫度傳感器驅動****************************************/

  242. /***************************************************/
  243. //函數名稱:void delay750us(void);
  244. //函數功能:延時7500us;
  245. /***************************************************/
  246. void delay750us(void)  
  247. {
  248.     unsigned char a,b;
  249.     for(b=112;b>0;b--)
  250.         for(a=17;a>0;a--);
  251. }

  252. /***************************************************/
  253. //函數名稱:void delay70us(void);
  254. //函數功能:延時70us;
  255. /***************************************************/
  256. void delay70us(void)  
  257. {
  258.     unsigned char a;
  259.     for(a=192;a>0;a--);
  260. }

  261. /***************************************************/
  262. //函數名稱:void delay15us(void);
  263. //函數功能:延時15us;
  264. /***************************************************/
  265. void delay15us(void)   
  266. {
  267.     unsigned char a,b;
  268.     for(b=1;b>0;b--)
  269.         for(a=38;a>0;a--);
  270.     _nop_();  
  271. }

  272. /***************************************************/
  273. //函數名稱:void delay45us(void);
  274. //函數功能:延時45us;
  275. /***************************************************/
  276. void delay45us(void)   
  277. {
  278.     unsigned char a,b;
  279.     for(b=49;b>0;b--)
  280.         for(a=1;a>0;a--);
  281.     _nop_();  
  282. }

  283. /***************************************************/
  284. //函數名稱:void delay2us(void);
  285. //函數功能:延時2us;
  286. /***************************************************/
  287. void delay2us(void)   
  288. {
  289.     unsigned char a;
  290.     for(a=4;a>0;a--);
  291. }

  292. /***************************************************/
  293. //函數名稱:void delay4us(void);
  294. //函數功能:延時4us;
  295. /***************************************************/
  296. void delay4us(void)   
  297. {
  298.     unsigned char a,b;
  299.     for(b=1;b>0;b--)
  300.         for(a=8;a>0;a--);
  301. }

  302. /***************************************************/
  303. //函數名稱:void delay6us(void);
  304. //函數功能:延時6us;
  305. /***************************************************/
  306. void delay6us(void)  
  307. {
  308.     unsigned char a;
  309.     for(a=15;a>0;a--);
  310. }

  311. /***************************************************/
  312. //函數名稱:void delay30us(void);
  313. //函數功能:延時30us;
  314. /***************************************************/
  315. void delay30us(void)   
  316. {
  317.     unsigned char a;
  318.     for(a=81;a>0;a--);
  319.     _nop_();  
  320. }

  321. /***************************************************/
  322. //函數名稱:bit ack_ds18b20(void);
  323. //函數功能:        ds18b20復位答應函數
  324. /***************************************************/
  325. bit ack_ds18b20(void)
  326. {
  327.         bit flag;//返回標志位定義
  328.        
  329.         DQ = 1;//先將數據總線置高電平1
  330.         delayms(2);//延時(延時時間沒有太大要求,但盡可能短比較好)
  331.         DQ = 0;//將數據總線拉低
  332.         delay750us();//延時480-960us之內的時間
  333.         DQ = 1;//將總是拉高釋放數據線
  334.         delay70us();//將總線拉高后需要等待15-60us后ds18b20會釋放一個60-240us的低電平
  335.         if(DQ==0)
  336.                 flag = 1;//檢測到總是拉低則輸出1
  337.         else
  338.                 flag = 0;//檢測總線是高電平則輸出0
  339.         delay750us();//從單片機拉高釋放數據線后需要延時大于480us才能結束
  340.         DQ = 1;//將數據線釋放
  341.        
  342.         return flag;//返回數據
  343. }

  344. /***************************************************/
  345. //函數名稱:write_ds18b20(uchar dat)
  346. //函數功能:        向ds18b20發送一個字節的數據
  347. /***************************************************/
  348. void write_ds18b20(unsigned char dat)
  349. {
  350.         unsigned char i;
  351.         DQ = 1;//先將總線拉高
  352.         delayms(1);//稍作延時,時間不定
  353.         for(i=0;i<8;i++)
  354.         {
  355.                 DQ = 0;//先拉低總線
  356.                 delay15us();//延時15us
  357.                 DQ = dat&0x01;//按從低位到高位的順序發送數據,一次發送一位數據
  358.                 delay45us();//保存數據狀態,延時45us
  359.                 DQ = 1;//將總線釋放
  360.                 dat>>=1;//將數據右移一位,為下一次數據發送做準備
  361.         }
  362.         DQ = 1;//8位數據發送完后釋放總線
  363. }
  364. /***************************************************/
  365. //函數名稱:read_ds18b20(uchar dat)
  366. //函數功能:        讀取一個字節的數據
  367. /***************************************************/
  368. unsigned char read_ds18b20(void)
  369. {
  370.         unsigned char dat;
  371.         unsigned char i;
  372.         for(i=0;i<8;i++)
  373.         {
  374.                 dat >>= 1;//右移一位
  375.                 DQ = 1;//總線先拉高
  376.                 delay2us();//延時2us
  377.                 DQ = 0;//將總線拉低
  378.                 delay6us();//延時6us
  379.                 DQ = 1;//將總線拉高
  380.                 delay4us();//延時4us
  381.                 if(DQ == 1)//讀取總線的狀態,如果是1的,就寫進數據里,如果是0就不作處理
  382.                         dat |= 0x80;
  383.                 delay30us();//延時30us
  384.         }
  385.        
  386.         return dat;//返回讀取到的數據
  387. }

  388. /*************************************************************/
  389. //函數名稱:unsigned int Rtemp_ds18b20()
  390. //函數功能:向ds18b20讀取溫度值,如實際溫度為36.5,返回的數據為365
  391. //調用:為外部調用函數
  392. /************************************************************/
  393. unsigned int Rtemp_ds18b20()
  394. {
  395.         bit k;
  396.         unsigned char temph,templ;//讀取的溫度高低數據保存
  397.         unsigned int temp;//計算后的溫度
  398.         k = ack_ds18b20();//先發送復位信號
  399.         if(k==1)//ds18b20如果有答應,則讀取溫度
  400.         {
  401.                 write_ds18b20(0xcc);//跳過ROM匹配命令
  402.                 write_ds18b20(0xbe);//發送讀取溫度命令
  403.                 templ = read_ds18b20();//讀取溫度低8位
  404.                 temph = read_ds18b20();//讀取溫度高8位
  405.                 temp = (temph*256+templ)*0.0625*10;//將讀取的溫度數據進行計算轉換為溫度值,
  406.         }                                                                                                                                                //并擴大10倍,將小數點后一位往前移動一位,方便顯示               

  407.         k = ack_ds18b20();//先發送復位信號
  408.         if(k==1)//ds18b20如果有答應,則發送溫度轉換命令
  409.         {
  410.                 write_ds18b20(0xcc);//跳過ROM匹配命令
  411.                 write_ds18b20(0x44);//發送溫度轉換命令
  412.         }
  413.         return temp;
  414. }


  415. /*********************DS1302驅動****************************************/

  416. void delaynus(unsigned char n)
  417. {
  418.         unsigned char i;
  419.         for(i=0;i<(n*10);i++);
  420. }

  421. /*************************************************************/
  422. //函數名稱:void Write1302(unsigned char dat)
  423. //函數功能:向ds1302芯片發送一個字節的數據
  424. //調用:為內部調用函數
  425. /************************************************************/
  426. void Write1302(unsigned char dat)//發送一個字節的數據
  427. {
  428.   unsigned char i;
  429.   SCLK=0;            //先將時鐘線置位
  430.   delaynus(2);      
  431.   for(i=0;i<8;i++)      
  432.   {
  433.                 DATA=dat&0x01;   //先發送低電平
  434.                 delaynus(2);      
  435.                 SCLK=1;          //拉高時鐘線,時鐘芯片在這時候讀取數據線上的電平
  436.                 delaynus(2);      
  437.                 SCLK=0;          //時鐘線復位
  438.                 dat>>=1;         //數據右移
  439.         }       
  440. }

  441. /*************************************************************/
  442. //函數名稱:unsigned char Read1302(void)
  443. //函數功能:向ds1302芯片讀取一個字節的數據
  444. //調用:為內部調用函數
  445. /************************************************************/
  446. unsigned char Read1302(void)
  447. {
  448.         unsigned char i,dat;
  449.         delaynus(2);        
  450.         for(i=0;i<8;i++)   
  451.         {
  452.                 dat>>=1;      
  453.                 if(DATA==1)   
  454.                 dat|=0x80;   
  455.                 SCLK=1;      
  456.                 delaynus(2);   
  457.                 SCLK=0;      
  458.                 delaynus(2);  
  459.         }         
  460.         return dat;        
  461. }  


  462. /*************************************************************/
  463. //函數名稱:void WriteSet1302(unsigned char Cmd,unsigned char dat)
  464. //函數功能:向ds1302芯片內部某個字節(Cmd)寫入一個數據(dat)
  465. //參數說明:Cmd為0-6,分別代表"秒,分,時,日,月,周,年"
  466. //調用:為外部調用函數
  467. /************************************************************/
  468. void WriteSet1302(unsigned char Cmd,unsigned char dat)//向時鐘寫入一個字節的數據
  469. {
  470.         WriteSet1302(0x8E,0x00);  //關閉寫保護
  471.         RST=0;           
  472.         SCLK=0;         
  473.         RST=1;           
  474.         delaynus(2);     
  475.         Write1302(ds1302_w[Cmd]);  
  476.         Write1302(((dat/10)<<4)|(dat%10));  
  477.         SCLK=1;         
  478.         RST=0;           
  479. }

  480. /*************************************************************/
  481. //函數名稱:unsigned char ReadSet1302(unsigned char Cmd)
  482. //函數功能:向ds1302芯片內部某個字節(Cmd)讀出一個數據,并將數據返回
  483. //調用:為外部調用函數
  484. /************************************************************/
  485. unsigned char ReadSet1302(unsigned char Cmd)
  486. {
  487.         unsigned char dat;
  488.         RST=0;                 
  489.         SCLK=0;               
  490.         RST=1;                 
  491.         Write1302(ds1302_r[Cmd]);        
  492.         dat=Read1302();      
  493.         SCLK=1;              
  494.         RST=0;   
  495.        
  496.         return dat;         
  497. }

  498. /******************************尋光模塊*******************************/

  499. /*************************************************************/
  500. //函數名稱:bit gm_left(void)
  501. //函數功能:左尋光光敏電阻,當亮度大時返回1,亮度比較小時返回0
  502. //調用:為外部調用函數
  503. /************************************************************/
  504. bit gm_left(void)
  505. {
  506.         bit dat;
  507.         dat = u5_out1;
  508.         return dat;
  509. }

  510. /*************************************************************/
  511. //函數名稱:bit gm_left(void)
  512. //函數功能:右尋光光敏電阻,當亮度大時返回1,亮度比較小時返回0
  513. //調用:為外部調用函數
  514. /************************************************************/
  515. bit gm_right(void)
  516. {
  517.         bit dat;
  518.         dat = u5_out2;
  519.         return dat;
  520. }

  521. /******************************紅外避障模塊*******************************/

  522. /*************************************************************/
  523. //函數名稱:bit hbz_left(void)
  524. //函數功能:左紅外避障,接收到反射回來的信號返回0,沒有收到信號返回1
  525. //調用:為外部調用函數
  526. /************************************************************/
  527. bit hbz_left(void)
  528. {
  529.         bit dat;
  530.         dat = u4_out3;
  531.         return dat;
  532. }

  533. /*************************************************************/
  534. //函數名稱:bit hbz_right(void)
  535. //函數功能:右紅外避障,接收到反射回來的信號返回0,沒有收到信號返回1
  536. //調用:為外部調用函數
  537. /************************************************************/
  538. bit hbz_right(void)
  539. {
  540.         bit dat;
  541.         dat = u4_out4;
  542.         return dat;
  543. }

  544. /******************************紅外循跡模塊*******************************/
  545. /*************************************************************/
  546. //函數名稱:bit hxj_left(void)
  547. //函數功能:左紅外循跡,接收到反射回來的信號返回0,沒有收到信號返回1
  548. //調用:為外部調用函數
  549. /************************************************************/
  550. bit hxj_left(void)
  551. {
  552.         bit dat;
  553.         dat = u4_out2;
  554.         return dat;
  555. }

  556. /*************************************************************/
  557. //函數名稱:bit hxj_right(void)
  558. //函數功能:右紅外循跡,接收到反射回來的信號返回0,沒有收到信號返回1
  559. //調用:為外部調用函數
  560. /************************************************************/
  561. bit hxj_right(void)
  562. {
  563.         bit dat;
  564.         dat = u4_out1;
  565.         return dat;
  566. }

  567. /******************************超聲波模塊*******************************/

  568. /***************************************************/
  569. //函數名稱:void delay20us();
  570. //函數功能:延時20us;
  571. /***************************************************/
  572. void delay20us()                //@11.0592MHz
  573. {
  574.         unsigned char i;

  575.         _nop_();
  576.         _nop_();
  577.         _nop_();
  578.         i = 24;
  579.         while (--i);
  580. }

  581. /***************************************************/
  582. //函數名稱:void csb_init(void);
  583. //函數功能:        超聲波模塊初始化程序
  584. //使用定時器1計算時間,
  585. /***************************************************/
  586. void csb_init(void)
  587. {
  588.         EA = 1;                                //打開中斷總開關
  589.         AUXR &= 0xBF;        //定時器時鐘12T模式
  590.         TMOD &= 0x0F;               
  591.         TMOD |= 0x10;        //定時器1工作方式1,16位計時模式       
  592.         TF1 = 0;                        //將定時器溢出標志復位       
  593. }

  594. /***************************************************/
  595. //函數名稱:unsigned int get_distance(void);
  596. //函數功能:        獲取超聲波返回的時間,并計算距離,返回計算好的距離
  597. //使用定時器1計算時間,
  598. /***************************************************/
  599. unsigned int get_distance(void)
  600. {
  601.          unsigned int Distance;        //測量到的距離
  602.    unsigned char flag_i=0;        //距離測量成果標志位
  603.          TR1 = 0;                        //先將定時器1關閉
  604.    TH1 = 0;
  605.          TL1 = 0;                        //將定時器1的計數清零
  606.    Tring = 0;                //信號端先置零
  607.    delayms(2);                //稍微延時一下
  608.    Tring = 1;       
  609.    delay20us();               
  610.    Tring = 0;                   //信號端置位保存大約10us的時間,產生開始信號
  611.        
  612.    while(Echo==0);         //等待返回高電平
  613.    TR1 = 1;                                        //啟動定時器1開始計數
  614.    while(Echo==1)        //當為1時計時
  615.    {
  616.                    Distance = TH1*256+TL1;
  617.                         if(Distance>27110)                           //大約4000時間已超出出量距離,返回888
  618.                         {
  619.                                 TR1 = 0;
  620.                                 flag_i = 2;
  621.                                 Distance = 888;
  622.                                 break;
  623.                         }
  624.                         else
  625.                                 flag_i = 1;
  626.    }
  627.    if(flag_i==1)
  628.    {
  629.                    TR1 = 0;                                //關閉定時器3;
  630.                         Distance = TH1*256+TL1;                //讀取定時器里的時間
  631.                         Distance *= 0.01844;                        //距離=(時間*速度)/2,時間單位秒,速度單位m/s,距離單位米
  632.                         if(Distance>500)                                //定時器一個計時時間:12/11.0592=1.085
  633.                         Distance=888;                                                //時間=(TH1*256+TL1)*1.085,單位微秒,轉換為秒需除1000000
  634.    }                                                                                                        //距離=(340*(TH1*256+TL1)*1.085)/2/1000000=(TH1*256+TL1)*0.0001844,單位米
  635.                                                                                                                         //轉化為厘米顯示:0.0001844*100=0.01844,單位厘米
  636.          TR1 = 0;//關閉定時器1中斷
  637.    return Distance;//將計算出的距離返回
  638. }

  639. /******************************紅外遙控模塊*******************************/
  640. /***************************************************/
  641. //函數名稱:void hwyk_init(void);
  642. //函數功能:        超聲波模塊初始化程序
  643. //使用定時器1計算時間,
  644. /***************************************************/
  645. void hwyk_init(void)
  646. {
  647.         EA = 1;//打開中斷總開關
  648.         ET1 = 1;//允許定時器0中斷
  649.         EX0 = 1;//允許外部中斷0中斷
  650.         IT0 = 1;//下降沿觸發外部中斷0
  651.         AUXR &= 0xBF;                //定時器工作在12T模式
  652.         TMOD &= 0x0f;                //將定時器工作模式設置先復位
  653.         TMOD |= 0x10;                //設置定時工作在方式1中,16位計時模式
  654.         TH1 = 0;
  655.         TL1 = 0;//將定時器計時溢出清零
  656. }

  657. /***************************************************/
  658. //函數名稱:unsigned char get_hwyk(void);
  659. //函數功能:        返回接收到的紅外按鍵碼
  660. //使用定時器1計算時間,
  661. /***************************************************/
  662. unsigned char get_hwyk(void)
  663. {
  664.         unsigned char i,x;//i為計算接上多少字節的數據,x為計算每一個字節數據的第幾位
  665.         unsigned char temp;//臨時接到字節數據存儲
  666.         unsigned int Ltime,Htime;//波形的高低電平時間存儲
  667.         EX0 = 0;//先將中斷允許關閉,放在其他的電平造成干擾
  668.         TH1 = 0;
  669.         TL1 = 0;//將定時器的計算寄存器清零
  670.         TR1 = 1;//定時器開始運行計時
  671.         while(Rt==0)//計算低電平時間
  672.         {
  673.                 if((TH1*256+TL1)>16000)//如果低電平時間超過16000,則實際時間是16000*1.085=17360us,是引導碼9000us的兩倍
  674.                 {
  675.                         Rt = 1;//將管腳釋放
  676.                         IE0 = 0;//將中斷標記位清零
  677.                         TR1 = 0;//定時器關閉
  678.                         TF1 = 0;
  679.                         EX0 = 1;//重新開啟外中斷
  680.                         break;//直接退出中斷
  681.                 }
  682.         }
  683.         TR1 = 0;
  684.         Ltime = TH1*256+TL1;//記錄低電平時間
  685.         TH1 = 0;
  686.         TL1 = 0;//將定時器的計算寄存器清零
  687.         TR1 = 1;//定時器開始運行計時
  688.         while(Rt==1)//計算高電平時間
  689.         {
  690.                 if((TH1*256+TL1)>9000)//如果高電平時間超過9000,則實際時間是9000*1.085=9765us,是引導碼4500us的兩倍
  691.                 {
  692.                         Rt = 1;//將管腳釋放
  693.                         IE0 = 0;//將中斷標記位清零
  694.                         TR1 = 0;//定時器關閉
  695.                   TF1 = 0;
  696.                         EX0 = 1;//重新開啟外中斷       
  697.                         break;//直接退出中斷
  698.                 }
  699.         }
  700.         TR1 = 0;
  701.         Htime = TH1*256+TL1;//記錄高電平時間
  702.        
  703.         if((Ltime>7800)&&(Ltime<8800)&&(Htime>3800)&&(Htime<4500))//如果引導碼低電平在9000us左右,高電平在4500us左右,則符合
  704.         {
  705.                 for(i=0;i<4;i++)//一共有4個字節數據
  706.                 {
  707.                         for(x=0;x<8;x++)//每個字節有8位數據
  708.                         {
  709.                                 temp >>= 1;//先接上低位,在接高位,所以需要先左移一位
  710.                                 while(Rt==0);//跳過低電平
  711.                                
  712.                                 TH1 = 0;
  713.                                 TL1 = 0;
  714.                                 TR1 = 1;
  715.                                 while(Rt==1);
  716.                                 TR1 = 0;
  717.                                 Htime = TH1*256+TL1;//測量高電平時間
  718.                                
  719.                                 if((Htime>300)&&(Htime<720))//高電平符合則為0
  720.                                         temp &= 0x7f;
  721.                                 if((Htime>1300)&&(Htime<1800))//高電平符合則為1
  722.                                         temp |= 0x80;
  723.                         }
  724.                         a[i] = temp;//將每個字節都存儲到數組中
  725.                 }
  726.         }
  727.         Rt = 1;
  728.         IE0 = 0;
  729.         TR1 = 0;
  730.         TF1 = 0;
  731.         EX0 = 1;//重新啟動外部中斷
  732.        
  733.         return a[2];//讀取遙控編碼的第三位,第三位為按鍵碼
  734. }

  735. /******************************紅外遙控模塊*******************************/
  736. /***************************************************/
  737. //函數名稱:void c_init(void);
  738. //函數功能:        小車初始化,每個程序都需要保護這個
  739. /***************************************************/
  740. void c_init(void)
  741. {
  742.         unsigned char i=0;
  743.         unsigned char dddd;
  744.         unsigned int vvvv;
  745.         if(i==1)
  746.         {
  747.         c_stop();
  748.         c_go();
  749.         c_bask();
  750.         c_left();
  751.         c_right();
  752.         bell(1,200);
  753.         display_init();
  754.         display_07(0,0);
  755.         display_led(0xaa);
  756.         k1();
  757.         k2();
  758.         k3();
  759.         k4();
  760.         vvvv = Rtemp_ds18b20();
  761.         WriteSet1302(0x80,0x00);
  762.         dddd = ReadSet1302(0x81);
  763.         gm_left();
  764.         gm_right();
  765.         hbz_left();
  766.         hbz_right();
  767.         hxj_left();
  768.         hxj_right();
  769.         csb_init();
  770.         vvvv = get_distance();
  771.         hwyk_init();
  772.         dddd = get_hwyk();
  773.         }
  774. }
復制代碼


新建文件夾.zip

621.56 KB, 下載次數: 39, 下載積分: 黑幣 -5

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

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产精品久久久乱弄 | 日韩成人免费在线视频 | 日本一区二区三区在线观看 | 午夜影视大全 | 精品日本久久久久久久久久 | 欧美高清视频一区 | 婷婷91| 日韩中文电影 | 99久久精品免费看国产四区 | 99热这里有精品 | 国产精品毛片久久久久久久 | 日韩精品一区二区三区老鸭窝 | 国产精品高潮呻吟久久 | 国产亚洲精品美女久久久久久久久久 | 日韩高清成人 | 爱爱视频网 | 亚洲黄色片免费观看 | 一本色道精品久久一区二区三区 | 综合二区 | 欧美中文一区 | 精品国产青草久久久久96 | 91在线视频播放 | 亚洲人成人一区二区在线观看 | 婷婷中文在线 | www日本高清 | 国产电影一区二区在线观看 | 久久尤物免费一区二区三区 | 亚洲免费成人av | 九九热免费在线观看 | 国产成人精品一区二区三区网站观看 | 成人免费观看男女羞羞视频 | 美女视频一区二区三区 | 成人黄色在线视频 | 精品亚洲一区二区三区四区五区 | 日韩一区二区av | 欧美一级免费观看 | 亚洲毛片| 免费看国产a | 视频1区 | 精品久久久久久18免费网站 | 国产精品伦一区二区三级视频 |