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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

制作單片機+紅外+光敏模塊操控步進電機,現在光敏自動控制出了點問題,求大佬

[復制鏈接]
跳轉到指定樓層
樓主
ID:889445 發表于 2021-4-21 13:30 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
步進電機用的是ULN2003模塊,光敏模塊是LM393通過比較光敏電阻和變阻器的阻值,輸出0,1信號。現在的問題是如果一開始光敏信號輸入為1,電動機正轉,光敏信號變為0時,電動機不反轉。反之如果一開始為0,電機反轉,改變光敏信號無反應。我覺著應該是光敏程序出了問題,光敏程序在下面117行求大佬指點。
單片機源程序如下:
  1. #include<reg52.h>    //包含頭文件,一般情況不需要改動,頭文件包含特殊功能寄存器的定義
  2. #define uchar unsigned char
  3. sbit IR=P3^2;  //紅外接口標志
  4. sbit light=P2^3;//定義光敏模塊信號輸入口為P3-5
  5. sbit upswitch=P2^0;//定義上行程開關為s4
  6. sbit downswitch=P2^1;//定義下行程開關為s2

  7. unsigned char  irtime;//紅外用全局變量

  8. bit irpro_ok,irok; //處理OK,接收OK
  9. unsigned char IRcord[4]; //定義ircord是4個數組構成的數字
  10. unsigned char irdata[33];//定義irdata是33個b組成的數據,
  11. unsigned char nt[8]={0x01,0x03,0x02,0x06,0x04,0x0c,0x08,0x09}; //順時針旋轉
  12. unsigned char st[8]={0x09,0x08,0x0c,0x04,0x06,0x02,0x03,0x01};//逆時針旋轉表


  13. void delay(unsigned int n) //系統延時用于四步電機控制
  14. {
  15. unsigned int i=0,j=0;
  16. for(i=0;i<n;i++)
  17. {
  18.   for(j=0;j<120;j++);
  19. }
  20. }
  21. /*定時器0中斷處理*/

  22. void tim0_isr (void) interrupt 1 using 1
  23. {
  24.   irtime++;  //用于計數2個下降沿之間的時間
  25. }

  26. /*外部中斷0中斷處理*/
  27. void EX0_ISR(void) interrupt 0 //外部中斷0服務函數
  28. {
  29.   static unsigned char  i;             //接收紅外信號處理
  30.   static bit startflag;                //是否開始處理標志位

  31. if(startflag)
  32.    {
  33.     if(irtime<63&&irtime>=33)//引導碼 TC9012的頭碼,9ms+4.5ms 頭碼的持續時間的范圍,33(8.448ms)<63(16.128ms),
  34.                         i=0;
  35.                     irdata[ i]=irtime;//存儲每個電平的持續時間,用于以后判斷是0還是1
  36.                     irtime=0;
  37.                     i++;
  38.                             if(i==33)          //33是33位的意思,包括32位的數據和一位的頭碼。
  39.                               {
  40.                                    irok=1;
  41.                                  i=0;
  42.                                   }
  43.           }
  44.            else
  45.                 {
  46.                 irtime=0;
  47.                 startflag=1;
  48.                 }

  49. }

  50. /*定時器0初始化*/
  51. void TIM0init(void)//定時器0初始化
  52. {

  53.   TMOD=0x02;//定時器0工作方式2,TH0是重裝值,TL0是初值
  54.   TH0=0x00; //裝初值
  55.   TL0=0x00;
  56.   ET0=1;    //開中斷
  57.   TR0=1;
  58. }
  59. /*外部中斷0初始化*/
  60. void EX0init(void)
  61. {
  62. IT0 = 1;   //指定外部中斷0下降沿觸發,INT0 (P3.2)
  63. EX0 = 1;   //打開外部中斷
  64. EA = 1;    //開總中斷
  65. }
  66. /*步進電機控制程序*/
  67. void stepperdown()//四相步進電機逆時針轉
  68. {
  69. //  delay(10);加上就變成點動了
  70.   while(1)
  71. {
  72. int i=0;
  73. for(i=0;i<8;i++)
  74.    {
  75.   P1=nt[ i];
  76.   delay(2);//delay2這個時間差不多合適<2無法運行
  77.    }
  78. if(IR==0) //事實證明可行
  79. {
  80.   break;
  81. }
  82. }
  83. }


  84. void stepperup()//四相步進電機順時針旋轉
  85. {
  86.   while(1)
  87. {
  88. int i=0;
  89. for(i=0;i<8;i++)
  90.    {
  91.   P1=st[ i];
  92.   delay(2);//delay2這個時間差不多合適<2無法運行
  93.    }
  94. if(IR==0) //事實證明可行
  95. {
  96.   break;
  97. }
  98. }
  99. }
  100. void stepperstop()
  101. {
  102. P1=0x00;
  103. }

  104. /*光敏自動控制模式*/
  105. void lightmod()        //現在的問題:只走一個程序其他if語句完全沒用
  106. {
  107. while(1)
  108. { if(light==1)
  109.     {
  110.           stepperup();
  111.         }
  112.    if(light==0)
  113.    {
  114.            stepperdown();
  115.    }

  116.    if(IR==0) //事實證明可行
  117.    {
  118.      break;
  119.    }
  120. }
  121. }

  122. /*原鍵值處理*/
  123. void Ir_work(void)//紅外鍵值散轉程序
  124. {
  125.                 P1=0x00;//初始化p1
  126.            switch(IRcord[2])//判斷第三個數碼前兩個是用戶碼,最后一個是反碼,第三個才是真正的數據碼。
  127.                  {
  128.                          case 0x45:stepperdown();break;//- 按下遙控器上面0-9的按鍵,led亮起相應的數值
  129.                          case 0x47:stepperup();break;//+
  130.                          case 0x46:stepperstop();break;
  131.                          case 0x09:lightmod();break;
  132.              default:break;
  133.                          }


  134.                   irpro_ok=0;//處理完成標志

  135.   }



  136. /*紅外碼值處理*/
  137. void Irpro(void)//紅外碼值處理函數        分析出那些是1那些是0
  138. {
  139.   unsigned char i, j, k;
  140.   unsigned char cord,value;

  141.   k=1;        //前導碼沒數據,從第二個開始,就是用戶碼開始。
  142.   for(i=0;i<4;i++)      //處理4個字節
  143.      {
  144.       for(j=1;j<=8;j++) //處理1個字節8位。for語句:先執行j=1;在執行j<=8,為真則繼續執行,否則結束執行;執行完循環體后執行j++,重復執行執行循環和j++直到j<=8為假
  145.          {
  146.           cord=irdata[k]; //
  147.           if(cord>7)  //低電平下降沿到下一個下降沿的寬度是0.56+0.565=1.125ms,高電平則是0.56+1.69=2.25ms,同樣我們也給出一個范圍用于區分它們,可以這樣識別 (1.125ms + 2.25ms )/ 2=1.68ms,
  148.                        //大于1.68為高,小于1.68為低。
  149.                                   //假設使用12M晶振 定時器的單位數值時1us,使用8位定時器自動重裝,將得到每個定時周期0.256ms的時長, 1.68/0.256=6.59,約等于7.也就是 定時器0計數次數。
  150.             value|=0x80;//最高位就給1,
  151.                         if(j<8)
  152.                     {
  153.                          value>>=1;
  154.                         }
  155.            k++;
  156.          }
  157.      IRcord[ i]=value;
  158.      value=0;
  159.      }
  160.          irpro_ok=1;//處理完畢標志位置1
  161. }

  162. /*主函數*/
  163. void main(void)
  164. {
  165. EX0init(); //初始化外部中斷
  166. TIM0init();//初始化定時器
  167. while(1)//主循環
  168.    {
  169.     if(irok)                        //如果接收好了進行紅外處理
  170.           {
  171.            Irpro();
  172.             irok=0;
  173.           }

  174.     if(irpro_ok)                   //如果處理好后進行工作處理,如按對應的按鍵后顯示對應的數字等
  175.           {
  176.            Ir_work();

  177.             }

  178.    }
  179. }



  180.   }
復制代碼

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

使用道具 舉報

沙發
ID:889445 發表于 2021-4-21 18:10 | 只看該作者
過段時間把源碼會分享出來,問題已解決
回復

使用道具 舉報

板凳
ID:889445 發表于 2021-7-6 18:11 | 只看該作者
  1. #include<reg52.h>    //包含頭文件,一般情況不需要改動,頭文件包含特殊功能寄存器的定義
  2. #define uchar unsigned char
  3. sbit IR=P3^2;  //紅外接口標志
  4. sbit light=P2^3;//定義光敏模塊信號輸入口為P3-5
  5. sbit upswitch=P3^4;//定義上行程開關為s4
  6. sbit downswitch=P3^5;//定義下行程開關為s2
  7. sbit IN1=P1^0;
  8. sbit IN2=P1^1;
  9. sbit IN3=P1^2;
  10. sbit IN4=P1^3;
  11. sbit ENA=P1^4;
  12. sbit ENB=P1^5;//定義l298n引腳

  13. unsigned char  irtime;//紅外用全局變量

  14. bit irpro_ok,irok; //處理OK,接收OK
  15. unsigned char IRcord[4]; //定義ircord是4個數組構成的數字
  16. unsigned char irdata[33];//定義irdata是33個b組成的數據,

  17. void delay(unsigned int n) //系統延時用于四步電機控制
  18. {
  19. unsigned int i=0,j=0;
  20. for(i=0;i<n;i++)
  21. {
  22.   for(j=0;j<120;j++);
  23. }
  24. }
  25. /*定時器0中斷處理*/

  26. void tim0_isr (void) interrupt 1 using 1
  27. {
  28.   irtime++;  //用于計數2個下降沿之間的時間
  29. }

  30. /*外部中斷0中斷處理*/
  31. void EX0_ISR(void) interrupt 0 //外部中斷0服務函數
  32. {
  33.   static unsigned char  i;             //接收紅外信號處理
  34.   static bit startflag;                //是否開始處理標志位

  35. if(startflag)                        
  36.    {
  37.     if(irtime<63&&irtime>=33)//引導碼 TC9012的頭碼,9ms+4.5ms 頭碼的持續時間的范圍,33(8.448ms)<63(16.128ms),
  38.                         i=0;
  39.                     irdata[i]=irtime;//存儲每個電平的持續時間,用于以后判斷是0還是1
  40.                     irtime=0;
  41.                     i++;
  42.                             if(i==33)          //33是33位的意思,包括32位的數據和一位的頭碼。
  43.                               {
  44.                                    irok=1;
  45.                                  i=0;
  46.                                   }
  47.           }
  48.            else
  49.                 {
  50.                 irtime=0;
  51.                 startflag=1;
  52.                 }

  53. }

  54. /*定時器0初始化*/
  55. void TIM0init(void)//定時器0初始化
  56. {

  57.   TMOD=0x02;//定時器0工作方式2,TH0是重裝值,TL0是初值
  58.   TH0=0x00; //裝初值
  59.   TL0=0x00;
  60.   ET0=1;    //開中斷
  61.   TR0=1;   
  62. }
  63. /*外部中斷0初始化*/
  64. void EX0init(void)
  65. {
  66. IT0 = 1;   //指定外部中斷0下降沿觸發,INT0 (P3.2)
  67. EX0 = 1;   //打開外部中斷
  68. EA = 1;    //開總中斷
  69. }
  70. /*直流電機控制部分*/
  71. void nishizhen()//電機逆時針轉動
  72. {
  73. while(1)
  74. {
  75.   ENA=1;
  76.   if(downswitch==1)
  77.   {
  78.    IN1=1;
  79.    IN2=0;
  80.    IN3=1;
  81.    IN4=0;
  82.   }
  83.    if(downswitch!=1)
  84.   {
  85.    IN1=0;
  86.    IN2=0;
  87.    IN3=0;
  88.    IN4=0;
  89.   }
  90.   if(IR==0)
  91.   {
  92.    break;
  93.   }
  94. }
  95. }

  96. void shunshizhen()//電機順時針轉動
  97. {
  98. while(1)
  99. {
  100.   ENA=1;
  101.   if(downswitch==1)
  102.   {
  103.    IN1=0;
  104.    IN2=1;
  105.    IN3=0;
  106.    IN4=1;
  107.   }
  108.    if(downswitch!=1)
  109.   {
  110.    IN1=0;
  111.    IN2=0;
  112.    IN3=0;
  113.    IN4=0;
  114.   }
  115.   if(IR==0)
  116.   {
  117.    break;
  118.   }
  119. }
  120. }

  121. void motorstop()
  122. {
  123.    IN1=0;
  124.    IN2=0;
  125.    IN3=0;
  126.    IN4=0;
  127. }

  128. /*光敏自動控制模式*/
  129. void lightmod()        //現在的問題:只走up程序else語句完全沒用
  130. {
  131. // if(light==1&&downswitch==1)//如果光敏模塊輸出1亮且下限位開關不觸發(限位器平常為高電位,觸發后為低電位)
  132. //  {
  133.   while(1)                   //循環執行
  134.     {
  135.         if(light==1&&downswitch==1)        //再次確定
  136.            {
  137.            IN1=0;
  138.        IN2=1;
  139.        IN3=0;
  140.        IN4=1;
  141.           if(IR==0) //有其他紅外按鍵命令來就中斷
  142.       break;
  143.           }
  144.           if(light==0&&upswitch==1)//如果光照變暗反轉
  145.            {
  146.          IN1=1;
  147.      IN2=0;
  148.      IN3=1;
  149.       IN4=0;
  150.           if(IR==0) //有其他紅外按鍵命令來就中斷
  151.       break;
  152.        }
  153.          }   
  154. }
  155. /*原鍵值處理*/
  156. void Ir_work(void)//紅外鍵值散轉程序
  157. {
  158.                 P1=0x00;//初始化p1
  159.            switch(IRcord[2])//判斷第三個數碼前兩個是用戶碼,最后一個是反碼,第三個才是真正的數據碼。
  160.                  {
  161.                          case 0x45:nishizhen();break;//- 按下遙控器上面0-9的按鍵,led亮起相應的數值
  162.                          case 0x47:shunshizhen();break;//+
  163.                          case 0x46:motorstop();break;
  164.                          case 0x09:lightmod();break;
  165.              default:break;
  166.                          }
  167.                        

  168.                   irpro_ok=0;//處理完成標志

  169.   }



  170. /*紅外碼值處理*/
  171. void Irpro(void)//紅外碼值處理函數        分析出那些是1那些是0
  172. {
  173.   unsigned char i, j, k;
  174.   unsigned char cord,value;

  175.   k=1;        //前導碼沒數據,從第二個開始,就是用戶碼開始。
  176.   for(i=0;i<4;i++)      //處理4個字節
  177.      {
  178.       for(j=1;j<=8;j++) //處理1個字節8位。for語句:先執行j=1;在執行j<=8,為真則繼續執行,否則結束執行;執行完循環體后執行j++,重復執行執行循環和j++直到j<=8為假
  179.          {
  180.           cord=irdata[k]; //
  181.           if(cord>7)  //低電平下降沿到下一個下降沿的寬度是0.56+0.565=1.125ms,高電平則是0.56+1.69=2.25ms,同樣我們也給出一個范圍用于區分它們,可以這樣識別 (1.125ms + 2.25ms )/ 2=1.68ms,
  182.                        //大于1.68為高,小于1.68為低。
  183.                                   //假設使用12M晶振 定時器的單位數值時1us,使用8位定時器自動重裝,將得到每個定時周期0.256ms的時長, 1.68/0.256=6.59,約等于7.也就是 定時器0計數次數。
  184.             value|=0x80;//最高位就給1,
  185.                         if(j<8)
  186.                     {
  187.                          value>>=1;
  188.                         }
  189.            k++;
  190.          }
  191.      IRcord[i]=value;
  192.      value=0;     
  193.      }
  194.          irpro_ok=1;//處理完畢標志位置1
  195. }

  196. /*主函數*/
  197. void main(void)
  198. {
  199. EX0init(); //初始化外部中斷
  200. TIM0init();//初始化定時器
  201. P1=0x00;
  202. while(1)//主循環
  203.    {
  204.     if(irok)                        //如果接收好了進行紅外處理
  205.           {   
  206.            Irpro();
  207.            irok=0;
  208.           }

  209.     if(irpro_ok)                   //如果處理好后進行工作處理,如按對應的按鍵后顯示對應的數字等
  210.           {
  211.            Ir_work();
  212.           
  213.             }

  214.    }
  215. }
復制代碼


程序框圖.docx

33.33 KB, 下載次數: 7

評分

參與人數 1黑幣 +50 收起 理由
admin + 50 回帖助人的獎勵!

查看全部評分

回復

使用道具 舉報

地板
ID:97350 發表于 2021-7-7 15:58 | 只看該作者
原理圖放上來豈不是更完美
回復

使用道具 舉報

5#
ID:161164 發表于 2021-7-7 16:07 | 只看該作者
在函數里用while(1)是什么腦洞?
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产乱人伦精品一区二区 | 亚洲人久久 | 日本成人免费观看 | 日韩一区二区三区在线视频 | 亚洲男女视频在线观看 | 精品一区二区三区在线观看国产 | 男女羞羞视频在线看 | 欧美一级片在线 | 婷婷二区 | 久久9热 | 国产精品久久久久久婷婷天堂 | 日韩福利在线观看 | 在线观看亚洲精品视频 | 亚洲精品美女视频 | 91精品国产综合久久久久久丝袜 | 亚洲综合一区二区三区 | 国产一区二区在线视频 | 欧美日韩中文字幕在线播放 | 四季久久免费一区二区三区四区 | 国产美女精品视频 | 国产精品亚洲精品日韩已方 | 欧美亚洲在线 | 亚洲免费人成在线视频观看 | 三级国产三级在线 | 成人午夜免费网站 | 在线免费看黄 | 亚洲成人国产综合 | 中文字幕成人av | 96久久久久久 | 久久精品无码一区二区三区 | av在线播放国产 | 天天天天天天操 | 狠狠色综合久久丁香婷婷 | 日韩成人久久 | 国产精久久久久久 | 青青草一区 | 综合久久av | 国产三级电影网站 | av在线一区二区 | 成人二区 | 欧美久久久久 |