1、智能家居控制系统C程序智能家居控制系统C程序日期:2010-03-03 来源:本站编辑 作者:admin 字体:大 中 小 (投递新闻) #include bit r_flag; enum eepromtype M2401,M2402,M2404,M2408,M2416,M2432,M2464,M24128,M24256; extern bit RW24XX(unsigned char *DataBuff,unsigned char ByteQuantity,unsigned int Address, unsigned char ControlByte,enum eepromtype Eepr
2、omType); sbit key = P20; bit key_flag; sbit dog = P07; sbit LED = P00; sbit TELA = P36; sbit TEL = P37; sbit RING = P32; sbit switching =P04; unsigned char mode; bit passwordflag; unsigned char password6; unsigned char passwordtest6; void dlms(unsigned int x); void reset(void); void open(void); /* /
3、 / INT1中断服务程序 / /* / unsigned char ring_fluctuation; unsigned char ring_count; bit ring_flag; void service_int0() interrupt 0 using 1 if(ring_fluctuation5) EX0=0;/INT1_OFF; ring_dlsm+; if(ring_dlsm=20)/等待一秒 ring_dlsm=0; EX0=1;/INT1_ON; ring_fluctuation=0; ring_count+;/震铃次数 if(ring_flag)/有效振铃 if(ring
4、_count=6) ring_count=7; mode=1; else/无效振铃 if(ring_count2) ring_reset_time=800; if(ring_count=2)|(ring_count=1) ring_time+; if(ring_time=200) ring_flag=1; if(ring_count0)&(ring_count0) ring_reset_time+; if(ring_reset_time=1100)/55s reset(); LED=0; dlms(100); LED=1; dlms(100); LED=0; dlms(100); LED=1;
5、 dlms(100); LED=0; dlms(100); LED=1; dlms(100); LED=0; dlms(100); LED=1; dlms(100); LED=0; dlms(100); LED=1; dlms(100); LED=0; dlms(100); LED=switching; /* / / INT1中断服务程序 / /* / unsigned char DTMF; void service_int1() interrupt 2 using 1 EX1=0; DTMF=P1; DTMF=DTMF4; void main(void) TMOD=0x11; TH1=0x3
6、c; TL1=0xb0; TR1=1; ET1=1; IT0=1; EX0=1; IT1=0; EX1=1; reset(); EA=0; r_flag=RW24XX(password,6,0x0000,0xa1,M2402);/R if(P2_0=0) dlms(20); if(P2_0=0) ring_flag=1; mode=1; passwordflag=1; ring_count=7; ring_fluctuation=6; EA=1; while(1) open(); dog=dog; switch(mode) case 0:; break; case 1: TEL=1; LED=
7、0;/ dlms_time=0; ring_reset_time=0; while(dlms_time40) dlms(1); TELA=TELA; ring_reset_time=0; LED=1;/ TELA=0; mode+; DTMF=255; EX1=1; LED=switching; break; case 2:/password if(DTMF!=255) passwordtest0=DTMF; if(INT1=1) dlms_time=0; while(dlms_time2); if(INT1=1) DTMF=255; mode+; dlms_time=0; while(dlm
8、s_time10) dlms(2); TELA=TELA; EX1=1; TELA=0; break; case 3:/password if(DTMF!=255) passwordtest1=DTMF; if(INT1=1) dlms_time=0; while(dlms_time2); if(INT1=1) DTMF=255; mode+; dlms_time=0; while(dlms_time10) dlms(2); TELA=TELA; EX1=1; TELA=0; break; case 4:/password if(DTMF!=255) passwordtest2=DTMF; i
9、f(INT1=1) dlms_time=0; while(dlms_time2); if(INT1=1) DTMF=255; mode+; dlms_time=0; while(dlms_time10) dlms(2); TELA=TELA; EX1=1; TELA=0; break; case 5:/password if(DTMF!=255) passwordtest3=DTMF; if(INT1=1) dlms_time=0; while(dlms_time2); if(INT1=1) DTMF=255; mode+; dlms_time=0; while(dlms_time10) dl
10、ms(2); TELA=TELA; EX1=1; TELA=0; break; case 6:/password if(DTMF!=255) passwordtest4=DTMF; if(INT1=1) dlms_time=0; while(dlms_time2); if(INT1=1) DTMF=255; mode+; dlms_time=0; while(dlms_time2); if(INT1=1) DTMF=255; mode+; /EX1=1; break; case 8: if(passwordflag=0) if(passwordtest0=password0)&(passwor
11、dtest1=password1)&(passwordtest2=password2)&(passwordtest3=password3)&(passwordtest4=password4)&(passwordtest5=password5) mode+; dlms_time=0; else reset(); else dlms_time=0; while(dlms_time10) dlms(2); TELA=TELA; TELA=0; password0=passwordtest0; password1=passwordtest1; password2=passwordtest2; pass
12、word3=passwordtest3; password4=passwordtest4; password5=passwordtest5; EA=0; r_flag=RW24XX(password,6,0x0000,0xa0,M2402);/W EA=1; reset(); break; case 9: while(dlms_time20) dlms(1); TELA=TELA; while(dlms_time25) while(dlms_time45) dlms(1); TELA=TELA; TELA=0; EX1=1; mode+; break; case 10: switch(DTMF
13、) case 1: if(ring_reset_time1050) dlms_time=0; switching=0; LED=0; while(dlms_time10) while(dlms_time20) dlms(2); TELA=TELA; while(dlms_time30) while(dlms_time40) dlms(2); TELA=TELA; TELA=0; DTMF=255; EX1=1; break; case 2: if(ring_reset_time1050) dlms_time=0; switching=1; LED=1; while(dlms_time10) w
14、hile(dlms_time20) dlms(4); TELA=TELA; while(dlms_time30) while(dlms_time40) dlms(4); TELA=TELA; TELA=0; DTMF=255; EX1=1; break; case 12: reset(); break; break; /-/ default:; /-/ void reset(void) TEL=0; TELA=0; ring_fluctuation=0; ring_count=0; ring_flag=0; ring_dlsm=0; ring_time=0; dlms_time=0; ring
15、_reset_time=0; key_flag=0; mode=0; EX1=1; DTMF=255; LED=switching; passwordflag=0; passwordtest0=255; passwordtest1=255; passwordtest2=255; passwordtest3=255; passwordtest4=255; passwordtest5=255; void open(void) if(key=0)&(key_flag=0)&(passwordflag=0) dlms_time=0; while(dlms_time10) key_flag=0; voi
16、d dlms(unsigned int x) unsigned int i; while (x-0) dog=dog; for (i=0;i163;i+) ; /24cxx /-START-/ /enum eepromtype M2401,M2402,M2404,M2408,M2416,M2432,M2464,M24128,M24256; /extern bit RW24XX(unsigned char *DataBuff,unsigned char ByteQuantity,unsigned int Address, / unsigned char ControlByte,enum eepr
17、omtype EepromType); / flag=RW24XX(&x,1,0x0000,0xa0,M24256);/W 24C256 / flag=RW24XX(&x,1,0x0000,0xa1,M24256);/R 24C256 #include /#pragma ot(6,SIZE) #include #define ERRORCOUNT 10 sbit SDA=P27;/对应硬件 sbit SCL=P26;/对应硬件 enum eepromtype M2401,M2402,M2404,M2408,M2416,M2432,M2464,M24128,M24256; enum eeprom
18、type EepromType; /*/ /DataBuff为读写数据输入输出缓冲区的首址 /ByteQuantity 为要读写数据的字节数量 /Address 为EEPROM的片内地址 /ControlByte 为EEPROM的控制字节,具体形式为(1)(0)(1)(0)(A2)(A1)(A0)(R/W),其中R/W=1, /表示读操作,R/W=0为写操作,A2,A1,A0为EEPROM的页选或片选地址; /EepromType为枚举变量,需为M2401至M24256中的一种,分别对应24C01至24C256; /函数返回值为一个位变量,若返回1表示此次操作失效,0表示操作成功; /ERRO
19、RCOUNT为允许最大次数,若出现ERRORCOUNT次操作失效后,则函数中止操作,并返回1 /*/ extern bit RW24XX(unsigned char *DataBuff,unsigned char ByteQuantity,unsigned int Address, unsigned char ControlByte,enum eepromtype EepromType) void Delay(unsigned char DelayCount); void IICStart(void); void IICStop(void); bit IICRecAck(void); void
20、 IICNoAck(void); void IICAck(void); unsigned char IICReceiveByte(void); void IICSendByte(unsigned char sendbyte); unsigned char data j,i=ERRORCOUNT; bit errorflag=1; while(i-) IICStart(); IICSendByte(ControlByte&0xfe); if(IICRecAck() continue; if(EepromTypeM2416) IICSendByte(unsigned char)(Address8)
21、; if(IICRecAck() continue; IICSendByte(unsigned char)Address); if(IICRecAck() continue; if(!(ControlByte&0x01) j=ByteQuantity; errorflag=0; /*clr errorflag while(j-) IICSendByte(*DataBuff+); if(!IICRecAck() continue; errorflag=1; break; if(errorflag=1) continue; break; else IICStart(); IICSendByte(ControlByte); if(IICRecAck() continue; while(-ByteQuantity) *DataBuff+=IICReceiveByte(); IICAck()
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1