[请教]有关MT8880的使用
[QUOTE][QUOTE]#include <reg51.h>
#define uc unsigned char
#define ui unsigned int
sbit clock=P1^6;
sbit RSO=P1^5;
sbit RW=P1^4;
uc rem; //接收号码变量
uc mem1;
void MT8880_readstate(void); //子函数调用
void MT8880_initial(void);
void MT8880_send(uc num);
void delay(ui t);
void main(void)
{
uc data sdata; //发送号码变量,直接寻址片内数据存储区
sdata=0x06; // 预存数6
delay(50000); //上电100ms后,必须在程序开始部分初始化控制寄存器
MT8880_readstate();
MT8880_initial();
MT8880_send(sdata);
}
/* MT8880初始化子函数 */
void MT8880_readstate(void) //P1.0=D3,P1.1=D2,P1.2=D1,P1.3=D0
{ //P1.4=R/W,P1.5=RSO,P1.6=RD
P1=0xff; //读状态
clock=1;
RSO=1;
RW=1;
clock=0;
delay(200);
mem1=P1; // 读SR ,11读状态寄存器,读后后三位自动清0
RSO=0;
RW=0;
}
void MT8880_initial(void)
{
RSO=1; //CRA=0000 ,10写控制寄存器
RW=0;
P1&=0xf0;
clock=1;
delay(100);
clock=0;
delay(100);
RSO=1;
RW=0;
P1&=0xf0; //CRA=0000
clock=1;
delay(100);
clock=0;
delay(100);
RSO=1;
RW=0;
P1&=0xf1; // CRA=1000 ,选中CRB
clock=1;
delay(100);
clock=0;
delay(100);
RSO=1;
RW=0;
P1&=0xf0; // CRB=0000
clock=1;
delay(100);
clock=0;
}
/* 发送操作子函数 */
void MT8880_send(uc num)
{
RSO=1;
RW=0;
P1&=0xf9; // CRA=1001,DTMF模式,允许写CRB,无中断模式
clock=1;
delay(100);
clock=0;
delay(100);
RSO=1;
RW=0;
P1&=0xf0; //CRB=0000,突发模式
clock=1;
delay(100);
clock=0;
delay(100);
RSO=0;
RW=0;
P1=num; // 发送数码
clock=1;
delay(60000); // 延时,在发送触发模式下,要在数据写入发送数据寄存器100ms后,状态寄存器位1才会置为“1“
MT8880_readstate();
}
/* 延时子函数 */
void delay(ui t) //大约1.2us每单位
{
ui i;
for (i=0;i <t;i++);
}
发送程序如上,可是在读状态寄存器时P1口的低四位总是高电平,如果断开D3~D0和单片机的连接,则用万用表测D3~D0全市低电平,请高手指教!!!
发表时间:2006年1月4日15:02:51