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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

單片機超聲波避障小車程序 LCD1602不亮和L298NIN口都處于高電平的原因?

  [復制鏈接]
回帖獎勵 60 黑幣 回復本帖可獲得 30 黑幣獎勵! 每人限 1 次
跳轉到指定樓層
樓主

請大佬幫我看看

單片機源程序如下:
  1. #include<reg52.h>                                //包含51單片機系統頭文件            
  2. sfr T2MOD = 0xC9;
  3. #define SPEED_30C 3495                           //30攝氏度時的聲速,聲速V= 331.5 + 0.6*溫度;
  4. #define SPEED_23C 3453                           //23攝氏度時的聲速,聲速V= 331.5 + 0.6*溫度;
  5. #define LCD_Data P0                                          //定義液晶1602數據接口對應單片機的P0口
  6. #define Busy 0x80                                            //液晶為忙時對應的狀態字
  7. //定義智能小車電機驅動芯片L293D輸入IO口      
  8. sbit IN1 = P1^4;                                      //電機驅動芯片L298N的IN1管腳
  9. sbit IN2 = P1^5;                                     //電機驅動芯片L298N的IN2管腳               
  10. sbit IN3 = P1^6;                                       //電機驅動芯片L298N的IN3管腳
  11. sbit IN4 = P1^7;                                      //電機驅動芯片L298N的IN4管腳
  12. sbit EN1 = P1^3;                                      //電機驅動芯片L298N的EN1管腳
  13. sbit EN2 = P3^2;                                               //電機驅動芯片L298N的EN2管腳
  14. sbit key1 = P3^7;                                         //暫停按鍵
  15. sbit key2 = P3^6;                                         //避障按鍵
  16. sbit key3 = P3^5;                                         //循跡按鍵
  17. sbit key4 = P3^4;
  18. sbit LCD_RS = P1^0;                                      //液晶的RS管腳
  19. sbit LCD_RW = P1^1;                                            //液晶的RW管腳
  20. sbit LCD_E = P1^2;                                       //液晶的E管腳
  21. sbit ECHO = P2^6;                              //超聲波模塊回聲接收端口
  22. sbit TRIG = P2^5;                              //超聲波模塊觸發端口
  23. sbit left_led  = P2^7;                            //左循跡引腳   
  24. sbit right_led = P2^0;                                    //右循跡引腳
  25. sbit zhong_led = P2^2;                                  //中循跡引腳
  26. unsigned char code table0[] = {"State:Stop      "};           //定義字符數組SL-51B用于液晶顯示
  27. unsigned char code table1[] = {"                "};           //定義字符數組NO ECHO用于液晶顯示
  28. unsigned char code table2[] ={"State:Avoiding  "};             //液晶顯示避障標志
  29. unsigned char code table3[] ={"Distance:xxx.xcm"};           //定義字符數組Distance:xxx.xcm用于顯示
  30. unsigned char code table4[] ={"State:Tracing   "};             //液晶顯示循跡標志
  31. unsigned char code table5[] ={"State:Telecont  "};
  32. unsigned char disbuff[4]={0,0,0,0};            //用于分別存放距離的值0.1mm、mm、cm和m的值
  33. unsigned char pwmval_left   = 0;               //變量定義pwmval_left 并初始化為0.用于小車的PWM調速  
  34. unsigned char pwmval_right  = 0;                  //變量定義pwmval_right并初始化為0.用于小車的PWM調速  
  35.                    //小車啟動時的初始占空比(左電機)
  36. unsigned char pwmval_left_init  = 8;          //左電機占空比調節 ,調節值在0到20之間,調節此值可調節小車速度。        
  37. unsigned char pwmval_right_init = 8;           //右電機占空比調節,調節值在0到20之間,調節此值可調節小車速度。        
  38. bit right_pwm = 1;                               //右電機PWM開關,為1時打開   
  39. bit left_pwm  = 1;                                   //左電機PWM開關,為1時打開     
  40. bit bz_flag1  = 1;                                              //超聲波避障標志變量
  41.       
  42. unsigned char lyen  = 0;       //小車工作模式標識(為0時表示小車暫停,為1時表示工作在避障模式,為2表示工作在循跡模式)            
  43. long int distance  = 0;                        //用于暫存超聲波模塊測到的距離
  44. long int distance1 = 0;                                  //用于轉存超聲波模塊測到的距離
  45. unsigned char count;                                    //count變量用于超聲波測距
  46. unsigned char UART_data;
  47. void delay(int In,int Out)                    //定義延時函數        
  48. {
  49. inti,j;
  50. for(i = 0;i < In;i++ )
  51. {
  52. for( j = 0;j < Out;j++ )
  53.   {;}
  54. }
  55. }
  56. void delayt(unsigned int x)                         //延時函數
  57. {
  58. unsigned char j;
  59. while(x-- > 0)
  60. {
  61. for(j = 0;j < 125;j++)
  62.   {;}
  63. }
  64. }
  65. void Delay5Ms(void)                                   //延時函數
  66. {
  67. unsigned int TempCyc = 3552;   
  68. while(TempCyc--);
  69. }
  70. /**************************讀狀態函數***************************/
  71. unsigned char ReadStatusLCD(void)                      //讀液晶狀態函數
  72. {
  73. LCD_Data = 0xFF;                                            //給液晶1602的數據口置0xff
  74. LCD_RS = 0;                                                    //控制液晶的RS管腳為低電平
  75. LCD_RW = 1;                                                //控制液晶的RW管腳為高電平
  76. LCD_E = 0;                                                     //控制液晶的E管腳為低電平
  77. LCD_E = 0;                                                     //控制液晶的E管腳為低電平
  78. LCD_E = 1;
  79. while (LCD_Data & Busy);                      //檢測忙信號  
  80. return(LCD_Data);
  81. }
  82. /**************************寫數據函數***************************/
  83. void WriteDataLCD(unsigned char WDLCD)
  84. {
  85. ReadStatusLCD();                                    //檢測忙
  86. LCD_Data = WDLCD;                                                     //將數據寫入液晶的數據口
  87. LCD_E = 0;                                          //控制液晶的E管腳為低電平(若晶振速度太高可以在這后加小的延時)        
  88. LCD_E = 0;                                          //控制液晶的E管腳為低電平(設置兩次,相當于小小的延時)   
  89. LCD_RS = 1;                                                         //控制液晶的RS管腳為高電平
  90. LCD_RW = 0;                                                        //控制液晶的RW管腳維低電平
  91. LCD_E = 1;                                                           //控制液晶的E管腳為高電平
  92. LCD_E = 0;                                                           //控制液晶的E管腳為低電平
  93. }
  94. /*************************寫指令函數****************************/
  95. void WriteCommandLCD(unsigned charWCLCD,BuysC)     //BuysC為0時忽略忙檢測     
  96. {
  97. if(BuysC) ReadStatusLCD();                          //根據需要檢測忙   
  98. LCD_Data = WCLCD;                                                      //給液晶寫命令
  99. LCD_E = 0;                                           //將液晶的管腳E設置成0,若晶振速度太高可以在這后加小的延時   
  100. LCD_E = 0;                                           //延時  
  101. LCD_RS = 0;                                                           //將液晶的RS設置成0
  102. LCD_RW = 0;                                                          //將液晶的RW設置成0  
  103. LCD_E = 1;                                                             //將液晶的E設置成1
  104. LCD_E = 0;                                                            //將液晶的E設置成0
  105. }
  106. /***************************LCD初始化***************************/
  107. void LCDInit(void)                                   //LCD初始化
  108. {
  109. LCD_Data = 0;
  110. WriteCommandLCD(0x38,0);                             //三次顯示模式設置,不檢測忙信號(給液晶寫命令0x38)
  111. Delay5Ms();                                                            //延時 5ms
  112. WriteCommandLCD(0x38,0);                             //給液晶寫命令0x38
  113. Delay5Ms();                                                            //延時 5ms  
  114. WriteCommandLCD(0x38,0);                                      //給液晶寫命令0x38
  115. Delay5Ms();                                                            //延時 5ms  
  116. WriteCommandLCD(0x38,1);                            //顯示模式設置, 開始要求每次檢測忙信號 (給液晶寫命令0x38)
  117. WriteCommandLCD(0x08,1);                            //關閉顯示,(給液晶寫命令0x08)
  118. WriteCommandLCD(0x01,1);                            //顯示清屏 ,(給液晶寫命令0x01)
  119. WriteCommandLCD(0x06,1);                            //顯示光標移動設置  ,(給液晶寫命令0x06)
  120. WriteCommandLCD(0x0C,1);                            //顯示開及光標設置  , (給液晶寫命令0x0C)
  121. }
  122. /**********************按指定位置顯示一個字符*********************/
  123. void DisplayOneChar(unsigned char X,unsigned char Y, unsigned char DData)
  124. {
  125. Y&= 0x1;
  126. X&= 0xF;                                           //限制X不能大于15,Y不能大于1        
  127. if(Y) X |= 0x40;                                  //當要顯示第二行時地址碼+0x40;
  128. X |=0x80;                                         //算出指令碼   
  129. WriteCommandLCD(X, 0);                              //這里不檢測忙信號,發送地址碼   
  130. WriteDataLCD(DData);                                              //將需要顯示的字符發給液晶
  131. }
  132. /***********************按指定位置顯示一串字符********************/
  133. void DisplayListChar(unsigned char X,unsigned char Y, unsigned char code *DData)
  134. {
  135. unsigned char ListLength;
  136. ListLength = 0;
  137. Y&= 0x1;
  138. X&= 0xF;                                           //限制X不能大于15,Y不能大于1     
  139. while (DData[ListLength]>=0x20)                     //若到達字串尾則退出      
  140. {
  141.   if(X <= 0xF)                                     //X坐標應小于0xF
  142.   {
  143.   DisplayOneChar(X, Y, DData[ListLength]);          //依次顯示單個字符,最終完成一串字符的顯示        
  144.   ListLength++;
  145.   X++;
  146.   }
  147. }
  148. }
  149. void Init_Parameter(void)                            //超聲波模塊初始化
  150. {
  151. TRIG    = 1;                                                      //將超聲波模塊的trig管腳設置成高電平
  152. ECHO    = 1;                                                     //將超聲波模塊的echo管腳設置成低電平
  153. count   = 0;                                                       //將變量count設置成0
  154. distance = 0;                                                         //將變量distance設置成0
  155. }
  156. void Trig_SuperSonic(void)                          //控制超聲波模塊發出超聲波   
  157. {
  158. TRIG= 1;                                                             //設置超聲波模塊的trig為高,發出超聲波
  159. delayt(1);                                                             //延時
  160. TRIG= 0;                                                             //設置超聲波模塊的trig為低,停止發出超聲波
  161. }
  162. void Measure_Distance(void)                       //距離計算函數
  163. {
  164. unsigned char l;
  165. unsigned int h,y;
  166. TR0= 1;                                                             //讓定時器0開始計數
  167. while(ECHO)                                                          //等待超聲波的回波信號
  168. {
  169.   ;
  170. }   
  171. TR0= 0;                                                              //讓定時器0停止計數
  172. l =TL0;                                                                //讀取定時器0計數值的低8位
  173. h =TH0;                                                              //讀取定時器0計數值的高8位
  174. y =(h << 8) + l;                                                   //得到定時器總的計數值
  175. y =y - 0xfc66;                                    //us部分      
  176. distance = y + 1000 * count;                        //計算總時間         
  177. TL0= 0x66;                                                          //重置定時器0的tl0      
  178. TH0= 0xfc;                                                          //重置定時器0的th0           
  179. delayt(30);                                                      //延時
  180. distance = SPEED_30C * distance / 20000;                  //計算距離值
  181. distance1 = distance;                                               //將距離值放在變量distance1中
  182. }
  183. void forward(void)                                           //小車前進控制函數   
  184. {
  185. IN1= 1;                                                               //將電機驅動芯片L298N的控制管腳 IN1設置成高電平
  186. IN2= 0;                                                               //將電機驅動芯片L298N的控制管腳 IN2設置成低電平
  187. IN3= 1;                                                               //將電機驅動芯片L298N的控制管腳 IN3設置成高電平
  188. IN4= 0;                                                              //將電機驅動芯片L298N的控制管腳 IN4設置成低電平
  189. }
  190. void back(void)                                        //小車后退控制函數   
  191. {
  192. IN1= 0;                                                               //將電機驅動芯片L298N的控制管腳 IN1設置成低電平
  193. IN2= 1;                                                          //將電機驅動芯片L298N的控制管腳 IN2設置成高電平
  194. IN3= 0;                                                               //將電機驅動芯片L298N的控制管腳 IN3設置成低電平
  195. IN4= 1;                                                      //將電機驅動芯片L298N的控制管腳 IN4設置成高電平
  196. }
  197. void stop(void)                                        //小車停止控制函數
  198. {
  199. IN1= 0;                                                               //將電機驅動芯片L298N的控制管腳 IN1設置成低電平
  200. IN2= 0;                                                           //將電機驅動芯片L298N的控制管腳 IN2設置成低電平
  201. IN3= 0;                                                               //將電機驅動芯片L298N的控制管腳 IN3設置成低電平
  202. IN4= 0;                                                      //將電機驅動芯片L298N的控制管腳 IN4設置成低電平
  203. }
  204. void left(void)                                            //小車向左轉控制函數
  205. {
  206. IN1= 0;                                                               //將電機驅動芯片L298N的控制管腳 IN1設置成低電平
  207. IN2= 0;                                                           //將電機驅動芯片L298N的控制管腳 IN2設置成低電平
  208. IN3= 1;                                                               //將電機驅動芯片L298N的控制管腳 IN3設置成高電平
  209. IN4= 0;                                                               //將電機驅動芯片L298N的控制管腳 IN4設置成低電平
  210. }
  211. void right(void)                                       //小車向右轉控制函數
  212. {
  213. IN1= 1;                                                               //將電機驅動芯片L298N的控制管腳 IN1設置成高電平
  214. IN2= 0;                                                               //將電機驅動芯片L298N的控制管腳 IN2設置成低電平
  215. IN3= 0;                                                               //將電機驅動芯片L298N的控制管腳 IN3設置成低電平
  216. IN4= 0;                                                               //將電機驅動芯片L298N的控制管腳 IN4設置成低電平
  217. }
  218. void circle_right(void)                                 //小車向右打轉控制函數         
  219. {
  220. IN1= 1;                                                             //將電機驅動芯片L298N的控制管腳 IN1設置成低電平
  221. IN2= 0;                                                               //將電機驅動芯片L298N的控制管腳 IN2設置成高電平
  222. IN3= 0;                                                            //將電機驅動芯片L298N的控制管腳 IN3設置成高電平
  223. IN4= 1;                                                               //將電機驅動芯片L298N的控制管腳 IN4設置成低電平
  224. }
  225. /************************************************************************/                                                         
  226. void left_moto(void)                                            //小車左電機PWM調速控制函數
  227. {  
  228. if(left_pwm)                                                          //如果變量left_pwm為1,執行左電機pwm調速功能(left_pwm相當于一個開關,只有為1時才有pwm調速功能)
  229. {
  230. if(pwmval_left <= pwmval_left_init)                   //當pwmval_left小于等于pwm_left_init時
  231.   {
  232.   EN1 = 1;
  233.                                                           //將電機驅動芯片的EN1管腳設置成高電平
  234.   }
  235. else                                                                    //當pwmval_left小不于等于pwm_left_init時
  236.   {                                                                       
  237.   EN1 = 0;
  238.                                                                 //將電機驅動芯片的EN1管腳設置成低電平
  239.   }
  240. if(pwmval_left >= 20)                                           //如果   pwmval_left大于等于20
  241.   {
  242.   pwmval_left = 0;                                                 //將  pwmval_left設為0
  243.   }
  244. }
  245. else                                                                    //  如果變量left_pwm為0,將電機驅動芯片的EN1管腳設置成低電平 (left_pwm相當于一個開關,只有為1時才有pwm調速功能)
  246. {
  247.   EN1= 0;
  248.                   
  249. }
  250. }
  251. /******************************************************************/
  252. void right_moto(void)                                            //小車右電機PWM調速控制函數
  253. {                                                                     
  254. if(right_pwm)                                                        //如果變量right_pwm為1,執行右電機pwm調速功能(right_pwm相當于一個開關,只有為1時才有pwm調速功能)
  255. {                                                                     
  256. if(pwmval_right <= pwmval_right_init)                     //當pwmval_right小于等于pwm_right_init時
  257.   {
  258.   EN2 = 1;                                                         //將電機驅動芯片的EN2管腳設置成高電平
  259.   }
  260. else if(pwmval_right > pwmval_right_init)                 //當pwmval_right小不于等于pwm_right_init時
  261.   {
  262.   EN2 = 0;                                                           //將電機驅動芯片的EN2管腳設置成低電平
  263.   }
  264. if(pwmval_right >= 20)                                //如果    pwmval_right大于等于20
  265.   {
  266.   pwmval_right = 0;                                               //將 pwmval_right設為0
  267.   }
  268. }
  269. else                                                                   //如果變量right_pwm為0,將電機驅動芯片的EN2管腳設置成低電平 (right_pwm相當于一個開關,只有為1時才有pwm調速功能)
  270. {
  271.   EN2= 0;                                          
  272. }
  273. }
  274. /******************************************************************/
  275. void timer0_init()                                                   //定時器0初始化  ,此定時器用于超聲波模塊測距
  276. {
  277. TMOD|=0x01;                                                             //設置定時器的工作模式
  278. TH0=0xfc;                                        //設置定時器0為1ms定時   
  279. TL0=0x66;                                                           //設置定時器0為1ms定時
  280. TR0=1;                                                               //啟動定時器0的計數
  281. ET0=1;                                                               //開定時器0中斷
  282. EA =1;                                                   //開總中斷  
  283. }
  284. /* 串口配置函數,baud-通信波特率 */
  285. void ConfigUART(unsigned int baud)
  286. {
  287.    SCON  = 0x50;  //配置串口為模式1
  288.    TMOD &= 0x0F;  //清零T1的控制位
  289.    TMOD |= 0x20;  //配置T1為模式2
  290.    TH1 = 256 - (11059200/12/32)/baud; //計算T1重載值
  291.    TL1 = TH1;     //初值等于重載值
  292.    ET1 = 0;       //禁止T1中斷
  293.    TR1 = 1;       //啟動T1
  294.       EA=1;
  295.       ES=1;
  296. }
  297. void timer2_init()                                                   //定時器2初始化   ,此定時器用于pwm調速
  298. {                                                                          
  299. T2CON=0;                                                                 //設置定時器的T2CON,設置T2為內部定時器,T2EX的跳變對定時器2無效
  300. T2MOD=0;                                                            //定時器2輸出使能,定時器遞增計數
  301. /// 以下設置將定時器2的輸出頻率設置成42HZ///         
  302. RCAP2H = (0xFFFF-0x400)/256;                              //設置定時器2的RCAP2H為254         
  303. RCAP2L = (0xFFFF-0x400)%256;                              //設置定時器2的RCAP2L為255
  304. TH2    =RCAP2H;                                                     //將RCAP2H中的值(254)重裝到TH2中
  305. TL2    =RCAP2L;                                                //將RCAP2L中的值(255)重裝到TL2中
  306. ///////////////////////////////////////////                                                                       
  307. TR2    =1;                                                       //開啟定時器2計數
  308. ET2    =1;                                                        //開啟定時器2中斷
  309. EA     =1;                                                       //開總中斷
  310. }
  311. void PROCESS(void)                                                        //藍牙遙控與工作模式切換處理函數
  312. {   
  313.   if(key1 == 0)  
  314.         {
  315.              Delay5Ms();                 
  316.              if (key1 == 0)
  317.              {
  318.               while(!key1);
  319.               lyen=0;
  320.               DisplayListChar(0,0,table0);                                                 //在液晶上顯示字體 SL-51B   
  321.          DisplayListChar(0,1,table1);                                                  //在液晶上顯示字體 ECHO                          
  322.             }
  323.         }
  324.         if(key2 == 0)        
  325.         {
  326.            Delay5Ms();               
  327.              if (key2 == 0)
  328.              {
  329.               while(!key2);
  330.                     
  331.                         lyen=1;  //如果小車單片機接收到的命令是將小車工作模式切換成避障模式
  332.                       DisplayListChar(0,0,table2);                                                    //在液晶上顯示字體 SL-51B   
  333.                 DisplayListChar(0,1,table3);                                                    //在液晶上顯示字體 ECHO
  334.      
  335.                stop();                                                                                              //控制小車停下                                                                                                  //將小車工作模式切換到避障模式(非藍牙遙控模式)         
  336.                      pwmval_left_init  = 8;
  337.                    pwmval_right_init = 8;     
  338.             }
  339.         }
  340.         if(key3 == 0)     
  341.         {
  342.            Delay5Ms();      
  343.              if (key3 == 0)
  344.              {
  345.                while(!key3);
  346.                lyen=2; //如果小車單片機接收到的命令是將小車工作模式切換成循跡模式         
  347.                 DisplayListChar(0,0,table4);                                                    //在液晶上顯示字體   
  348.           DisplayListChar(0,1,table1);                                                      //在液晶上顯示字體
  349.           stop();
  350.                pwmval_left_init  = 6;
  351.                pwmval_right_init = 6;                                                                                                 //控制小車停下                                                                                                     //將小車工作模式切換到循跡模式(非藍牙遙控模式)
  352.             }
  353.         }
  354.       
  355.          if(key4 == 0)   
  356.         {
  357.            Delay5Ms();      
  358.              if (key4 == 0)
  359.              {
  360.                while(!key4);
  361.                lyen=3; //如果小車單片機接收到的命令是將小車工作模式切換成無線遙控模式         
  362.                DisplayListChar(0,0,table5);                                                      //在液晶上顯示字體     
  363.           DisplayListChar(0,1,table1);                                                      //在液晶上顯示字體     
  364.           stop();                                                                                                                                         //將小車工作模式切換到循跡模式(非藍牙遙控模式)
  365.             }
  366.         }
  367. }
  368. void PROCESS1(void)//ok                                          //避障處理函數
  369. {
  370. if((distance1>=300)||(distance1 == 0))                                    //超聲波模塊測到障礙物在30毫米外
  371. {
  372. bz_flag1 = 0;                                                                      //將標志變量bz_flag1設置成0
  373. }
  374. else
  375. {
  376.    bz_flag1 = 1;                                     //否則將標志變量bz_flag1設置成1
  377. }
  378.                                                                                           
  379. if(bz_flag1 == 0)                                    //如果標志變量bz_flag1和標志變量bz_flag2都為0(表示超聲波模塊和紅外避障模塊都沒有感應到障礙物)
  380. {
  381. forward();                                                                    //智能小車前進
  382. }
  383. elseif(bz_flag1 == 1)                   //超聲波模塊或紅外避障模塊感應到障礙物
  384. {     
  385. back();                                                        //小車后退      
  386. delay(20,1000);                                                  //延時
  387. circle_right();                                            //小車轉個角度     
  388. delay(5,500);                                                                     //延時
  389. distance1 = 0;                                          //將變量distance1清零
  390. }   
  391. }
  392. void display(int number)                                 //顯示距離值
  393. {
  394. unsigned char b,c,d,e;
  395. b =(number/1000);                                               //計算出距離的百位
  396. c =(number/100)%10;                                           //計算出距離的十位
  397. d =(number/10)%10;                                            //計算出距離的個位
  398. e =number%10;                                                         //計算出距離的小數位
  399. DisplayOneChar(9,1,(0x30+b));                                 //顯示距離的百位
  400. DisplayOneChar(10,1,(0x30+c));                                //顯示距離的十位
  401. DisplayOneChar(11,1,(0x30+d));                                //顯示距離的個位
  402. DisplayOneChar(13,1,(0x30+e));                                //顯示距離的小數位
  403. }
  404. void PROCESS2(void) //ok                                               //超聲波模塊測距函數
  405. {
  406. Trig_SuperSonic();                                           //觸發超聲波發射   
  407. while(ECHO == 0)                                            //等待回聲      
  408. {
  409.   ;
  410. }
  411. Measure_Distance();                                          //計算脈寬并轉換為距離
  412. DisplayListChar(0,1,table3);                                            //在液晶1602上顯示distance字體
  413. display(distance);                                           //顯示距離值   
  414. Init_Parameter();                                            //參數重新初始化
  415. delayt(100);                                                //延時,兩次發射之間要至少有10ms間隔
  416. }
  417. void PROCESS3(void) // 白0 黑1                                          //循跡處理函數
  418. {
  419.    
  420. if((left_led == 1) && (right_led ==1)&& (zhong_led == 1))      //全是黑線
  421. {
  422.       pwmval_left_init  = 5;            
  423.    pwmval_right_init = 5;
  424.    forward();           //調用前進函數                                          
  425. }
  426. if((left_led == 0 && right_led ==0&& zhong_led == 0)||(left_led == 0 && right_led == 0&&zhong_led == 1))     //全是白線,或中間檢測到黑線
  427. {
  428.        pwmval_left_init  = 5;                  
  429.     pwmval_right_init = 5;
  430.     forward();                 //調用前進函數
  431. }
  432.                     
  433. if((left_led == 1) && (right_led == 0) )                   //左邊檢測到黑線      
  434.   {
  435.       pwmval_left_init  = 4;                  
  436.     pwmval_right_init = 4;  
  437.        left();              //調用小車左轉函數      
  438.        while(!zhong_led);
  439. //    right();
  440. //    delayt(150);
  441.        forward();  
  442. //    delay(50,50);Delay5Ms()  ;                                                      
  443.   }                                
  444. if((right_led == 1) && (left_led == 0))                   //右邊檢測到黑線      
  445.   {
  446.       pwmval_left_init  = 4;            
  447.    pwmval_right_init = 4;
  448.       right();                     //調用小車右轉函數
  449.       while(!zhong_led);
  450. //    left();
  451. //    delayt(150);
  452.       forward();
  453.                                                                
  454.    //delay(50,50); Delay5Ms(); (zhong_led == 1)   
  455.    
  456.   }
  457.       
  458. }
  459. //系統初始化函數
  460. void sys_init(void)
  461. {
  462. timer0_init();                                                                          //定時器0初始化
  463. timer2_init();                                                                            //定時器2初始化   
  464. ConfigUART(9600);  //配置波特率為9600                                                                       
  465. Init_Parameter();                                                                       //超聲波模塊初始化
  466. EA =1;                                                                                    //打開總中斷
  467. LCDInit();                                                      //液晶1602初始化        
  468. }
  469. void main(void)  //主函數                                                
  470. {
  471. sys_init();                                                                           //系統初始化函數
  472. DisplayListChar(0,0,table0);                                                    //在液晶上顯示字體 SL-51B   
  473. DisplayListChar(0,1,table1);                                                     //在液晶上顯示字體 ECHO
  474. while(1)                                                                                    //while(1)循環(死循環)
  475. {
  476. PROCESS();                                                                             //調用小車工作模式切換處理函數
  477.   if(lyen== 0)                                                                           //暫停模式
  478.   {     
  479.   stop();
  480.   }                                                                                      //調用超聲波模塊測距函數
  481. if(lyen == 1)                                                                           //如果小車工作在避障工作模式
  482.   {   
  483.   PROCESS2();                                                                       //當前工作模式是避障模式
  484.   PROCESS1();                                                                        //調用避障處理函數
  485.   }
  486. if(lyen == 2)                                                                           //當前工作模式是循跡模式
  487. {  
  488.   PROCESS3();                                                                         //調用循跡處理函數
  489.   }                                                                                          
  490. }                     
  491. }
  492.                                                                                                
  493. void timer0()interrupt 1 using 2                                              //定時器0中斷處理函數
  494. {
  495. TF0= 0;                                                                                //清定時器0中斷標志
  496. TL0= 0x66;                                                                            //重置定時器0的TL0            
  497. TH0= 0xfc;                                                                            //重置定時器0的TH0            
  498. count++;                                                                               //變量count加1,count用于超聲波測距,每毫秒count加1(定時器0每毫秒中斷一次)
  499. if(count == 18)                                                //超聲波回聲脈寬最多18ms      
  500. {
  501.   TR0=0;                                                                               //定時器0停止計數
  502.   TL0= 0x66;                                                                          //重置定時器0的TL0            
  503.   TH0= 0xfc;                                                                          //重置定時器0的TH0      
  504. count = 0;                                                                      //變量count置0
  505. }
  506. }
  507. void timer2()interrupt 5 using 1                                              //定時器2中斷處理函數
  508. {
  509. TF2= 0;                                                                                //清定時器2中斷標志
  510. pwmval_left = pwmval_left  + 1;                                              //變量pwmval_left加1,用于小車PWM調速
  511. pwmval_right = pwmval_right + 1;                                              //變量pwmval_right加1,用于小車PWM調速
  512. left_moto();                                                                            //調用小車左電機調速函數
  513. right_moto();                                                                          //調用小車右電機調速函數
  514. }
  515. /************串行口1中斷處理函數*************/
  516. void ser() interrupt 4
  517. {
  518. if(RI)
  519.       {     
  520.        UART_data=SBUF;
  521.       if(lyen== 3)
  522.        {
  523.          switch(UART_data)
  524.         {
  525.          case 'a':forward();break; //前
  526.          case 'b':back();   break; //后
  527.          case 'c':left();   break; //左
  528.          case 'd':right();  break; //右
  529.          case 'e':stop();   break; //停
  530.         }
  531.        }
  532.       }
  533.       RI=0;  
  534. }
復制代碼


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

使用道具 舉報

沙發
ID:819198 發表于 2022-4-20 08:57 | 只看該作者
程序是借鑒的話,程序問題不大,主要檢查硬件和接線問題。
回復

使用道具 舉報

板凳
ID:121859 發表于 2022-4-20 10:54 | 只看該作者
電路沒有問題,修改液晶驅動代碼吧,看仿真圖,RW為高,這肯定不對的。
回復

使用道具 舉報

地板
ID:161164 發表于 2022-4-20 11:06 | 只看該作者
把85和97行注釋掉看看
回復

使用道具 舉報

5#
ID:1016999 發表于 2022-4-20 14:54 | 只看該作者
lkc8210 發表于 2022-4-20 11:06
把85和97行注釋掉看看

還是不對
回復

使用道具 舉報

6#
ID:1016999 發表于 2022-4-20 14:56 | 只看該作者
lkc8210 發表于 2022-4-20 11:06
把85和97行注釋掉看看

注釋了以后L298N甚至低電了
回復

使用道具 舉報

7#
ID:844772 發表于 2022-4-20 16:19 | 只看該作者
各端口都是高位,顯示剛開機,默認高位,一定是你初始化的程序出現死循環,我通過搜索while,發現應該發生在79行。別的沒仔細看啊。
回復

使用道具 舉報

8#
ID:161164 發表于 2022-4-21 11:08 | 只看該作者

然后在寫名令和數據后加些延時








回復

使用道具 舉報

9#
ID:844772 發表于 2022-4-21 16:31 | 只看該作者
你的程序卡在下邊的讀LCD狀態函數里了,建議把LCD_E = 0;兩句都刪除,按手冊不應該有。
如果你不使用這個函數,那在使用這個函數的位置要加延遲函數,特別在清屏的時候。好多人不用它是因為實際用時,經常出現通過率低,但你是模擬啊,還是盡量用唄。
建議改成下邊這樣,函數是忙就等待到不忙,所以沒必要返回值。

/**************************讀狀態函數***************************/
void ReadStatusLCD(void)                      //讀液晶狀態函數
{
LCD_Data = 0xFF;                                            //給液晶1602的數據口置0xff
LCD_RS = 0;                                                    //控制液晶的RS管腳為低電平
LCD_RW = 1;                                                //控制液晶的RW管腳為高電平
LCD_E = 1;
while (LCD_Data & Busy);                      //檢測忙信號  
LCD_E = 0;
}
回復

使用道具 舉報

10#
ID:768534 發表于 2023-5-17 11:20 | 只看該作者
應該是你的電路引腳設定的有問題
回復

使用道具 舉報

11#
ID:1078097 發表于 2023-5-17 16:39 | 只看該作者
LDC1602初始化程序有問題
回復

使用道具 舉報

12#
ID:1078027 發表于 2023-5-17 20:29 | 只看該作者
LCD1602不亮且L298N的IN口都處于高電平,可能有以下幾種可能的原因:
供電問題:確保LCD1602和L298N都接收到正確的電源供電。檢查它們的電源連接,確保電壓穩定且符合規格要求。
引腳連接問題:檢查LCD1602和L298N的引腳連接是否正確。確保連接正確地與單片機相連,并且對應的引腳設置正確。
初始化問題:確保LCD1602在程序中正確初始化。確保正確設置LCD1602的工作模式、行數、字符大小等,并發送正確的初始化命令。
程序邏輯錯誤:檢查程序中有關LCD1602和L298N的代碼邏輯。確保發送正確的數據和命令到LCD1602,以及正確設置L298N的IN口狀態。
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产精品高清在线 | 国产精品久久国产精品 | 免费黄色的视频 | 欧美在线观看一区 | 国产精品久久久久久一级毛片 | 91亚洲国产成人精品一区二三 | 亚洲国产成人一区二区 | 国产日韩一区二区 | 亚洲成人av在线播放 | 国产精品精品视频 | 精品久久不卡 | 91精品久久久久久久久久入口 | aaa国产大片 | 精品久久国产视频 | 日韩高清一区二区 | 狠狠av| 中文字幕av在线 | 成年免费大片黄在线观看岛国 | 天堂在线中文 | 成年人国产在线观看 | 九九热在线免费视频 | 中文字幕蜜臀av | 99热99| 国产一级视频在线 | 日本亚洲一区 | 亚洲成人一区 | 成人在线不卡 | 99久久精品国产一区二区三区 | 成人综合视频在线观看 | 成人精品免费视频 | 国产精品免费在线 | 蜜臀久久99精品久久久久久宅男 | 亚洲精品一二三 | 欧美自拍第一页 | 人人澡视频 | 91九色视频 | 久久国产精品精品国产色婷婷 | 中文字幕国产高清 | 国产成人精品一区二区三区在线 | 91久久精品一区二区二区 | 综合亚洲视频 |