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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 17979|回復: 10
收起左側

基于51單片機的紅外遙控電風扇設計源碼與資料分享

  [復制鏈接]
ID:425054 發表于 2018-11-12 15:36 | 顯示全部樓層 |閱讀模式
原理圖都在資料里,資料在附件l,曾經的課程設計

制作出來的紅外遙控電風扇實物圖如下:
0.jpg 1.jpg

電路原理圖如下:
0.png

紅外遙控器配置圖:
0.png

元件清單:
STC89C52/C51單片機        1
10uF電解電容            2
10K色環電阻        4
1K色環電阻        1
22pF瓷片電容        2
11.0592Mhz晶振        1
DIP40單片機插座        1
7cm*9cm萬孔板        1
2.5mm排針        3+2
自復位按鍵        1   
DC5V的電源座        2
DC5V的USB電源線        2
小的LED電源指示燈        1
焊接跳線        不計
4.7K排阻            1
VS1838B紅外接收頭        1
通用紅外遙控器        1
DC5V 馬達        1
L9110H 電機驅動芯片    1
VS1838B紅外接收頭        1
紅外遙控器        1

紅外遙控電風扇單片機源程序如下:

  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=P2^0;
  9. sbit dianji2=P2^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=9;
  171.                                
  172.                                                 break;  
  173.                 case 0x46:       
  174.         //P2=0xff;
  175. //        timer1_init();//定時器1初始化
  176.                                                   PWM_val_buf=PWM_val;
  177.                                         PWM_val=0;

  178.                                        
  179.                                 //        }
  180.                                         break;
  181.                 case 0x0C:                                        //亮度
  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=6;
  191.                                
  192.                                         break;
  193.             case 0x5E:                        //亮度
  194.                           //  timer1_init();//定時器1初始化
  195.                                                 PWM_val=9;
  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. /************************************************************/
復制代碼
QQ截圖20181112153303.png
所有資料51hei提供下載:
王一哲——散件紅外遙控器控制直流電機PWM轉速設計資料.zip (594.09 KB, 下載次數: 355)

評分

參與人數 2黑幣 +55 收起 理由
都市郎 + 5 共享資料的黑幣獎勵!
admin + 50 共享資料的黑幣獎勵!

查看全部評分

回復

使用道具 舉報

ID:92513 發表于 2019-5-1 11:05 | 顯示全部樓層
感謝分享,程序編譯成功 慢慢研究
回復

使用道具 舉報

ID:539074 發表于 2019-5-15 17:08 | 顯示全部樓層
請問這個的子程序框圖怎么畫呢
回復

使用道具 舉報

ID:484435 發表于 2019-5-15 18:49 | 顯示全部樓層
謝謝分享
回復

使用道具 舉報

ID:562262 發表于 2019-6-13 23:48 | 顯示全部樓層
新手前來圍觀,好
回復

使用道具 舉報

ID:571461 發表于 2019-6-27 08:54 | 顯示全部樓層
我的開發板還有遙控都不一樣,這個程序好像沒用,我的電機風扇也不是焊的,不知道要往哪里接,求大神解惑
回復

使用道具 舉報

ID:573668 發表于 2019-6-27 19:38 | 顯示全部樓層
很幫很好支持加油
回復

使用道具 舉報

ID:451441 發表于 2019-11-13 13:57 | 顯示全部樓層
很全面的資料,謝謝LZ分享
回復

使用道具 舉報

ID:694235 發表于 2020-2-17 13:09 | 顯示全部樓層
感謝分享
回復

使用道具 舉報

ID:808455 發表于 2020-7-27 14:41 | 顯示全部樓層
感謝分享 先下來看看 不知道懂不懂
回復

使用道具 舉報

ID:808455 發表于 2020-7-27 14:42 | 顯示全部樓層
考慮的很周到啊
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 一级欧美| 丝袜天堂 | 国产精品视频在线播放 | 日韩电影中文字幕 | 亚洲一区二区在线 | 黄毛片| 午夜成人免费视频 | 在线看av网址 | 在线看黄免费 | 久久久看| 91精品久久久久久久久中文字幕 | 亚洲第一黄色网 | 欧美在线视频不卡 | 丝袜天堂| 国产视频在线观看一区二区三区 | 日韩av在线一区二区三区 | 成人福利网站 | 精品久久99 | 国产一区二区三区www | 欧美性久久 | 国产精品久久久久久久久图文区 | 99福利 | 欧美日韩精品一区二区天天拍 | 日韩美女一区二区三区在线观看 | 国产成人一区二区 | 久久婷婷麻豆国产91天堂 | 亚洲人成人一区二区在线观看 | 午夜寂寞网站 | 国产网站在线免费观看 | 国产精品国产精品国产专区不卡 | 日韩国产欧美视频 | 久久黄色 | 久久久久久久综合 | 亚洲不卡在线观看 | 亚洲综合天堂网 | 一区二区三区国产好 | 九色视频网 | 久久香蕉网 | 九九精品在线 | 自拍视频网站 | 久久草在线视频 |