
#include #include #include #define uint unsigned int #define uchar unsigned char sbit B2=P1^0; sbit B1=P1^1; sbit A1=P1^2; sbit A2=P1^3; sbit RED=P3^3; /* //开发板这三个引脚参考资料 sbit E=P2^7; //1602使能引脚 sbit RW=P2^6; //1602读写引脚 sbit RS=P2^5; //1602数据/命令选择引脚 */ //这三个引脚参考资料 sbit E=P0^5; //1602使能引脚 sbit RW=P0^6; //1602读写引脚 sbit RS=P0^7; //1602数据/命令选择引脚 uchar i_TC35_RECE; uchar i_receive, TC35_MAX; uchar TC35_RE[50]; uchar TC35_CON, ch; uchar read_flag; uchar i_TC35; uchar flag_TC35_RE; //标志 TC35_RE[50]接收几次数据,为1时表示接收的数据量小于50个,为2时,表示接收数据量大于50,小于100 uchar RED_flag; uint b,RED_long; uchar code TC_MDSJ[]={"AT+CMGS=15256006305"}; //目的手机地址, uchar code TC_ZXH[]={"AT+CSCA=+8613010305500"}; //本地中心号。 ////////其他地方不要乱动//////////////////////////////////////////////////////// uchar code TC_FSNR1[]={"I AM OK1"}; //发送短信内容。 uchar code TC_WLZT[]={"AT+CREG?"}; //网络状态查询 uchar code TC_MSXZ[]={"AT+CMGF=1"}; //发送模式选择。 uchar code TC_DQML[]={"AT+CMGR=1"}; //短信读取命令。 uchar code TC_SCML[]={"AT+CMGD=1"}; //短信删除命令。 uchar code TC_ATF[]={"AT&F"}; //格式化命令。 uchar code TC_BEGINE[]={"AT"}; void delay(uint); void init_serialcom( void ); void send_uart( unsigned char); void ATNAME(void); void AT_CMGS(void); void AT_CSCA(void); void AT_RST(void); void AT_CREG(void); void AT_CMGF(void); void AT_CMGR(void); void AT_CMGD(void); void KEY_TEST(void); //按键测试 /******************************************************************** * 名称 : delay5us() * 功能 : 延时,延时时间大概为5US。 * 输入 : 无 * 输出 : 无 ***********************************************************************/ void delay5us() { _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); } /******************************************************************** * 名称 : bit Busy(void) * 功能 : 这个是一个读状态函数,读出函数是否处在忙状态 * 输入 : 输入的命令值 * 输出 : 无 ***********************************************************************/ bit Busy(void) { bit busy_flag = 0; RS = 0; RW = 1; E = 1; delay(1); busy_flag = (bit)(P0 & 0x80); E = 0; return busy_flag; } /******************************************************************** * 名称 : wcmd(uchar del) * 功能 : 1602命令函数 * 输入 : 输入的命令值 * 输出 : 无 ***********************************************************************/ void wcmd(uchar del) { while(Busy()); RS = 0; RW = 0; E = 0; delay(1); P2= del; delay(1); E = 1; delay(1); E = 0; } /******************************************************************** * 名称 : wdata(uchar del) * 功能 : 1602写数据函数 * 输入 : 需要写入1602的数据 * 输出 : 无 ***********************************************************************/ void wdata(uchar del) { while(Busy()); RS = 1; RW = 0; E = 0; delay(1); P2= del; delay(1); E = 1; delay(1); E = 0; } /******************************************************************** * 名称 : L1602_init() * 功能 : 1602初始化,请参考1602的资料 * 输入 : 无 * 输出 : 无 ***********************************************************************/ void L1602_init(void) { wcmd(0x38); wcmd(0x0c); wcmd(0x06); wcmd(0x01); } /******************************************************************** * 名称 : L1602_char(uchar hang,uchar lie,char sign) * 功能 : 改变液晶中某位的值,如果要让第一行,第五个字符显示"b" ,调用该函数如下 L1602_char(1,5,'b') * 输入 : 行,列,需要输入1602的数据 * 输出 : 无 ***********************************************************************/ void L1602_char(uchar hang,uchar lie,char sign) { uchar a; if(hang == 1) a = 0x80; if(hang == 2) a = 0xc0; a = a + lie - 1; wcmd(a); wdata(sign); } /******************************************************************** * 名称 : L1602_string(uchar hang,uchar lie,uchar *p) * 功能 : 改变液晶中某位的值,如果要让第一行,第五个字符开始显示"ab cd ef" ,调用该函数如下 L1602_string(1,5,"ab cd ef;") * 输入 : 行,列,需要输入1602的数据 * 输出 : 无 ***********************************************************************/ void L1602_string(uchar hang,uchar lie,uchar *p) { uchar a,b=0; if(hang == 1) a = 0x80; if(hang == 2) a = 0xc0; a = a + lie - 1; while(1) { wcmd(a++); b++; if((*p == '\\0')||(b==16)) break; wdata(*p); p++; } } void delay(uint i) { unsigned int i_delay,j_delay; for(i_delay=0;i_delay { for(j_delay=0;j_delay<100;j_delay++) {;} } } void init_serialcom( void ) { SCON = 0x50 ; //UART为模式1,8位数据,允许接收 TMOD = 0x20 ; //定时器1为模式2,8位自动重装 PCON |= 0x80 ; //SMOD=1; TH1 = 0xFD ; //Baud:19200 fosc="11".0592MHz TL1=0; // IE = 0x90 ; //Enable Serial Interrupt IE = 0x94; //允许总中断中断,使能 INT1 外部中断 TCON = 0x10; //触发方式为脉冲负边沿触发 REN=1; //允许串口接收数据 EA=1;//打开全局中断 ES=1;//打开串口中断 EX1 = 0; TR1 = 1 ; // timer 1 run TI=1; } //向串口发送一个字符 void send_uart( unsigned char ch) { ES=0; while (TI==0); TI= 0 ; SBUF=ch; } //串口接收中断函数 , void serial () interrupt 4 { ES=0; if(RI==1) { RI = 0 ; TC35_RE[i_TC35_RECE++]=SBUF; // 表示接受了多少个字符 } if(i_TC35_RECE==50) { flag_TC35_RE=2; i_TC35_RECE=0; } ES=1; } //AT测试指令 void AT_TEST() { uchar i; for(i=0;i send_uart(0X0D); send_uart(0X0A); } void ATNAME1() ///// //I AM OK1 { uchar i; for(i=0;i send_uart(0X1A); send_uart(0X0D); send_uart(0X0A); // TC35_CON=ATDAT; } //写目的手机的 void AT_CMGS() {//AT+CMGS=131******** uchar i; for(i=0;i send_uart(0X0D); // send_uart(0X0D); send_uart(0X0A); // TC35_CON=CMGS; } //写信息中心号 void AT_CSCA() {//AT+CSCA=+86130******** uchar i; for(i=0;i send_uart(0X0D); // send_uart(0X0D); send_uart(0X0A); // TC35_CON=CSCA; } //AT复位指令 void AT_RST() { uchar i; for(i=0;i send_uart(0X0D); // send_uart(0X0D); send_uart(0X0A); // TC35_CON=RST; } //AT网络状态查询指令 void AT_CREG() { uchar i; delay(500); for(i=0;i send_uart(0X0D); // send_uart(0X0D); send_uart(0X0A); // TC35_CON=CREG; } //AT接收格式指令 void AT_CMGF() {//AT+CMGF=1 uchar i; for(i=0;i send_uart(0X0D); // send_uart(0X0D); send_uart(0X0A); // TC35_CON=CMGF; } //AT短消息读取指令 void AT_CMGR() {//AT+CMGR=1 uchar i; for(i=0;i send_uart(0X0D); send_uart(0X0D); send_uart(0X0A); // TC35_CON=CMGR; } //AT短消息删除指令 void AT_CMGD() {//AT+CMGD=1 uchar i; for(i=0;i send_uart(0X0D); // send_uart(0X0D); send_uart(0X0A); // TC35_CON=CMGD; } void init_devices1() //向目的手机发送“I AM OK1” { i_TC35_RECE=0; AT_TEST(); //发送“AT”指令 ES=1; L1602_string(1,1,TC_BEGINE); L1602_string(2,1,TC35_RE); i_TC35_RECE=0; AT_CMGF(); //发送“AT+CMGF=1”指令,选择text发送模式 ES=1; L1602_string(1,1,TC_MSXZ); L1602_string(2,1,TC35_RE); i_TC35_RECE=0; AT_CSCA(); //发送手机中心号 ES=1; L1602_string(1,1,TC_ZXH) ; L1602_string(2,1,TC35_RE); i_TC35_RECE=0; AT_CMGS(); //发送目的手机号 ES=1; L1602_string(1,1,TC_MDSJ); L1602_string(2,1,TC35_RE); i_TC35_RECE=0; ATNAME1(); //发送短信内容 ES=1; L1602_string(1,1,TC_FSNR1); L1602_string(2,1,TC35_RE); } /* void KEY_TEST() { if(s19==0) { delay(10); if(s19==0) { while(!s19); init_devices1(); //向目的手机发送“I AM OK1” } } if(s18==0) { delay(10); if(s18==0) { while(!s18); i_TC35_RECE=0; AT_CMGR(); ES=1; delay(100); i_TC35_RECE=0; AT_CMGR(); ES=1; L1602_string(1,1,TC_DQML); L1602_string(2,1,TC35_RE+19); L1602_char(2,15,flag_TC35_RE+0x30); } } if(s17==0) //删除短信 { delay(10); if(s17==0) { while(!s17); i_TC35_RECE=0; AT_CMGD(); ES=1; L1602_string(1,1,TC_SCML); L1602_string(2,1,TC35_RE); } } } */ void main( ) { L1602_init(); //LCD初始化 init_serialcom(); //初始化串口 delay(10); flag_TC35_RE=1; RED=1; //I/O口初始化 RED_flag=0; RED_long=0; while(1) { // KEY_TEST(); i_TC35_RECE=0; AT_CMGF(); ES=1; delay(30); i_TC35_RECE=0; AT_CMGR(); ES=1; delay(30); i_TC35_RECE=0; AT_CMGR(); ES=1; delay(30); while(!((TC35_RE[19]=='1')||(TC35_RE[19]=='2')||(TC35_RE[19]=='3')||(TC35_RE[19]=='4')||(TC35_RE[19]=='5'))) { i_TC35_RECE=0; AT_CMGR(); ES=1; L1602_string(1,1,TC_DQML); L1602_string(2,1,TC35_RE+19); L1602_char(1,15,flag_TC35_RE+0x30); } RED_long=TC35_RE[19]; L1602_char(1,16,RED_long); RED_long=(TC35_RE[19]-48 )*100; //1米到9米 ,转换成厘米 if(flag_TC35_RE==2) { flag_TC35_RE=1; A1=1; A2=0; B1=1; B2=0; i_TC35_RECE=0; AT_CMGD(); ES=1; L1602_string(1,1,TC_SCML); L1602_string(2,1,TC35_RE); EX1 = 1; } } } void IR_IN() interrupt 2 using 0 { float a; EX1 = 0; a=3.3; //两个白线 距离约为3厘米 ES=0; while(!RED); RED_flag++; b=(uint)RED_flag*a; if(b A1=1; A2=0; B1=1; B2=0; } else { A1=0; A2=0; B1=0; B2=0; b=0; RED_long=0; } EX1 = 1; }
