找回密码
 立即注册

QQ登录

只需一步,快速开始

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

stc15f104e单片机程序 ,峰鸣器 高电平输出 改低电平输出要什样修改才能在低电平峰...

[复制链接]
跳转到指定楼层
楼主
ID:17109 发表于 2018-4-1 17:43 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
stc15f104e单片机程序   ,峰鸣器     高电平输出   改低电平输出     要什样修改才能在低电平峰鸣器使用,有了解c程序这方面的朋友吗?帮帮小弟修改谢谢

#include <reg52.h>
#include <intrins.h>
        
sfr AUXR=0x8e;  //设置定时器1/0是分频还是不分频的计程器
sfr IAP_DATA    = 0xC2;  //片内EEPROM资源声明
sfr IAP_ADDRH   = 0xC3;
sfr IAP_ADDRL   = 0xC4;
sfr IAP_CMD     = 0xC5;
sfr IAP_TRIG    = 0xC6;
sfr IAP_CONTR   = 0xC7;
sfr P3M0  =0xb2;
sfr P3M1  =0xb1;
sfr IE2  = 0xAF;
sfr INT_CLKO = 0x8F;
sfr T2H  = 0xD6;
sfr T2L  = 0xD7;
#define uchar unsigned char
#define uint  unsigned int

/************************************************************
* 功能名称:型号定义
* 功能描述:
* 参数:无
* 返回:无
************************************************************/
//#define  SBT8818_01   0   //86WIFI墙壁开关
#define  SBT8818_02   0  //86摇控墙壁开关
#define  SBT8828_01   1 //摇控灯座
#define  SBT8828_02   0 //移动摇控插座
#define  SBT8828_03   0 //86摇控墙壁插座
#define  SBT8828_04   0 //86摇控双控墙壁开关

/************************************************************
* 功能名称:MCU脚位定义
* 功能描述:
* 参数:无
* 返回:无
************************************************************/
sbit RF    = P3^3;    //RF_in      8                  
sbit PAD    = P3^5;    //光敏检测     3   
sbit LED2      = P3^0;    //RESET          5
sbit OUT   = P3^4;    //控制输出     1
sbit set   = P3^2;    //按键      7
sbit LED1   = P3^1;    //指示      6
/************************************************************
* 功能名称:变量的定义
* 功能描述:
* 参数:无
* 返回:无
************************************************************/
//uint key_repeat_num;
bit  decode_ok;   //解码成功
bit key1_ok;
bit key2_ok;
bit key3_ok;
bit key4_ok;
bit key5_ok;
bit key6_ok;
bit key7_ok;
bit key8_ok;
bit key9_ok;
bit keya_ok;
bit keyb_ok;
bit keyc_ok;
bit keyd_ok;
bit keye_ok;
bit keyf_ok;
bit goout;//控制输出标记
uchar Timer2_50Ms=0,timer_S=0 ,timer_M=0,timer_H=0 ;

uchar  hh_w,ll_w;           //高,低电平宽度
uchar  ma_x;                //接收到第几位编码了
uchar  bma1,bma2,bma3; //用于接收过程存放遥控编码,编码比较两次,这是第一次
uchar idata mmb1; // 用于接收过程存放遥控编码,第二次
uchar idata mmb2;
uchar idata mmb3;
bit rf_ok1,rf_ok2;   //解码过程中的临时接收成功标志
bit old_rc5;             //保存上一次查询到的电平状态
bit tb_ok;               //接收到同步的马时置1   
uchar  mma1,mma2,mma3,mma4; //用于解码过程
uchar  mma8;

bit rf_ok;               //接收到一个完整的遥控命令后置1,通知解码程序可以解码了
bit study;     //进入学习状态标志
bit study1;     //开关状态标志
bit system_int;    //系统清零标志   
uchar temp_h,temp_l;
bit bt_auto;     //自动设置遥控接收波特率标志
bit L_M_select;
uint s,s1;
uchar s2;
uchar idata key_number[33];  //遥控器编码数组,存放10个遥控器


/************************************************************
  * 功能名称:延迟函数
  * 功能描述:
  * 参数:无
  * 返回:无
  ************************************************************/
/*(void Delay_Us(unsigned char time)
{
while (time--)
{
  ;
}
}
*/

void delay_1ms(uint x)    //1毫秒延时
{
uchar b,c;
for(x;x>0;x--)
{
  for(b=3;b>0;b--)
   {
    for(c=150;c>0;c--);
   }
}
}
  /************************************************************
  * 功能名称:指示标记函数
  * 功能描述:
  * 参数:无
  * 返回:无
  ************************************************************/

void beep_on_off()
{   
uint e;
   
   if( SBT8818_02)
      {
          for(e=0;e<5;e++)
    {
   LED1=0;
   LED2=0;
   delay_1ms(300) ;
   LED1=1;
   LED2=1;
   delay_1ms(300) ;
    }
      }
    if( SBT8828_01)
      {
          for(e=0;e<5;e++)
    {
   LED1=1;
   delay_1ms(300) ;
   LED1=0;
   delay_1ms(300) ;
    }
      }
     if( SBT8828_02)
      {
          for(e=0;e<5;e++)
    {
   LED1=1;
   LED2=0;
   delay_1ms(300) ;
   LED1=0;
   LED2=1;
   delay_1ms(300) ;
    }
      }
   if( SBT8828_03)
      {
          for(e=0;e<5;e++)
    {
   LED1=1;
   LED2=0;
   delay_1ms(300) ;
   LED1=0;
   LED2=1;
   delay_1ms(300) ;
    }
    if(goout)
     {LED2=0;}
    else
     {LED2=1;}
      }
   if( SBT8828_04)
      {
          for(e=0;e<5;e++)
    {
   LED1=1;
   LED2=0;
   delay_1ms(300) ;
   LED1=0;
   LED2=1;
   delay_1ms(300) ;
    }
      }
   
  
}
  /************************************************************
  * 功能名称:光敏电阻检测函数
  * 功能描述:
  * 参数:无
  * 返回:无
  ************************************************************/
/*void GUANGMIN__scan()
{
if(timer_H>0)
{
     if(!PAD)
          {
           delay_1ms(100) ;
              if(!PAD)
          {
          OUT=1;
          goout=1;
          beep_on_off();
          }
           }
     else
        {
        OUT=0;
       goout=0;
       beep_on_off();
          }
}
}  */
  
/************************************************************
* 功能名称:EEPROM函数
* 功能描述:
* 参数:无
* 返回:无
************************************************************/

//====================================================
/////////片内EEPROM读写驱动程序///////////////////////////
//====================================================

void IAP_Disable()    //关闭IAP
{
    //关闭IAP 功能, 清相关的特殊功能寄存器,使CPU 处于安全状态,
    //一次连续的IAP 操作完成之后建议关闭IAP 功能,不需要每次都关
    IAP_CONTR = 0;      //关闭IAP 功能
    IAP_CMD   = 0;      //清命令寄存器,使命令寄存器无命令,此句可不用
    IAP_TRIG = 0;      //清命令触发寄存器,使命令触发寄存器无触发,此句可不用
    IAP_ADDRH = 0;
    IAP_ADDRL = 0;
}//

//读一字节,调用前需打开IAP 功能,入口:DPTR = 字节地址,返回:A = 读出字节
uchar read_add(uint addr)  //读EEPROM
{
    IAP_DATA = 0x00;
    IAP_CONTR = 0x84;         //打开IAP 功能, 设置Flash 操作等待时间
    IAP_CMD = 0x01;                 //IAP/ISP/EEPROM 字节读命令
    IAP_ADDRH = addr>>8;    //设置目标单元地址的高8 位地址
    IAP_ADDRL = addr&0xff;    //设置目标单元地址的低8 位地址
    EA = 0;
    IAP_TRIG = 0x5a;   //先送 46h,再送B9h 到ISP/IAP 触发寄存器,每次都需如此
    IAP_TRIG = 0xa5;   //送完 B9h 后,ISP/IAP 命令立即被触发起动
    _nop_();
    EA = 1;
    IAP_Disable(); //关闭IAP 功能, 清相关的特殊功能寄存器,使CPU 处于安全状态,
                    //一次连续的IAP 操作完成之后建议关闭IAP 功能,不需要每次都关
    return (IAP_DATA);
}//------------------------------------------------------------------------------

//字节编程,调用前需打开IAP 功能,入口:DPTR = 字节地址, A= 须编程字节的数据
void write_add(uint addr,uchar ch)  //直接写EEPROM
{
    IAP_CONTR = 0x84;         //打开 IAP 功能, 设置Flash 操作等待时间
    IAP_CMD = 0x02;                 //IAP/ISP/EEPROM 字节编程命令

    IAP_ADDRH = addr>>8;    //设置目标单元地址的高8 位地址
    IAP_ADDRL = addr&0xff;    //设置目标单元地址的低8 位地址
    IAP_DATA = ch;                  //要编程的数据先送进IAP_DATA 寄存器
    EA = 0;
    IAP_TRIG = 0x5a;   //先送 46h,再送B9h 到ISP/IAP 触发寄存器,每次都需如此
    IAP_TRIG = 0xa5;   //送完 B9h 后,ISP/IAP 命令立即被触发起动
    _nop_();
    EA = 1;
    IAP_Disable(); //关闭IAP 功能, 清相关的特殊功能寄存器,使CPU 处于安全状态,
                    //一次连续的IAP 操作完成之后建议关闭IAP 功能,不需要每次都关
}//------------------------------------------------------------------------------
//擦除扇区, 入口:DPTR = 扇区地址

void Sector_Erase(uint addr)  //扇区擦除
{
     IAP_CONTR = 0x84;         //打开IAP 功能, 设置Flash 操作等待时间
    IAP_CMD = 0x03;                 //IAP/ISP/EEPROM 扇区擦除命令
    IAP_ADDRH =addr>>8;    //设置目标单元地址的高8 位地址
    IAP_ADDRL =addr&0xff;    //设置目标单元地址的低8 位地址
    EA = 0;
    IAP_TRIG = 0x5a;   //先送 46h,再送B9h 到ISP/IAP 触发寄存器,每次都需如此
    IAP_TRIG = 0xa5;   //送完 B9h 后,ISP/IAP 命令立即被触发起动
    _nop_();
    EA = 1;
}//------------------------------------------------------------------------------
/************************************************************
* 功能名称:定时器0中断函数
* 功能描述:
* 参数:无
* 返回:无
************************************************************/
void timeint() interrupt 1    //遥控接收,通过定时器0中断,定时去查询
   {   
      uchar x1;
//   mtb++;
   if(!bt_auto)   //自适应波特率标志
     {
        TL0=0x00;             //   430K:FE/B5   220K:FF/30
    TH0=0xfe;     
     }
  else
   {
    TL0=temp_l;             //   430K:FE/B5   220K:FF/30
    TH0=temp_h;   
   }
   TF0=0;                // 清除T0中断标志
   
      if (!RF) { ll_w++;old_rc5=0; }           // 检测到低电平 低电平时间加1,记录本次电平状态
       else                                      // 检测到高电平
        { hh_w++;
         if (!old_rc5)                          // 检测到从低到高的跳变,已检测到一个完整(高-低)电平周期
          { if (((hh_w>=2)&&(hh_w<=8))&&((ll_w>=50)&&(ll_w<=190)))          //判同步码   2/5 110/140
             {
     
    if((ll_w>=110)&&(ll_w<=140)){ma_x=0;tb_ok=1;bma1=0; bma2=0; bma3=0; bt_auto=0;}  //根据不同 同步码 宽度,T0加载不同初值
       else
     {  
       if((ll_w>140)&&(ll_w<=160))
        { ma_x=0;tb_ok=1;bma1=0; bma2=0; bma3=0; bt_auto=1;temp_h=0xfd;temp_l=0xb6; }//fe  6b      
        else
       {  
        if((ll_w>160)&&(ll_w<=190))
         { ma_x=0;tb_ok=1;bma1=0; bma2=0; bma3=0; bt_auto=1;temp_h=0xfd;temp_l=0x27; } //fd  dc
       else
        {      
          if((ll_w>70)&&(ll_w<=90))
           {ma_x=0;tb_ok=1;bma1=0; bma2=0; bma3=0; bt_auto=1;temp_h=0xfe;temp_l=0x7b; } //ff  30
         else
          {
            if((ll_w>90)&&(ll_w<=110))
             {ma_x=0;tb_ok=1;bma1=0; bma2=0; bma3=0; bt_auto=1;temp_h=0xfe;temp_l=0x4b; } //ff  00
           else
             {
             if((ll_w>=50)&&(ll_w<=70))
               {ma_x=0;tb_ok=1;bma1=0; bma2=0; bma3=0; bt_auto=1;temp_h=0xfe;temp_l=0xc5; }//ff  7a
                     
             }
   
          }
        }         
       }
       }   
             }
            else if ((tb_ok)&&((ll_w>=10)&&(ll_w<=14)))  //   10/14
    {  
     ma_x++;    //已经接收到同步码,判0
     if(ma_x>23)
      {
         if(!rf_ok1)
         {
         mma1=bma1;mma2=bma2;mma3=bma3;//将接收到的编码复制到解码寄存器中                             
                              rf_ok1=1;                                // 通知解码子程序可以解码了
                              tb_ok=0;
         bt_auto=0;
         s=1000;        
       }
       else
        {
          mmb1=bma1;mmb2=bma2;mmb3=bma3;//将接收到的编码复制到解码寄存器中                             
                                  rf_ok2=1;                                // 通知解码子程序可以解码了
                                  tb_ok=0;
          bt_auto=0;                  
        }
      }
     }  
            else if ((tb_ok)&&((ll_w>=2)&&(ll_w<=8)))     //   3/5
                  { switch (ma_x)
                     {
        case 0 : { bma1=bma1 | 0x80; break; }//遥控编码第1位
                       case 1 : { bma1=bma1 | 0x40; break; }
                       case 2 : { bma1=bma1 | 0x20; break; }
                       case 3 : { bma1=bma1 | 0x10; break; }
                       case 4 : { bma1=bma1 | 0x08; break; }
                       case 5 : { bma1=bma1 | 0x04; break; }
                       case 6 : { bma1=bma1 | 0x02; break; }
                       case 7 : { bma1=bma1 | 0x01; break; }
                       case 8 : { bma2=bma2 | 0x80; break; }
                       case 9 : { bma2=bma2 | 0x40; break; }
                       case 10: { bma2=bma2 | 0x20; break; }
                       case 11: { bma2=bma2 | 0x10; break; }
                       case 12: { bma2=bma2 | 0x08; break; }
                       case 13: { bma2=bma2 | 0x04; break; }
                       case 14: { bma2=bma2 | 0x02; break; }
                       case 15: { bma2=bma2 | 0x01; break; }
                       case 16: { bma3=bma3 | 0x80; break; }
                       case 17: { bma3=bma3 | 0x40; break; }
                       case 18: { bma3=bma3 | 0x20; break; }
                       case 19: { bma3=bma3 | 0x10; break; }
                       case 20: { bma3=bma3 | 0x08; break; }//按键状态第1位
                       case 21: { bma3=bma3 | 0x04; break; }
                       case 22: { bma3=bma3 | 0x02; break; }
                       case 23: { bma3=bma3 | 0x01;
        
             if(!rf_ok1)
           {
           mma1=bma1;mma2=bma2;mma3=bma3;//将接收到的编码复制到解码寄存器中                             
                                   rf_ok1=1;                                // 通知解码子程序可以解码了
                                   tb_ok=0;
           bt_auto=0;
           s=1000;
           break;         
         }
         else
          {
            mmb1=bma1;mmb2=bma2;mmb3=bma3;//将再次接收到的编码复制到解码寄存器中,                             
                                    rf_ok2=1;                                // 通知解码子程序可以解码了
                                    tb_ok=0;
            bt_auto=0;
            break;                  
          }
                                   
                                }
                     }
                    ma_x++;
     
                  }
            else {ma_x=0; tb_ok=0; bt_auto=0;bma1=0; bma2=0; bma3=0; hh_w=1;ll_w=0;}      //接收到不符合的高-低电平序列
        ll_w=0;hh_w=1;
      }         
         old_rc5=1;      // 记录本次电平状态
       }
if(rf_ok1)  //规定时间内接受到2帧相同的编码数据才有效
  {
   s--;
   if(!s) rf_ok1=0;
   if(rf_ok2)
    {
      if((mma1==mmb1)&&(mma2==mmb2)&&(mma3==mmb3))
        {
       rf_ok=1;
       rf_ok1=0;
       rf_ok2=0;      
      }
      else
        {
        rf_ok=0;
        rf_ok1=0;
        rf_ok2=0;
      
        }
         
    }     
  }
    if((rf_ok)&&(!study))   //判断是否是学习状态
   {   
    EA=0;
    rf_ok=0;
     
       for(x1=0;x1<10;x1++)
        {
      if((mma1==key_number[x1*3+1])&&(mma2==key_number[x1*3+2])&&(mma3==key_number[x1*3+3]))
       {
         
            mma8=mma3<<4;
         if((mma8==0x10)||(mma3==0x03))
          {
           key1_ok=1;
         }
         else if ((mma8==0x20)||(mma3==0x0c))
          {
           key2_ok=1;
         }
         else if ((mma8==0x30)||(mma3==0x0f))
          {
           key3_ok=1;
         }
         else if ((mma8==0x40)||(mma3==0x30))
          {
           key4_ok=1;
         }
          else if ((mma8==0x50)||(mma3==0x33))
          {
           key5_ok=1;
         }
         else if ((mma8==0x60)||(mma3==0x3c))
          {
           key6_ok=1;
         }
         else if ((mma8==0x70)||(mma3==0x3f))
          {
           key7_ok=1;
         }
          else if ((mma8==0x80)||(mma3==0xc0))
          {
           key8_ok=1;
         }
         else if ((mma8==0x90)||(mma3==0xc3))
          {
           key9_ok=1;
         }
         else if ((mma8==0xa0)||(mma3==0xcc))
          {
           keya_ok=1;
         }
          else if ((mma8==0xb0)||(mma3==0xcf))
          {
           keyb_ok=1;
         }
         else if ((mma8==0xc0)||(mma3==0xf0))
          {
           keyc_ok=1;
         }
         else if ((mma8==0xd0)||(mma3==0xf3))
          {
           keyd_ok=1;
         }
           else if ((mma8==0xe0)||(mma3==0xfc))
          {
           keye_ok=1;
         }
         else if ((mma8==0xf0)||(mma3==0xff))
          {
           keyf_ok=1;
         }
      

        decode_ok=1;     
        s1=1500;
        break;
       }
           
     }
            
      
     EA=1;
   }

   if(decode_ok)   //解码有效信号,类似2272 PT脚
    {
   s1--;
   if(!s1)
    {
     decode_ok=0;
     key1_ok=0;
     key2_ok=0;
     key3_ok=0;
     key4_ok=0;
     key5_ok=0;
     key6_ok=0;
     key7_ok=0;
     key8_ok=0;
     key9_ok=0;
     keya_ok=0;
     keyb_ok=0;
     keyc_ok=0;
     keyd_ok=0;
     keye_ok=0;
     keyf_ok=0;
     
    }      
    }   
   }

/************************************************************
* 功能名称:遥控器码学习函数
* 功能描述:
* 参数:无
* 返回:无
************************************************************/
void KEY_study()        //遥控器学习
{
uchar num_rf;
uchar d_num;
if(study==1)
  {
      rf_ok=0;
   d_num=0;

   while(!rf_ok)
    {
     delay_1ms(100);
     d_num++;
     if(d_num>200) break;         
    }
   d_num=0;
   if(rf_ok==1)
    {
     EA=0;
     num_rf=key_number[0];                   //取已学习的遥控器数量
     if(num_rf>20){num_rf=0;}        //如果遥控器数量超过10个,覆盖最先学习的
     key_number[num_rf*3+1]=mma1;
     key_number[num_rf*3+2]=mma2;
     key_number[num_rf*3+3]=mma3;
     key_number[0]=num_rf+1;
     Sector_Erase(0x0000);
     for(num_rf=0;num_rf<32;num_rf++)
      {
       write_add(0x0000+num_rf,key_number[num_rf]);      
      }
     rf_ok=0;
                   if(SBT8818_02)
                    {LED1=1;}
     LED2=1;
     //LED_green=1;
     delay_1ms(500);
     EA=1;
     
      }
    else
     {
      rf_ok=0;
      for(num_rf=0;num_rf<4;num_rf++)     //操作超时
       {
        LED2=1;
        if(SBT8818_02)
                                {LED1=1;}
        delay_1ms(500);
        LED2=0;
        if(SBT8818_02)
                                {LED1=0;}
        delay_1ms(500);
        LED2=1;
        if(SBT8818_02)
                                {LED1=1;}
               
       }
       set=1;
     
     }
   d_num=0;
   study=0;
   /*if(OUT){LED_green=0;LED_red=1;
          }
   else {LED_red=0;
         LED_green=1;
         }
      */
  }
}
/************************************************************
* 功能名称:把遥控器码从 EEPROM 复制到DATA函数
* 功能描述:
* 参数:无
* 返回:无
************************************************************/
void key_buffer()    //把遥控器码从 EEPROM 复制到DATA
{
uchar n;
for(n=0;n<31;n++)
  {
     key_number[n]=read_add(0x0000+n);   
  }
key_number[32]=read_add(0x0200+1);
}
/************************************************************
* 功能名称:记忆清零函数
* 功能描述:
* 参数:无
* 返回:无
************************************************************/
void system_res()  //系统清零   
{
Sector_Erase(0x0000);
write_add(0x0000,0x00);
    key_buffer();  
}
void system_res1()  //系统清零   
{
Sector_Erase(0x0200);
write_add(0x0200,0x00);
key_buffer();  
}
/************************************************************
* 功能名称:写数据到 EEPROM 函数
* 功能描述:
* 参数:无
* 返回:无
************************************************************/
void DATA_WRITE_EPPROM()  
{
        EA=0;
  Sector_Erase(0x0200);
  key_number[32]=mma4;
  write_add(0x0200+1,key_number[32]);
  EA=1;
}
/************************************************************
* 功能名称:按键扫描函数
* 功能描述:
* 参数:无
* 返回:无
************************************************************/
void set_scan()   //判断学习键状态
{
uchar h=0,k;
if(!set)
{
   while(!set)   
  { if(h>0)
      {
        LED2=1;
         study1=1;
    while(!set)
    {
       delay_1ms(100);
       h++;
          if(h>60)
       {
     study=1;
     study1=0;
     h=0;
     //LED_Flashing(2);
     for(k=0;k<1;k++)   
              {
           LED2=1;
        if(SBT8818_02)
                                {LED1=1;}
           delay_1ms(1500);
           LED2=0;
        if(SBT8818_02)
                                {LED1=0;}
                                delay_1ms(1500);
              }
     while(!set)
      {
        delay_1ms(100);
        h++;
        if(h>120)
         {
           study=0;
        h=0;
        system_res();
        for(k=0;k<2;k++)     //删除成功
              {
              LED2=1;
              if(SBT8818_02)
                                     {LED1=1;}
              delay_1ms(500);
              LED2=0;
                                   if(SBT8818_02)
                                      {LED1=0;}
              delay_1ms(500);
               LED2=1;
            if(SBT8818_02)
                                       {LED1=1;}      
              }
        while(!set)
        {
           delay_1ms(100);
                  h++;
            if(h>200)
         {
          h=0;
          system_res1() ;
          for(k=0;k<5;k++)     //删除成功
                       {
                     LED2=1;
                     if(SBT8818_02)
                                              {LED1=1;}
                     delay_1ms(500);
                     LED2=0;
                                          if(SBT8818_02)
                                             {LED1=0;}
                     delay_1ms(500);
                        LED2=1;
                  if(SBT8818_02)
                                             {LED1=1;}      
                       }
           while(!set);
         }
        }
        
       }
      
      }
     }
    }
   }
   delay_1ms(100);
   h++;
   }
   
    if(study1)
    {  
       timer_H = 0;
       timer_M = 0;
       timer_S = 0;
   
       if(goout)
             {
              OUT=0;
           goout=0;
           }
       else
          {
              OUT=1;
           goout=1;
             }
      beep_on_off();
   if(SBT8828_04)
          {mma4=goout;DATA_WRITE_EPPROM();}
   study1=0;
  }
   if(study)
   {
    KEY_study();
    study=0;
   }
}

   
}


  /*
//---触摸采集
unsigned int TOUCH_SCAN()
{
unsigned int result=0;
P3M1&=0X08;
P3M0&=0X00;
PAD=1;   //充电

T2L = 0x00;  //设置定时初值
T2H = 0x00;  //设置定时初值
  
  
//TH1 = 0;
//TL1 = 0;
Delay_Us(100);
TR0=0;
//TR1 = 1;
//IE2 |= 0x04;   //允许定时器2产生中断
AUXR |= 0x10;  //定时器2开始计时
P3M1=0X28;  //转为高阻
while (PAD); //等待放电完成
AUXR &=  ~(1<<4); //Timer2 停止运行
//TR1 =0;
TR0=1;
result =T2H <<8;
result|=T2L;
return result;
}

//---测量电容并处理数据
void TOUCH_Process()
{
uchar i=0;
uint pad_val[TOUCH_SAMPLE_NUMBER];   //当前值
unsigned long pad_sum=0;     //中间值总和

for (;i<TOUCH_SAMPLE_NUMBER;i++)      //采样
{
  pad_val[i]=TOUCH_SCAN();
  Delay_Us(10);
}
for (i=0;i<TOUCH_SAMPLE_NUMBER;i++)     //去极值,求和for (i=1;i<TOUCH_SAMPLE_NUMBER-1;i++)
{
  pad_sum+=pad_val[i];
}
pad_val[0]=pad_sum/(TOUCH_SAMPLE_NUMBER); //当前有效值
if(pad_val[0]>(pad_average+140))s2=5;  //不同介质,需要修改此值
    else if(pad_val[0]<pad_average+150)  //不同介质,需要修改此值
     {        
       pad_average=pad_average+((long)pad_val[0]-(long)pad_average)/16;
     }
     
if(s2>0)
  {
   s2--;
   if(!pad_new)
    {
     OUT=!OUT;
      beep_on_off();
     pad_new=1;      
      }         
  }
  else  
   {pad_new=0;}
   
}*/

  /********************************************************************
         定时器中断2初始化
  *********************************************************************/
  /*******************************************************************/
  void Timer2_Init(void)  //50毫秒@12.000MHz
  {
   
   AUXR &= 0xFB;    //定时器时钟12T模式
   T2L = 0x58;   //设置定时初值
   T2H = 0x9e;   //设置定时初值  
   IE2 |= 0x04;     //允许定时器2产生中断
   AUXR |= 0x10;    //定时器2开始计时
  
   
   
  }
/************************************************************
* 功能名称:上电初始化函数
* 功能描述:
* 参数:无
* 返回:无
************************************************************/
void system_start()   //上电初始化
{
    P3M1=0X08;     //P3^3配置为输入
P3M0=0X00;
   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;
}

/************************************************************
* 功能名称:主函数
* 功能描述:
* 参数:无
* 返回:无
************************************************************/
void main()
{
AUXR=0xc0;     //设置定时器是传统8051的12倍

system_start();
LED1=0;
PAD=1;
if(SBT8818_02)
           {
           LED1=1;
     }
LED2=1;
OUT=0;
goout=0;
if(SBT8828_01)
            {
             //if(PAD){OUT=1;goout=1;}
       //else{OUT=0;goout=0;}
    if(!set){mma4=0;DATA_WRITE_EPPROM();}
    delay_1ms(500);
    key_number[32]=read_add(0x0200+1);
    if(key_number[32]){ OUT=0;goout=0; }
          else{ OUT=1;goout=1;}
            }
if(SBT8828_04)
    {
      if(key_number[32]){ OUT=1;goout=1;}
   else{OUT=0;goout=0;}
  }
while(1)
{
   
delay_1ms(300);
//========================================= LED—ON/off
if((key1_ok)|| (key2_ok)||(key4_ok)||(key8_ok))
{
   timer_H = 0;
   timer_M = 0;
   timer_S = 0;
   
    if(goout)
     {
      OUT=0;
   goout=0;
     }
    else
     {
      OUT=1;
   goout=1;
     }
    beep_on_off();
    if(SBT8828_04)
    {mma4=goout;DATA_WRITE_EPPROM();}
}


//========================================= LED—ON
     if((key3_ok)||(key5_ok)||(key6_ok)||(key7_ok)||(key9_ok) )
{
   timer_H = 0;
   timer_M = 0;
   timer_S = 0;
   OUT=1;
   goout=1;
   beep_on_off();
    if(SBT8828_04)
    {mma4=goout;DATA_WRITE_EPPROM();}
}

//============================================LED-OFF
    if((keya_ok)||(keyb_ok)||(keyc_ok)||(keyd_ok)||(keye_ok) )
{
   timer_H = 0;
   timer_M = 0;
   timer_S = 0;
   OUT=0;
   goout=0;
   beep_on_off();
    if(SBT8828_04)
    {mma4=goout;DATA_WRITE_EPPROM();}
}

//============================================   
while(decode_ok);
set_scan();
     //GUANGMIN__scan() ;

}  
}

/************************************************************
* 功能名称:定时器2中断函数
* 功能描述:
* 参数:无
* 返回:无
************************************************************/

void Timer2Interrupt(void) interrupt 12 using 1
{
    TL2 = 0x58;        //设置定时初值
    TH2 = 0x9e;        //设置定时初值
    if ( ++Timer2_50Ms>= 20 )  //  1000MS定时
          {
            Timer2_50Ms = 0 ;
            timer_S  ++;
   if (timer_S  > 59)
                {
                        timer_S = 0;
                        timer_M ++;                                                                /*-- 分--*/
                        
                        if (timer_M > 59)
                        {
                                timer_M = 0;
                                timer_H  ++;                                                        /*-- 时--*/
                                if (timer_H  > 7)
                                {
                                    timer_H  = 0;
         OUT=0;
                 goout=0;
                             beep_on_off();
                                }
      
                        }
    }
   }
}



souer.rar

75.97 KB, 下载次数: 8

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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