找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 13995|回復(fù): 14
收起左側(cè)

51單片機紅外遙控小車源程序

  [復(fù)制鏈接]
ID:226728 發(fā)表于 2017-8-10 20:53 | 顯示全部樓層 |閱讀模式
自己做的紅外遙控小車器件練手

單片機源程序如下:
  1. /*******************************************************************************
  2. --------------------------------------------------------------------------------
  3. * 實 驗 名                 : 紅外線試驗
  4. * 實驗說明       : 數(shù)碼管顯示紅外線發(fā)送過來的鍵值。
  5. * 連接方式       : 見連接圖
  6. * 注    意                 :
  7. *******************************************************************************/

  8. //#include<reg51.h>
  9. #include<reg52.h>
  10. //--定義使用的IO--//


  11. sbit IRIN = P3^2;
  12. sbit PWM1  = P0^1;
  13. sbit PWM2  = P0^2;

  14. //--定義一個全局變量--//
  15. unsigned char timer1;
  16. unsigned char IrValue[6];          //用來存放讀取到的紅外值
  17. unsigned char Time;

  18. //--聲明全局函數(shù)--//
  19. void IrInit();
  20. void DelayMs(unsigned int );
  21. void Time1Config();
  22. void speedup();
  23. void Slowdown();
  24. void go();
  25. void left();
  26. void right();
  27. void pwm_left(int x);
  28. void pwm_right(int x);
  29. /*******************************************************************************
  30. * 函數(shù)名         : main
  31. * 函數(shù)功能                   : 主函數(shù)
  32. * 輸入           : 無
  33. * 輸出                  : 無
  34. *******************************************************************************/

  35. void main()
  36. {
  37.         PWM1=0;
  38.         PWM2=0;
  39.         IrInit();
  40.         Time1Config();
  41.         while(1)
  42.         {
  43.                 IrValue[4]=IrValue[2]>>4;                          //高位
  44.                 IrValue[5]=IrValue[2]&0x0f;                //低位
  45.            if(IrValue[4]==0x0e&&IrValue[5]==0x08)
  46.                   {         
  47.                    pwm_left(37);
  48.                         pwm_right(40);

  49.                 }

  50.                    if(IrValue[4]==0x0d&&IrValue[5]==0x04)
  51.                      {         
  52.                 pwm_left(0);
  53.                                 pwm_right(0);

  54.                 }
  55. //           
  56.                    if(IrValue[4]==0x0e&&IrValue[5]==0x02)
  57.                   {         
  58.                    pwm_left(35);
  59.                         pwm_right(22);


  60.                 }
  61.                    if(IrValue[4]==0x0e&&IrValue[5]==0x00)
  62.                   {         
  63.                    pwm_left(22);
  64.                         pwm_right(35);


  65.                 }
  66.         }
  67. }


  68.         
  69.                         

  70. void pwm_left(int x)
  71. {
  72.                 if(timer1>100)  //PWM周期為100*0.5ms
  73.                 {
  74.                         timer1=0;
  75.                 }
  76.                 if(timer1 < x)        //改變30這個值可以改變直流電機的速度
  77.                 {
  78.                         PWM1=1;
  79.                 }
  80.                 else
  81.                 {
  82.                         PWM1=0;
  83.                 }        
  84. }
  85.          
  86. void pwm_right(int y)
  87. {
  88.                 if(timer1>100)  //PWM周期為100*0.5ms
  89.                 {
  90.                         timer1=0;
  91.                 }
  92.                 if(timer1 < y)        //改變30這個值可以改變直流電機的速度
  93.                 {
  94.                         PWM2=1;
  95.                 }
  96.                 else
  97.                 {
  98.                         PWM2=0;
  99.                 }        
  100. }
  101. /*******************************************************************************
  102. * 函數(shù)名         : DelayMs()
  103. * 函數(shù)功能                   : 延時
  104. * 輸入           : x
  105. * 輸出                  : 無
  106. *******************************************************************************/

  107. void DelayMs(unsigned int x)   //0.14ms誤差 0us
  108. {
  109.         unsigned char i;
  110.         while(x--)
  111.         {
  112.                 for (i = 0; i<13; i++)
  113.                 {}
  114.         }
  115. }
  116. /*******************************************************************************
  117. * 函數(shù)名         : IrInit()
  118. * 函數(shù)功能                   : 初始化紅外線接收
  119. * 輸入           : 無
  120. * 輸出                  : 無
  121. *******************************************************************************/

  122. void IrInit()
  123. {
  124.         IT0=1;//下降沿觸發(fā)
  125.         EX0=1;//打開中斷0允許
  126.         EA=1;        //打開總中斷

  127.         IRIN=1;//初始化端口
  128.     PWM1=0;
  129.         PWM2=0;
  130. }
  131. /*******************************************************************************
  132. * 函數(shù)名         : ReadIr()
  133. * 函數(shù)功能                   : 讀取紅外數(shù)值的中斷函數(shù)
  134. * 輸入           : 無
  135. * 輸出                  : 無
  136. *******************************************************************************/

  137. void ReadIr() interrupt 0
  138. {
  139.         unsigned char j,k;
  140.         unsigned int err;
  141.         Time=0;                                         
  142.         DelayMs(70);

  143.         if(IRIN==0)                //確認是否真的接收到正確的信號
  144.         {         
  145.                
  146.                 err=1000;                                //1000*10us=10ms,超過說明接收到錯誤的信號
  147.                 /*當兩個條件都為真是循環(huán),如果有一個條件為假的時候跳出循環(huán),免得程序出錯的時
  148.                 侯,程序死在這里*/        
  149.                 while((IRIN==0)&&(err>0))        //等待前面9ms的低電平過去                  
  150.                 {                        
  151.                         DelayMs(1);
  152.                         err--;
  153.                 }
  154.                 if(IRIN==1)                        //如果正確等到9ms低電平
  155.                 {
  156.                         err=500;
  157.                         while((IRIN==1)&&(err>0))                 //等待4.5ms的起始高電平過去
  158.                         {
  159.                                 DelayMs(1);
  160.                                 err--;
  161.                         }
  162.                         for(k=0;k<4;k++)                //共有4組數(shù)據(jù)
  163.                         {                                
  164.                                 for(j=0;j<8;j++)        //接收一組數(shù)據(jù)
  165.                                 {

  166.                                         err=60;               
  167.                                         while((IRIN==0)&&(err>0))//等待信號前面的560us低電平過去
  168.                                         {
  169.                                                 DelayMs(1);
  170.                                                 err--;
  171.                                         }
  172.                                         err=500;
  173.                                         while((IRIN==1)&&(err>0))         //計算高電平的時間長度。
  174.                                         {
  175.                                                 DelayMs(1);//0.14ms
  176.                                                 Time++;
  177.                                                 err--;
  178.                                                 if(Time>30)
  179.                                                 {
  180.                                                         EX0=1;
  181.                                                         return;
  182.                                                 }
  183.                                         }
  184.                                         IrValue[k]>>=1;         //k表示第幾組數(shù)據(jù)
  185.                                         if(Time>=8)                        //如果高電平出現(xiàn)大于565us,那么是1
  186.                                         {
  187.                                                 IrValue[k]|=0x80;
  188.                                         }
  189.                                         Time=0;                //用完時間要重新賦值                                                        
  190.                                 }
  191.                         }
  192.                 }
  193.                 if(IrValue[2]!=~IrValue[3])
  194.                 {
  195.                         return;
  196.                 }
  197.         }                        
  198. }

  199. /*******************************************************************************
  200. * 函 數(shù) 名       : Time1Config
  201. * 函數(shù)功能                 : 設(shè)置定時器
  202. * 輸    入       : 無
  203. * 輸    出       : 無
  204. *******************************************************************************/

  205. void Time1Config()
  206. ……………………

  207. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復(fù)制代碼

所有資料51hei提供下載:
程序.zip (30.61 KB, 下載次數(shù): 264)


回復(fù)

使用道具 舉報

ID:298119 發(fā)表于 2018-3-28 08:50 | 顯示全部樓層
頂頂頂 剛好需要 謝謝樓主
回復(fù)

使用道具 舉報

ID:298119 發(fā)表于 2018-3-28 09:09 | 顯示全部樓層
謝謝無私分享
回復(fù)

使用道具 舉報

ID:317135 發(fā)表于 2018-5-18 14:37 | 顯示全部樓層
下載后發(fā)現(xiàn)里面的前后左右程序沒有寫

下載后發(fā)現(xiàn)里面的前后左右程序沒有寫

下載后發(fā)現(xiàn)里面的前后左右程序沒有寫
回復(fù)

使用道具 舉報

ID:343934 發(fā)表于 2018-6-7 16:11 來自觸屏版 | 顯示全部樓層
好好好,,謝謝樓主
回復(fù)

使用道具 舉報

ID:89217 發(fā)表于 2018-6-18 01:49 | 顯示全部樓層
灰常感謝樓主,共享資料。學(xué)習(xí)了
回復(fù)

使用道具 舉報

ID:326450 發(fā)表于 2018-11-4 18:48 | 顯示全部樓層
郵電路圖和其他詳細資料么?
回復(fù)

使用道具 舉報

ID:426007 發(fā)表于 2018-11-15 23:28 | 顯示全部樓層
灰常感謝樓主,共享資料。學(xué)習(xí)了
回復(fù)

使用道具 舉報

ID:428746 發(fā)表于 2018-11-18 16:26 | 顯示全部樓層
謝謝樓主
回復(fù)

使用道具 舉報

ID:426007 發(fā)表于 2018-11-18 23:48 | 顯示全部樓層
樓主打不開啊
回復(fù)

使用道具 舉報

ID:165792 發(fā)表于 2018-11-26 21:52 | 顯示全部樓層
好,下載來試試
回復(fù)

使用道具 舉報

ID:584662 發(fā)表于 2019-8-1 20:03 | 顯示全部樓層
沒看到連接圖啊
回復(fù)

使用道具 舉報

ID:592788 發(fā)表于 2019-8-6 23:38 | 顯示全部樓層
學(xué)習(xí)學(xué)習(xí)
回復(fù)

使用道具 舉報

ID:661170 發(fā)表于 2019-12-11 01:11 | 顯示全部樓層
謝謝樓主分享
回復(fù)

使用道具 舉報

ID:661170 發(fā)表于 2019-12-11 01:11 | 顯示全部樓層
幫大忙了
回復(fù)

使用道具 舉報

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

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表