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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

oh yeah···單片機智能小何程序完成了

[復制鏈接]
跳轉到指定樓層
樓主
ID:71259 發表于 2014-12-29 01:12 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
  1. #include<reg52.h>
  2. #include<stdio.h>     //標準輸入輸出
  3. #include<intrins.h>    //
  4. sbit left1=P1^0;    //左邊1電機轉
  5. sbit right1=P1^1;   //右邊1電機轉
  6. sbit left2=P1^6;    //左邊2電機轉
  7. sbit right2=P1^7;   //右邊2電機轉  
  8. sbit cleft0=P1^2;   //左邊第一號紅外檢測
  9. sbit cleft1=P1^3;   //左邊第二號紅外檢測
  10. sbit cright0=P1^4;   //右邊第一號紅外檢測
  11. sbit cright1=P1^5;   //右邊第二號紅外檢測
  12. sbit key=P3^2;    //外部按鍵
  13. sbit rs=P0^5;    //數據/命令控制位
  14. sbit rw=P0^6;    //讀寫控制位
  15. sbit enable=P0^7;   //使能控制位
  16. sbit xl=P3^0;    //尋線左紅外
  17. sbit xr=P3^1;    //尋線右紅外
  18. sbit TX =P3^6;    //超聲波信號發送端
  19. sbit RX =P3^7;    //超聲波信號接收端
  20. #define date P2    //用于LCD數據輸出
  21. char data test1[]="                  ";   //第一行顯示table
  22. char data test2[]="                  ";   //第二行顯示table
  23. unsigned char wflag;  //工作位標志,包括避障,尋線,超聲波探測
  24. unsigned long S;   //超聲波測試距離
  25. unsigned int time;   //超聲波高電平時間
  26. unsigned char qian,bai,shi,ge;  //千百十個位

  27. void delay(int i)   //不精確延時
  28. {
  29. while(i--);
  30. }
  31. unsigned char test()   //小車正向避障監測子程序
  32. {
  33. unsigned char k;
  34. if((cleft0&&cleft1&&cright0&&cright1)==1)
  35. {
  36.   k=1;     //小車前面完全沒有障礙物標志為1
  37. }
  38. if((cleft0&&cleft1)==0)
  39. {
  40.   k=2;     //左邊有障礙物時標志為2
  41. }
  42. if((cright0&&cright1)==1)
  43. {
  44.   k=3;     //右邊有障礙物時標志為3
  45. }
  46. return k;
  47. }
  48. unsigned char test3()   //尋線紅外檢測子程序
  49. {
  50. unsigned char p;
  51. if((xl&&xr)==1)  
  52. {
  53.   p=1;     //此標志顯示小車可向前移動
  54. }
  55. if((xl=1)&&(xr=0))
  56. {
  57.   p=2;     //小車右邊碰到黑線,小車需糾正位置
  58. }
  59. if((xl=0)&&(xr=1))
  60. {
  61.   p=3;     //小車左邊碰到黑線,小車需要糾正位置
  62. }
  63. if((xl=0)&&(xr=0))
  64. {
  65.   p=4;     //小車全部碰到黑線,倒車
  66. }
  67. return p;
  68. }
  69. void zhengxiang()    //正向
  70. {
  71. delay(500);      
  72. right1=1;
  73. right2=0;
  74. left1=1;
  75. left2=0;
  76. delay(500);     //全部置零 停止小車,減速
  77. right1=0;
  78. right2=0;
  79. left1=0;
  80. left2=0;
  81. delay(2000);
  82. }
  83. void youxiang()     //右向
  84. {
  85. delay(500);
  86. right1=0;
  87. right2=0;
  88. left1=1;
  89. left2=0;
  90. delay(500);     //全部置零 停止小車,減速
  91. right1=0;
  92. right2=0;
  93. left1=0;
  94. left2=0;
  95. delay(2000);
  96. }
  97. void zuoxiang()     //左向
  98. {
  99. delay(500);
  100. right1=1;
  101. right2=0;
  102. left1=0;
  103. left2=0;
  104. delay(500);     //全部置零 停止小車,減速
  105. right1=0;
  106. right2=0;
  107. left1=0;
  108. left2=0;
  109. delay(2000);
  110. }
  111. void daoche()     //倒車
  112. {
  113. delay(500);
  114. right1=0;
  115. right2=1;
  116. left1=0;
  117. left2=1;
  118. delay(500);     //全部置零 停止小車,減速
  119. right1=0;
  120. right2=0;
  121. left1=0;
  122. left2=0;
  123. delay(2000);
  124. }

  125. void bizhang()     //避障子程序
  126. {  
  127.   unsigned char flag;  //障礙標志位
  128.   test();     //運行監測
  129.   flag=test();   
  130.   if(flag==1)    //判斷處理
  131.   {
  132.    zhengxiang();
  133.   }
  134.   if(flag==2)
  135.   {
  136.    zuoxiang();
  137.   }
  138.   if(flag==3)
  139.   {
  140.    youxiang();
  141.   }
  142. }
  143. void xunxian()
  144. {
  145. unsigned char flag;
  146. test3();
  147. flag=test3();
  148. if(flag==1)
  149. {
  150.   zhengxiang();
  151. }
  152. if(flag==2)
  153. {
  154.   zuoxiang();
  155. }
  156. if(flag==3)
  157. {
  158.   youxiang();
  159. }
  160. if(flag==4)
  161. {
  162.   daoche();
  163. }
  164. }
  165. void delayms(int x)     //粗略的MS延時
  166. {
  167. while(x--)
  168. {
  169.   delay(500);     //調用US延時
  170.   delay(500);
  171.   delay(500);
  172. }
  173. }

  174. void write_com(unsigned char c)  //LCD液晶寫命令
  175. {
  176. delayms(5);      //這一部分請參考1602C型號的LCD使用手冊
  177. enable=0;
  178. rs=0;
  179. rw=0;
  180. _nop_();
  181. _nop_();
  182. enable=1;
  183. _nop_();
  184. date=c;
  185. _nop_();
  186. enable=0;
  187. }
  188. void write_date(unsigned char s) //LCD寫數據命令
  189. {
  190.   delayms(5);     //這一部分請參考1602C型號的LCD使用手冊
  191. enable=0;
  192. rs=1;
  193. rw=0;
  194. _nop_();
  195. enable=1;
  196. _nop_();
  197. date=s;
  198. _nop_();
  199. enable=0;
  200. }
  201. void init()       //LCD初始指令
  202. {
  203. delayms(15);
  204. write_com(0x38);    //0XXX為命令指令,請參考1602C型號LCD的使用手冊
  205. write_com(0x38);
  206. write_com(0x38);
  207. write_com(0x0f);
  208. write_com(0x06);
  209. write_com(0x01);     //顯示清屏
  210. write_com(0x80);     //數據起始書寫地址
  211. }

  212. void showjie(unsigned char pos,unsigned char c)  //寫入一個字節的數據
  213. {
  214. unsigned char p;
  215. if(pos>=0x10)
  216.   p=pos+0xb0;
  217. else
  218.   p=pos+0x80;
  219. write_com(p);
  220. write_date(c);
  221. }
  222. void showchuan(unsigned char line,char *ptr)  //寫入一個字符串的數據并包含行數
  223. {
  224. unsigned char l,o;
  225. l=line<<4;
  226. for (o=0;o<16;o++)
  227.   showjie(l++,*(ptr+o));
  228. }
  229. void sent()      //定義一個發送
  230. {  
  231. TX=1;       //發送端發送信號
  232. delay(25);      //給一個大于10US的信號
  233. TX=0;       //關閉發送端信號
  234. }
  235. void Count()
  236. {
  237. time=TH0*256+TL0;    //計算時間
  238. TH0=0;       //復位
  239. TL0=0;       //復位
  240. S=(time*1.7)/10;    //計算距離,單位MM
  241. if(S<5000)
  242. {
  243.   qian=S/1000;    //定義第四位
  244.   bai=S/100%10;    //定義第三位
  245.   shi=S/10%10;    //定義第二位
  246.   ge=S%10;     //定義第一位
  247.   test2[5]=(qian+48);
  248.   test2[6]=(bai+48);
  249.   test2[7]=(shi+48);
  250.   test2[8]=(ge+48);
  251.   showchuan(1,test2);
  252. }
  253. }
  254. void receive()     //定義一個接收
  255. {
  256. TR0=1;      //定時器0開
  257. while(RX);     //持續延時RX為高電平的時間
  258. TR0=0;      //定時器0關
  259. Count();     //調用Count
  260. }
  261. void welcome()        //起始LCD歡迎詞
  262. {
  263. delayms(20);
  264. init();         //初始化LCD
  265. delayms(20);
  266. sprintf(test1,"welcome to robot");  //調用sprintf
  267. showchuan(0,test1);      //using showchuan
  268. sprintf(test2,"     by jack    ");  //using sprintf
  269. showchuan(1,test2);      //using showchuan
  270. while(1);
  271. }
  272. void chaoshengbo()       //超聲波子程序
  273. {
  274. int lv;
  275. delayms(20);
  276. init();
  277. delayms(20);
  278. sprintf(test1,"the distance is ");
  279. showchuan(0,test1);
  280. for(lv=1000;lv>0;lv--)
  281. {
  282.   RX=1;      //給RX一個高電平
  283.   sent();      //給發送端一個>10us的信號
  284.   if(RX==1)
  285.   {
  286.    receive();   //調用RECEIVE
  287.   }
  288. }
  289. }
  290. void main()
  291. {
  292. EA=1;       //中斷打開
  293. EX0=1;       //外部中斷打開
  294. IT0=0;       //外部中斷低電平有效
  295. ET0=1;       //定時器中斷0開
  296. ET1=1;       //定時器中斷1開
  297. TMOD=0X11;      //定義TO,T1由TCON控制,工作方式為方式1
  298. TH0=0;
  299. TL0=0;
  300. TH1=0;
  301. TL1=0;
  302. while(wflag==0)     //LCD歡迎界面
  303. {
  304.   welcom();
  305. }
  306. while(wflag==1)     //避障模式
  307. {
  308.   bizhang();
  309. }
  310. while(wflag==2)     //尋線模式
  311. {
  312.   xunxian();
  313. }
  314. while(wflag==3)
  315. {
  316.   chaoshengbo();
  317. }
  318.   
  319. }
  320. void ISR_KEY(void) interrupt 1 using 1  //外部中斷函數  控制工作標志位的改變 切換工作狀態
  321. {
  322. delay(500);
  323. if(!key)
  324. {
  325.   wflag++;
  326.   if(wflag==4)
  327.    wflag=0;
  328. }
  329. }

  330. //到這里就寫完啦···整體的硬件還沒做出來,但是分開的我都做過一次了,程序都沒問題···哈哈,整體作出來后再測試吧,哈哈···
復制代碼



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

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 欧美精品二区 | 一区欧美 | 久久人| 日韩中文字幕在线视频 | 精品国产免费一区二区三区演员表 | 国产一区二区三区视频 | 精品视频在线观看 | 国产欧美精品一区 | 国产精品美女久久久久久免费 | 国产成人91视频 | 欧美精品国产一区二区 | 亚洲成人播放器 | 成人av高清在线观看 | 亚洲综合视频一区 | av在线电影网 | 久久国产一区 | 国产成人精品久久二区二区91 | 日韩福利 | 久久精品91久久久久久再现 | 最新国产精品视频 | 午夜色婷婷 | 美国一级黄色片 | 国产在线观看一区二区三区 | 日韩精品免费在线观看 | 精品国产不卡一区二区三区 | 国产高清一区二区三区 | 国产精品国产三级国产aⅴ中文 | 久久久久国产精品午夜一区 | 日韩免费视频 | 久色| 欧美日韩精品亚洲 | 成人精品在线观看 | 国产婷婷色一区二区三区 | 日韩福利在线观看 | 国产精品一二三区 | 日本小视频网站 | 精品久久久久久久久久 | 在线中文视频 | 国产精品久久久久无码av | 亚洲经典一区 | 国产区精品视频 |