|
stc15f104e單片機(jī)程序 ,峰鳴器 高電平輸出 改低電平輸出 要什樣修改才能在低電平峰鳴器使用,有了解c程序這方面的朋友嗎?幫幫小弟修改謝謝
#include <reg52.h>
#include <intrins.h>
sfr AUXR=0x8e; //設(shè)置定時(shí)器1/0是分頻還是不分頻的計(jì)程器
sfr IAP_DATA = 0xC2; //片內(nèi)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
/************************************************************
* 功能名稱:型號定義
* 功能描述:
* 參數(shù):無
* 返回:無
************************************************************/
//#define SBT8818_01 0 //86WIFI墻壁開關(guān)
#define SBT8818_02 0 //86搖控墻壁開關(guān)
#define SBT8828_01 1 //搖控?zé)糇?br />
#define SBT8828_02 0 //移動(dòng)搖控插座
#define SBT8828_03 0 //86搖控墻壁插座
#define SBT8828_04 0 //86搖控雙控墻壁開關(guān)
/************************************************************
* 功能名稱:MCU腳位定義
* 功能描述:
* 參數(shù):無
* 返回:無
************************************************************/
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
/************************************************************
* 功能名稱:變量的定義
* 功能描述:
* 參數(shù):無
* 返回:無
************************************************************/
//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;//控制輸出標(biāo)記
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; //解碼過程中的臨時(shí)接收成功標(biāo)志
bit old_rc5; //保存上一次查詢到的電平狀態(tài)
bit tb_ok; //接收到同步的馬時(shí)置1
uchar mma1,mma2,mma3,mma4; //用于解碼過程
uchar mma8;
bit rf_ok; //接收到一個(gè)完整的遙控命令后置1,通知解碼程序可以解碼了
bit study; //進(jìn)入學(xué)習(xí)狀態(tài)標(biāo)志
bit study1; //開關(guān)狀態(tài)標(biāo)志
bit system_int; //系統(tǒng)清零標(biāo)志
uchar temp_h,temp_l;
bit bt_auto; //自動(dòng)設(shè)置遙控接收波特率標(biāo)志
bit L_M_select;
uint s,s1;
uchar s2;
uchar idata key_number[33]; //遙控器編碼數(shù)組,存放10個(gè)遙控器
/************************************************************
* 功能名稱:延遲函數(shù)
* 功能描述:
* 參數(shù):無
* 返回:無
************************************************************/
/*(void Delay_Us(unsigned char time)
{
while (time--)
{
;
}
}
*/
void delay_1ms(uint x) //1毫秒延時(shí)
{
uchar b,c;
for(x;x>0;x--)
{
for(b=3;b>0;b--)
{
for(c=150;c>0;c--);
}
}
}
/************************************************************
* 功能名稱:指示標(biāo)記函數(shù)
* 功能描述:
* 參數(shù):無
* 返回:無
************************************************************/
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) ;
}
}
}
/************************************************************
* 功能名稱:光敏電阻檢測函數(shù)
* 功能描述:
* 參數(shù):無
* 返回:無
************************************************************/
/*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函數(shù)
* 功能描述:
* 參數(shù):無
* 返回:無
************************************************************/
//====================================================
/////////片內(nèi)EEPROM讀寫驅(qū)動(dòng)程序///////////////////////////
//====================================================
void IAP_Disable() //關(guān)閉IAP
{
//關(guān)閉IAP 功能, 清相關(guān)的特殊功能寄存器,使CPU 處于安全狀態(tài),
//一次連續(xù)的IAP 操作完成之后建議關(guān)閉IAP 功能,不需要每次都關(guān)
IAP_CONTR = 0; //關(guān)閉IAP 功能
IAP_CMD = 0; //清命令寄存器,使命令寄存器無命令,此句可不用
IAP_TRIG = 0; //清命令觸發(fā)寄存器,使命令觸發(fā)寄存器無觸發(fā),此句可不用
IAP_ADDRH = 0;
IAP_ADDRL = 0;
}//
//讀一字節(jié),調(diào)用前需打開IAP 功能,入口:DPTR = 字節(jié)地址,返回:A = 讀出字節(jié)
uchar read_add(uint addr) //讀EEPROM
{
IAP_DATA = 0x00;
IAP_CONTR = 0x84; //打開IAP 功能, 設(shè)置Flash 操作等待時(shí)間
IAP_CMD = 0x01; //IAP/ISP/EEPROM 字節(jié)讀命令
IAP_ADDRH = addr>>8; //設(shè)置目標(biāo)單元地址的高8 位地址
IAP_ADDRL = addr&0xff; //設(shè)置目標(biāo)單元地址的低8 位地址
EA = 0;
IAP_TRIG = 0x5a; //先送 46h,再送B9h 到ISP/IAP 觸發(fā)寄存器,每次都需如此
IAP_TRIG = 0xa5; //送完 B9h 后,ISP/IAP 命令立即被觸發(fā)起動(dòng)
_nop_();
EA = 1;
IAP_Disable(); //關(guān)閉IAP 功能, 清相關(guān)的特殊功能寄存器,使CPU 處于安全狀態(tài),
//一次連續(xù)的IAP 操作完成之后建議關(guān)閉IAP 功能,不需要每次都關(guān)
return (IAP_DATA);
}//------------------------------------------------------------------------------
//字節(jié)編程,調(diào)用前需打開IAP 功能,入口:DPTR = 字節(jié)地址, A= 須編程字節(jié)的數(shù)據(jù)
void write_add(uint addr,uchar ch) //直接寫EEPROM
{
IAP_CONTR = 0x84; //打開 IAP 功能, 設(shè)置Flash 操作等待時(shí)間
IAP_CMD = 0x02; //IAP/ISP/EEPROM 字節(jié)編程命令
IAP_ADDRH = addr>>8; //設(shè)置目標(biāo)單元地址的高8 位地址
IAP_ADDRL = addr&0xff; //設(shè)置目標(biāo)單元地址的低8 位地址
IAP_DATA = ch; //要編程的數(shù)據(jù)先送進(jìn)IAP_DATA 寄存器
EA = 0;
IAP_TRIG = 0x5a; //先送 46h,再送B9h 到ISP/IAP 觸發(fā)寄存器,每次都需如此
IAP_TRIG = 0xa5; //送完 B9h 后,ISP/IAP 命令立即被觸發(fā)起動(dòng)
_nop_();
EA = 1;
IAP_Disable(); //關(guān)閉IAP 功能, 清相關(guān)的特殊功能寄存器,使CPU 處于安全狀態(tài),
//一次連續(xù)的IAP 操作完成之后建議關(guān)閉IAP 功能,不需要每次都關(guān)
}//------------------------------------------------------------------------------
//擦除扇區(qū), 入口:DPTR = 扇區(qū)地址
void Sector_Erase(uint addr) //扇區(qū)擦除
{
IAP_CONTR = 0x84; //打開IAP 功能, 設(shè)置Flash 操作等待時(shí)間
IAP_CMD = 0x03; //IAP/ISP/EEPROM 扇區(qū)擦除命令
IAP_ADDRH =addr>>8; //設(shè)置目標(biāo)單元地址的高8 位地址
IAP_ADDRL =addr&0xff; //設(shè)置目標(biāo)單元地址的低8 位地址
EA = 0;
IAP_TRIG = 0x5a; //先送 46h,再送B9h 到ISP/IAP 觸發(fā)寄存器,每次都需如此
IAP_TRIG = 0xa5; //送完 B9h 后,ISP/IAP 命令立即被觸發(fā)起動(dòng)
_nop_();
EA = 1;
}//------------------------------------------------------------------------------
/************************************************************
* 功能名稱:定時(shí)器0中斷函數(shù)
* 功能描述:
* 參數(shù):無
* 返回:無
************************************************************/
void timeint() interrupt 1 //遙控接收,通過定時(shí)器0中斷,定時(shí)去查詢
{
uchar x1;
// mtb++;
if(!bt_auto) //自適應(yīng)波特率標(biāo)志
{
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中斷標(biāo)志
if (!RF) { ll_w++;old_rc5=0; } // 檢測到低電平 低電平時(shí)間加1,記錄本次電平狀態(tài)
else // 檢測到高電平
{ hh_w++;
if (!old_rc5) // 檢測到從低到高的跳變,已檢測到一個(gè)完整(高-低)電平周期
{ 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;} //根據(jù)不同 同步碼 寬度,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++; //已經(jīng)接收到同步碼,判0
if(ma_x>23)
{
if(!rf_ok1)
{
mma1=bma1;mma2=bma2;mma3=bma3;//將接收到的編碼復(fù)制到解碼寄存器中
rf_ok1=1; // 通知解碼子程序可以解碼了
tb_ok=0;
bt_auto=0;
s=1000;
}
else
{
mmb1=bma1;mmb2=bma2;mmb3=bma3;//將接收到的編碼復(fù)制到解碼寄存器中
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; }//按鍵狀態(tài)第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;//將接收到的編碼復(fù)制到解碼寄存器中
rf_ok1=1; // 通知解碼子程序可以解碼了
tb_ok=0;
bt_auto=0;
s=1000;
break;
}
else
{
mmb1=bma1;mmb2=bma2;mmb3=bma3;//將再次接收到的編碼復(fù)制到解碼寄存器中,
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; // 記錄本次電平狀態(tài)
}
if(rf_ok1) //規(guī)定時(shí)間內(nèi)接受到2幀相同的編碼數(shù)據(jù)才有效
{
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)) //判斷是否是學(xué)習(xí)狀態(tài)
{
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;
}
}
}
/************************************************************
* 功能名稱:遙控器碼學(xué)習(xí)函數(shù)
* 功能描述:
* 參數(shù):無
* 返回:無
************************************************************/
void KEY_study() //遙控器學(xué)習(xí)
{
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]; //取已學(xué)習(xí)的遙控器數(shù)量
if(num_rf>20){num_rf=0;} //如果遙控器數(shù)量超過10個(gè),覆蓋最先學(xué)習(xí)的
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++) //操作超時(shí)
{
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 復(fù)制到DATA函數(shù)
* 功能描述:
* 參數(shù):無
* 返回:無
************************************************************/
void key_buffer() //把遙控器碼從 EEPROM 復(fù)制到DATA
{
uchar n;
for(n=0;n<31;n++)
{
key_number[n]=read_add(0x0000+n);
}
key_number[32]=read_add(0x0200+1);
}
/************************************************************
* 功能名稱:記憶清零函數(shù)
* 功能描述:
* 參數(shù):無
* 返回:無
************************************************************/
void system_res() //系統(tǒng)清零
{
Sector_Erase(0x0000);
write_add(0x0000,0x00);
key_buffer();
}
void system_res1() //系統(tǒng)清零
{
Sector_Erase(0x0200);
write_add(0x0200,0x00);
key_buffer();
}
/************************************************************
* 功能名稱:寫數(shù)據(jù)到 EEPROM 函數(shù)
* 功能描述:
* 參數(shù):無
* 返回:無
************************************************************/
void DATA_WRITE_EPPROM()
{
EA=0;
Sector_Erase(0x0200);
key_number[32]=mma4;
write_add(0x0200+1,key_number[32]);
EA=1;
}
/************************************************************
* 功能名稱:按鍵掃描函數(shù)
* 功能描述:
* 參數(shù):無
* 返回:無
************************************************************/
void set_scan() //判斷學(xué)習(xí)鍵狀態(tài)
{
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; //設(shè)置定時(shí)初值
T2H = 0x00; //設(shè)置定時(shí)初值
//TH1 = 0;
//TL1 = 0;
Delay_Us(100);
TR0=0;
//TR1 = 1;
//IE2 |= 0x04; //允許定時(shí)器2產(chǎn)生中斷
AUXR |= 0x10; //定時(shí)器2開始計(jì)時(shí)
P3M1=0X28; //轉(zhuǎn)為高阻
while (PAD); //等待放電完成
AUXR &= ~(1<<4); //Timer2 停止運(yùn)行
//TR1 =0;
TR0=1;
result =T2H <<8;
result|=T2L;
return result;
}
//---測量電容并處理數(shù)據(jù)
void TOUCH_Process()
{
uchar i=0;
uint pad_val[TOUCH_SAMPLE_NUMBER]; //當(dāng)前值
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); //當(dāng)前有效值
if(pad_val[0]>(pad_average+140))s2=5; //不同介質(zhì),需要修改此值
else if(pad_val[0]<pad_average+150) //不同介質(zhì),需要修改此值
{
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;}
}*/
/********************************************************************
定時(shí)器中斷2初始化
*********************************************************************/
/*******************************************************************/
void Timer2_Init(void) //50毫秒@12.000MHz
{
AUXR &= 0xFB; //定時(shí)器時(shí)鐘12T模式
T2L = 0x58; //設(shè)置定時(shí)初值
T2H = 0x9e; //設(shè)置定時(shí)初值
IE2 |= 0x04; //允許定時(shí)器2產(chǎn)生中斷
AUXR |= 0x10; //定時(shí)器2開始計(jì)時(shí)
}
/************************************************************
* 功能名稱:上電初始化函數(shù)
* 功能描述:
* 參數(shù):無
* 返回:無
************************************************************/
void system_start() //上電初始化
{
P3M1=0X08; //P3^3配置為輸入
P3M0=0X00;
P3=0xff; //所有IO口置高
TMOD=0x11; //T1/T0方式1,做定時(shí)器用,兩個(gè)定時(shí)器
TL0=0xb5; //b5 低位裝數(shù)
TH0=0xfe; //fe 高位裝數(shù)
ET0=1; //允許T0中斷
TR0=1; //定時(shí)器0開啟
//TL1=0x00; //b5
//TH1=0x00; //fe
//ET1=1; //允許T1中斷
key_buffer();
Timer2_Init();
// pad_average=0x0fff; //平均值
EA=1;
}
/************************************************************
* 功能名稱:主函數(shù)
* 功能描述:
* 參數(shù):無
* 返回:無
************************************************************/
void main()
{
AUXR=0xc0; //設(shè)置定時(shí)器是傳統(tǒng)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() ;
}
}
/************************************************************
* 功能名稱:定時(shí)器2中斷函數(shù)
* 功能描述:
* 參數(shù):無
* 返回:無
************************************************************/
void Timer2Interrupt(void) interrupt 12 using 1
{
TL2 = 0x58; //設(shè)置定時(shí)初值
TH2 = 0x9e; //設(shè)置定時(shí)初值
if ( ++Timer2_50Ms>= 20 ) // 1000MS定時(shí)
{
Timer2_50Ms = 0 ;
timer_S ++;
if (timer_S > 59)
{
timer_S = 0;
timer_M ++; /*-- 分--*/
if (timer_M > 59)
{
timer_M = 0;
timer_H ++; /*-- 時(shí)--*/
if (timer_H > 7)
{
timer_H = 0;
OUT=0;
goout=0;
beep_on_off();
}
}
}
}
}
|
-
-
souer.rar
2018-4-1 17:43 上傳
點(diǎn)擊文件名下載附件
75.97 KB, 下載次數(shù): 8
|