السلام عليكم
تم تعديل على مشروع
http://up.top4top.net/downloadf-top4...a8ad1-rar.html
تجد ملف اسمه dtmf_relay_final وهو ملف مخطط كامل للمشروع
ويمكن استفاد من هذا مخطط لربط سماعه تليفون مع 8870
http://www.8051projects.net/files/pu..._interface.jpg
من ناحيه التعقيد في الكود فلا ارى اي تعقيد لانه عندما تضغط مثلا # فانه لابد من قراءه الكود ومن ثم عمل مقارنه له
على عموم أختصرت كود قراءه من متكامله 8870 لفقط 0 و 1 و # وبقيه تم حذفهم
بأختصار
هذا كود مجرد تعاريف فقط يعني اقصد مثلا DTMF0 اعرفته هو نفسه porta.f0 وبتالي بدلا من استخدم porta.f0 في برمجه أستخدم DTMF0 لاني قمت بتعريفه على انه porta.f0
كود:
#define new_click porta.f4
#define new_click_dir trisa.f4
#define DTMF0 porta.f0
#define DTMF0_dir trisa.f0
#define DTMF1 porta.f1
#define DTMF1_dir trisa.f1
#define DTMF2 porta.f2
#define DTMF2_dir trisa.f2
#define DTMF3 porta.f3
#define DTMF3_dir trisa.f3
#define relay portb.f0
#define relay_dir trisb.f0
#define led_data portb.f1
#define led_data_dir trisb.f1
اما هذا الكود لتهيئه مايكرو (( كمداخل ومخارج))
كود:
void init()
{
DTMF0_dir=1; // input
DTMF1_dir=1;
DTMF2_dir=1;
DTMF3_dir=1;
new_click_dir=1;
relay_dir=0; // output
relay=0;// off relays
led_data =0;//off led
led_data_dir=0;//output
}
اما هذا الكود هو كود مقاطعه لغرض أحتساب 10 ثواني
كود:
//Timer0
//Prescaler 1:128; TMR0 Preload = 100; Actual Interrupt Time : 19.968 ms
//Place/Copy this part in declaration section
void InitTimer0(){
OPTION_REG = 0x86;
TMR0 = 100;
INTCON = 0;
}
void Interrupt(){
if (TMR0IF_bit){
TMR0IF_bit = 0;
TMR0 = 100;
//Enter your code here
timer++;
if(timer>500){ //10 sec
timer=0;
flag_data=0;
}
}
}
هذا الكود لقراءه من متكامله 8870
كود:
if(new_click ==1){
code1=255;// intial value
if(DTMF3==1 && DTMF2==0&& DTMF1==1&& DTMF0==0) //0
{
code1=0;
}
else if(DTMF3==0 && DTMF2==0&& DTMF1==0&& DTMF0==1) //1
{
code1=1;
}
else if(DTMF3==1 && DTMF2==1&& DTMF1==0&& DTMF0==0) //#
{
code1='#';
}
حيث أختصرته لفقط 0 و1 و#
اما هذا الكود لغرض التحقق مما تم قراءته من 8870
كود:
if( code1=='#')
{
cont=0;
INTCON=0xA0;//enable interrupts
flag_data=1;
led_data=1;
}
if(code1 !=255)
{
output_state[cont]=code1;
cont++;
if(cont==2)
{
if(output_state[0]=='#')flag_recive=1;
}
}
اما هذا الكود لتشغيل وأطفاء الريلي
كود:
if(flag_recive==1 && cont==2)
{
if( output_state[1]==0 )
{
relay= 0; // relays is OFF
}
else if( output_state[1]==1 )
{
relay= 1;// relay is ON
}
for(cont=0;cont<2;cont++)output_state[cont]=0xFF;// clear output_state
cont=0;
flag_recive=0;
}