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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2970|回復: 3
收起左側

stc15f104e單片機程序 ,峰鳴器 高電平輸出 改低電平輸出

[復制鏈接]
ID:17109 發表于 2018-3-10 16:49 | 顯示全部樓層 |閱讀模式
本帖最后由 ll13536121668 于 2018-3-25 15:08 編輯

stc15f104e單片機程序   ,峰鳴器     高電平輸出   改低電平輸出     要什樣修改才能在低電平峰鳴器使用,有了解c程序這方面的朋友嗎?幫幫小弟修改謝謝
下載:
C_souer.rar (75.97 KB, 下載次數: 17)
  1. #include <reg52.h>
  2. #include <intrins.h>
  3.                                                          
  4. sfr AUXR=0x8e;  //設置定時器1/0是分頻還是不分頻的計程器

  5. sfr IAP_DATA    = 0xC2;                //片內EEPROM資源聲明
  6. sfr IAP_ADDRH   = 0xC3;
  7. sfr IAP_ADDRL   = 0xC4;
  8. sfr IAP_CMD     = 0xC5;
  9. sfr IAP_TRIG    = 0xC6;
  10. sfr IAP_CONTR   = 0xC7;

  11. sfr P3M0                =0xb2;
  12. sfr P3M1                =0xb1;

  13. sfr IE2  = 0xAF;
  14. sfr INT_CLKO = 0x8F;
  15. sfr        T2H  = 0xD6;
  16. sfr        T2L  = 0xD7;

  17. #define uchar unsigned char
  18. #define uint  unsigned int


  19. /************************************************************
  20. * 功能名稱:型號定義
  21. * 功能描述:
  22. * 參數:無
  23. * 返回:無
  24. ************************************************************/
  25. //#define  SBT8818_01   0   //86WIFI墻壁開關
  26. #define  SBT8818_02   0  //86搖控墻壁開關
  27. #define  SBT8828_01   1 //搖控燈座
  28. #define  SBT8828_02   0 //移動搖控插座
  29. #define  SBT8828_03   0 //86搖控墻壁插座
  30. #define  SBT8828_04   0 //86搖控雙控墻壁開關


  31. /************************************************************
  32. * 功能名稱:MCU腳位定義
  33. * 功能描述:
  34. * 參數:無
  35. * 返回:無
  36. ************************************************************/

  37. sbit RF                                =        P3^3;           //遙控接收                                           8                                                                                                                           
  38. sbit PAD                         =        P3^5;           //光敏檢測                                        3         
  39. sbit LED2                    =        P3^0;           //指示燈                                      5
  40. sbit OUT                        =        P3^4;           //控制輸出                                        1
  41. sbit set                        =        P3^2;           //按鍵                                                7
  42. sbit LED1                        =        P3^1;           //峰鳴器                                              6
  43. /************************************************************
  44. * 功能名稱:變量的定義
  45. * 功能描述:
  46. * 參數:無
  47. * 返回:無
  48. ************************************************************/

  49. //uint key_repeat_num;

  50. bit  decode_ok;                 //解碼成功
  51. bit key1_ok;
  52. bit key2_ok;
  53. bit key3_ok;
  54. bit key4_ok;
  55. bit key5_ok;
  56. bit key6_ok;
  57. bit key7_ok;
  58. bit key8_ok;
  59. bit key9_ok;
  60. bit keya_ok;
  61. bit keyb_ok;
  62. bit keyc_ok;
  63. bit keyd_ok;
  64. bit keye_ok;
  65. bit keyf_ok;

  66. bit goout;//控制輸出標記
  67. uchar Timer2_50Ms=0,timer_S=0 ,timer_M=0,timer_H=0 ;


  68. uchar  hh_w,ll_w;           //高,低電平寬度
  69. uchar  ma_x;                //接收到第幾位編碼了
  70. uchar  bma1,bma2,bma3; //用于接收過程存放遙控編碼,編碼比較兩次,這是第一次
  71. uchar idata mmb1; //        用于接收過程存放遙控編碼,第二次
  72. uchar idata mmb2;
  73. uchar idata mmb3;

  74. bit rf_ok1,rf_ok2;                 //解碼過程中的臨時接收成功標志
  75. bit old_rc5;             //保存上一次查詢到的電平狀態
  76. bit tb_ok;               //接收到同步的馬時置1   

  77. uchar  mma1,mma2,mma3,mma4; //用于解碼過程
  78. uchar  mma8;


  79. bit rf_ok;               //接收到一個完整的遙控命令后置1,通知解碼程序可以解碼了

  80. bit study;                                 //進入學習狀態標志
  81. bit study1;                                 //開關狀態標志

  82. bit system_int;                         //系統清零標志                        
  83. uchar temp_h,temp_l;

  84. bit bt_auto;     //自動設置遙控接收波特率標志
  85. bit L_M_select;

  86. uint s,s1;
  87. uchar s2;

  88. uchar idata key_number[33];                //遙控器編碼數組,存放10個遙控器




  89. /************************************************************
  90.   * 功能名稱:延遲函數
  91.   * 功能描述:
  92.   * 參數:無
  93.   * 返回:無
  94.   ************************************************************/
  95. /*(void Delay_Us(unsigned char time)
  96. {
  97.         while (time--)
  98.         {
  99.                 ;
  100.         }
  101. }

  102. */


  103. void delay_1ms(uint x)    //1毫秒延時
  104. {
  105. uchar b,c;
  106. for(x;x>0;x--)
  107.         {
  108.                 for(b=3;b>0;b--)
  109.                         {
  110.                                 for(c=150;c>0;c--);
  111.                         }
  112.         }
  113. }
  114.   /************************************************************
  115.   * 功能名稱:指示標記函數
  116.   * 功能描述:
  117.   * 參數:無
  118.   * 返回:無
  119.   ************************************************************/

  120. void beep_on_off()
  121. {   
  122. uint e;

  123.           if( SBT8818_02)
  124.              {
  125.           for(e=0;e<5;e++)
  126.                   {
  127.                         LED1=0;
  128.                         LED2=0;
  129.                         delay_1ms(300) ;
  130.                         LED1=1;
  131.                         LED2=1;
  132.                         delay_1ms(300) ;
  133.                   }

  134.              }
  135.            if( SBT8828_01)
  136.              {
  137.           for(e=0;e<5;e++)
  138.                   {
  139.                         LED1=1;
  140.                         delay_1ms(300) ;
  141.                         LED1=0;
  142.                         delay_1ms(300) ;
  143.                   }

  144.              }
  145.             if( SBT8828_02)
  146.              {
  147.           for(e=0;e<5;e++)
  148.                   {
  149.                         LED1=1;
  150.                         LED2=0;
  151.                         delay_1ms(300) ;
  152.                         LED1=0;
  153.                         LED2=1;
  154.                         delay_1ms(300) ;
  155.                   }

  156.              }
  157.                  if( SBT8828_03)
  158.              {
  159.           for(e=0;e<5;e++)
  160.                   {
  161.                         LED1=1;
  162.                         LED2=0;
  163.                         delay_1ms(300) ;
  164.                         LED1=0;
  165.                         LED2=1;
  166.                         delay_1ms(300) ;
  167.                   }
  168.                   if(goout)
  169.                           {LED2=0;}
  170.                   else
  171.                           {LED2=1;}

  172.              }
  173.                  if( SBT8828_04)
  174.              {
  175.           for(e=0;e<5;e++)
  176.                   {
  177.                         LED1=1;
  178.                         LED2=0;
  179.                         delay_1ms(300) ;
  180.                         LED1=0;
  181.                         LED2=1;
  182.                         delay_1ms(300) ;
  183.                   }

  184.              }


  185. }

  186.   /************************************************************
  187.   * 功能名稱:光敏電阻檢測函數
  188.   * 功能描述:
  189.   * 參數:無
  190.   * 返回:無
  191.   ************************************************************/
  192. /*void GUANGMIN__scan()
  193. {
  194. if(timer_H>0)
  195.         {
  196.      if(!PAD)
  197.                  {
  198.                   delay_1ms(100) ;
  199.               if(!PAD)
  200.                  {
  201.                  OUT=1;
  202.                  goout=1;
  203.                  beep_on_off();
  204.                  }
  205.                   }
  206.      else
  207.                {
  208.                OUT=0;
  209.        goout=0;
  210.        beep_on_off();
  211.                  }
  212.         }

  213. }  */

  214. /************************************************************
  215. * 功能名稱:EEPROM函數
  216. * 功能描述:
  217. * 參數:無
  218. * 返回:無
  219. ************************************************************/


  220. //====================================================
  221. /////////片內EEPROM讀寫驅動程序///////////////////////////
  222. //====================================================


  223. void IAP_Disable()           //關閉IAP
  224. {
  225.     //關閉IAP 功能, 清相關的特殊功能寄存器,使CPU 處于安全狀態,
  226.     //一次連續的IAP 操作完成之后建議關閉IAP 功能,不需要每次都關
  227.     IAP_CONTR = 0;      //關閉IAP 功能
  228.     IAP_CMD   = 0;      //清命令寄存器,使命令寄存器無命令,此句可不用
  229.     IAP_TRIG = 0;      //清命令觸發寄存器,使命令觸發寄存器無觸發,此句可不用
  230.     IAP_ADDRH = 0;
  231.     IAP_ADDRL = 0;
  232. }//



  233. //讀一字節,調用前需打開IAP 功能,入口:DPTR = 字節地址,返回:A = 讀出字節
  234. uchar read_add(uint addr)         //讀EEPROM
  235. {
  236.     IAP_DATA = 0x00;
  237.     IAP_CONTR = 0x84;         //打開IAP 功能, 設置Flash 操作等待時間
  238.     IAP_CMD = 0x01;                 //IAP/ISP/EEPROM 字節讀命令

  239.     IAP_ADDRH = addr>>8;    //設置目標單元地址的高8 位地址
  240.     IAP_ADDRL = addr&0xff;    //設置目標單元地址的低8 位地址

  241.     EA = 0;
  242.     IAP_TRIG = 0x5a;   //先送 46h,再送B9h 到ISP/IAP 觸發寄存器,每次都需如此
  243.     IAP_TRIG = 0xa5;   //送完 B9h 后,ISP/IAP 命令立即被觸發起動
  244.     _nop_();
  245.     EA = 1;
  246.     IAP_Disable(); //關閉IAP 功能, 清相關的特殊功能寄存器,使CPU 處于安全狀態,
  247.                     //一次連續的IAP 操作完成之后建議關閉IAP 功能,不需要每次都關
  248.     return (IAP_DATA);
  249. }//------------------------------------------------------------------------------


  250. //字節編程,調用前需打開IAP 功能,入口:DPTR = 字節地址, A= 須編程字節的數據
  251. void write_add(uint addr,uchar ch)         //直接寫EEPROM
  252. {
  253.     IAP_CONTR = 0x84;         //打開 IAP 功能, 設置Flash 操作等待時間
  254.     IAP_CMD = 0x02;                 //IAP/ISP/EEPROM 字節編程命令


  255.     IAP_ADDRH = addr>>8;    //設置目標單元地址的高8 位地址
  256.     IAP_ADDRL = addr&0xff;    //設置目標單元地址的低8 位地址

  257.     IAP_DATA = ch;                  //要編程的數據先送進IAP_DATA 寄存器
  258.     EA = 0;
  259.     IAP_TRIG = 0x5a;   //先送 46h,再送B9h 到ISP/IAP 觸發寄存器,每次都需如此
  260.     IAP_TRIG = 0xa5;   //送完 B9h 后,ISP/IAP 命令立即被觸發起動
  261.     _nop_();
  262.     EA = 1;
  263.     IAP_Disable(); //關閉IAP 功能, 清相關的特殊功能寄存器,使CPU 處于安全狀態,
  264.                     //一次連續的IAP 操作完成之后建議關閉IAP 功能,不需要每次都關
  265. }//------------------------------------------------------------------------------
  266. //擦除扇區, 入口:DPTR = 扇區地址


  267. void Sector_Erase(uint addr)         //扇區擦除
  268. {
  269.      IAP_CONTR = 0x84;         //打開IAP 功能, 設置Flash 操作等待時間
  270.     IAP_CMD = 0x03;                 //IAP/ISP/EEPROM 扇區擦除命令

  271.     IAP_ADDRH =addr>>8;    //設置目標單元地址的高8 位地址
  272.     IAP_ADDRL =addr&0xff;    //設置目標單元地址的低8 位地址

  273.     EA = 0;
  274.     IAP_TRIG = 0x5a;   //先送 46h,再送B9h 到ISP/IAP 觸發寄存器,每次都需如此
  275.     IAP_TRIG = 0xa5;   //送完 B9h 后,ISP/IAP 命令立即被觸發起動
  276.     _nop_();
  277.     EA = 1;
  278. }//------------------------------------------------------------------------------

  279. /************************************************************
  280. * 功能名稱:定時器0中斷函數
  281. * 功能描述:
  282. * 參數:無
  283. * 返回:無
  284. ************************************************************/
  285. void timeint() interrupt 1    //遙控接收,通過定時器0中斷,定時去查詢
  286.    {           
  287.              uchar x1;
  288. //          mtb++;
  289.           if(!bt_auto)          //自適應波特率標志
  290.                    {
  291.                                     TL0=0x00;             //   430K:FE/B5   220K:FF/30
  292.                                 TH0=0xfe;                  
  293.                    }
  294.                 else
  295.                         {
  296.                                 TL0=temp_l;             //   430K:FE/B5   220K:FF/30
  297.                                 TH0=temp_h;                        
  298.                         }

  299.           TF0=0;                // 清除T0中斷標志

  300.       if (!RF) { ll_w++;old_rc5=0; }           // 檢測到低電平 低電平時間加1,記錄本次電平狀態
  301.               else                                      // 檢測到高電平
  302.                { hh_w++;
  303.          if (!old_rc5)                          // 檢測到從低到高的跳變,已檢測到一個完整(高-低)電平周期
  304.           { if (((hh_w>=2)&&(hh_w<=8))&&((ll_w>=50)&&(ll_w<=190)))          //判同步碼          2/5 110/140
  305.              {
  306.                                  
  307.                                 if((ll_w>=110)&&(ll_w<=140)){ma_x=0;tb_ok=1;bma1=0; bma2=0; bma3=0; bt_auto=0;}         //根據不同 同步碼 寬度,T0加載不同初值
  308.                                    else
  309.                                         {  
  310.                                           if((ll_w>140)&&(ll_w<=160))
  311.                                                   { ma_x=0;tb_ok=1;bma1=0; bma2=0; bma3=0; bt_auto=1;temp_h=0xfd;temp_l=0xb6; }//fe  6b                                 
  312.                                            else
  313.                                                  {  
  314.                                                   if((ll_w>160)&&(ll_w<=190))
  315.                                                           { ma_x=0;tb_ok=1;bma1=0; bma2=0; bma3=0; bt_auto=1;temp_h=0xfd;temp_l=0x27; } //fd  dc
  316.                                                         else
  317.                                                                 {                                          
  318.                                                                   if((ll_w>70)&&(ll_w<=90))
  319.                                                                           {ma_x=0;tb_ok=1;bma1=0; bma2=0; bma3=0; bt_auto=1;temp_h=0xfe;temp_l=0x7b; }        //ff  30
  320.                                                                         else
  321.                                                                                 {
  322.                                                                                   if((ll_w>90)&&(ll_w<=110))
  323.                                                                                           {ma_x=0;tb_ok=1;bma1=0; bma2=0; bma3=0; bt_auto=1;temp_h=0xfe;temp_l=0x4b; }        //ff  00
  324.                                                                                         else
  325.                                                                                           {
  326.                                                                                                  if((ll_w>=50)&&(ll_w<=70))
  327.                                                                                                           {ma_x=0;tb_ok=1;bma1=0; bma2=0; bma3=0; bt_auto=1;temp_h=0xfe;temp_l=0xc5; }//ff  7a
  328.                                                                                                                                                                         
  329.                                                                                           }
  330.                         
  331.                                                                                 }
  332.                                                                 }                                                         
  333.                                                  }
  334.                                           }                        
  335.              }
  336.             else if ((tb_ok)&&((ll_w>=10)&&(ll_w<=14)))         //   10/14
  337.                                 {         
  338.                                         ma_x++;                                //已經接收到同步碼,判0
  339.                                         if(ma_x>23)
  340.                                                 {
  341.                                                    if(!rf_ok1)
  342.                                                           {
  343.                                                           mma1=bma1;mma2=bma2;mma3=bma3;//將接收到的編碼復制到解碼寄存器中                             
  344.                               rf_ok1=1;                                // 通知解碼子程序可以解碼了
  345.                               tb_ok=0;
  346.                                                           bt_auto=0;
  347.                                                           s=1000;                                                               
  348.                                                         }
  349.                                                         else
  350.                                                                 {
  351.                                                                   mmb1=bma1;mmb2=bma2;mmb3=bma3;//將接收到的編碼復制到解碼寄存器中                             
  352.                                   rf_ok2=1;                                // 通知解碼子程序可以解碼了
  353.                                   tb_ok=0;
  354.                                                                   bt_auto=0;                                                                                                                                                        
  355.                                                                 }
  356.                                                 }
  357.                                  }  
  358.             else if ((tb_ok)&&((ll_w>=2)&&(ll_w<=8)))                   //   3/5
  359.                   { switch (ma_x)
  360.                      {
  361.                                            case 0 : { bma1=bma1 | 0x80; break; }//遙控編碼第1位
  362.                        case 1 : { bma1=bma1 | 0x40; break; }
  363.                        case 2 : { bma1=bma1 | 0x20; break; }
  364.                        case 3 : { bma1=bma1 | 0x10; break; }
  365.                        case 4 : { bma1=bma1 | 0x08; break; }
  366.                        case 5 : { bma1=bma1 | 0x04; break; }
  367.                        case 6 : { bma1=bma1 | 0x02; break; }
  368.                        case 7 : { bma1=bma1 | 0x01; break; }
  369.                        case 8 : { bma2=bma2 | 0x80; break; }
  370.                        case 9 : { bma2=bma2 | 0x40; break; }
  371.                        case 10: { bma2=bma2 | 0x20; break; }
  372.                        case 11: { bma2=bma2 | 0x10; break; }
  373.                        case 12: { bma2=bma2 | 0x08; break; }
  374.                        case 13: { bma2=bma2 | 0x04; break; }
  375.                        case 14: { bma2=bma2 | 0x02; break; }
  376.                        case 15: { bma2=bma2 | 0x01; break; }
  377.                        case 16: { bma3=bma3 | 0x80; break; }
  378.                        case 17: { bma3=bma3 | 0x40; break; }
  379.                        case 18: { bma3=bma3 | 0x20; break; }
  380.                        case 19: { bma3=bma3 | 0x10; break; }
  381.                        case 20: { bma3=bma3 | 0x08; break; }//按鍵狀態第1位
  382.                        case 21: { bma3=bma3 | 0x04; break; }
  383.                        case 22: { bma3=bma3 | 0x02; break; }
  384.                        case 23: { bma3=bma3 | 0x01;
  385.                                           
  386.                                                                      if(!rf_ok1)
  387.                                                                           {
  388.                                                                           mma1=bma1;mma2=bma2;mma3=bma3;//將接收到的編碼復制到解碼寄存器中                             
  389.                                           rf_ok1=1;                                // 通知解碼子程序可以解碼了
  390.                                           tb_ok=0;
  391.                                                                           bt_auto=0;
  392.                                                                           s=1000;
  393.                                                                           break;                                                                        
  394.                                                                         }
  395.                                                                         else
  396.                                                                                 {
  397.                                                                                   mmb1=bma1;mmb2=bma2;mmb3=bma3;//將再次接收到的編碼復制到解碼寄存器中,                             
  398.                                                   rf_ok2=1;                                // 通知解碼子程序可以解碼了
  399.                                                   tb_ok=0;
  400.                                                                                   bt_auto=0;
  401.                                                                                   break;                                                                                                                                                        
  402.                                                                                 }

  403.                                 }
  404.                      }
  405.                     ma_x++;
  406.                                        
  407.                   }
  408.             else {ma_x=0; tb_ok=0; bt_auto=0;bma1=0; bma2=0; bma3=0; hh_w=1;ll_w=0;}      //接收到不符合的高-低電平序列
  409.                ll_w=0;hh_w=1;
  410.                            }         
  411.          old_rc5=1;      // 記錄本次電平狀態
  412.        }
  413.         if(rf_ok1)                //規定時間內接受到2幀相同的編碼數據才有效
  414.                 {
  415.                         s--;
  416.                         if(!s) rf_ok1=0;
  417.                         if(rf_ok2)
  418.                                 {
  419.                                   if((mma1==mmb1)&&(mma2==mmb2)&&(mma3==mmb3))
  420.                                            {
  421.                                           rf_ok=1;
  422.                                           rf_ok1=0;
  423.                                           rf_ok2=0;                                         
  424.                                          }
  425.                                          else
  426.                                            {
  427.                                                   rf_ok=0;
  428.                                                   rf_ok1=0;
  429.                                                   rf_ok2=0;
  430.                                          
  431.                                            }
  432.                                                                   
  433.                                 }                                       
  434.                 }

  435.     if((rf_ok)&&(!study))                 //判斷是否是學習狀態
  436.                         {         
  437.                                 EA=0;
  438.                                 rf_ok=0;
  439.                                  
  440.                             for(x1=0;x1<10;x1++)
  441.                                            {
  442.                                                 if((mma1==key_number[x1*3+1])&&(mma2==key_number[x1*3+2])&&(mma3==key_number[x1*3+3]))
  443.                                                         {
  444.                                                                  
  445.                                                              mma8=mma3<<4;
  446.                                                                  if((mma8==0x10)||(mma3==0x03))
  447.                                                                          {
  448.                                                                           key1_ok=1;
  449.                                                                         }
  450.                                                                  else if ((mma8==0x20)||(mma3==0x0c))
  451.                                                                          {
  452.                                                                           key2_ok=1;
  453.                                                                         }
  454.                                                                  else if ((mma8==0x30)||(mma3==0x0f))
  455.                                                                          {
  456.                                                                           key3_ok=1;
  457.                                                                         }
  458.                                                                  else if ((mma8==0x40)||(mma3==0x30))
  459.                                                                          {
  460.                                                                           key4_ok=1;
  461.                                                                         }
  462.                                                                   else if ((mma8==0x50)||(mma3==0x33))
  463.                                                                          {
  464.                                                                           key5_ok=1;
  465.                                                                         }
  466.                                                                  else if ((mma8==0x60)||(mma3==0x3c))
  467.                                                                          {
  468.                                                                           key6_ok=1;
  469.                                                                         }
  470.                                                                  else if ((mma8==0x70)||(mma3==0x3f))
  471.                                                                          {
  472.                                                                           key7_ok=1;
  473.                                                                         }
  474.                                                                   else if ((mma8==0x80)||(mma3==0xc0))
  475.                                                                          {
  476.                                                                           key8_ok=1;
  477.                                                                         }
  478.                                                                  else if ((mma8==0x90)||(mma3==0xc3))
  479.                                                                          {
  480.                                                                           key9_ok=1;
  481.                                                                         }
  482.                                                                  else if ((mma8==0xa0)||(mma3==0xcc))
  483.                                                                          {
  484.                                                                           keya_ok=1;
  485.                                                                         }
  486.                                                                   else if ((mma8==0xb0)||(mma3==0xcf))
  487.                                                                          {
  488.                                                                           keyb_ok=1;
  489.                                                                         }
  490.                                                                  else if ((mma8==0xc0)||(mma3==0xf0))
  491.                                                                          {
  492.                                                                           keyc_ok=1;
  493.                                                                         }
  494.                                                                  else if ((mma8==0xd0)||(mma3==0xf3))
  495.                                                                          {
  496.                                                                           keyd_ok=1;
  497.                                                                         }
  498.                                                                    else if ((mma8==0xe0)||(mma3==0xfc))
  499.                                                                          {
  500.                                                                           keye_ok=1;
  501.                                                                         }
  502.                                                                  else if ((mma8==0xf0)||(mma3==0xff))
  503.                                                                          {
  504.                                                                           keyf_ok=1;
  505.                                                                         }
  506.                                                         


  507.                                                                 decode_ok=1;                                       
  508.                                                                 s1=1500;
  509.                                                                 break;
  510.                                                         }
  511.                                                                                        
  512.                                         }
  513.                                                                                                 
  514.                                                 

  515.                                         EA=1;
  516.                         }


  517.    if(decode_ok)   //解碼有效信號,類似2272 PT腳
  518.                   {
  519.                         s1--;
  520.                         if(!s1)
  521.                                 {
  522.                                         decode_ok=0;
  523.                                         key1_ok=0;
  524.                                         key2_ok=0;
  525.                                         key3_ok=0;
  526.                                         key4_ok=0;
  527.                                         key5_ok=0;
  528.                                         key6_ok=0;
  529.                                         key7_ok=0;
  530.                                         key8_ok=0;
  531.                                         key9_ok=0;
  532.                                         keya_ok=0;
  533.                                         keyb_ok=0;
  534.                                         keyc_ok=0;
  535.                                         keyd_ok=0;
  536.                                         keye_ok=0;
  537.                                         keyf_ok=0;
  538.                                        
  539.                                 }                                 
  540.                   }         
  541.    }


  542. /************************************************************
  543. * 功能名稱:遙控器碼學習函數
  544. * 功能描述:
  545. * 參數:無
  546. * 返回:無
  547. ************************************************************/

  548. void KEY_study()        //遙控器學習
  549. {        
  550.         uchar num_rf;
  551.         uchar d_num;
  552.         if(study==1)
  553.                 {
  554.                            rf_ok=0;
  555.                         d_num=0;
  556.         
  557.                         while(!rf_ok)
  558.                                 {
  559.                                         delay_1ms(100);
  560.                                         d_num++;
  561.                                         if(d_num>200) break;                                                                        
  562.                                 }
  563.                         d_num=0;
  564.                         if(rf_ok==1)
  565.                                 {
  566.                                         EA=0;
  567.                                         num_rf=key_number[0];                   //取已學習的遙控器數量
  568.                                         if(num_rf>20){num_rf=0;}        //如果遙控器數量超過10個,覆蓋最先學習的
  569.                                         key_number[num_rf*3+1]=mma1;
  570.                                         key_number[num_rf*3+2]=mma2;
  571.                                         key_number[num_rf*3+3]=mma3;
  572.                                         key_number[0]=num_rf+1;

  573.                                         Sector_Erase(0x0000);
  574.                                         for(num_rf=0;num_rf<32;num_rf++)
  575.                                                 {
  576.                                                         write_add(0x0000+num_rf,key_number[num_rf]);                                                        
  577.                                                 }

  578.                                         rf_ok=0;
  579.                    if(SBT8818_02)
  580.                            {LED1=1;}
  581.                                         LED2=1;
  582.                                         //LED_green=1;
  583.                                         delay_1ms(500);
  584.                                         EA=1;
  585.                                        
  586.                                   }        
  587.                                 else
  588.                                         {
  589.                                                 rf_ok=0;

  590.                                                 for(num_rf=0;num_rf<4;num_rf++)                   //操作超時
  591.                                                         {
  592.                                                                 LED2=1;
  593.                                                                 if(SBT8818_02)
  594.                                        {LED1=1;}
  595.                                                                 delay_1ms(500);
  596.                                                                 LED2=0;
  597.                                                                 if(SBT8818_02)
  598.                                        {LED1=0;}
  599.                                                                 delay_1ms(500);
  600.                                                                 LED2=1;
  601.                                                                 if(SBT8818_02)
  602.                                        {LED1=1;}
  603.                                                                                                                         
  604.                                                         }
  605.                                                  set=1;
  606.                                        
  607.                                         }
  608.                         d_num=0;
  609.                         study=0;
  610.                         /*if(OUT){LED_green=0;LED_red=1;
  611.                                }
  612.                         else {LED_red=0;
  613.                               LED_green=1;
  614.                               }        
  615.                            */
  616.                 }
  617. }
  618. /************************************************************
  619. * 功能名稱:把遙控器碼從 EEPROM 復制到DATA函數
  620. * 功能描述:
  621. * 參數:無
  622. * 返回:無
  623. ************************************************************/
  624. void key_buffer()                  //把遙控器碼從 EEPROM 復制到DATA
  625. {
  626.         uchar n;

  627.         for(n=0;n<31;n++)
  628.                 {
  629.                    key_number[n]=read_add(0x0000+n);                        
  630.                 }
  631.         key_number[32]=read_add(0x0200+1);
  632. }
  633. /************************************************************
  634. * 功能名稱:記憶清零函數
  635. * 功能描述:
  636. * 參數:無
  637. * 返回:無
  638. ************************************************************/
  639. void system_res()  //系統清零           
  640. {
  641.         Sector_Erase(0x0000);        
  642.         write_add(0x0000,0x00);        
  643.     key_buffer();               

  644. }
  645. void system_res1()  //系統清零           
  646. {
  647.         Sector_Erase(0x0200);        
  648.         write_add(0x0200,0x00);        
  649.         key_buffer();               

  650. }
  651. /************************************************************
  652. * 功能名稱:寫數據到 EEPROM 函數
  653. * 功能描述:
  654. * 參數:無
  655. * 返回:無
  656. ************************************************************/
  657. void DATA_WRITE_EPPROM()               
  658. {
  659.         EA=0;
  660.                 Sector_Erase(0x0200);
  661.                 key_number[32]=mma4;
  662.                 write_add(0x0200+1,key_number[32]);
  663.                 EA=1;
  664. }

  665. /************************************************************
  666. * 功能名稱:按鍵掃描函數
  667. * 功能描述:
  668. * 參數:無
  669. * 返回:無
  670. ************************************************************/
  671. void set_scan()          //判斷學習鍵狀態
  672. {
  673. uchar h=0,k;

  674. if(!set)
  675.         {
  676.           while(!set)                  
  677.                 {        if(h>0)
  678.                     {        
  679.                              LED2=1;
  680.                               study1=1;
  681.                                 while(!set)        
  682.                                 {
  683.                                    delay_1ms(100);
  684.                                    h++;
  685.                                if(h>60)
  686.                                    {
  687.                                         study=1;
  688.                                         study1=0;
  689.                                         h=0;
  690.                                         //LED_Flashing(2);
  691.                                         for(k=0;k<1;k++)                 
  692.                                                         {
  693.                                                             LED2=1;
  694.                                                                 if(SBT8818_02)
  695.                                        {LED1=1;}
  696.                                                             delay_1ms(1500);
  697.                                                             LED2=0;
  698.                                                                 if(SBT8818_02)
  699.                                        {LED1=0;}
  700.                                 delay_1ms(1500);
  701.                                                         }
  702.                                         while(!set)
  703.                                                 {
  704.                                                   delay_1ms(100);
  705.                                                   h++;
  706.                                                   if(h>120)
  707.                                                           {
  708.                                                                    study=0;
  709.                                                                 h=0;
  710.                                                                 system_res();
  711.                                                                 for(k=0;k<2;k++)                   //刪除成功
  712.                                                         {
  713.                                                                LED2=1;
  714.                                                                if(SBT8818_02)
  715.                                             {LED1=1;}
  716.                                                                delay_1ms(500);
  717.                                                                LED2=0;
  718.                                    if(SBT8818_02)
  719.                                              {LED1=0;}
  720.                                                                delay_1ms(500);
  721.                                                                 LED2=1;
  722.                                                                     if(SBT8818_02)
  723.                                               {LED1=1;}                                                
  724.                                                         }

  725.                                                                 while(!set)
  726.                                                                 {
  727.                                                                    delay_1ms(100);
  728.                                                             h++;
  729.                                                                     if(h>200)
  730.                                                                         {
  731.                                                                                 h=0;
  732.                                                                          system_res1() ;
  733.                                                                          for(k=0;k<5;k++)                   //刪除成功
  734.                                                                  {
  735.                                                                       LED2=1;
  736.                                                                       if(SBT8818_02)
  737.                                                      {LED1=1;}
  738.                                                                       delay_1ms(500);
  739.                                                                       LED2=0;
  740.                                           if(SBT8818_02)
  741.                                                     {LED1=0;}
  742.                                                                       delay_1ms(500);
  743.                                                                          LED2=1;
  744.                                                                           if(SBT8818_02)
  745.                                                     {LED1=1;}                                                
  746.                                                                  }
  747.                                                                                  while(!set);
  748.                                                                         }
  749.                                                                 }
  750.                                                                
  751.                                                         }
  752.                                                 
  753.                                                 }
  754.                                         }
  755.                                 }
  756.                         }

  757.                         delay_1ms(100);
  758.                         h++;
  759.                  }
  760.                  
  761.            if(study1)
  762.            {         
  763.               timer_H = 0;
  764.               timer_M = 0;
  765.               timer_S = 0;
  766.                         
  767.               if(goout)
  768.                            {
  769.                             OUT=0;
  770.                          goout=0;
  771.                          }
  772.               else
  773.                         {
  774.                             OUT=1;
  775.                          goout=1;
  776.                            }
  777.              beep_on_off();
  778.                  if(SBT8828_04)
  779.                  {mma4=goout;DATA_WRITE_EPPROM();}
  780.                  study1=0;
  781.                 }
  782.           if(study)
  783.                         {
  784.                                 KEY_study();
  785.                                 study=0;
  786.                         }
  787.         }


  788.                  
  789. }



  790.   /*

  791. //---觸摸采集

  792. unsigned int TOUCH_SCAN()
  793. {
  794.         unsigned int result=0;

  795.         P3M1&=0X08;
  796.         P3M0&=0X00;
  797.         PAD=1;                        //充電
  798.         
  799.         T2L = 0x00;         //設置定時初值
  800.         T2H = 0x00;         //設置定時初值        
  801.                
  802.                
  803.         //TH1 = 0;
  804.         //TL1 = 0;
  805.         Delay_Us(100);
  806.         TR0=0;
  807.         //TR1 = 1;
  808.         //IE2 |= 0x04;                        //允許定時器2產生中斷
  809.         AUXR |= 0x10;                //定時器2開始計時
  810.         P3M1=0X28;                //轉為高阻        
  811.         while (PAD);        //等待放電完成

  812.         AUXR &=  ~(1<<4);        //Timer2 停止運行

  813.         //TR1 =0;        
  814.         TR0=1;
  815.         result =T2H <<8;
  816.         result|=T2L;
  817.         return result;
  818. }


  819. //---測量電容并處理數據

  820. void TOUCH_Process()
  821. {
  822.         uchar i=0;        
  823.         uint pad_val[TOUCH_SAMPLE_NUMBER];                        //當前值
  824.         unsigned long pad_sum=0;                                        //中間值總和
  825.         

  826.         for (;i<TOUCH_SAMPLE_NUMBER;i++)                                  //采樣
  827.         {
  828.                 pad_val[i]=TOUCH_SCAN();
  829.                 Delay_Us(10);
  830.         }

  831.         for (i=0;i<TOUCH_SAMPLE_NUMBER;i++)                          //去極值,求和for (i=1;i<TOUCH_SAMPLE_NUMBER-1;i++)
  832.         {
  833.                 pad_sum+=pad_val[i];
  834.         }
  835.         pad_val[0]=pad_sum/(TOUCH_SAMPLE_NUMBER);        //當前有效值

  836.         if(pad_val[0]>(pad_average+140))s2=5;                //不同介質,需要修改此值

  837.            else if(pad_val[0]<pad_average+150)                //不同介質,需要修改此值
  838.                           {                             
  839.                                    pad_average=pad_average+((long)pad_val[0]-(long)pad_average)/16;
  840.                           }
  841.                           
  842.         if(s2>0)
  843.                 {
  844.                         s2--;
  845.                         if(!pad_new)
  846.                                 {
  847.                                         OUT=!OUT;
  848.                                          beep_on_off();
  849.                                         pad_new=1;                                                
  850.                                                 }                                                                                
  851.                 }
  852.                 else  
  853.                         {pad_new=0;}
  854.                                 

  855. }*/
  856.         
  857.   /********************************************************************
  858.                                                           定時器中斷2初始化
  859.   *********************************************************************/
  860.   /*******************************************************************/
  861.   void Timer2_Init(void)                //50毫秒@12.000MHz
  862.   {

  863.           AUXR &= 0xFB;           //定時器時鐘12T模式
  864.           T2L = 0x58;          //設置定時初值
  865.           T2H = 0x9e;          //設置定時初值  
  866.           IE2 |= 0x04;                          //允許定時器2產生中斷
  867.           AUXR |= 0x10;           //定時器2開始計時

  868.          
  869.          
  870.   }

  871. /************************************************************
  872. * 功能名稱:上電初始化函數
  873. * 功能描述:
  874. * 參數:無
  875. * 返回:無
  876. ************************************************************/
  877. void system_start()   //上電初始化
  878. {        
  879.     P3M1=0X08;     //P3^3配置為輸入
  880.         P3M0=0X00;
  881.           P3=0xff;           //所有IO口置高
  882.     TMOD=0x11;   //T1/T0方式1,做定時器用,兩個定時器
  883.         TL0=0xb5;           //b5 低位裝數
  884.         TH0=0xfe;           //fe  高位裝數
  885.         ET0=1;        //允許T0中斷
  886.         TR0=1;        //定時器0開啟

  887.         //TL1=0x00;           //b5
  888.         //TH1=0x00;           //fe
  889.         //ET1=1;        //允許T1中斷
  890.         key_buffer();

  891.         Timer2_Init();
  892. //        pad_average=0x0fff;                                                          //平均值
  893.                
  894.         EA=1;

  895. }



  896. /************************************************************
  897. * 功能名稱:主函數
  898. * 功能描述:
  899. * 參數:無
  900. * 返回:無
  901. ************************************************************/
  902. void main()
  903. {

  904. AUXR=0xc0;     //設置定時器是傳統8051的12倍


  905. system_start();
  906. LED1=0;
  907. PAD=1;
  908. if(SBT8818_02)
  909.            {
  910.            LED1=1;
  911.                    }
  912. LED2=1;

  913. OUT=0;
  914. goout=0;
  915. if(SBT8828_01)
  916.                    {
  917.                     //if(PAD){OUT=1;goout=1;}
  918.                             //else{OUT=0;goout=0;}
  919.                                 if(!set){mma4=0;DATA_WRITE_EPPROM();}
  920.                                 delay_1ms(500);
  921.                                 key_number[32]=read_add(0x0200+1);
  922.                                 if(key_number[32]){ OUT=0;goout=0; }
  923.                         else{ OUT=1;goout=1;}
  924.                    }
  925. if(SBT8828_04)
  926.            {
  927.              if(key_number[32]){ OUT=1;goout=1;}
  928.                  else{OUT=0;goout=0;}

  929.                 }
  930. while(1)
  931. {

  932.         delay_1ms(300);
  933. //========================================= LED—ON/off        
  934.         if((key1_ok)|| (key2_ok)||(key4_ok)||(key8_ok))
  935.         {
  936.           timer_H = 0;
  937.           timer_M = 0;
  938.           timer_S = 0;
  939.            
  940.            if(goout)
  941.                    {
  942.                     OUT=0;
  943.                  goout=0;
  944.                    }
  945.            else
  946.                    {
  947.                     OUT=1;
  948.                  goout=1;
  949.                    }
  950.            beep_on_off();
  951.            if(SBT8828_04)
  952.            {mma4=goout;DATA_WRITE_EPPROM();}
  953.         }
  954.         
  955.         
  956. //========================================= LED—ON

  957.             if((key3_ok)||(key5_ok)||(key6_ok)||(key7_ok)||(key9_ok) )
  958.         {
  959.           timer_H = 0;
  960.           timer_M = 0;
  961.           timer_S = 0;
  962.           OUT=1;
  963.           goout=1;
  964.           beep_on_off();
  965.            if(SBT8828_04)
  966.            {mma4=goout;DATA_WRITE_EPPROM();}
  967.         }
  968.         
  969. //============================================LED-OFF
  970.     if((keya_ok)||(keyb_ok)||(keyc_ok)||(keyd_ok)||(keye_ok) )
  971.         {
  972.           timer_H = 0;
  973.           timer_M = 0;
  974.           timer_S = 0;
  975.           OUT=0;
  976.           goout=0;
  977.           beep_on_off();
  978.            if(SBT8828_04)
  979.            {mma4=goout;DATA_WRITE_EPPROM();}
  980.         }
  981.         
  982. //============================================                 
  983.         while(decode_ok);
  984.         set_scan();
  985.      //GUANGMIN__scan() ;
  986.         
  987. }  

  988. }


  989. /************************************************************
  990. * 功能名稱:定時器2中斷函數
  991. * 功能描述:
  992. * 參數:無
  993. * 返回:無
  994. ************************************************************/


  995. void Timer2Interrupt(void) interrupt 12 using 1
  996. {
  997.            TL2 = 0x58;        //設置定時初值
  998.     TH2 = 0x9e;        //設置定時初值
  999.     if ( ++Timer2_50Ms>= 20 )  //  1000MS定時
  1000.           {
  1001.             Timer2_50Ms = 0 ;
  1002.                    timer_S  ++;
  1003.                         if (timer_S  > 59)
  1004.                 {
  1005.                         timer_S = 0;
  1006.                         timer_M ++;                                                                /*-- 分--*/

  1007.                         if (timer_M > 59)
  1008.                         {
  1009.                                 timer_M = 0;
  1010.                                 timer_H  ++;                                                        /*-- 時--*/

  1011.                                 if (timer_H  > 7)
  1012.                                 {
  1013.                                     timer_H  = 0;
  1014.                                                                         OUT=0;
  1015.                                                            goout=0;
  1016.                                            beep_on_off();
  1017.                                 }
  1018.                            
  1019.                         }
  1020.                                 }
  1021.                         }
  1022. }

復制代碼
回復

使用道具 舉報

ID:213173 發表于 2018-3-10 21:16 | 顯示全部樓層
芯片型號 : STC15F104E
關于此芯片的重要說明:
無硬件串口,可用軟件模擬串口 (范例代碼中有參考代碼)
有定時器0和定時器1 (注意:無定時器2)

芯片型號 : STC15W408AS
關于此芯片的重要說明:
有定時器0和定時器2 (注意:無定時器1, 有3路CCP可作3個定時器使用)
有比較器 (可當作一路ADC使用)
有SPI (可為主模式和從模式)
有3路PCA/PWM/CCP (可用作DAC)
有8通道10位精度的A/D

從以上資料看兩者除了定時器有所不同外,STC15W408AS基本可以直接替代STC15F104E

評分

參與人數 1黑幣 +50 收起 理由
admin + 50 回帖助人的獎勵!

查看全部評分

回復

使用道具 舉報

ID:438886 發表于 2020-1-25 23:25 | 顯示全部樓層
好像是把上電初始狀態改成0
回復

使用道具 舉報

ID:159575 發表于 2020-1-27 18:59 來自觸屏版 | 顯示全部樓層
軟件的話,改輸出引腳01反過來,硬件就加個非門電路。
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 高清免费在线 | 韩日一区二区 | 欧美精品一区二区三区四区 | 久久精品欧美一区二区三区麻豆 | 日韩成人在线免费视频 | 天天操天天干天天爽 | 日韩精品视频一区二区三区 | 久久久精品 | 中文字幕在线一区二区三区 | 黄色成人在线网站 | 一本色道久久综合亚洲精品高清 | 岛国毛片在线观看 | 国产精品一区二区三 | 欧美一区二区三区四区视频 | 午夜精品福利视频 | 在线天堂免费中文字幕视频 | 国产成人精品一区二区三区视频 | 欧美影院 | 精品久久久久久久久亚洲 | 久久久91精品国产一区二区三区 | 欧美日韩中文在线 | 日韩欧美网 | 一区二区高清 | 精品网| 久久久久国产精品一区二区 | 国产一级淫片免费视频 | 综合亚洲视频 | av大片| 一区二区三区四区不卡 | 麻豆久久久 | 91精品国产综合久久久久久漫画 | 午夜丁香视频在线观看 | 成人免费网视频 | 国产小视频自拍 | 人人天天操 | 99视频在线播放 | 精品一区二区三区在线视频 | 国产成人jvid在线播放 | 超级黄色一级片 | 91久久久久久久久久久久久 | 在线不卡一区 |