以下代码在通电时P3.4 会有短暂的信号输出,继电器会滴答一下,用来控制电器的,这样会对电器造成冲击容易损害电器
要求:把通电时P3.4 短暂的输出信号去掉
P3^4口如何设置为推挽输出?
下面是STC15F104E单片机程序源码
- #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();
- }
-
- }
- }
- }
- }
复制代码 |