问题是在 “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]; //取下一位电话号码 } } |