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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4281|回復: 3
打印 上一主題 下一主題
收起左側(cè)

通過超聲波傳感器控制電機的正反轉(zhuǎn)單片機程序有問題,大神幫忙看一下來

[復制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:108510 發(fā)表于 2017-7-11 20:49 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
50黑幣
要求是:通過超聲波傳感器控制電機的正反轉(zhuǎn),當小于設(shè)定值A(chǔ)時,電機正轉(zhuǎn),等于時停止,大于時反轉(zhuǎn)。現(xiàn)在程序?qū)懭牒螅O(shè)定值在個位數(shù)滿足要求,但設(shè)定值超過個位后比如12或25時它還是按照2或5進行比較.不知道程序在哪出錯了.怎么整
//超聲波模塊顯示程序
  1. #include <reg52.h>     //包括一個52標準內(nèi)核的頭文件
  2. #include<intrins.h>  //包含_nop_()函數(shù)定義的頭文件
  3. #define uchar unsigned char //定義一下方便使用
  4. #define uint  unsigned int
  5. #define ulong unsigned long
  6. sbit ZZ=P1^0;
  7. sbit FZ=P1^1;
  8. sbit k1=P1^4;
  9. sbit k2=P1^5;
  10. sbit k3=P1^6;
  11. sbit Tx=P3^2;
  12. sbit Rx=P3^3;
  13. sbit RS=P2^0;    //寄存器選擇位,將RS位定義為P2.0引腳
  14. sbit RW=P2^1;    //讀寫選擇位,將RW位定義為P2.1引腳
  15. sbit E=P2^2;     //使能信號位,將E位定義為P2.2引腳
  16. sbit BF=P0^7;    //忙碌標志位,,將BF位定義為P0.7引腳
  17. int  A=20;
  18. unsigned char code digit[ ]={"0123456789"}; //定義字符數(shù)組顯示數(shù)字
  19. //uchar code SEG7[10]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};//數(shù)碼管0-9
  20. uint distance[4];  //測距接收緩沖區(qū)
  21. uchar ge,shi,bai,temp,flag,outcomeH,outcomeL,i;  //自定義寄存器
  22. bit succeed_flag;  //測量成功標志
  23. uint tdata;
  24. //********函數(shù)聲明
  25. void conversion(uint temp_data);
  26. void delay_20us();
  27. void pai_xu();
  28. void DisplayA();


  29. /*****************************************************
  30. 函數(shù)功能:延時1ms
  31. (3j+2)*i=(3×33+2)×10=1010(微秒),可以認為是1毫秒
  32. ***************************************************/
  33. void delay1ms()
  34. {
  35.    unsigned char i,j;        
  36.          for(i=0;i<10;i++)
  37.           for(j=0;j<33;j++)
  38.            ;                 
  39. }
  40. /*****************************************************
  41. 函數(shù)功能:延時若干毫秒
  42. 入口參數(shù):n
  43. ***************************************************/
  44. void delay(unsigned char n)
  45. {
  46.    unsigned char i;
  47.         for(i=0;i<n;i++)
  48.            delay1ms();
  49. }
  50. /*****************************************************
  51. 函數(shù)功能:判斷液晶模塊的忙碌狀態(tài)
  52. 返回值:result。result=1,忙碌;result=0,不忙
  53. ***************************************************/
  54. unsigned char BusyTest(void)
  55.   {
  56.     bit result;
  57.         RS=0;       //根據(jù)規(guī)定,RS為低電平,RW為高電平時,可以讀狀態(tài)
  58.     RW=1;
  59.     E=1;        //E=1,才允許讀寫
  60.     _nop_();   //空操作
  61.     _nop_();
  62.     _nop_();
  63.     _nop_();   //空操作四個機器周期,給硬件反應時間        
  64.     result=BF;  //將忙碌標志電平賦給result
  65.    E=0;         //將E恢復低電平
  66.     return result;
  67.   }
  68. /*****************************************************
  69. 函數(shù)功能:將模式設(shè)置指令或顯示地址寫入液晶模塊
  70. 入口參數(shù):dictate
  71. ***************************************************/
  72. void WriteInstruction (unsigned char dictate)
  73. {   
  74.     while(BusyTest()==1); //如果忙就等待
  75.          RS=0;                  //根據(jù)規(guī)定,RS和R/W同時為低電平時,可以寫入指令
  76.          RW=0;   
  77.          E=0;                   //E置低電平(根據(jù)表8-6,寫指令時,E為高脈沖,
  78.                              // 就是讓E從0到1發(fā)生正跳變,所以應先置"0"
  79.          _nop_();
  80.          _nop_();             //空操作兩個機器周期,給硬件反應時間
  81.          P0=dictate;            //將數(shù)據(jù)送入P0口,即寫入指令或地址
  82.          _nop_();
  83.          _nop_();
  84.          _nop_();
  85.          _nop_();               //空操作四個機器周期,給硬件反應時間
  86.          E=1;                   //E置高電平
  87.          _nop_();
  88.          _nop_();
  89.          _nop_();
  90.          _nop_();               //空操作四個機器周期,給硬件反應時間
  91.           E=0;                  //當E由高電平跳變成低電平時,液晶模塊開始執(zhí)行命令
  92. }
  93. /*****************************************************
  94. 函數(shù)功能:指定字符顯示的實際地址
  95. 入口參數(shù):x
  96. ***************************************************/
  97. void WriteAddress(unsigned char x)
  98. {
  99.      WriteInstruction(x|0x80); //顯示位置的確定方法規(guī)定為"80H+地址碼x"
  100. }
  101. /*****************************************************
  102. 函數(shù)功能:將數(shù)據(jù)(字符的標準ASCII碼)寫入液晶模塊
  103. 入口參數(shù):y(為字符常量)
  104. ***************************************************/
  105. void WriteData(unsigned char y)
  106. {
  107.     while(BusyTest()==1);  
  108.           RS=1;           //RS為高電平,RW為低電平時,可以寫入數(shù)據(jù)
  109.           RW=0;
  110.           E=0;            //E置低電平(根據(jù)表8-6,寫指令時,E為高脈沖,
  111.                        // 就是讓E從0到1發(fā)生正跳變,所以應先置"0"
  112.           P0=y;           //將數(shù)據(jù)送入P0口,即將數(shù)據(jù)寫入液晶模塊
  113.           _nop_();
  114.           _nop_();
  115.            _nop_();
  116.      _nop_();       //空操作四個機器周期,給硬件反應時間
  117.           E=1;          //E置高電平
  118.           _nop_();
  119.           _nop_();
  120.           _nop_();
  121.          _nop_();        //空操作四個機器周期,給硬件反應時間
  122.          E=0;            //當E由高電平跳變成低電平時,液晶模塊開始執(zhí)行命令
  123. }
  124. /*****************************************************
  125. 函數(shù)功能:對LCD的顯示模式進行初始化設(shè)置
  126. ***************************************************/
  127. void LcdInitiate(void)
  128. {
  129.    delay(15);             //延時15ms,首次寫指令時應給LCD一段較長的反應時間
  130.    WriteInstruction(0x38);  //顯示模式設(shè)置:16×2顯示,5×7點陣,8位數(shù)據(jù)接口
  131.         delay(5);               //延時5ms ,給硬件一點反應時間
  132.    WriteInstruction(0x38);
  133.         delay(5);
  134.         WriteInstruction(0x38); //連續(xù)三次,確保初始化成功
  135.         delay(5);
  136.         WriteInstruction(0x0c);  //顯示模式設(shè)置:顯示開,無光標,光標不閃爍
  137.         delay(5);
  138.         WriteInstruction(0x06);  //顯示模式設(shè)置:光標右移,字符不移
  139.         delay(5);
  140.         WriteInstruction(0x01);  //清屏幕指令,將以前的顯示內(nèi)容清除
  141.         delay(5);
  142. }
  143. void DisplayA()
  144. {
  145.   unsigned char i,j;
  146.    i=A/10;
  147.    //計算設(shè)定值的十位
  148.         j=A%10;                //計算設(shè)定值的個位
  149.    WriteAddress(0x04);   //在第二行從第三位開始寫數(shù)據(jù)
  150.         WriteData(digit[i]);  //將設(shè)定值的十位寫入LCD
  151.         WriteData(digit[j]);  //將設(shè)定值的個位寫入LCD
  152. }   








  153. void main(void)   // 主程序
  154. {  uint distance_data,a,b;
  155.    uchar CONT_1;  
  156.     LcdInitiate();         //調(diào)用LCD初始化函數(shù)  
  157.    delay(10);             //延時10ms,給硬件一點反應時間

  158.    i=0;

  159.    flag=0;
  160.         Tx=0;       //首先拉低脈沖輸入引腳
  161.         TMOD=0x10;    //定時器0,定時器1,16位工作方式
  162. //        TR0=1;             //啟動定時器0
  163.    IT1=0;        //由高電平變低電平,觸發(fā)外部中斷
  164.         //ET0=1;        //打開定時器0中斷
  165.         EX1=0;        //關(guān)閉外部中斷
  166.         EA=1;         //打開總中斷0        

  167.         
  168. while(1)         //程序循環(huán)
  169.         {{if(k2==0)
  170. {delay1ms();
  171.         if(A<0)
  172. A=99;
  173. A++;}
  174. if(k3==0)
  175. {delay1ms();
  176.         if(A>99)
  177.                 A=0;
  178. A--;}
  179. B=A;
  180. WriteAddress(0x00);   
  181. WriteData('S');  
  182. WriteData('E');                          
  183. WriteData('T');  
  184. WriteData(':');
  185. DisplayA();
  186. WriteData('C');
  187. WriteData('M');
  188. delay(10);}
  189.          WriteAddress(0x43);   
  190. WriteData('J');  
  191. WriteData('U');                          
  192. WriteData('L');
  193.         WriteData('I');
  194.         WriteData(':');
  195.         WriteData(digit[bai]);
  196.         WriteData(digit[shi]);
  197. WriteData('.');
  198. WriteData(digit[ge]);

  199. WriteData('C');
  200. WriteData('M');  
  201. if(tdata==B)
  202. {WriteAddress(0x0c);      
  203. WriteData('S');  
  204. WriteData('T');
  205. WriteData('O');
  206. WriteData('P');
  207. ZZ=0;
  208. FZ=0;}
  209. else if(tdata>B)
  210. {WriteAddress(0x0c);      
  211. WriteData('F');  
  212. WriteData('X');
  213. WriteData('X');
  214. WriteData('Z');
  215. ZZ=0;
  216. FZ=1;}
  217. else
  218. {WriteAddress(0x0c);      
  219. WriteData('Z');  
  220. WriteData('X');
  221. WriteData('X');
  222. WriteData('Z');
  223. ZZ=1;
  224. FZ=0;}
  225.   EA=0;
  226.              Tx=1;
  227.         delay_20us();
  228.         Tx=0;         //產(chǎn)生一個20us的脈沖,在Tx引腳  
  229.         while(Rx==0); //等待Rx回波引腳變高電平
  230.              succeed_flag=0; //清測量成功標志
  231.              EX1=1;          //打開外部中斷
  232.                    TH1=0;          //定時器1清零
  233.         TL1=0;          //定時器1清零
  234.              TF1=0;          //
  235.         TR1=1;          //啟動定時器1
  236.    EA=1;

  237.       while(TH1 < 30);//等待測量的結(jié)果,周期65.535毫秒(可用中斷實現(xiàn))  
  238.                   TR1=0;          //關(guān)閉定時器1
  239.         EX1=0;          //關(guān)閉外部中斷

  240.     if(succeed_flag==1)
  241.              {         
  242.                    distance_data=outcomeH;                //測量結(jié)果的高8位
  243.            distance_data<<=8;                   //放入16位的高8位
  244.                      distance_data=distance_data|outcomeL;//與低8位合并成為16位結(jié)果數(shù)據(jù)
  245.             distance_data*=12;                  //因為定時器默認為12分頻
  246.            distance_data/=58;                   //微秒的單位除以58等于厘米
  247.          }                                      //為什么除以58等于厘米,  Y米=(X秒*344)/2
  248.                                                                // X秒=( 2*Y米)/344 ==》X秒=0.0058*Y米 ==》厘米=微秒/58
  249.     if(succeed_flag==0)
  250.                    {
  251.             distance_data=0;                    //沒有回波則清零

  252.            }

  253.            distance[i]=distance_data; //將測量結(jié)果的數(shù)據(jù)放入緩沖區(qū)
  254.             i++;
  255.                      if(i==3)
  256.                        {
  257.                          distance_data=(distance[0]+distance[1]+distance[2]+distance[3])/4;

  258.             pai_xu();
  259.              distance_data=distance[1];


  260.            a=distance_data;
  261.        if(b==a) CONT_1=0;
  262.        if(b!=a) CONT_1++;
  263.        if(CONT_1>=3)
  264.                    { CONT_1=0;
  265.                           b=a;
  266.                           conversion(b);
  267.                         }      
  268.                            i=0;
  269.                            }            
  270.          }
  271. }
  272. //***************************************************************
  273. //外部中斷0,用做判斷回波電平
  274. INTO_()  interrupt 2   // 外部中斷是2號
  275. {   
  276.      outcomeH =TH1;    //取出定時器的值
  277.      outcomeL =TL1;    //取出定時器的值
  278.      succeed_flag=1;   //至成功測量的標志
  279.      EX1=0;            //關(guān)閉外部中斷
  280.   }
  281. //****************************************************************
  282. //定時器0中斷,用做顯示
  283. timer0() interrupt 1  // 定時器0中斷是1號
  284.    {
  285.          // TH0=0xfd; //寫入定時器0初始值
  286.         // TL0=0x77;                 
  287.         
  288.    }

  289. //顯示數(shù)據(jù)轉(zhuǎn)換程序
  290. void conversion(uint temp_data)  
  291. {  
  292.     uchar ge_data,shi_data,bai_data ;
  293.          
  294.     bai_data=temp_data/100 ;
  295.     temp_data=temp_data%100;   //取余運算
  296.     shi_data=temp_data/10 ;
  297.     temp_data=temp_data%10;   //取余運算
  298.     ge_data=temp_data;

  299.     //bai_data=SEG7[bai_data];
  300.     //shi_data=SEG7[shi_data]&0x7f;
  301.     //ge_data =SEG7[ge_data];

  302.     EA=0;
  303.     bai = bai_data;
  304.     shi = shi_data;
  305.     ge  = ge_data ;
  306.          tdata=bai*10+shi;
  307.          EA=1;
  308. }
  309. //******************************************************************


  310. void delay_20us()
  311. {  uchar bt ;
  312.     for(bt=0;bt<60;bt++);
  313. }
  314.    void pai_xu()
  315.   {  uint t;
  316.   if (distance[0]>distance[1])
  317.     {t=distance[0];distance[0]=distance[1];distance[1]=t;}
  318.   if(distance[0]>distance[2])
  319.     {t=distance[2];distance[2]=distance[0];distance[0]=t;}
  320.   if(distance[1]>distance[2])
  321.     {t=distance[1];distance[1]=distance[2];distance[2]=t;}  
  322.     }
復制代碼


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

使用道具 舉報

沙發(fā)
ID:108510 發(fā)表于 2017-7-12 15:45 | 只看該作者
已解決
回復

使用道具 舉報

板凳
ID:493518 發(fā)表于 2019-4-14 15:42 | 只看該作者

樓主怎么解決的,可以分享一下這份資料嗎
回復

使用道具 舉報

地板
ID:523121 發(fā)表于 2019-4-27 18:07 來自手機 | 只看該作者
1003 發(fā)表于 2017-7-12 15:45
已解決

還有這個資料沒啊
回復

使用道具 舉報

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

本版積分規(guī)則

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

Powered by 單片機教程網(wǎng)

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 亚洲精品专区 | 免费色网址 | 高清国产一区二区 | 99久久99久久精品国产片果冰 | 日本三级精品 | 国产免费观看久久黄av片涩av | 婷婷在线视频 | 天天碰日日操 | 国产精品久久久久久一级毛片 | 日本xx视频免费观看 | 男女精品网站 | 婷婷五月色综合香五月 | 范冰冰一级做a爰片久久毛片 | 欧美日韩一 | 亚洲欧美日韩在线 | 亚洲精品久久久一区二区三区 | 欧美成年视频 | 久久久.com | 免费久久99精品国产婷婷六月 | 精产嫩模国品一二三区 | 羞羞免费网站 | 国产欧美日韩在线一区 | 男女一区二区三区 | 久久福利网站 | 国产综合精品一区二区三区 | 久久国产综合 | 看av电影| 亚洲精品在线看 | 久久精品一区二区三区四区 | 中国一级特黄视频 | 99久久久无码国产精品 | 成人精品鲁一区一区二区 | 成人精品一区二区三区四区 | 欧美精品一区久久 | 国产精品久久久久久妇女6080 | 亚洲精品视频免费观看 | 综合国产 | 久久国产高清 | 一区免费 | 久久国产欧美日韩精品 | 一级毛片免费完整视频 |