查看: 151|回复: 0
打印 上一主题 下一主题

用过mt8880的大虾给看一下这个程序,多谢!!

[复制链接] qrcode

1

主题

1

帖子

5

积分

新手上路

Rank: 1

积分
5
楼主
跳转到指定楼层
发表于 2015-11-29 03:51 AM | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
问题是在 “while((mt8880_Status&0x02)!=0x02);//判断数据是否发送完毕”为什么
读出SR的B1位总是0呢??
是什么原因?多谢各位大虾指教!!!
sbit RW=P2^4; //定义MT8880的引脚
sbit CS=P2^5; D0^D3接在P20^P23
sbit CK=P2^6;
sbit RS=P2^7;
void mt8880_ReadStatus()//读mt8880的状态寄存器
{
P2=0xFF; //先将P2口全置1,才能正确读出P2口的内容
CK=0;
CS=0;
RW=1;
RS=1;
CK=1;
_nop_();
_nop_();
CK=0;
mt8880_Status=P2;//存储读出状态寄存器的数据
RS=0;
RW=0;
CS=1;
CK=0;
}

void mt8880_WriteData(uchar SendData) //向mt8880写入一位数据
{
CK=0;
CS=0;
RS=0;
RW=0;
CK=1;
_nop_();
P2|=SendData;
_nop_();
CK=0;
_nop_();
RW=1;
RS=1;
CS=1;
CK=0;
}

void mt8880_Initial() //mt8880初始化\RW\CS\CK\RS
{
mt8880_ReadStatus();
CK=0;//写CRA
CS=0;
RS=1;
RW=0;
CK=1;
_nop_();
P2&=0xf0;
_nop_();
_nop_();
CK=0;
short_delay();
RW=0; //写CRA
CK=1;
_nop_();
P2&=0xf0;
_nop_();
CK=0;
short_delay();
RW=0;//8写入控制寄存器A,下一周期写入控制寄存器B
CK=1;
_nop_();
P2&=0xf0;
P2|=0x08;
_nop_();
CK=0;
short_delay();
CK=1;
P2&=0xf0; //写CRB
_nop_();
CK=0;
short_delay();
mt8880_ReadStatus();
CK=0;
CS=1;
}

void mt8880_Dial()//拨号子程序
{
unsigned char tel,i;
unsigned char array[8]={1,4,7,1} ;
CK=0;
CS=0;
RS=1;
RW=0;
CK=1;
_nop_();
P2&=0xFD;//置mt8880为DTMF模式和中断模式
_nop_();
CK=0;
_nop_();
_nop_();
CK=1;
_nop_();
P2&=0xF0; //写CRB设置为突发模式
_nop_();
CK=0;
_nop_();
SW_MAIN=1;//模拟摘机
tel=array[0]; //取预制电话号码
for(i=0;i<=7;i++)
{
mt8880_WriteData(tel);
mt8880_ReadStatus();
Display(mt8880_Status);
while((mt8880_Status&0x02)!=0x02);//判断数据是否发送完毕
i++;
tel=array[i]; //取下一位电话号码
}
}

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表