说明:以下问题我已经在本论坛找了相关MT8880的贴子,没有找到答案。自己又尝试了N次了还是没有解决问题,所以贴上来请教一下大家。谢谢!
以下是MT8880的接收发送程序,可以正常接收和发送(程序参考21IC网友的,不记得那位网友了) 为什么一定要把MT8880初始化[MT8880_Init()]和MT8880接收初始化[MT8880_Rec_Init()]这两个函数放在无限循环里才能正常接收DTMF? 我在无限循环[while(1)]之前运行这两个函数后如果在无限循环里不运行这两个函数就没法接收DTMF. 真奇怪!MT8880不可能要不停地初始化的吧?我看过一些网友写的程序,也只是初始化一次就可以接收的了.是我的那个地方错了?
发送就很正常,只要按下KEY2初始化一次就可以发送一个手机号码了.
#include <at89x51.h>
typedef unsigned char uchar; typedef unsigned int uint;
uchar DATA1 //全局变量 sbit D0 = P1^0; //MT8880接线脚定义. sbit D1 = P1^1; sbit D2 = P1^2; sbit D3 = P1^3; sbit RW = P1^4; sbit RS = P1^5; sbit CS = P1^6; sbit O2 = P1^7;
void MT8880_Init(); //MT8880初始化 void MT8880_Rec_Init();//MT8880接收初始化 void transmit(uchar data *p,uchar count);//发送数据 void tran_init();//MT8880发送初始化. void delay(uint l); //发送迟时.
void main(void) { uchar kk; uchar data w_buf[13] = {1,3,5,3,8,7,8,7,9,6,1}; //发送的数据码. DATA1 = 0; TL = 0; MT8880_Init(); //MT8880初始化 tran_init(); //MT8880发送初始化.
delay(60000);
transmit(w_buf,11);//发送数据
MT8880_Init();//MT8880初始化 MT8880_Rec_Init();//MT8880接收初始化
while(1) //无限循环. {
MT8880_Init();//MT8880初始化 (问题就在这里) MT8880_Rec_Init();//MT8880接收初始化(问题就在这里) DisplayOneChar(0, 1, figure[DATA1]); //液晶显示, // if(KEY2 == 0) // { TL = 0; led2 = 0; MT8880_Init(); tran_init(); transmit(w_buf,11);} }
} void transmit(uchar data *p,uchar count) //发送数据码. { uchar i; for (i=0;i<count;i++,p++) { P1= *p | 0x80; /* 发送数码 */ delay(60000); /* 延时 */ P1=0xBf; } led2 = !led2; }/* 读SR */
void tran_init(void)//发送初始化 { P1=0x29; /* CRA=1001 */ P1=0xA1; } /* CRB=0001 */
void MT8880_Init() //MT8880初始化. { P1 = 0x3F; P1 = 0x20; P1 = 0x20; P1 = 0x28; P1 = 0xA0; }
void MT8880_Rec_Init() //接收初始化 { P1 = 0xA5; EA = 1; EX0 = 1; EX1 = 1; IT1 = 1; IT0 = 1; }
void Init0() interrupt 0 using 1 //外问中断0 用于接收DTMF。 { EX0 = 0; P1 = 0x3F; P1 = 0x9F; delay(100); DATA1 = P1; DATA1 = P1 & 0x0f; EX0 = 1; }
void ext() interrupt 2 { kk++; }
void delay(uint l) { uint i; for (i=0;i<l;i++); }
|