⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 51

📁 51单片机典型模块开发
💻
📖 第 1 页 / 共 3 页
字号:
    P0=dat; 									//写数据
    LCDE=1;										//高电平有效
    LCDE=0;
}
/*************************写命令子函数************************/
void cmd_wrt(uchar cmd)
{
    LCDE=0;
    busy();										//检测 读写操作使能吗
    P0=cmd; 									//命令
    RS=0; 										//指向命令计数器
    RW=0; 										//写
    LCDE=1;										//高电平有效
    LCDE=0;
}
/************************1602初始化函数***********************/
void init_1602(void)
{
    cmd_wrt(0x01);								//清屏
    cmd_wrt(0x0c);								//开显示,不显示光标,不闪烁
    cmd_wrt(0x06);								//完成一个字符码传送后,光标左移,显示不发生移位
    cmd_wrt(0x38);								//16×2显示,5×7点阵,8位数据接口
}
/***********************设定显示位置函数**********************/
void lcd_start(uchar start)
{
    cmd_wrt(start|0x80);
}
/***********************显示数据调整函数**********************/
uchar dat_adj(uint dat1)
{
    uchar i;
	dis_buf[0]=(uchar)(dat1/1000);				//百位
	dis_buf[1]=(uchar)((dat1%1000)/100);		//十位
	dis_buf[2]=(uchar)((dat1%100)/10);			//个位
	dis_buf[3]=10;								//小数点
	dis_buf[4]=(uchar)(dat1%10);				//小数点后个位
	for(i=0;i<2;i++)
	{
		if(dis_buf[i]!=0)break;					//确定显示位数
	}
	return(i);
}
/**************************显示子函数*************************/
void disp(uint dat,uchar k)
{
	uchar temp,j;
	temp=dat_adj(dat);
	lcd_start(k+temp);							//确定显示起始位置
	for(j=temp;j<5;j++)							//写显示数据
		dat_wrt(dis[dis_buf[j]]);
}
/************************字符串显示函数***********************/
void print(uchar *str)
{
	while(*str!='\0')							//直到字符串结束
	{
		dat_wrt(*str);							//  
		str++;									//指向下一个字符
	}
}

/*********************************************************************
 *                  AT指令发送程序                            *
 *********************************************************************/
uchar  Send_AT_Command(uchar type) 				//AT指令发送程序 
//这里为AT指令处理区,所有的AT指令都在这时对uart_buff数组进行赋值,并发送出去,    
//-正常情况下,AT指令反回也会在这里接收完       
//发送AT指令
//拨号时号码放在phone.number
//其他用para_temp
//strcpy:把src所指由NULL结束的字符串复制到destf所指的数组中
//strcat 把src所指字符串添加到dest结尾处(覆盖dest结尾处的'\0')并添加'\0'
{	
	AT_Command_Type=type;						//当前发送的命令类型
	send_count=0;								//设置发送数组指针为0
	switch(type)								//查看命令类型	
	{
		case RESET_TC35:						//复位TC35
			strcpy(uart_buff,"AT+CFUN=1,1");	//AT+CFUN=1,modem可以打电话,发短信;1立即
			break;
		case CHECK_PIN:							//检查当前是否要输入PIN码 读PIN码寄存器
			strcpy(uart_buff,"AT+CPIN?");
			break;
		case TC35_INIT:							//TC35初始化命令 ATE0 ATV0 合体
			strcpy(uart_buff,"ATE0V0");			//ATE0关闭命令回应,ATV0发送短型 (数字型) 结果码
			break;
        //0D 0A 54 43 33 35 0D 0A
		case SIM_ID:							// 合体组合  ATE0 ATV0 AT+CMGF=1 AT+CNMI=2,1 
			// AT+CMGF=1选择短消息信息格式为文本:0-PDU;1-文本
			//AT+CNMI=2,1   2 通知TE。在数据线被占用的情况下,先缓冲起来,待数据线空闲,再行通知
			//1 – 储存到默认的内存位置,并且向TE发出通知												
			strcpy(uart_buff,"ATE0V0+CMGF=1+CNMI=2,1");//读出SIM卡的卡号,与SIM卡标明的卡号一样
			break;
		case  AT_IPR:							//波特率//设置TC35的内部时钟
			strcpy(uart_buff,"AT+IPR=9600"); 	//取消波特率自动适配并设置波特率为9600bps
			break;
		case SMSS_ID:							//TC35i模块专用  
			strcpy(uart_buff,"ATE0V0^SSMSS=1+CNMI=2,1");//AT^SSMSS设置短消息存储序列,优先sim卡
			break;
		case SMS_CMGF:							//SMS 接收方式,
			strcpy(uart_buff,"ATE0V0+CMGF=0");	//AT+CMGF=0选择短消息信息格式为PDU:0-PDU;1-文本
			break;
		case PHONE_WRITE:  						//存电话号码 写电话本
			strcpy(uart_buff,"AT+CPBW=");
			strcat(uart_buff,para_temp);		//字符串para_temp添加到uart_buff结尾处
			break;
		case PHONE_READ:  						//读电话本
			strcpy(uart_buff,"AT+CPBR=");		//读电话本号参数
			strcat(uart_buff,&read_tmp); 		//字符串read_tmp添加到uart_buff结尾处
			uart_buff[9]=0x0d; 					//回车
			uart_buff[10]=0x0a;					//换行
			uart_buff[11]=0x00;					//空2格   
			uart_buff[12]=0x00;
			break;
		case SMS_CMGR:							//读一个短信
			strcpy(uart_buff,"AT+CMGR=");
			strcat(uart_buff,para_temp); 		//字符串para_temp添加到uart_buff结尾处
			break;
		case SMS_CMGS:							//写一个短信
			strcpy(uart_buff,"AT+CMGS=");		//AT+CMGS= "13X12345678"指定号码  
			strcat(uart_buff,para_temp); 		//字符串para_temp添加到uart_buff结尾处
			break;
		case SMS_CMGD:							//删除一个短信
			strcpy(uart_buff,"AT+CMGD=");
			strcat(uart_buff,para_temp); 		//字符串para_temp添加到uart_buff结尾处
			break;
		case  CMGS_MUB:    						//发报警短信内容
			strcpy(uart_buff,para_temp);		//字符串para_temp添加到uart_buff结尾处
			break;
		case AT_COMMAND:						//AT 命令
			break;								//返回
		default:
			receive_count=0;					//接收 数组指针清0
			return(TRUE);						//返回TRUE 1
    }
	ES=1;										//串口中断时能
	strcat(uart_buff,"\x0d\x00");				//在命令后加入CR 回车空格
	send_count=0;								//发送指针清零
	receive_count=0;      						//接送指针清零
	AT_Command_Status=COMMAND_WAIT;				//设置接收成功标志  0xff等待命令回应 //命令发出以后的返回参数
	timer_S_cnt=0;								//秒计数变量 1个数1s 清0
	txd_rxd_bit=0;								//接收正确标志位 清0
	at_send_bit=0;								//发送未完成标志0  不接收允许
	TI=1;										//发送数据完成标志设为1
	RI=0;										//清除接收标志
	if (type==TC35_INIT)						//TC35初始化命令
	{
		while (timer_S_cnt<6)					//等6S
		{
			if (AT_Command_Status!=COMMAND_WAIT||txd_rxd_bit==1) //不是等待接收回应或接收正确指令标志
				return(TRUE);					//返回TRUE 1
		}
	}
	else if((type==SMS_CMGR))					//读一个短信
	{
		while (timer_S_cnt<6)					//等6S
		{
			if (AT_Command_Status!=COMMAND_WAIT||txd_rxd_bit==1) //不是等待接收回应或接收正确指令标志
				return(TRUE);					//返回TRUE 1
		}
	}
	else
	{
		while (timer_S_cnt<6)					//等6S
		{
			if (AT_Command_Status!=COMMAND_WAIT||txd_rxd_bit==1)  //不是等待接收回应或接收正确指令标志
			{
				return(TRUE);  					//返回TRUE 1
			}
		}
	}
	return(FALSE);								//返回FALSE	0
}

 //所有的短信都在这里发送出去 
 //para_temp为短信内容数组, TMP_BUF为数组指针 
void send_sms(void)								//发送短信  	
{ 
	uchar  j=1,i=1;
	uchar  TMP_BUF;         					//万用变量
	Send_AT_Command(SIM_ID);					//合体组合  ATE0 ATV0 AT+CMGF=1 AT+CNMI=2,1
												//0011000D91683118180295F20008A70A8F 66670953719669FF01
    Send_AT_Command(SMS_CMGF);					//AT+CMGF=0选择短消息信息格式为PDU:0-PDU;1-文本
    TMP_BUF=0;									//万用变值
	para_temp[TMP_BUF++]='2';   				//短信号码长度,如果每加一个中文,长度加2
	para_temp[TMP_BUF++]='5';
	para_temp[TMP_BUF++]=0x0d;					//回车空2格
	para_temp[TMP_BUF++]=0x00;
	para_temp[TMP_BUF++]=0x00;
    Send_AT_Command(SMS_CMGS);					//写一个短信
    
	TMP_BUF=0;									// 万用变值
	para_temp[TMP_BUF++]='0';					//0011000D9168
	para_temp[TMP_BUF++]='0';
	para_temp[TMP_BUF++]='1';
	para_temp[TMP_BUF++]='1';
	para_temp[TMP_BUF++]='0';
	para_temp[TMP_BUF++]='0';
	para_temp[TMP_BUF++]='0';
	para_temp[TMP_BUF++]='D';
    para_temp[TMP_BUF++]='9';
	para_temp[TMP_BUF++]='1';
	para_temp[TMP_BUF++]='6';
	para_temp[TMP_BUF++]='8';
    	
    para_temp[TMP_BUF++]='3';					//改号码的地方13X12345678
	para_temp[TMP_BUF++]='1';					//发送对方号码311X325476F8
	para_temp[TMP_BUF++]='1';
	para_temp[TMP_BUF++]='X';
    para_temp[TMP_BUF++]='3';
	para_temp[TMP_BUF++]='2';
	para_temp[TMP_BUF++]='5';
	para_temp[TMP_BUF++]='4';
	para_temp[TMP_BUF++]='7';
	para_temp[TMP_BUF++]='6';
	para_temp[TMP_BUF++]='F';
	para_temp[TMP_BUF++]='8';
/* 	j=0;       //发送对方号码 
	do       //动态电话号码 
	{ 
		para_temp[TMP_BUF++]=TEL_temp[j+1]; 
		para_temp[TMP_BUF++]=TEL_temp[j]; 
		j=j+2; 
		if(TEL_temp[j+1]==0x0d) 
		{ para_temp[TMP_BUF++]='F'; 
			para_temp[TMP_BUF++]=TEL_temp[j]; 
			break; 
		} 
	} while(j<=18);  */
    para_temp[TMP_BUF++]='0';					//短信格式设备 发送中文字符方式
	para_temp[TMP_BUF++]='0';
	para_temp[TMP_BUF++]='0';
	para_temp[TMP_BUF++]='8';
	para_temp[TMP_BUF++]='A';
	para_temp[TMP_BUF++]='0';
	para_temp[TMP_BUF++]='1';					//短信长度、11个字或22个英文或数字
	para_temp[TMP_BUF++]='6';													
												//温度显值uint  temp;  //湿度显值uint  Humi;	
	para_temp[TMP_BUF++]='6';					//短信内容 "温度:"  6E29 5EA6 FF1A 				
	para_temp[TMP_BUF++]='E';
	para_temp[TMP_BUF++]='2';
	para_temp[TMP_BUF++]='9';
	para_temp[TMP_BUF++]='5';
	para_temp[TMP_BUF++]='E';
	para_temp[TMP_BUF++]='A';
	para_temp[TMP_BUF++]='6';
	para_temp[TMP_BUF++]='F';
	para_temp[TMP_BUF++]='F';
	para_temp[TMP_BUF++]='1';
	para_temp[TMP_BUF++]='A';
	para_temp[TMP_BUF++]=temp/1000+0X30;		//温度百位
	para_temp[TMP_BUF++]=(temp/100)%10+0X30;	//温度十位
	para_temp[TMP_BUF++]=(temp/10)%10+0X30;		//温度个位
	para_temp[TMP_BUF++]=0X2E;					//小数点
	para_temp[TMP_BUF++]=temp%10+0X30;			//温度一位小数位
	
	para_temp[TMP_BUF++]='6';	 				//短信内容 “湿度:”  6E7F 5EA6 FF1A
	para_temp[TMP_BUF++]='E';
	para_temp[TMP_BUF++]='7';
	para_temp[TMP_BUF++]='F';
	para_temp[TMP_BUF++]='5';
	para_temp[TMP_BUF++]='E';
	para_temp[TMP_BUF++]='A';
	para_temp[TMP_BUF++]='6';
	para_temp[TMP_BUF++]='F';
	para_temp[TMP_BUF++]='F';
	para_temp[TMP_BUF++]='1';
	para_temp[TMP_BUF++]='A';
	para_temp[TMP_BUF++]=Humi/1000+0X30;		//湿度百位
	para_temp[TMP_BUF++]=(Humi/100)%10+0X30;	//湿度十位
	para_temp[TMP_BUF++]=(Humi/10)%10+0X30;		//湿度个位
	para_temp[TMP_BUF++]=0X2E;					//小数点
	para_temp[TMP_BUF++]=Humi%10+0X30;			//湿度一位小数位
                
    para_temp[TMP_BUF++]=0X1A;					//短信结束符
	para_temp[TMP_BUF++]=0X0D;					//回车空格
    para_temp[TMP_BUF++]=0X00;
    Send_AT_Command(CMGS_MUB);					//发报警短信内容
	system_server=SYS_SMSR;						//系统状态 主叫摘机
	receive_count=0;							//接收 数组指针    短信读
	AT_Command_Status=COMMAND_WAIT;				//等待命令回应 设置接收成功标志
	send_count=0xff;							//发送不允许		
	timer_S_cnt=0;								//秒计数变量清0
	while((timer_S_cnt<15)&&(AT_Command_Status==COMMAND_WAIT))//等待命令回应  时间<15S
	{
		if(strsearch("+CMGS:"))        			//是否有新短信
			break;
		else if(txd_rxd_bit)  					//接收正确的指令中断
			break;
	}
	para_temp[0]=(num_tmp1/10)+0x30;        	//十位 num_tmp1短信号码参数
	para_temp[1]=(num_tmp1%10)+0x30;         	//个位
	para_temp[2]=0x0d;							//回车空格
	para_temp[3]=0x00;
	Send_AT_Command(SMS_CMGD);					//删除一个短信
	timer_S_cnt=0; 								//秒计数变量清零
	Send_AT_Command(SIM_ID);					//合体组合  ATE0 ATV0 AT+CMGF=1 AT+CNMI=2,1
	for(i=0;i<=MAX_TM-2;i++)					//清空
		uart_buff[i]=0;
}


void Initialize_Model(void)						//初始化 PIN检测
{    
	uchar i;
	IO_IGT=0;									// 触发点火信号端
	for(i=0;i<12;i++)							//进行初始化,并显示
	{
		Send_AT_Command(TC35_INIT); 			//TC35初始化命令 ATE0 ATV0 合体 
		if((uart_buff[1]==0x0d)&&(uart_buff[0]==0x30))//0 换行
		{ 
			chinit=1;	 						//进行初始化 标志
			break;
		}
		if((i%4)==0)
		{
			IO_IGT=1;							// 触发点火信号端
		}
		else if((i%2)==0)
		{
			IO_IGT=0;							// 触发点火信号端
		}
		timer_S_cnt=0; 							//秒计数变量清零
	}	 
	if(i>=11)
	{
		chinit=0; 								//进行初始化 标志清0
		goto at_eer;
	}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -