|
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();
}
}
}
}
}
|
|