51单片机与sim900a相连接的最简单的程序是什么?

51单片机与sim900a相连接的最简单的程序是什么?,第1张

/************************************************************

程序说明:

程序运行后如果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)

}

}


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12423867.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-25
下一篇 2023-05-25

发表评论

登录后才能评论

评论列表(0条)

保存