📄 51
字号:
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 + -