/************************************************************
程序说明:
本程序运行后如果gprs模块找到服务商信号,就拨打指定电话。
1.将自己的51单片机的串口1连接到GSM的tx rx gnd
2.找到程序中前面的#define处,根据说明修改好自己的单片机配置,编译程序
2.下载程序
3.按下模块复位键,启动模块,等待信号灯闪烁变慢,复位单片机
4.等待发送成功
*************************************************************/
#include <REGX52.H>
#define uchar unsigned char
#define uint unsigned int
//以下是板子上LED的配置,把Px_x改成自己对应的脚。
#define LED1_ON P1_0 = 0
#define LED1_OFF P1_0 = 1
#define LED2_ON P1_1 = 0
#define LED2_OFF P1_1 = 1
#define LED3_ON P1_2 = 0
#define LED3_OFF P1_2 = 1
#define LED4_ON P1_3 = 0
#define LED4_OFF P1_3 = 1
//以下是你的51单片机的晶振大小
#define FOSC_110592M
//#define FOSC_12M
//以下是开机后发送到手机的内容,发送的号码在程序中修改。
uchar sms_text[] = "123"
//注意,无论接收到信号还是发送完信号,都会进中断服务程序的
/*初始化程序(必须使用,否则无法收发),次程序将会使用定时器1*/
void SerialInti()//初始化程序(必须使用,否则无法收发)
{
TMOD=0x20//定时器1 *** 作模式2:8位自动重载定时器
#ifdef FOSC_12M//在这里根据晶振大小衫穗扮设置不同的数值初族兄始化串口
TH1=0xf3//装入初值,波特率2400
TL1=0xf3
#else
TH1=0xfd//装入初值,波特率9600
TL1=0xfd
#endif //end of SOC_12M
TR1=1//打开定时器
SM0=0//设置串行通讯工作模式,(10为一部发送,波特率可变,由定时器1的溢出率控制)
SM1=1//(同上)在此模式下,定时器溢出一次就发送一个位的数据
REN=1//串行接收允许位(要先设置sm0sm1再开串行允许)
EA=1//开总中断
ES=1//开串行口中断
}
/*串行通讯中断,收发完成将进入该中断*/
void Serial_interrupt() interrupt 4
{
//a=SBUF
P2=SBUF
RI=0//接收中断信号清零,表示将继续接收
//flag=1//进入中断的标志符号
}
void Uart1Send(uchar c)
{
SBUF=c
while(!TI)//等待发送完成信号(TI=1)出现
TI=0
}
//串行口连续发送char型数组,遇到终止号/0将停或灶止
void Uart1Sends(uchar *str)
{
while(*str!='\0')
{
SBUF=*str
while(!TI)//等待发送完成信号(TI=1)出现
TI=0
str++
}
}
//延时函数大概是1s钟,不过延时大的话不准...
void DelaySec(int sec)
{
uint i , j= 0
for(i=0i<seci++)
{
for(j=0j<65535j++)
{
}
}
}
void main()
{
uchar i = 0
LED1_OFF
LED2_OFF
LED3_OFF
LED4_OFF
SerialInti()
while(1)
{
LED1_ON
LED2_OFF
Uart1Sends("AT+CMGF=1\r")
DelaySec(3)//延时3秒
Uart1Sends("AT+CSCS=\"GSM\"\r")
DelaySec(3)//延时3秒
Uart1Sends("AT+CSMP=17,167,0,250\r")//设备短信模式(手机自动保存模式)
//Uart1Sends("AT+CSMP=17,167,0,240\r")//设备短信模式(手机非自动保存模式)
DelaySec(3)//延时3秒
Uart1Sends("AT+CMGS=\"18332563682\"\r")
DelaySec(5)//延时3秒
Uart1Sends(sms_text)
Uart1Send(0x1a)
LED2_ON
LED1_OFF
DelaySec(15)//延时20秒
}
}
//你接p3.0和p3.1吧
sim900a和sim800c的51单片机程序一样。根据查询相关资料信息显示,sim900a和sim800c的51单片机都是利用串口贺败通信,附件是51单片机控制SIM800的例程,因此他们的程序是一样的。计算机程序是一组升亩计算机能识别和执行的指令,运吵拍森行于电子计算机上,满足人们某种需求的信息化工具。代码如下流程是一致的
只是端口定义不同
#include
"sim900a.h"
#include
"usart.h"
#include
"delay.h"
#include
"led.h"
#include
"key.h"
#include
"lcd.h"
#include
"dma.h"
#include
"flash.h"
#include
"touch.h"
#include
"malloc.h"
#include
"string.h"
#include
"text.h"
#include
"usart2.h"
#include
"ff.h"
//将收到的AT指令应答数据返回给电脑串口
//mode:0,不清零USART2_RX_STA
//
1,清零USART2_RX_STA
void
sim_at_response(u8
mode)
{
if(USART2_RX_STA&0X8000)
//接收到一次数据了
{
USART2_RX_BUF[USART2_RX_STA&0X7FFF]=0//添加结束符
printf("%s",USART2_RX_BUF)
//发送到串口
if(mode)USART2_RX_STA=0
}
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////
//ATK-SIM900A
各项测试(拨号测试、短信测试、GPRS测试)共用代码
//sim900a发送命令后,检测接收到的应答
//str:期待的应答结果
//返回值:0,没有得到期待的应答结果
//
其他,期待应答结果的位置(str的位置)
u8*
sim900a_check_cmd(u8
*str)
{
char
*strx=0
if(USART2_RX_STA&0X8000)
//接收到一次数据了
{
USART2_RX_BUF[USART2_RX_STA&0X7FFF]=0//添加结束符
strx=strstr((const
char*)USART2_RX_BUF,(const
char*)str)
}
return
(u8*)strx
}
//向sim900a发送命令
//cmd:发送的命令做答字符猜哪串(不需要添加回车了),当cmd<0XFF的时候,发送数字(比如发送0X1A),大于的时候发送字符串.
//ack:期待的应答结果,如果为空,则表示不需要等待应答
//waittime:等待时间(单位:10ms)
//返回值:0,发送成功(得穗胡码到了期待的应答结果)
//
1,发送失败
u8
sim900a_send_cmd(u8
*cmd,u8
*ack,u16
waittime)
{
u8
res=0
USART2_RX_STA=0
if((u32)cmd<=0XFF)
{
while(DMA1_Channel7->CNDTR!=0)
//等待通道7传输完成
USART2->DR=(u32)cmd
}else
u2_printf("%s\r\n",cmd)//发送命令
if(ack&&waittime)
//需要等待应答
{
while(--waittime)
//等待倒计时
{
delay_ms(10)
if(USART2_RX_STA&0X8000)//接收到期待的应答结果
{
if(sim900a_check_cmd(ack))break//得到有效数据
USART2_RX_STA=0
}
}
if(waittime==0)res=1
}
return
res
}
//将1个字符转换为16进制数字
//chr:字符,0~9/A~F/a~F
//返回值:chr对应的16进制数值
u8
sim900a_chr2hex(u8
chr)
{
if(chr>='0'&&chr<='9')return
chr-'0'
if(chr>='A'&&chr<='F')return
(chr-'A'+10)
if(chr>='a'&&chr<='f')return
(chr-'a'+10)
return
0
}
//将1个16进制数字转换为字符
//hex:16进制数字,0~15
//返回值:字符
u8
sim900a_hex2chr(u8
hex)
{
if(hex<=9)return
hex+'0'
if(hex>=10&&hex<=15)return
(hex-10+'A')
return
'0'
}
//unicode
gbk
转换函数
//src:输入字符串
//dst:输出(uni2gbk时为gbk内码,gbk2uni时,为unicode字符串)
//mode:0,unicode到gbk转换
//
1,gbk到unicode转换
void
sim900a_unigbk_exchange(u8
*src,u8
*dst,u8
mode)
{
u16
temp
u8
buf[2]
if(mode)//gbk
2
unicode
{
while(*src!=0)
{
if(*src<0X81)
//非汉字
{
temp=(u16)ff_convert((WCHAR)*src,1)
src++
}else
//汉字,占2个字节
{
buf[1]=*src++
buf[0]=*src++
temp=(u16)ff_convert((WCHAR)*(u16*)buf,1)
}
*dst++=sim900a_hex2chr((temp>>12)&0X0F)
*dst++=sim900a_hex2chr((temp>>8)&0X0F)
*dst++=sim900a_hex2chr((temp>>4)&0X0F)
*dst++=sim900a_hex2chr(temp&0X0F)
}
}else
//unicode
2
gbk
{
while(*src!=0)
{
buf[1]=sim900a_chr2hex(*src++)*16
buf[1]+=sim900a_chr2hex(*src++)
buf[0]=sim900a_chr2hex(*src++)*16
buf[0]+=sim900a_chr2hex(*src++)
temp=(u16)ff_convert((WCHAR)*(u16*)buf,0)
if(temp<0X80){*dst=tempdst++}
else
{*(u16*)dst=swap16(temp)dst+=2}
}
}
*dst=0//添加结束符
}
//键盘码表
const
u8*
kbd_tbl1[13]={"1","2","3","4","5","6","7","8","9","*","0","#","DEL"}
const
u8*
kbd_tbl2[13]={"1","2","3","4","5","6","7","8","9",".","0","#","DEL"}
u8**
kbd_tbl
u8*
kbd_fn_tbl[2]
//加载键盘界面(尺寸为240*140)
//x,y:界面起始坐标(320*240分辨率的时候,x必须为0)
void
sim900a_load_keyboard(u16
x,u16
y,u8
**kbtbl)
{
u16
i
POINT_COLOR=RED
kbd_tbl=kbtbl
LCD_Fill(x,y,x+240,y+140,WHITE)
LCD_DrawRectangle(x,y,x+240,y+140)
LCD_DrawRectangle(x+80,y,x+160,y+140)
LCD_DrawRectangle(x,y+28,x+240,y+56)
LCD_DrawRectangle(x,y+84,x+240,y+112)
POINT_COLOR=BLUE
for(i=0i<15i++)
{
if(i<13)Show_Str_Mid(x+(i%3)*80,y+6+28*(i/3),(u8*)kbd_tbl[i],16,80)
else
Show_Str_Mid(x+(i%3)*80,y+6+28*(i/3),kbd_fn_tbl[i-13],16,80)
}
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)