大哥大姐帮我看一下我的程序问题出在哪?是不是程序有问题呀?我把程序烧进芯片后各P1口和P3口全是高电平,P2口在1~3V左右,按复位也没用。救救我吧! 还有请教一下那个判断回铃音,拨号音,忙音的程序怎么弄?
程序如下:大哥们一定帮我解决! #include <at89x52.h> #include <intrins.h> #define uc unsigned char #define ui unsigned int
/*----------------------------------- 功能: I/O口,全局变量定义 -----------------------------------*/ extern void MT8880_WD(uc dat); extern uc MT8880_RD(void); extern uc MT8880_RS(void); extern void InitMT8880(uc mode); extern void UpHandle(void); extern void DownHandle(void); extern void Delay(ui count); extern void Beep(uc count); extern void InitBreak(void); extern void Dial(void); //全局变量: #define HandMode 1 //提机模式 #define DTMF8880 0x0d //DTMF模式常数 #define CP8880 0x0f //CP模式常数 #define MT_DataBus P2 /*----------------------------------- 功能: 主程序 -----------------------------------*/
//引脚定义 sbit MT_D0 = P2^0; sbit MT_D1 = P2^1; sbit MT_D2 = P2^2; sbit MT_D3 = P2^3; sbit MT_CS = P3^1; sbit MT_IRQ = P3^4; sbit MT_RW = P2^5; sbit MT_RS0 = P2^6; sbit MT_CLK = P2^7; sbit P_Online = P1^3; //摘机 sbit P_Beep = P3^5; //蜂鸣器鸣叫线 sbit P_Alarm0 = P1^0; //小偷入室检测线 sbit P_Alarm1 = P1^1; //火灾检测线 sbit APR_M1 = P1^4; //语音报警1 sbit APR_M2 = P1^5; //语音报警2
//************************************ void main(void) { EA=0; P1=0x30; P2=0x00; P3=0x00; EA=1; while(P_Alarm0) {Delay(200); if(P_Alarm0) {Dial(); //拨号 APR_M1=0; Delay(100); APR_M1=1; Delay(2000); DownHandle(); Delay(50); for(;;){Beep(1);;} } } while(P_Alarm1) {Delay(200); if(P_Alarm1) {Dial(); //拨号 APR_M2=0; Delay(100); APR_M2=1; Delay(2000); DownHandle(); Delay(50); Beep(1); for(;;){;} } } }
/************************************** *名称: void Dial(void); *功能: 拨号子程序 *入口参数: 无 *出口参数: 无 **************************************/ void Dial(void) { uc data Number[7]; uc i; Number[0]=1; Number[1]=2; Number[2]=3; Number[3]=4; Number[4]=5; Number[5]=6; Number[6]=7; //开始拨号: UpHandle(); Delay(5); InitMT8880(DTMF8880); for(i=0;i<7;i++) {MT8880_WD(Number); //拨号 Delay(5); } Delay(10); }
/************************************** *名称: void UpHandle(void); *功能: 模拟摘机 *入口参数: 无 *出口参数: 无 **************************************/ void UpHandle(void) { EA=0; if (HandMode) P_Online=1; else P_Online=0; EA=1; }
/************************************** *名称: void DownHandle(void); *功能: 模拟挂机 *入口参数: 无 *出口参数: 无 **************************************/ void DownHandle(void) { EA=0; if (HandMode) P_Online=0; else P_Online=1; EA=1; }
/************************************** *名称: void Delay(ui count); *功能: 延时 *入口参数: ui count, *出口参数: 无 **************************************/ void Delay(ui count) { ui i,k; EA=0; for(i=0;i<count;i++) {for(k=0;k<1000;k++){;} } EA=1; }
/************************************** *名称: void Beep(uc count); *功能: 蜂鸣器鸣叫 *入口参数: count 鸣叫次数 *出口参数: 无 **************************************/ void Beep(uc count) { EA=0; for(;count>0;count--) { P_Beep=1; Delay(50); P_Beep=0; Delay(50); } EA=1; }
/*------------------------------------- *功能: 8880功能函数 -------------------------------------*/
/************************************** *名称: void MT8880_WC(uc com); *功能: 写控制寄存器CRA或CRB *入口参数: com--要写入的数据 *出口参数: 无 **************************************/ void MT8880_WC(uc com) { EA=0; MT_CS=0; MT_RS0=1; MT_RW=0; _nop_(); MT_CLK=1; com&=0x0f; MT_DataBus&=0xf0; MT_DataBus=com; _nop_(); MT_CLK=0; MT_CS=1; P2=0x00; EA=1; }
/************************************** *名称: void MT8880_WD(uc dat); *功能: 写MT8880的发送数据寄存器 *入口参数: dat--要发送的数据 *出口参数: 无 **************************************/ void MT8880_WD(uc dat) { EA=0; MT_CS=0; MT_RS0=0; MT_RW=0; MT_CLK=1; dat&=0x0f; MT_DataBus&=0xf0; MT_DataBus|=dat; MT_CLK=0; MT_CS=1; P2=0x00; EA=1; }
/*************************************** *名称: uc MT8880_RS(void); *功能: 读MT8880的状态寄存器 *入口参数: 无 *出口参数: temp--读出的数据,低4位有效 ***************************************/
uc MT8880_RS(void) { uc temp; EA=0; MT_DataBus|=0x0f; MT_CS=0; MT_RS0=1; MT_RW=1; MT_CLK=1; _nop_(); temp=MT_DataBus; temp &=0x0f; MT_CLK=0; MT_CS=1; P2=0x00; EA=1; return(temp); } /**************************************** *名称: void InitMT8880(uc mode); *功能: 初始化MT8880 *入口参数: mode 可以选择CP8880,DTMF8880 *出口参数: 无 ****************************************/ void InitMT8880(uc mode) { MT8880_WC(0x00); //写控制寄存器,确保控制寄存器指针指向CRA MT8880_WC(0x00); MT8880_WC(mode); //写控制寄存器A MT8880_WC(0x00); //写控制寄存器B MT8880_RS(); //读状态寄存器,用以清除各标志 } |