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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3598|回復: 2
收起左側

基于51單片機的紅外遙控和按鍵調速風扇程序

  [復制鏈接]
ID:974010 發表于 2022-3-28 20:47 | 顯示全部樓層 |閱讀模式
  1. /*************************************************************************/
  2. #include <reg52.h>      
  3. #include <intrins.h>

  4. #define uchar unsigned char
  5. #define uint unsigned int

  6. /***********端口定義*****************/
  7. sbit IR_R=P3^3;      //紅外線數據接收口



  8. sbit dianji1=P1^0;
  9. sbit dianji2=P1^1;



  10. /************************************/
  11. /***********寄存器定義***************/
  12. //以下為紅外接收解碼用到的寄存器
  13. uchar IR_receive_time;      //紅外接收脈沖時間計數
  14. bit IR_receive_flag;      //紅外接收檢測啟動標志位

  15. uchar IR_receive_data[33];  //紅外數據接收緩存接收計數脈沖個數 引導碼+8位地址碼+8位地址碼+8位數據碼+8位數據反碼

  16. uchar IR_receive_bit;       //紅外接收數據位標志
  17. bit IR_receive_OK;        //紅外數據接收完畢標志

  18. uchar IR_receive_code[4];   //紅外解碼數據緩存

  19. bit IR_receive_end;       //紅外解碼結束標志位      
  20. //鍵值相關定義
  21. bit ON_flag;  //開標志

  22. //PWM相關寄存器定義
  23. #define                PWM_DUTY_MAX        10        // 0~255        PWM周期, 最大255
  24. #define                PWM_ON                        0        // 定義占空比的電平, 1 或 0

  25. #define                PWM_OFF                        (!PWM_ON)
  26. uchar pwm_cnt;                //周期計數值
  27. uchar PWM_val;
  28. uchar PWM_val_buf;
  29. /*******1ms基準延時程序*******************/
  30. void Delay1ms(uint t)    //1ms延時程序
  31. {
  32.         uchar j;
  33.         while(t--)
  34.         {
  35.                 for(j=0;j<125;j++)
  36.                 { ; }
  37.         }
  38. }
  39. /****************************************/
  40. /************************************************************************
  41. //定時器1中斷服務子函數產生PWM信號
  42. void timer1() interrupt 3                 //定時器1設置為8位自動重裝
  43. {      
  44.         if(++pwm_cnt==PWM_DUTY_MAX)        //PWM周期結束,重新開始新的周期
  45.         {
  46.                 pwm_cnt=0;
  47.                 P1=PWM_ON;   
  48.         }
  49.         if(pwm_cnt==PWM_val)         P1=PWM_OFF;  //判斷PWM占空比是否結束  高電平結束
  50. }
  51. /***************************************************/
  52. /********************紅外解碼初始化設置程序***********************/
  53. void IR_receive_init(void)   //定時器0設置函數
  54. {
  55.         IR_receive_time=0;
  56.         IR_receive_flag=0;
  57.         IR_receive_bit=0;
  58.         IR_receive_OK=0;
  59.         IR_receive_end=0;
  60.         TMOD=0x22;         //設置定時器0為8位自動重裝計數
  61.         TH0=0x00;
  62.         TL0=0x00;          //設置定時時間為256us
  63.         ET0=1;             //定時器0中斷打開
  64.         EA=1;              //總中斷打開         
  65.         TR0=1;             //啟動定時器0
  66. }
  67. /*************************************************************/
  68. /*******************紅外接收口外部中斷0設置函數*********************/
  69. void int0init(void)
  70. {
  71.         IT0=1;            //外部中斷0觸發方式設置為下降沿觸發
  72.         EX0=1;            //外部中斷0中斷打開
  73.         EA=1;             //總中斷打開
  74. }
  75. /*******************************************************************/
  76. /***********************紅外接收產生256us定時計數程序***************/
  77. void time0(void) interrupt 1      //定時器0中斷處理函數
  78. {
  79.         IR_receive_time++;            //紅外接收定時脈沖計數器
  80. }
  81. /*******************************************************************/
  82. /***********************紅外33位數據(含一位引導碼)接收程序************************/
  83. void int0() interrupt 0         //外部中斷0處理程序
  84. {
  85.         if(IR_receive_flag)    //紅外數據接收檢測標志位
  86.         {
  87.                 if(IR_receive_time>32&&IR_receive_time<63)   //檢測接收時間是否在8-16ms范圍,若在,說明接收到紅外引導碼
  88.                 {
  89.                         IR_receive_bit=0;    //紅外接收數據位標志 清0
  90.                 }
  91.                 IR_receive_data[IR_receive_bit]=IR_receive_time;    //接收數據(每位數據的脈沖時間)
  92.                 IR_receive_time=0;        //紅外接收定時脈沖計數器  清0 準備等待接收下一位數的脈沖時間
  93.                 IR_receive_bit++;         //紅外接收數據位標志 接收下一位數據
  94.                 if(IR_receive_bit==33)    //判斷包括一位引導碼和32位數據是否接收完成
  95.                 {
  96.                         IR_receive_bit=0;     //接收完畢,則接收數據位標志清0
  97.                         IR_receive_OK=1;      //紅外接收完畢標志位置1,表示數據已接收完
  98.                 }
  99.         }
  100.         else
  101.         {
  102.                 IR_receive_flag=1;     //紅外接收啟動標志
  103.                 IR_receive_time=0;     //紅外接收脈沖計數器清0 準備計數
  104.         }
  105. }
  106. /*********************************************************************/
  107. /*****************************紅外數據解碼程序************************/
  108. void IR_code(void)
  109. {
  110.         uchar k,i,j,value;
  111.         k=1;                 //k=1意思是跳過引導碼數據,不處理接收引導碼
  112.         for(j=0;j<4;j++)     //有4組數據,即8位地址碼+8位地址碼+8位數據碼+8位數據碼反碼
  113.         {
  114.                 for(i=0;i<8;i++)     //每組數據有8位二進制數
  115.                 {
  116.                         value=value>>1;      //寄存器數據位右移一位   接收數據是從每組數據的低位到高位接收的
  117.                         if(IR_receive_data[k]>6)     //通過判斷計數脈沖時長確定個位數是0還是1  通過計算我們得知數據0的時長為4.4ms,數據1的時長為8.8ms,我們取中間值6,則大于6說明為數量1
  118.                         {
  119.                                 value=value|0x80;    //確定一組8位數據的一位(bit)數值
  120.                         }
  121.                    k++;
  122.                 }
  123.                 IR_receive_code[j]=value;    //確定一組8位數據的值
  124.         }
  125.         IR_receive_end=1;      //紅外數據解碼完成標志
  126. }
  127. /*********************************************************************/

  128. /*********定時器1初始化程序*********************/
  129. void timer1_init(void)
  130. {

  131.         TMOD = 0x22;  //設置定時器為模式2(8位自動重裝載)
  132.         TL1=0x9C;  //初始化計時值 100us 9C  50us CE
  133.         TH1=0x9C;
  134.         TR1=1;  //啟動定時器1
  135.         ET1=1;  //開啟定時器1中斷
  136.         EA=1;   //開總中斷
  137. }
  138. /***********************************************/
  139. void timer1(void) interrupt 3
  140. {
  141.         pwm_cnt++;
  142.         if(pwm_cnt>=PWM_DUTY_MAX)        //PWM周期結束,重新開始新的周期
  143.         {
  144.                 pwm_cnt=0;
  145.         //        P1=PWM_ON;  
  146.                         dianji1=0;
  147. //                                zhishi=0;
  148.         }
  149.         if(pwm_cnt>=PWM_val) //        P1=PWM_OFF;  //判斷PWM占空比是否結束  高電平結束      
  150.         {
  151.                                 dianji1=1;
  152. //zhishi=1;
  153.         }                                 
  154. }
  155. /***********************************************/
  156. /*****************紅外鍵值處理程序***************************/
  157. void IR_check(uchar tmp)
  158. {
  159.         switch(tmp){
  160.                 case 0x45:  
  161.                            //按鍵1         開 LED燈   
  162.                                   //        if(ON_flag==0)  
  163.                                 //        {
  164.                                          //   ON_flag=1;
  165.                                           PWM_val=PWM_val_buf;
  166.                                        
  167.                                           //P2=0x00;
  168.                                 //        }
  169.                                         timer1_init();//定時器1初始化
  170.                         PWM_val=1;
  171.                               
  172.                                                 break;  
  173.                 case 0x0C:      
  174.         //P2=0xff;
  175. //        timer1_init();//定時器1初始化
  176.                                                   PWM_val_buf=PWM_val;
  177.                                         PWM_val=0;

  178.                                        
  179.                                 //        }
  180.                                         break;
  181.                 case 0x08:                                        //亮度
  182.                           //  if(ON_flag==1)
  183.                                 //        {
  184.                                         //        timer1_init();//定時器1初始化
  185.                                                 PWM_val=4;

  186.                                 //        }
  187.                                         break;
  188.             case 0x18:                        //亮度
  189.                                   //        timer1_init();//定時器1初始化
  190.                                                 PWM_val=1;
  191.                               
  192.                                         break;
  193.             case 0x5E:                        //亮度
  194.                           //  timer1_init();//定時器1初始化
  195.                                                 PWM_val=3;
  196.                               
  197.                                         break;
  198.          
  199.         }
  200. }

  201. /************************************************************/
  202. /**************主程序****************************************/
  203. void main()
  204. {
  205.     //PWM_val=5;  //占空比
  206.         //PWM_val_buf=5;
  207.         IR_receive_init();   //紅外初始化設置程序
  208.         int0init();          //外部中斷0設置
  209.         //P2=0x00;

  210.         dianji2=1;

  211.         while(1)                                                     
  212.         {
  213.          
  214.                 if(IR_receive_OK)
  215.                 {
  216.                 //        IR_receive_OK=0;
  217.                         IR_code();    //紅外數據解碼
  218.                 }
  219.                 if(IR_receive_end)
  220.                 {
  221.                         IR_receive_end=0;

  222.                         EX0=0;
  223.                         if(IR_receive_code[0]==0x00&&IR_receive_code[1]==0xFF)  //判斷用戶碼是否正確
  224.                         {
  225.                                 if(IR_receive_code[2]==~IR_receive_code[3])  //判斷反碼是否正確
  226.                                 {
  227.                                         IR_check(IR_receive_code[2]);  //紅外按鍵值處理程序
  228.                                 }
  229.                         }
  230.          //   IR_receive_init();   //再次啟動紅外解碼設置程序,等待下一次解碼
  231.                         int0init();          //外部中斷0設置
  232.                 }
  233.         }
  234. }
  235. /************************************************************/
復制代碼
可以通過紅外遙控控制電機擋位。

評分

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

查看全部評分

回復

使用道具 舉報

ID:1032802 發表于 2022-6-7 09:26 | 顯示全部樓層
請問有沒有仿真電路圖
回復

使用道具 舉報

ID:974010 發表于 2022-7-15 21:03 | 顯示全部樓層
@無名 發表于 2022-6-7 09:26
請問有沒有仿真電路圖

不好意思,沒有啊。就是跟普中開發板一樣的電路圖
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产一二三区免费视频 | 奇米视频777 | 国产午夜精品久久久 | 欧美日韩亚洲系列 | 日韩中文字幕在线视频 | 久久精品国产亚洲一区二区三区 | 97久久久久久 | 久久精品99 | 久久久激情 | 欧美在线一区二区视频 | 九九爱这里只有精品 | 欧美日韩国产高清 | 国产丝袜人妖cd露出 | 国产精品免费一区二区三区四区 | 亚洲va欧美va天堂v国产综合 | 91天堂网 | 欧美三级电影在线播放 | 午夜在线 | 国产精品18hdxxxⅹ在线 | av一级毛片 | 密色视频| 精品国产18久久久久久二百 | 青草青草久热精品视频在线观看 | 日韩毛片免费视频 | 在线国产一区二区 | 日本久久综合 | 国产成人一区二区三区久久久 | 日韩欧美网 | 欧美精品一区二区三区在线 | 狠狠色综合久久婷婷 | 午夜爱爱网 | 日韩成人精品 | 国产精品成av人在线视午夜片 | 91久久国产综合久久91精品网站 | 天天综合久久 | 可以在线观看av的网站 | 欧美精品久久久 | 成年人黄色小视频 | 伦理二区 | 亚洲国产精品美女 | 国产精品久久久久久久久久 |