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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

51單片機代碼實現按鍵-PC串口通訊-紅外遙控控制電機

[復制鏈接]
跳轉到指定樓層
樓主
51單片機代碼實現按鍵-PC串口通訊-紅外遙控控制電機


完整代碼下載:
紅外無線-PC機串口-按鍵控制PWM變化.rar (39.91 KB, 下載次數: 67)






部分源碼預覽:
  1. #include<reg51.h>  //51頭文件,
  2. #include<intrins.h>
  3. //---------常用的兩個宏定義--------------
  4. typedef unsigned char u8;
  5. typedef unsigned int  u16;

  6. //------------函數的聲明-----------------
  7. void DelayMS(u16 dly);

  8. //--定義使用的IO口--//
  9. sbit LED=P1^3;
  10. sbit KEY1=P1^1;
  11. sbit KEY2=P1^2;
  12. sbit PWM=P2^1;

  13. sbit LSA=P2^2;
  14. sbit LSB=P2^3;
  15. sbit LSC=P2^4;
  16. sbit IRIN=P3^2;

  17. //--定義一個全局變量--//
  18. u16 num,j,k,pwm,i;        //定時器返回值
  19. u8  myKEY;        //存放電腦發送過來的按鍵

  20. u8 IrValue[6];
  21. u8 Time;
  22. u8 DisplayData[8];
  23. u8 code smgduan[17]={
  24. 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
  25. 0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0X76};
  26. //0、1、2、3、4、5、6、7、8、9、A、b、C、d、E、F、H的顯示碼

  27.         //void Timer0Interrupt();
  28.         //void InitTimer1();
  29.         //void Keyscan();
  30. /*******************************************************************************
  31. * 函 數 名         : delay
  32. * 函數功能                   : 延時函數,i=1時,大約延時10us
  33. *******************************************************************************/
  34. void delay(u16 i)
  35. {
  36.         while(i--);       
  37. }

  38. void Delay10ms(u8 c)   //誤差 0us
  39. {
  40.         u8 a, b;
  41.         for (;c>0;c--)                //--c已經在傳遞過來的時候已經賦值了,所以在for語句第一句就不用賦值了--//
  42.         {
  43.                 for (b=38;b>0;b--)
  44.                 {
  45.                         for (a=130;a>0;a--);
  46.                 }
  47.         }      
  48. }
  49. /*******************************************************************************
  50. * 函數名         :DigDisplay()
  51. * 函數功能                 :數碼管顯示函數
  52. * 輸入           : 無
  53. * 輸出                  : 無
  54. *******************************************************************************/
  55. void DigDisplay()
  56. {
  57.         u8 i;
  58.         for(i=0;i<3;i++)
  59.         {
  60.                 switch(i)         //位選,選擇點亮的數碼管,
  61.                 {
  62.                         case(0):
  63.                                 LSA=0;LSB=0;LSC=0; break;//顯示第0位
  64.                         case(1):
  65.                                 LSA=1;LSB=0;LSC=0; break;//顯示第1位
  66.                         case(2):
  67.                                 LSA=0;LSB=1;LSC=0; break;//顯示第2位       
  68.                 }
  69.                 P0=DisplayData[i];//發送數據
  70.                 delay(10); //間隔一段時間掃描       
  71.                 P0=0x00;//消隱
  72.         }               
  73. }
  74. /*******************************************************************************
  75. * 函數名         : IrInit()
  76. * 函數功能                   : 初始化紅外線接收
  77. * 輸入           : 無
  78. * 輸出                  : 無
  79. *******************************************************************************/

  80. void IrInit()
  81. {
  82.         IT0=1;//下降沿觸發
  83.         EX0=1;//打開中斷0允許
  84.         EA=1;        //打開總中斷

  85.         IRIN=1;//初始化端口
  86. }
  87. /*******************************************************************************
  88. * 函 數 名         : Timer0Init
  89. * 函數功能                   : 定時器0初始化
  90. * 輸    入         : 無
  91. * 輸    出         : 無
  92. *******************************************************************************/
  93. void Timer0Init()
  94. {
  95.         TMOD|=0X01;//選擇為定時器0模式,工作方式1,僅用TR0打開啟動。

  96.         TH0 = 0xFF;
  97.         TL0 = 0xff;   //60ms
  98.                
  99.         ET0=1;//打開定時器0中斷允許
  100.         EA=1;//打開總中斷
  101.         TR0=1;//打開定時器                       
  102. }
  103. /*******************************************************************************
  104. * 函 數 名         : UsartInit()
  105. * 函數功能                   : 串口初始化
  106. * 輸    入         : 無
  107. * 輸    出         : 無
  108. *******************************************************************************/

  109. void UsartInit()
  110. {
  111.         SCON=0x50;        //設置串口工作模式1,允許接收

  112.         TMOD=0x20;  //設置定時器1工作方式2
  113.         PCON=0x80;  //波特率加倍
  114.         TH1=0xF3;        //設置定時器1初始值,波特率是4800bps
  115.         TL1=0xF3;                                          
  116.         TR1=1;                //啟動定時器1

  117.         EA=1;                //打開總中斷
  118.         ES=1;                //打開接收中斷       
  119. }

  120. void main(void)
  121. {   
  122.         IrInit();

  123.         k=2;
  124.         Timer0Init();   //定時器0初始化
  125.         UsartInit();    // 串口初始化
  126.         IP=0x10;                //設置串口中斷為高優先級

  127.         i=100;
  128.         while(1)
  129.         {
  130.                 DisplayData[0] = smgduan[IrValue[2]/16];
  131.                 DisplayData[1] = smgduan[IrValue[2]%16];
  132.                 DisplayData[2] = smgduan[16];
  133.             DigDisplay();
  134.                   
  135.                
  136.                 if (KEY1==0)  //檢測按鍵K1是否按下
  137.                 {
  138.                         Delay10ms(1);        //消除抖動
  139.                         num=0;
  140.                         while (KEY1==0)        //再次檢測按鍵是否按下
  141.                         {
  142.                                 Delay10ms(1);
  143.                                 num++;                //記錄按鍵按下的時間
  144.                         }
  145.                         if(5<num&&num<50)        //此處一定不能定成0<num<50否則程序會認為是0<num而不會判定num<50;
  146.                         LED=~LED;
  147.                         i=i+5;
  148.                         if(num>50)
  149.                         k++;
  150.                         while(!KEY1)
  151.                         {
  152.                         }
  153.                 }

  154.                 if (myKEY=='x' || myKEY=='X')  //檢測鍵盤按鍵是否按下
  155.                 {
  156.                        
  157.                         Delay10ms(1);        //消除抖動
  158.                         if (myKEY=='x' || myKEY=='X')        //再次檢測鍵盤按鍵是否按下
  159.                         {
  160.                                 LED=~LED;
  161.                                 i=i+5;
  162.                                 myKEY=0;
  163.                         }
  164.                 }
  165.                 if (IrValue[2]/16==0&&IrValue[2]%16==9)  //檢測遙控按鍵是否按下
  166.                 {
  167.                         LED=~LED;
  168.                         i=i+10;
  169.                         IrValue[2]=0x11;
  170.                 }


  171.                 else if (KEY2==0)
  172.                 {
  173.                         Delay10ms(1);
  174.                         if (KEY2==0)
  175.                         {
  176.                                 LED=~LED;
  177.                                 i=i-5;
  178.                                 j=0;
  179.                                 while ((j<30) && (KEY2==0))  //檢測按鍵是否松開
  180.                                 {
  181.                                         Delay10ms(1);
  182.                                         j++;
  183.                                 }
  184.                         }      
  185.                 }
  186.                 P2=~k;

  187.                 if(myKEY=='y' || myKEY=='Y')          //按下鍵盤的Y鍵就亮,按其它鍵則滅
  188.                 {
  189.                         LED=~LED;
  190.                         i=i-5;
  191.                         myKEY=0;
  192.                 }
  193.                 if (IrValue[2]/16==1&&IrValue[2]%16==5)  //檢測按鍵K1是否按下
  194.                 {
  195.                         LED=~LED;
  196.                         i=i-10;
  197.                         IrValue[2]=0x00;
  198.                 }

  199.         }
  200. }

  201. /*******************************************************************************
  202. * 函數名         : ReadIr()
  203. * 函數功能                   : 讀取紅外數值的中斷函數
  204. * 輸入           : 無
  205. * 輸出                  : 無
  206. *******************************************************************************/

  207. void ReadIr() interrupt 0
  208. {
  209.         u8 j,k;
  210.         u16 err;
  211.         Time=0;                                         
  212.         delay(700);        //7ms
  213.         if(IRIN==0)                //確認是否真的接收到正確的信號
  214.         {         
  215.                
  216.                 err=1000;                                //1000*10us=10ms,超過說明接收到錯誤的信號
  217.                 /*當兩個條件都為真是循環,如果有一個條件為假的時候跳出循環,免得程序出錯的時
  218.                 侯,程序死在這里*/       
  219.                 while((IRIN==0)&&(err>0))        //等待前面9ms的低電平過去                 
  220.                 {                       
  221.                         delay(1);
  222.                         err--;
  223.                 }
  224.                 if(IRIN==1)                        //如果正確等到9ms低電平
  225.                 {
  226.                         err=500;
  227.                         while((IRIN==1)&&(err>0))                 //等待4.5ms的起始高電平過去
  228.                         {
  229.                                 delay(1);
  230.                                 err--;
  231.                         }
  232.                         for(k=0;k<4;k++)                //共有4組數據
  233.                         {                               
  234.                                 for(j=0;j<8;j++)        //接收一組數據
  235.                                 {

  236.                                         err=60;               
  237.                                         while((IRIN==0)&&(err>0))//等待信號前面的560us低電平過去
  238.                                         {
  239.                                                 delay(1);
  240.                                                 err--;
  241.                                         }
  242.                                         err=500;
  243.                                         while((IRIN==1)&&(err>0))         //計算高電平的時間長度。
  244.                                         {
  245.                                                 delay(10);         //0.1ms
  246.                                                 Time++;
  247.                                                 err--;
  248.                                                 if(Time>30)
  249.                                                 {
  250.                                                         return;
  251.                                                 }
  252.                                         }
  253.                                         IrValue[k]>>=1;         //k表示第幾組數據
  254.                                         if(Time>=8)                        //如果高電平出現大于565us,那么是1
  255.                                         {
  256.                                                 IrValue[k]|=0x80;
  257.                                         }
  258.                                         Time=0;                //用完時間要重新賦值                                                       
  259.                                 }
  260.                         }
  261.                 }
  262.                 if(IrValue[2]!=~IrValue[3])
  263.                 {
  264.                         return;
  265.                 }
  266.         }                       
  267. }

  268. void Timer0Interrupt(void) interrupt 1
  269. {
  270.         TH0 = 0xff;
  271.         TL0 = 0xff;
  272.         pwm++;
  273.         if(i>=200)         //改變i這個值可以改變直流電機的速度
  274.         {
  275.                 i=200;
  276.         }
  277.         if(pwm>200)  //PWM周期為100*0.5ms
  278.         {
  279.                 pwm=0;
  280.         }
  281.        

  282. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼


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

使用道具 舉報

沙發
ID:466759 發表于 2019-1-31 23:47 | 只看該作者
唔,小白一個,不會用。。。。
回復

使用道具 舉報

板凳
ID:253618 發表于 2019-2-6 13:15 | 只看該作者
樓主程序注釋得很詳細,感謝
回復

使用道具 舉報

地板
ID:9727 發表于 2019-4-9 10:22 | 只看該作者
非常感謝,學習了
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 精品久久久久久久久久久久久久久久久 | 欧美精品在线播放 | 欧洲视频一区二区 | 日韩成人免费视频 | 日韩欧美高清 | 中文字幕在线视频免费视频 | 国产在线一区二区三区 | 色999日韩 | 国外成人在线视频 | 一区在线免费视频 | 久久久久久成人 | 亚洲人成一区二区三区性色 | 成人久久| 中文字幕日韩在线 | 91精品国产综合久久久久蜜臀 | 国产精品揄拍一区二区 | 91精品在线播放 | 久久久爽爽爽美女图片 | 日韩av成人| 国产精品中文字幕在线 | 秋霞a级毛片在线看 | 99国产精品视频免费观看一公开 | 国产性网 | 久久精品视频播放 | 欧美日韩中文在线观看 | a视频在线| www.操.com| 草草视频在线免费观看 | 久久久久久久久久久久亚洲 | 交专区videossex农村 | 欧美成人在线影院 | 色综合久久久久 | 国产免费观看视频 | 久色网 | 亚洲成在线观看 | 成人免费视屏 | 久久久精彩视频 | 黄色毛片一级 | 色婷婷久久综合 | 亚洲欧美日韩精品久久亚洲区 | 中文字幕不卡在线88 |