#include <pic.h>
#define uchar unsigned char
//typedef unsigned char uchar;
//**************************************************GSM指令定义****************************************************************/
uchar const cm0[]="AT\r\n";
uchar const cm1[]="ATE0\r\n"; //ATE0关闭回显,我还不回白什么是回显??
uchar const cm2[]="AT+CMGF=0\r\n"; //AT+CMGF=0 采用PDU格式,长度11
uchar const cm3[]="AT+CNMI=2,2,0,0,1\r\n"; //AT+CNMI=2,2,0,0,1 设置接收显示
uchar cmcd[] = "AT+CMGS=20"; //AT+CMGS=143, PDU数据串长度为143 温度值两位 xxx 长度11
uchar const cmhh[]="\r\n";
uchar const cmlt[]="0891683110101705F01100"; //短信中心号码及设置联通 22
uchar const cmyd[]="0891683108501305F01100"; //短信中心号码及设置移动 22
uchar cmnr[]="0008A7064F60597DFF01"; //发送的内容长度为128=80H
uchar cmdf[]="0B8151895223554"; //对方手机号码 18
uchar const end=0x1a; //短信结束标志->
uchar buffer[30];
//bit send_gsm_flag=0,en_gsm=1;
//********************************************延时程序********************************************************************/
void delayms(unsigned int x,unsigned int y) //延时ms级的程序,延时时间为:(3*y+4)*x+10=?
{
unsigned char z;
do{
z=y;
// do{;}while(--z);
while(--z); //此句与上一句等效!
}while(--x);
asm("nop");
}
void delayus(unsigned char x) //延时us级的程序,延时时间为:3*x+9=?
{
unsigned char d;
d=x;
while(--d){;}
asm("nop");
}
//*****************************************************UART初始化************************************************************/
void usart_init()
{
TRISC6=0; //RC6:TX为发送口
TRISC7=1; //RC7:RX为接收口
SYNC=0;//异步方式
BRGH=1;//高波特率
TXEN=1;//使能串行发送
//TXSTA=0x24; //使能发送,高波特率异步方式
RCSTA=0x90; //串口使能,连续接收
SPBRG=0x19; //设置波特率9600
}
/*********************************************************************************************************************
*UART串口发送函数
*函数名:void tx_dat(uchar len,uchar stemp[])
*说明:通过串口发送数据串
************************************************************************************************************************/
void tx_dat(uchar len,uchar const stemp[])
{
uchar i=0;
TXEN=1;//打开串行发送
for(i=0;i<len;i++)
{
TXIE=0;//串行中断允许控制位,发送中断关闭
RCIE=0;//接收中断关闭
TXREG=stemp[i];
delayms(50,10);
}
TXEN=0;//关闭串行发送
}
/***********************************************************************
*UART串口发送函数
*函数名:void send_one_byte(uchar tx_data)
*说明:通过串口发送字节数据
*************************************************************************/
void send_one_byte(uchar tx_data)
{ TXEN=1;
TXIE=0;//串行中断允许控制位,发送中断关闭
RCIE=0;//接收中断关闭
TXREG=tx_data;
while(TXIF==0);
delayms(50,10);
TXEN=0;
}
/*void convert(uchar const cm[]) //从ROM到RAM的转换函数
{uchar i;
for(i=0;cm[i]!=0x00;i++)
buffer[i]=cm[i];
}
*/
/*******************************************************************
*GSM初始化程序
*函数名:void gsm_initial()
*说明:初始化GSM
*************************************************************************/
void gsm_initial()
{
tx_dat(4,cm0); //AT\r\n 长度4
delayms(10000,10000);
tx_dat(6,cm1); //ATE0\r\n 长度6关闭回显
delayms(10000,10000);
tx_dat(11,cm2); //AT+CMGF=0\r\n 长度11
delayms(10000,10000);
tx_dat(19,cm3); //AT+CNMI=2,2,0,0,1 长度19
delayms(10000,10000);
}
/***********************************************************************
*向GSM发送数据函数
*函数名:void send_to_gsm()
*说明:向GSM发送含有温度数据的短息数据
*************************************************************************/
void send_to_gsm()
{// uchar b20_num,j;
/* if(changenumber_flag==1)
{
for(j=0;j<11;j++)
read_eeprom[j]=ISP_READ(0x28,0x00+j); //读取EEPROM
ISP_DISABLE(); //关闭ISP功能
change_mobilenumber();//更改手机号码
}
*/
tx_dat(10,cmcd); //AT+CMGS=, PDU数据串长度为 温度值两位 xx 长度11/10
tx_dat(2,cmhh); //\r\n
delayms(10000,10000); //进行延时
tx_dat(22,cmyd); //短信中心号码及设置联通或移动 22
tx_dat(16,cmdf); //对方手机号码 18
tx_dat(20,cmnr); //00080006发送的内容长度为192=c0
send_one_byte(end); //短信结束标志->
tx_dat(2,cmhh); //\r\n
}
main()
{di();
usart_init();
gsm_initial();
send_to_gsm();
while(1);
}