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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

51單片機紅外遙控控制馬達源碼

[復制鏈接]
跳轉到指定樓層
樓主
ID:190192 發(fā)表于 2018-5-10 22:19 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式


單片機源程序如下:
  1. /* 模仿人機界面 通過遙控器控制馬達
  2.         其狀態(tài)通過LCD顯示
  3.         通過按第一個按鍵可以控制馬達的啟動和停止*/

  4. #include<reg52.h>
  5. typedef unsigned char uint8;
  6. typedef unsigned int uint16;

  7. sbit rs=P2^6;
  8. sbit rw=P2^5;
  9. sbit e=P2^7;
  10. uint8 d1[8]=" RED IR ";
  11. uint8 d2[12]="MOTO STATE: ";
  12. uint8 num[16]="0123456789ABCDEF";
  13. uint8 a[]={0x2d,0x03,0x17,0x02,0x2a,0x00,0x14,0x01};//A-AB-B-B`A-`A-`A`B-`B-`BA

  14. uint8 irtime;          //接收時間
  15. uint8 startflag;  //開始檢測
  16. uint8 bitnum;          //bit位數(shù)
  17. uint8 irdata[33]; //寄存沒有個bit的時間
  18. uint8 irreceok;          //接收完成標志位
  19. uint8 ircode[4];  //將接收的四個字節(jié)數(shù)據(jù)保存
  20. uint8 irprosok;          //接收數(shù)據(jù)處理標志位
  21. uint8 irdisp[8];  //將四個字節(jié)的16進制通過轉換變成十進制存儲
  22. uint8 dat1,dat2;
  23. uint8 keynum;
  24. uint8 moto;
  25. void delay(uint16 i)
  26. {
  27.         while(i--);
  28. }
  29. void lcdwrc(uint8 c)
  30. {
  31.         delay(1000);
  32.         rs=0;
  33.         rw=0;
  34.         e=0;
  35.         P0=c;
  36.         e=1;
  37.         delay(10);
  38.         e=0;
  39.         /*
  40.         P0=c<<4;
  41.         e=0;
  42.         */
  43. }
  44. void lcdwrd(uint8 dat)
  45. {
  46.         delay(1000);
  47.         rs=1;
  48.         rw=0;
  49.         e=0;
  50.         P0=dat;
  51.         e=1;
  52.         delay(10);
  53.         e=0;
  54.         /*
  55.         P0=dat<<4;
  56.         e=0;
  57.         */
  58.         rs=0;       
  59. }
  60. void lcdinit()
  61. {
  62.         delay(1000);
  63.         /*
  64.         lcdwrc(0x32);
  65.         lcdwrc(0x28);
  66.         lcdwrc(0x28);
  67.         */
  68.         lcdwrc(0x38);
  69.         lcdwrc(0x38);
  70.         lcdwrc(0x38);
  71.         lcdwrc(0x06);
  72.         lcdwrc(0x0c);
  73.         lcdwrc(0x01);
  74. }
  75. void int0init()
  76. {
  77.         EA=1;
  78.         EX0=1;
  79.         IT0=1;
  80. }
  81. void time0init()
  82. {
  83.         TMOD=0X02;        //設置定時器0模式2.該模式為自動裝載模式
  84.         TH0=0X00;
  85.         TL0=0X00;//設定計數(shù)初值,每當TL0計數(shù)到255時,TH0將把自己的數(shù)據(jù)給TL0,又重新計數(shù)
  86.         TR0=1;
  87.         ET0=1;
  88.         EA=1;       
  89. }
  90. void irpros() //紅外接收數(shù)據(jù)處理 ,區(qū)分是數(shù)據(jù)0還是1
  91. {
  92.         uint8 i,j,value;
  93.         uint8 k=1;        //引導碼去掉,所以令k=1;
  94.         for(j=0;j<4;j++)  //取出了一幀數(shù)據(jù)中的四個字節(jié)數(shù)據(jù)
  95.         {
  96.                 for(i=0;i<8;i++)        //取出了一個字節(jié)的數(shù)據(jù)               
  97.                 {
  98.                         value>>=1;
  99.                         if(irdata[k]>6)
  100.                         {
  101.                                 value=value|0x80;
  102.                         }
  103.                         k++;
  104.                 }
  105.                 ircode[j]=value;
  106.         }
  107.         irprosok=1;
  108. }
  109. void irwork()  //將四個字節(jié)的數(shù)據(jù)轉換成10進制數(shù)顯示
  110. {
  111.         irdisp[0]=ircode[0]/16;//顯示高位
  112.         irdisp[1]=ircode[0]%16;//顯示低位  
  113.         irdisp[2]=ircode[1]/16;
  114.         irdisp[3]=ircode[1]%16;         //同一個遙控器此2個字節(jié)的引導碼數(shù)據(jù)是不會改變的,改變的只是數(shù)據(jù)碼及反碼
  115.         irdisp[4]=ircode[2]/16;
  116.         irdisp[5]=ircode[2]%16;
  117.         irdisp[6]=ircode[3]/16;
  118.         irdisp[7]=ircode[3]%16;
  119.         dat1=irdisp[4];
  120.         dat2=irdisp[5];
  121.         keynum++;
  122. }
  123. void display()
  124. {
  125.         uint8 i;
  126.         lcdwrc(0x00+0x80);
  127.         for(i=0;i<8;i++)
  128.         {
  129.                 lcdwrd(d1[i]);
  130.         }       
  131.         for(i=4;i<6;i++)
  132.         {
  133.                 lcdwrd(num[irdisp[i]]);
  134.         }
  135.         lcdwrc(0x40+0x80);
  136.         for(i=0;i<12;i++)
  137.         {
  138.                 lcdwrd(d2[i]);
  139.         }
  140.         if(moto==1)                        //馬達狀態(tài)顯示
  141.         {
  142.                 lcdwrd('O');
  143.                 lcdwrd('N');
  144.         }
  145.         else
  146.         {
  147.                 lcdwrd('O');
  148.                 lcdwrd('F');
  149.                 lcdwrd('F');       
  150.         }
  151. }
  152. void motopros()
  153. {
  154.         uint8 i;
  155.         uint16 j=200;
  156.         if((dat1==4)&&(dat2==5)&&(keynum==1))  //按下第一次按鍵開馬達
  157.         {                       
  158.                 dat1=0;
  159.                 dat2=0;
  160.                 moto=1;
  161.                 while(j--)
  162.                 {
  163.                         for(i=0;i<8;i++)       
  164.                         {
  165.                                 P1=a[i];
  166.                                 delay(75);
  167.                         }
  168.                 }                                               
  169.         }
  170.                        
  171.         if((dat1==4)&&(dat2==5)&&(keynum>=2))        //按下第二次此按鍵時關閉馬達
  172.         {
  173.                 dat1=0;
  174.                 dat2=0;
  175.                 keynum=0;
  176.                 moto=0;
  177.                 P1=0xff;               
  178.         }                               
  179. }
  180. void main()
  181. {
  182.         lcdinit();
  183.         int0init();
  184.         time0init();
  185.         while(1)
  186.         {
  187.                 if(irreceok)
  188.                 {
  189.                         irreceok=0;
  190.                         irpros();
  191.                         if(irprosok)
  192.                         {
  193.                                 irwork();
  194.                         }
  195.                 }
  196.                 motopros();
  197.                 display();
  198.         }               
  199. }
  200. void time0() interrupt 1
  201. {
  202.         irtime++;//每進來一次就說明定時時間為256us;       
  203. }
  204. void init0() interrupt 0
  205. {
  206.         if(startflag)
  207.         {
  208.                 if(irtime>32)//檢測引導碼,求法是用引導碼時間除以一次計數(shù)時間,看看要多少次
  209.                 {
  210.                         bitnum=0;       
  211.                 }
  212.                 irdata[bitnum]=irtime;
  213.                 irtime=0;
  214.                 bitnum++;
  215.                 if(bitnum==33)
  216.                 {
  217.                         bitnum=0;
  218.                         irreceok=1;//一幀紅外數(shù)據(jù)接收完成標志
  219.                 }
  220.         }
  221.         else
  222.         {
  223.                 startflag=1;//將開始標志位置1,等到下次進入中斷即可進入if語句
  224.                 irtime=0;//將開始之前的計數(shù)器時間清零。等到下次進入中斷的時候才是引導碼真正的時間
  225.         }
  226. }
復制代碼

所有資料51hei提供下載:
紅外遙控控制馬達.zip (36.84 KB, 下載次數(shù): 36)




評分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

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

使用道具 舉報

沙發(fā)
ID:320868 發(fā)表于 2018-5-13 00:25 | 只看該作者
是否控制直流電機嗎?
回復

使用道具 舉報

板凳
ID:860855 發(fā)表于 2020-12-15 19:25 | 只看該作者
想問一下,如果我想紅外遙控實現(xiàn)電機轉動并調速,該如何用代碼實現(xiàn)
回復

使用道具 舉報

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

本版積分規(guī)則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 99久久久国产精品免费消防器 | 91久久国产综合久久 | 日本一二三区在线观看 | 日韩av在线一区 | 在线国产一区二区 | 91在线精品一区二区 | 毛色毛片免费看 | 日本aa毛片a级毛片免费观看 | 亚洲人va欧美va人人爽 | 日本免费视频在线观看 | 99精品福利视频 | 在线视频中文字幕 | 自拍偷拍亚洲欧美 | 国产精品精品视频一区二区三区 | 欧美一卡二卡在线 | 三级av在线| 亚洲一在线 | 亚洲国产欧美在线人成 | 欧美视频成人 | 国产农村妇女毛片精品久久麻豆 | 精品一区二区三区四区 | 日韩一区二区免费视频 | 国产精品久久久久久久久久免费看 | 国产成人福利视频在线观看 | 欧美日本在线观看 | 日韩在线免费视频 | 国产高清免费视频 | 免费在线播放黄色 | 中文字幕在线播放第一页 | 成人一区二区在线 | 日韩成人av在线 | 久久99精品久久久久久 | 欧美11一13sex性hd | 91精品国产91久久久久久最新 | 一区二区三区国产精品 | 亚洲成av人片在线观看无码 | 久草热在线 | 国产精品久久久 | 亚洲免费在线观看 | 中文字幕视频在线 | 成人影|