本帖最后由 ll13536121668 于 2018-3-25 15:08 編輯
stc15f104e單片機程序 ,峰鳴器 高電平輸出 改低電平輸出 要什樣修改才能在低電平峰鳴器使用,有了解c程序這方面的朋友嗎?幫幫小弟修改謝謝
下載:
C_souer.rar
(75.97 KB, 下載次數: 17)
2018-3-10 16:47 上傳
點擊文件名下載附件
- #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; //遙控接收 8
- sbit PAD = P3^5; //光敏檢測 3
- sbit LED2 = P3^0; //指示燈 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();
- }
-
- }
- }
- }
- }
復制代碼 |