找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4525|回复: 3
打印 上一主题 下一主题
收起左侧

STC15F104E单片机开关c程序 P3^4口如何设置为推挽输出?

[复制链接]
回帖奖励 30 黑币 回复本帖可获得 30 黑币奖励! 每人限 1 次
跳转到指定楼层
楼主
以下代码在通电时P3.4 会有短暂的信号输出,继电器会滴答一下,用来控制电器的,这样会对电器造成冲击容易损害电器
要求:把通电时P3.4 短暂的输出信号去掉
P3^4口如何设置为推挽输出?

下面是STC15F104E单片机程序源码
  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;           //RF_in                                                8                                                                                                                           
  38. sbit PAD                         =        P3^5;           //光敏检测                                        3         
  39. sbit LED2                    =        P3^0;           //RESET                                      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. }
复制代码
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:213173 发表于 2018-7-5 09:17 | 只看该作者
解决这个问题需要软件硬件一起使用才行,不清楚你的继电器驱动电路什么样,此改动是按高电平有效设置。

/************************************************************
* 功能名称:上电初始化函数
* 功能描述:
* 参数:无
* 返回:无
************************************************************/
void system_start()   //上电初始化
{        
        P3M1=0x08;     //P3^3配置为高阻输入,P3^4推挽输出0000 1000
        P3M0=0x10;     //P3^3配置为高阻输入,P3^4推挽输出0001 0000
//        P3=0xff;       //所有IO口置高
        P3=0xef;       //P3^4低电平,其他IO口置高
        TMOD=0x11;           //T1/T0方式1,做定时器用,两个定时器
        TL0=0xb5;           //b5 低位装数
        TH0=0xfe;           //fe  高位装数
        ET0=1;        //允许T0中断
        TR0=1;        //定时器0开启       
        //TL1=0x00;           //b5
        //TH1=0x00;           //fe
        //ET1=1;        //允许T1中断
        key_buffer();
       
        Timer2_Init();
        //        pad_average=0x0fff; //平均值
       
    EA=1;
}




回复

使用道具 举报

板凳
ID:213173 发表于 2018-7-5 09:39 | 只看该作者
软件改这样更合理些:
/************************************************************
* 功能名称:上电初始化函数
* 功能描述:
* 参数:无
* 返回:无
************************************************************/
void system_start()   //上电初始化
{        
        P3=0xef;       //P3^4低电平,其他IO口置高
        P3M1=0x08;     //P3^3配置为高阻输入,P3^4推挽输出0000 1000
        P3M0=0x10;     //P3^3配置为高阻输入,P3^4推挽输出0001 0000
//        P3=0xff;       //所有IO口置高

        TMOD=0x11;           //T1/T0方式1,做定时器用,两个定时器
        TL0=0xb5;           //b5 低位装数
        TH0=0xfe;           //fe  高位装数
        ET0=1;        //允许T0中断
        TR0=1;        //定时器0开启       
        //TL1=0x00;           //b5
        //TH1=0x00;           //fe
        //ET1=1;        //允许T1中断
        key_buffer();
       
        Timer2_Init();
        //        pad_average=0x0fff; //平均值
       
    EA=1;
}
回复

使用道具 举报

地板
ID:17109 发表于 2018-7-14 10:07 | 只看该作者
wulin 发表于 2018-7-5 09:39
软件改这样更合理些:
/************************************************************
* 功能名称:上 ...

STC15F104E单片机修改设置为推挽输出         还是有通电时P3.4 有短暂的信号输出     应该看来 不是推挽输出问题             那位师博能查看   这程序那部份出问题呢什样修改才能去   通电时P3.4 有短暂的信号输出
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表