找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 18037|回復(fù): 10
打印 上一主題 下一主題
收起左側(cè)

基于51單片機(jī)的紅外遙控電風(fēng)扇設(shè)計(jì)源碼與資料分享

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:425054 發(fā)表于 2018-11-12 15:36 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
原理圖都在資料里,資料在附件l,曾經(jīng)的課程設(shè)計(jì)

制作出來的紅外遙控電風(fēng)扇實(shí)物圖如下:


電路原理圖如下:


紅外遙控器配置圖:


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

紅外遙控電風(fēng)扇單片機(jī)源程序如下:

  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;      //紅外線數(shù)據(jù)接收口



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



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

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

  131.         TMOD = 0x22;  //設(shè)置定時(shí)器為模式2(8位自動(dòng)重裝載)
  132.         TL1=0x9C;  //初始化計(jì)時(shí)值 100us 9C  50us CE
  133.         TH1=0x9C;
  134.         TR1=1;  //啟動(dòng)定時(shí)器1
  135.         ET1=1;  //開啟定時(shí)器1中斷
  136.         EA=1;   //開總中斷
  137. }
  138. /***********************************************/
  139. void timer1(void) interrupt 3
  140. {
  141.         pwm_cnt++;
  142.         if(pwm_cnt>=PWM_DUTY_MAX)        //PWM周期結(jié)束,重新開始新的周期
  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占空比是否結(jié)束  高電平結(jié)束       
  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();//定時(shí)器1初始化
  170.                         PWM_val=9;
  171.                                
  172.                                                 break;  
  173.                 case 0x46:       
  174.         //P2=0xff;
  175. //        timer1_init();//定時(shí)器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();//定時(shí)器1初始化
  185.                                                 PWM_val=4;

  186.                                 //        }
  187.                                         break;
  188.             case 0x18:                        //亮度
  189.                                   //        timer1_init();//定時(shí)器1初始化
  190.                                                 PWM_val=6;
  191.                                
  192.                                         break;
  193.             case 0x5E:                        //亮度
  194.                           //  timer1_init();//定時(shí)器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();   //紅外初始化設(shè)置程序
  208.         int0init();          //外部中斷0設(shè)置
  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();    //紅外數(shù)據(jù)解碼
  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();   //再次啟動(dòng)紅外解碼設(shè)置程序,等待下一次解碼
  231.                         int0init();          //外部中斷0設(shè)置
  232.                 }
  233.         }
  234. }
  235. /************************************************************/
復(fù)制代碼

所有資料51hei提供下載:
王一哲——散件紅外遙控器控制直流電機(jī)PWM轉(zhuǎn)速設(shè)計(jì)資料.zip (594.09 KB, 下載次數(shù): 355)




評分

參與人數(shù) 2黑幣 +55 收起 理由
都市郎 + 5 共享資料的黑幣獎(jiǎng)勵(lì)!
admin + 50 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評分

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

使用道具 舉報(bào)

沙發(fā)
ID:92513 發(fā)表于 2019-5-1 11:05 | 只看該作者
感謝分享,程序編譯成功 慢慢研究
回復(fù)

使用道具 舉報(bào)

板凳
ID:539074 發(fā)表于 2019-5-15 17:08 | 只看該作者
請問這個(gè)的子程序框圖怎么畫呢
回復(fù)

使用道具 舉報(bào)

地板
ID:484435 發(fā)表于 2019-5-15 18:49 | 只看該作者
謝謝分享
回復(fù)

使用道具 舉報(bào)

5#
ID:562262 發(fā)表于 2019-6-13 23:48 | 只看該作者
新手前來圍觀,好
回復(fù)

使用道具 舉報(bào)

6#
ID:571461 發(fā)表于 2019-6-27 08:54 | 只看該作者
我的開發(fā)板還有遙控都不一樣,這個(gè)程序好像沒用,我的電機(jī)風(fēng)扇也不是焊的,不知道要往哪里接,求大神解惑
回復(fù)

使用道具 舉報(bào)

7#
ID:573668 發(fā)表于 2019-6-27 19:38 | 只看該作者
很幫很好支持加油
回復(fù)

使用道具 舉報(bào)

8#
ID:451441 發(fā)表于 2019-11-13 13:57 | 只看該作者
很全面的資料,謝謝LZ分享
回復(fù)

使用道具 舉報(bào)

9#
ID:694235 發(fā)表于 2020-2-17 13:09 | 只看該作者
感謝分享
回復(fù)

使用道具 舉報(bào)

10#
ID:808455 發(fā)表于 2020-7-27 14:41 | 只看該作者
感謝分享 先下來看看 不知道懂不懂
回復(fù)

使用道具 舉報(bào)

11#
ID:808455 發(fā)表于 2020-7-27 14:42 | 只看該作者
考慮的很周到啊
回復(fù)

使用道具 舉報(bào)

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

本版積分規(guī)則

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

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

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