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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

這個才匹配——小車控制程序

[復制鏈接]
跳轉到指定樓層
樓主
ID:76556 發表于 2015-4-10 01:44 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式

  1. //晶振=11.0592M
  2. //MCU=STC516RD+
  3. //************************************
  4. #include<reg51.h>        //包括一個52標準內核的頭文件
  5. #define uchar unsigned char        //定義一下方便使用
  6. #define uint unsigned int        //定義一下方便使用
  7. uchar Distance;        //定義Distance(距離)變量
  8. sbit Tr1=P1^4;        //定義超聲波模塊的控制端(Tr)
  9. sbit Ec1=P1^5;        //定義超聲波模塊的接收端(Ec)
  10. sbit Tr2=P1^6;        //定義第二個超聲波模塊的控制端(Tr)
  11. sbit Ec2=P1^7;        //定義第二個超聲波模塊的接收端(Ec)
  12. sbit IN1=P2^1;        //定義L298n步進電機驅動芯片的IN1管腳由51MCU的P2^1管腳控制IN1對應控制OUT1電機驅動腳
  13. sbit IN2=P2^0;        //定義L298n步進電機驅動芯片的IN2管腳由51MCU的P2^0管腳控制IN2對應控制OUT2電機驅動腳
  14. sbit IN3=P2^2;        //定義L298n步進電機驅動芯片的IN3管腳由51MCU的P2^2管腳控制IN3對應控制OUT3電機驅動腳
  15. sbit IN4=P2^3;        //定義L298n步進電機驅動芯片的IN4管腳由51MCU的P2^3管腳控制IN4對應控制OUT4電機驅動腳
  16. sbit ENA=P2^5;        //定義L298n步進電機驅動芯片的ENA管腳由51MCU的P2^5管腳控制ENA腳是使能腳控制IN1,2腳輸入的高低電平是否有效
  17. sbit ENB=P2^4;        //定義L298n步進電機驅動芯片的ENB管腳由51MCU的P2^4管腳控制ENA腳是使能腳控制IN3,4腳輸入的高低電平是否有效
  18. sbit RXd=P3^0;
  19. sbit hig=P3^1;
  20. sbit h=P3^2;
  21. void Delays1(uint x)      //延時函數Delays..定義形參x為unsigned int 型
  22. {
  23. uint q,w;        //定義實際參數q,w為unsigned int 型
  24. for(q=x;q>0;q--)      //q=x,q小于0,q減一。如果q小于零則退出此語句
  25. for(w=110;w>0;w--);      //w=110,w小于0,w減一。如果w小于零則退出此語句
  26. }
  27. void init1()          //初始化函數init
  28. {            //初始化Ec1=0;
  29. Ec1=0;           //初始化Tr1=0;
  30. Tr1=0;
  31. }
  32. void Ranging1()         //Ranging(測距)函數用于檢測出距離并控制電機做出相應的動作
  33. {
  34. while(1)
  35. {
  36. static uchar Num_Run=0;
  37. static uchar Num3=0;       //定義unsigned char型局部變量Num3,并且只第一次執行時Num3=0,以后執行時不會再次初始,主要用于超聲波模塊的使能信號過后用來檢測接收端Ec1是否有高電平,或用于進入和退出while循環,,
  38. static uchar Choice=0;
  39. bit Bit_Num2;         //定義bit型變量(51特有變量)Bit_Num2。。主要用于關閉定時器并進入下一個函數(檢測Ec1的脈寬長度)
  40. uchar Move1,Move2,Move3,Move4;             //定義unsigned char變量Move(用來進入switch語句并選擇那種工作方式)
  41. if(Choice==2){Choice=0;}
  42. switch(Choice)
  43.   {
  44.   case 0:Tr1=1;Delays1(10);Tr1=0;Num3=1;break;    //Tr1給高電平 //至少延時10微秒 //Tr1給低電平 //Num3給1
  45.   case 1:Tr2=1;Delays1(10);Tr2=0;Num3=2;break;
  46.   default:break;
  47.   }
  48. Choice++;           
  49. Bit_Num2=0;          //Bit_Num2給0用于進入下一步while循環
  50. while(Num3==1)         //當Num3檢測到定于1時進入本循環       //右邊的測距模塊檢測程序
  51.   {
  52.   while(Ec1==1)        //當Ec1檢測等于1是進入本循環,當Ec1(接收信號的高電平脈寬結束后退出此循環)
  53.    {          //Bit_Num2給以用來鍵入笑一個if語句
  54.    Bit_Num2=1;        //打開定時器TR0進入定時器0中斷
  55.    TR0=1;
  56.    }
  57.   if(Ec1==0&Bit_Num2==1)      //如果Ec1等于0(超聲波測距模塊的接收端發送到高電平脈寬傳送完后)而且Bit_Num2等于1進入此語句
  58.    {         
  59.    TR0=0;         //關閉定時器
  60.    if(Distance<20)       //如果脈寬小于50微秒
  61.     {
  62.     Move1=0;       //Move等于1      
  63.     }
  64.    else if(Distance>60)     //如果上一語句不成立則檢測此語句,如果脈寬的時間長度大于50微秒
  65.     {
  66.     uchar n;
  67.     for(n=1;n>0;n--)
  68.      {
  69.      Move1++;        //Move等于2
  70.      }
  71.     }
  72.    else{};
  73.    if(Distance<60&Distance>20)
  74.     {
  75.     uchar n;
  76.     for(n=2;n>0;n--)
  77.      {
  78.      Move1++;        //Move等于2
  79.      }
  80.     }
  81.    Num3=0;
  82.    }         
  83.   }
  84. while(Num3==2)
  85.   {
  86.   Distance=0;
  87.   while(Ec2==1)        //當Ec2檢測等于1是進入本循環,當Ec1(接收信號的高電平脈寬結束后退出此循環)
  88.    {         
  89.    Bit_Num2=1;        //Bit_Num2給以用來鍵入笑一個if語句
  90.    TR0=1;        //打開定時器TR0進入定時器0中斷
  91.    }
  92.    if(Ec2==0&Bit_Num2==1)      //如果Ec1等于0(超聲波測距模塊的接收端發送到高電平脈寬傳送完后)而且Bit_Num2等于1進入此語句
  93.     {         
  94.     TR0=0;        //關閉定時器                 
  95.     if(Distance<20)       //如果脈寬小于50微秒
  96.      {
  97.       Move2=0;   
  98.      }
  99.     else if(Distance>60)     //如果上一語句不成立則檢測此語句,如果脈寬的時間長度大于50微秒
  100.      {
  101.      uchar n;
  102.      for(n=1;n>0;n--)
  103.       {
  104.       Move2++;   
  105.       }
  106.      }
  107.     else{};
  108.     if(Distance<60&Distance>20)     //如果上一語句不成立則檢測此語句,如果脈寬的時間長度大于50微秒
  109.      {
  110.      uchar n;
  111.      for(n=2;n>0;n--)
  112.       {
  113.       Move2++;   
  114.       }
  115.      }
  116.     Num_Run=1;
  117.     Num3=0;
  118.     }   
  119.   }
  120. if(Num_Run==1)
  121.   {
  122.   unsigned char Get[4][4]={{0x01,0x02,0x03,0x04},{0x05,0x06,0x07,0x08},{0x0a,0x0b,0x0c,0x0e},{0x0f,0x11,0x21,0x31}};
  123.   switch(Get[Move1][Move2])       //檢測Move的值并進入相應的語句      //Move1=右邊。。//Move2=左邊
  124.    {
  125.    case 0x01:IN1=0;IN2=0;IN3=0;IN4=0;ENA=1;ENB=1;break;  //如果Move等于0,則電機反轉,并給Distance清零,然后退出此語句   // 左前,右后
  126.    case 0x02:IN1=1;IN2=0;IN3=0;IN4=1;ENA=1;ENB=1;break;    //左后,右前
  127.    case 0x05:IN1=0;IN2=1;IN3=1;IN4=0;ENA=1;ENB=1;break;   //左前,右后
  128.    case 0x06:IN1=0;IN2=0;IN3=0;IN4=0;ENA=1;ENB=1;break;  //如果Move等于1,則電機正轉,并給Distance清零,然后退出此語句**//前進   //左前,右前
  129.    case 0x0a:IN1=0;IN2=0;IN3=1;IN4=0;ENA=1;ENB=1;break;  // 左前,右后
  130.    case 0x0b:IN1=1;IN2=0;IN3=0;IN4=0;ENA=1;ENB=1;break;   //左停,右后  case 0x0c:IN1=1;IN2=0;IN3=0;IN4=1;ENA=1;ENB=1;break;改為case 0x0b:IN1=0;IN2=0;IN3=1;IN4=0;ENA=1;ENB=1;break; 。。。如果有錯可以改回來
  131.    case 0x0c:IN1=1;IN2=0;IN3=1;IN4=0;ENA=1;ENB=1;break;    // 左前,右后   //
  132.    case 0x03:IN1=1;IN2=0;IN3=0;IN4=0;ENA=1;ENB=1;break;   //左后,右前
  133.    case 0x07:IN1=0;IN2=0;IN3=1;IN4=0;ENA=1;ENB=1;break;  //左前,右停   
  134.    default:break;              //如果以上都不符合,則退出此語句,準備下一循環
  135.    }
  136.   Distance=0;
  137.   Move1=0;             //Move清零;
  138.   Move2=0;
  139.   Move3=0;
  140.   Move4=0;
  141.   Num_Run=0;
  142.   }            
  143. }
  144. }
  145. void open_time1()        //定時器初始函數
  146. {
  147. TMOD=0x01;          //確定工作方式位01,(內容自己上網查啊,大概是16位手動重裝計數器,,記不清了)
  148. TH0=(65536-1)/256;        //確定一微秒記一次
  149. TL0=(65536-1)%256;        //確定一微秒記一次
  150. EA=1;           //打開總中斷
  151. ET0=1;           //打開定時器0中斷
  152. TR0=0;           //關閉定時器0
  153. }
  154. void q1()          //main函數(主函數),,所有函數都從這個函數開始執行
  155. {            
  156. init1();           //執行init函數
  157. open_time1();         //執行open_time函數
  158. while(1)          //進入大循環(除非執行中斷函數否則永不退出)
  159. {
  160. Ranging1();         //執行Ranging函數
  161. }
  162. }













  163. /**********************/
  164. void Delays(uint x)        //延時函數Delays..定義形參x為unsigned int 型
  165. {
  166. uint q,w;        //定義實際參數q,w為unsigned int 型
  167. for(q=x;q>0;q--)        //q=x,q小于0,q減一。如果q小于零則退出此語句
  168. for(w=110;w>0;w--);        //w=110,w小于0,w減一。如果w小于零則退出此語句
  169. }
  170. void init()          //初始化函數init
  171. {          //初始化Ec1=0;
  172. Ec1=0;          //初始化Tr1=0;
  173. Tr1=0;
  174. }
  175. void Ranging()          //Ranging(測距)函數用于檢測出距離并控制電機做出相應的動作
  176. {
  177. while(1)
  178. {
  179. static uchar Num_Run=0;
  180. static uchar Num3=0;          //定義unsigned char型局部變量Num3,并且只第一次執行時Num3=0,以后執行時不會再次初始,主要用于超聲波模塊的使能信號過后用來檢測接收端Ec1是否有高電平,或用于進入和退出while循環,,
  181. static uchar Choice=0;
  182. bit Bit_Num2;          //定義bit型變量(51特有變量)Bit_Num2。。主要用于關閉定時器并進入下一個函數(檢測Ec1的脈寬長度)
  183. uchar Move1,Move2,Move3,Move4;            //定義unsigned char變量Move(用來進入switch語句并選擇那種工作方式)
  184. if(Choice==2){Choice=0;}
  185. switch(Choice)
  186. {
  187. case 0:Tr1=1;Delays(10);Tr1=0;Num3=1;break;        //Tr1給高電平 //至少延時10微秒        //Tr1給低電平 //Num3給1
  188. case 1:Tr2=1;Delays(10);Tr2=0;Num3=2;break;       
  189. default:break;
  190. }
  191. Choice++;          
  192. Bit_Num2=0;          //Bit_Num2給0用于進入下一步while循環
  193. while(Num3==1)          //當Num3檢測到定于1時進入本循環
  194. {
  195. while(Ec1==1)          //當Ec1檢測等于1是進入本循環,當Ec1(接收信號的高電平脈寬結束后退出此循環)
  196. {          //Bit_Num2給以用來鍵入笑一個if語句
  197. Bit_Num2=1;          //打開定時器TR0進入定時器0中斷
  198. TR0=1;
  199. }
  200. if(Ec1==0&Bit_Num2==1)          //如果Ec1等于0(超聲波測距模塊的接收端發送到高電平脈寬傳送完后)而且Bit_Num2等于1進入此語句
  201. {          
  202. TR0=0;          //關閉定時器
  203. if(Distance<20)          //如果脈寬小于50微秒
  204. {
  205. Move1=0;         //Move等于1          
  206. }
  207. else if(Distance>30)          //如果上一語句不成立則檢測此語句,如果脈寬的時間長度大于50微秒
  208. {
  209. uchar n;
  210. for(n=1;n>0;n--)
  211. {
  212. Move1++;          //Move等于2
  213. }

  214. }
  215. else{};
  216. if(Distance<30&Distance>20)       
  217. {
  218. uchar n;
  219. for(n=2;n>0;n--)
  220. {
  221. Move1++;          //Move等于2
  222. }
  223. }
  224. Num3=0;
  225. }          
  226. }
  227. while(Num3==2)
  228. {
  229. Distance=0;
  230. while(Ec2==1)          //當Ec2檢測等于1是進入本循環,當Ec1(接收信號的高電平脈寬結束后退出此循環)
  231. {          
  232. Bit_Num2=1;          //Bit_Num2給以用來鍵入笑一個if語句
  233. TR0=1;         //打開定時器TR0進入定時器0中斷
  234. }
  235. if(Ec2==0&Bit_Num2==1)          //如果Ec1等于0(超聲波測距模塊的接收端發送到高電平脈寬傳送完后)而且Bit_Num2等于1進入此語句
  236. {          
  237. TR0=0;         //關閉定時器          
  238. if(Distance<20)          //如果脈寬小于50微秒
  239. {
  240. Move2=0;       
  241. }
  242. else if(Distance>30)          //如果上一語句不成立則檢測此語句,如果脈寬的時間長度大于50微秒
  243. {
  244. uchar n;
  245. for(n=1;n>0;n--)
  246. {
  247. Move2++;       
  248. }
  249. }
  250. else{};
  251. if(Distance<30&Distance>20)          //如果上一語句不成立則檢測此語句,如果脈寬的時間長度大于50微秒
  252. {
  253. uchar n;
  254. for(n=2;n>0;n--)
  255. {
  256. Move2++;       
  257. }
  258. }
  259. Num_Run=1;
  260. Num3=0;
  261. }         
  262. }
  263. if(Num_Run==1)
  264. {
  265. unsigned char Get[4][4]={{0x01,0x02,0x03,0x04},{0x05,0x06,0x07,0x08},{0x0a,0x0b,0x0c,0x0e},{0x0f,0x11,0x21,0x31}};
  266. switch(Get[Move1][Move2])          //檢測Move的值并進入相應的語句
  267. {
  268. case 0x01:IN1=1;IN2=0;IN3=0;IN4=1;ENA=1;ENB=1;break;        //如果Move等于0,則電機反轉,并給Distance清零,然后退出此語句        //
  269. case 0x02:IN1=0;IN2=1;IN3=1;IN4=0;ENA=1;ENB=1;break;
  270. case 0x05:IN1=1;IN2=0;IN3=0;IN4=1;ENA=1;ENB=1;break;         //左開右關
  271. case 0x06:IN1=1;IN2=0;IN3=1;IN4=0;ENA=1;ENB=1;break;        //如果Move等于1,則電機正轉,并給Distance清零,然后退出此語句**//前進
  272. case 0x0a:IN1=1;IN2=0;IN3=0;IN4=1;ENA=1;ENB=1;break;
  273. case 0x0b:IN1=0;IN2=0;IN3=0;IN4=1;ENA=1;ENB=1;break;
  274. case 0x0c:IN1=1;IN2=0;IN3=0;IN4=1;ENA=1;ENB=1;break;
  275. case 0x03:IN1=0;IN2=1;IN3=1;IN4=0;ENA=1;ENB=1;break;
  276. case 0x07:IN1=1;IN2=0;IN3=0;IN4=0;ENA=1;ENB=1;break;          
  277. default:break;        //如果以上都不符合,則退出此語句,準備下一循環
  278. }
  279. Distance=0;
  280. Move1=0;                   //Move清零;
  281. Move2=0;
  282. Move3=0;
  283. Move4=0;
  284. Num_Run=0;
  285. }       
  286. }
  287. }
  288. void open_time()          //定時器初始函數
  289. {
  290. TMOD=0x01;          //確定工作方式位01,(內容自己上網查啊,大概是16位手動重裝計數器,,記不清了)
  291. TH0=(65536-1)/256;          //確定一微秒記一次
  292. TL0=(65536-1)%256;          //確定一微秒記一次
  293. EA=1;          //打開總中斷
  294. ET0=1;          //打開定時器0中斷
  295. TR0=0;          //關閉定時器0
  296. }
  297. void q2()          //main函數(主函數),,所有函數都從這個函數開始執行
  298. {       
  299. RXD=1;          
  300. init();          //執行init函數
  301. open_time();          //執行open_time函數
  302. while(1)          //進入大循環(除非執行中斷函數否則永不退出)
  303. {
  304. Ranging();          //執行Ranging函數

  305. }
  306. }
  307. void main()
  308. {
  309. hig=1;
  310. RXd=1;
  311. h=0;
  312. while(1)
  313. {
  314. unsigned char zz;
  315. unsigned int uu,ii;
  316. for(uu=9000;uu>0;uu--)
  317. for(ii=60;ii>0;ii--);
  318. if(RXd==0)
  319. {
  320. zz=1;
  321. }
  322. if(hig==0)
  323. {
  324. zz=2;
  325. }
  326. while(zz==1){q1();}
  327. while(zz==2){q2();}
  328. }
  329. }
  330. void time() interrupt 1          //定時器0中斷語句
  331. {
  332. TH0=(65536-1)/256;          //重裝初值TH0=(65536-1)/256;
  333. TL0=(65536-1)%256;          //重裝初值TL0=(65536-1)%256;
  334. Distance++;          //每次走一步Distance加一
  335. if(Distance==65535)          //如果Distance等于65535就進入此語句
  336. {
  337. Distance=0;          //Distance的值清零
  338. }
  339. }  
復制代碼


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

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 亚洲激情在线视频 | 成人网在线看 | 国产超碰人人爽人人做人人爱 | 欧美成人性生活 | 日日噜噜噜夜夜爽爽狠狠视频, | 亚洲欧洲一区二区 | 日韩一级免费大片 | 成人欧美一区二区 | 夜夜操天天干 | 日韩精品一区二区三区在线播放 | 日韩视频在线观看中文字幕 | 国产精品久久久久久久久婷婷 | 欧美一区二区三区四区五区无卡码 | 一区二区三区亚洲 | 欧美成人影院 | 成人免费观看男女羞羞视频 | 欧美成人一区二区三区 | 牛牛热在线视频 | 蜜桃av人人夜夜澡人人爽 | 久草在线在线精品观看 | 日韩免费网站 | 精品欧美一区二区精品久久久 | 天天干天天草 | 亚洲成人一区二区三区 | 欧美不卡一区二区三区 | 一级a爱片久久毛片 | 免费一级欧美在线观看视频 | 欧美国产大片 | 国产精品电影在线观看 | 国产精品视频一区二区三区四区国 | 国产精品我不卡 | 一区二区三区视频在线观看 | 中文字幕在线一区二区三区 | 91素人| 欧美一区二区三区在线 | 一区二区日韩 | 国产97在线视频 | 午夜免费视频 | 国产美女久久 | 欧美一级特黄aaa大片在线观看 | 刘亦菲国产毛片bd |