导航:首页 > 操作系统 > 单片机sim900

单片机sim900

发布时间:2022-09-12 02:40:00

① 51单片机怎样和SIM900a模块连接起来

一、单模块故障排除
分别测试“USB转TTL”“SIM900a”“51单片机”的UART通讯能否正常使用,主要测试51单片机芯片RX-TX引脚短接后能否自首自发。
二、模块协作故障排除
PC-USB-TTL-SIM900a
PC-USB-TTL-51单片机
51单片机-SIM900a
三、问题原因猜测
1、TX-RX连接线序错误
2、TTL-RS232电平错误
3、单片机串口多硬件接入相互冲突,比如TX-RX引出的同时连接了USB转UART芯片
4、单片机代码问题

② 单片机为什么接收不到SIM900A模块发送的数据

用原子的程序调试成功了,我自己的没成功。。。估计跟电脑串口调试助手,底层驱动有关。。我先用电脑和sim900a相互收发短信正常后,然后SIM900A模块别断电,带电操作把串口线和战舰开发板串口相应接好。战舰开发板,和SIM900A模块通信就正常了。战舰开发板串口就可以收到SIM900A的串口发送的信息了。。
电脑串口调试助手和SIM900A通信正常后,SIM900A带电操作,和战舰开发板串口跳线。此时通信正常。
搞不懂那电脑串口调试助手,底层怎么运行的,执行了什么代码。。。搞懂这个就可以解决了,但是我还没有搞懂电脑串口调试助手那界面怎么写出来的,底层到底进行了什么操作。。直接抄原子哥的代码,做触摸屏电话试验了。。
你要是研究出来了,通知我一下。我现在正在学习界面编程。。。。

③ 怎么用51单片机读取sim900a接收的短信,sim900a接收的短信到哪里了,要怎么用串口把它读

没用过这个模块不过帮你找到了一些资料。把发送端由PC改成51单片机应该是一样的效果
http://wenku..com/link?url=1LV69Z6dKOTgtkWRlCrws-gwOLAuALPzn37CGmTRd_Or4Q9PGsWW6641klwzpabxOUBDqL-

④ 用51单片机读取sim900里的短信程序怎么写

买模块商家送资料, 串口配置程序略,主程序如下:
/**********************************************************************************
* 工程名 :短信控制LED
* 描述 :通过短信控制开发板的LED
* 实验平台:C51
* 库版本 :
* 作者 :泥人通信模块开发平台团队
* 博客 :http://nirenelec.blog.163.com
* 淘宝 :http://shop105683814.taobao.com

* 硬件连接说明
使用单片串口与GPRS模块通信
C51 GPRS模块
P30 (RXD)->RXD
P31 (TXD)->TXD
GND ->GND

* 软件功能说明
板子上电后运行指示灯RUNING_LED会以一秒的频率闪烁
手机发送“onled”点亮LED;
手机发送“offled”熄灭LED;
**********************************************************************************/
#include "config.h"
#include "string.h"
#include "delay.h"
#include "uart.h"

#define Automatic_Startup 1 //定义自启动 V1.2版本起有自启动功能

#define Buf1_Max 200 //串口1缓存长度
/************* 本地常量声明 **************/
sbit RUNING_LED = P1^2; //运行指示灯
sbit LED = P1^3; //控制指示灯

/************* 本地变量声明 **************/
xdata u8 Uart1_Buf[Buf1_Max];

u8 Times=0,First_Int = 0,shijian=0;

bdata u8 Flag;//定时器标志位
sbit Timer0_start =Flag^0; //定时器0延时启动计数器

/************* 本地函数声明 **************/
void GPIO_config(void); //引脚初始化
void Timer0Init(void); //定时器0初始化
void CLR_Buf1(void); //清串口接收缓存
u8 Find(u8 *a); //查找字符串
void Second_AT_Command(u8 *b,u8 *a,u8 wait_time);//发送指令
void Wait_CREG(void); //查询等待模块注册成功
void Set_Text_Mode(void); //设置短信为TEXT模式
void Check_New_Message(void); //查询新短信

/************* 外部函数和变量声明*****************/

/*******************************************************************************
* 函数名 : main
* 描述 : 主函数
* 输入 :
* 输出 :
* 返回 :
* 注意 : 串口波特率是9600,GPRS模块默认波特率是115200,需要自己通过串口助手修改
为9600方可使用。
程序会删除手机卡上的短信,请注意
*******************************************************************************/
void main(void)
{
Timer0Init(); //初始化定时器0
GPIO_config();
EA=1; //开总中断
Uart1Init(); //初始化串口9600
Wait_CREG(); //查询等待模块注册成功
Set_Text_Mode();//设置短信为TEXT模式
//Second_AT_Command("AT+CMGD=1,4","OK",3);//删除卡上所有短信
while(1)
{
Check_New_Message();
}

}

/*******************************************************************************
* 函数名 : Uart1
* 描述 : 串口1中断服务入口函数
* 输入 :
* 输出 :
* 返回 :
* 注意 :
*******************************************************************************/
void Uart1() interrupt 4
{
if (RI)
{
RI = 0; //清除RI位
Uart1_Buf[First_Int] = SBUF; //将接收到的字符串存到缓存中
First_Int++; //缓存指针向后移动
if(First_Int > Buf1_Max) //如果缓存满,将缓存指针指向缓存的首地址
{
First_Int = 0;
}
}
if (TI)
{
TI = 0; //清除TI位
}
}

/*******************************************************************************
* 函数名 : Timer0_ISR
* 描述 : 定时器0中断服务入口函数,20ms中断一次
* 输入 :
* 输出 :
* 返回 :
* 注意 :
*******************************************************************************/
void Timer0_ISR() interrupt 1
{
static u8 Time_count=0;
TR0=0;//关定时器
TL0 = 0x00; //重设定时器初值
TH0 = 0xB8; //重设定时器初值
Time_count++;
if(Time_count>=50)
{
Time_count = 0;
RUNING_LED =~RUNING_LED;
}
if(count_20ms) //20ms延时计数器
count_20ms--;
if(Timer0_start)
Times++;
if(Times > (50*shijian))
{
Timer0_start = 0;
Times = 0;
}
TR0=1;//开定时器
}
/*******************************************************************************
* 函数名 : GPIO_config
* 描述 : IO口配置函数
* 输入 :
* 输出 :
* 返回 :
* 注意 :
*******************************************************************************/
void GPIO_config(void)
{
LED=1;
RUNING_LED=1;
}
/*******************************************************************************
* 函数名 : Timer0Init
* 描述 : 定时器0初始化,20ms定时
* 输入 :
* 输出 :
* 返回 :
* 注意 :
*******************************************************************************/
void Timer0Init(void) //20毫秒@11.0592MHz
{
AUXR &= 0x7F; //定时器时钟12T模式
TMOD &= 0xF0; //
TMOD |= 0x01; //设置定时器模式,16位定时器
TL0 = 0x00; //设置定时器初值
TH0 = 0xB8; //设置定时器初值
TF0 = 0; //清TF0标志
TR0 = 1; //定时器0开始计时
ET0 = 1; //使能定时器0中断
}
/*******************************************************************************
* 函数名 : CLR_Buf1
* 描述 : 清除串口2缓存数据
* 输入 :
* 输出 :
* 返回 :
* 注意 :
*******************************************************************************/
void CLR_Buf1(void)
{
u16 k;
for(k=0;k<Buf1_Max;k++) //将缓存内容清零
{
Uart1_Buf[k] = 0x00;
}
First_Int = 0; //接收字符串的起始存储位置
}

/*******************************************************************************
* 函数名 : Find
* 描述 : 判断缓存中是否含有指定的字符串
* 输入 :
* 输出 :
* 返回 : unsigned char:1 找到指定字符,0 未找到指定字符
* 注意 :
*******************************************************************************/

u8 Find(u8 *a)
{
if(strstr(Uart1_Buf,a)!=NULL)
return 1;
else
return 0;
}

/*******************************************************************************
* 函数名 : Second_AT_Command
* 描述 : 发送AT指令函数
* 输入 : 发送数据的指针、希望收到的应答、发送等待时间(单位:S)
* 输出 :
* 返回 :
* 注意 :
*******************************************************************************/

void Second_AT_Command(u8 *b,u8 *a,u8 wait_time)
{
u8 i;
u8 *c;
c = b; //保存字符串地址到c
CLR_Buf1();
i = 0;
while(i == 0)
{
if(!Find(a)) //查找需要应答的字符
{
if(Timer0_start == 0)
{
b = c; //将字符串地址给b
for (b; *b!='\0';b++)
{
UART1_SendData(*b);
}
UART1_SendLR();
Times = 0;
shijian = wait_time;
Timer0_start = 1;
}
}
else
{
i = 1;
Timer0_start = 0;
}
}
CLR_Buf1();
}

/*******************************************************************************
* 函数名 : Set_Text_Mode
* 描述 : 设置短信为TEXT文本模式
* 输入 :
* 输出 :
* 返回 :
* 注意 :
*******************************************************************************/
void Set_Text_Mode(void)
{
Second_AT_Command("ATE0","OK",3); //取消回显
Second_AT_Command("AT+CNMI=3,2,0,0,0","OK",3); //新短信直接输出
Second_AT_Command("AT+CMGF=1","OK",3); //TEXT模式
Second_AT_Command("AT+CPMS=\"SM\",\"SM\",\"SM\"","OK",3);//所有操作都在SIM卡中进行
}

/*******************************************************************************
* 函数名 : Check_Message_rec
* 描述 : 检查是否有新信息,并执行信息内容指令
* 输入 :
* 输出 :
* 返回 :
* 注意 :
*******************************************************************************/

void Check_New_Message(void)
{
u8 temp=0;
if(strstr(Uart1_Buf,"+CMT")!=NULL) //若缓存字符串中含有"+CMT"就表示有新的短信
{
delay_ms(3);//等待数据全部接收完成
if(strstr(Uart1_Buf,"onled")!=NULL)
{
LED = 0;
}
if(strstr(Uart1_Buf,"offled")!=NULL)
{
LED = 1;
}
CLR_Buf1();
//Second_AT_Command("AT+CMGD=1,4","OK",3);//删除短信
}
}

/*******************************************************************************
* 函数名 : Wait_CREG
* 描述 : 等待模块注册成功
* 输入 :
* 输出 :
* 返回 :
* 注意 :
*******************************************************************************/
void Wait_CREG(void)
{
u8 i;
u8 k;
i = 0;
CLR_Buf1();
while(i == 0)
{
CLR_Buf1();
UART1_SendString("AT+CREG?");//查询模块网络注册状态
UART1_SendLR();
delay_ms(250);
for(k=0;k<Buf1_Max;k++)
{
if(Uart1_Buf[k] == ':')
{
if((Uart1_Buf[k+4] == '1')||(Uart1_Buf[k+4] == '5')) //表明网络注册成功
{
i = 1;
break;
}
}
}
}
}

⑤ 关于单片机控制SIM900A模块发送短信的程序问题

第一个SBUF被注释掉了,那么第二个对P2赋值,我认为应该是为了观察是否收到了数据,P2口接的是指示灯,通过观察指示灯,判断数据的接收情况,这是最初调试的代码,我是这么认为的,祝你学习愉快!

⑥ 求一个89C51单片机 控制SIM900(相似的也可以),收发短信的程序!

代码如下
流程是一致的
只是端口定义不同
#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=temp;dst++;}
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=0;i<15;i++)
{
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);
}
}

⑦ 怎么用51单片机读取sim900a接收的短信

你这个应该是用串口连接的吧。读短信当然是往串口发送AT指令具体的AT指令可以参考模块的资料里面有。

⑧ 51单片机的GSM模块sim900a运用,手机收发短信“控制”实验

就是判断,然后驱动模块发短信就好了,

⑨ 如何利用51单片机读取sim900a收到的短信并且利用收到的短信控制其他引脚

买模块时,商家会给你例程的,短信控制LED灯亮灭。我这都有51单片机短信控制LED的程序

⑩ 单片机怎么读取sim900a收到的短信

使用中断方式获取到短信,然后对短信的内容进行解析,然后执行相应的功能就可以。
void serial () interrupt 4 using 3 
{
uchar bb;
if(RI==0)
return;
ES=0;
RI=0;
bb=SBUF;
if(bb=='m') //如果接收到的短信内容是m,就执行flag4=1;
flag4=1;
if(bb=='k')//如果接收到的短信内容是k,就执行flag4=0;
flag4=0;
ES=1;

阅读全文

与单片机sim900相关的资料

热点内容
新电脑管家下载好怎么解压 浏览:526
php获取接口数据 浏览:763
最后的命令 浏览:921
如何添加手机app桌面快捷图标 浏览:427
ui设计师与程序员 浏览:417
寿司pdf 浏览:828
pythonbg是什么 浏览:248
c数值算法程序大全 浏览:785
android整点报时 浏览:221
稀土pdf 浏览:536
单片机电子锁 浏览:596
通达信机智资金流指标公式源码 浏览:216
php安装xsl扩展 浏览:842
python如何使用help 浏览:367
上汽荣威app在哪里查询 浏览:903
冰柜压缩机温度108 浏览:720
阿里云邮smtp服务器地址 浏览:252
解压馆认知理解 浏览:239
为什么使用非官方服务器会封号 浏览:9
佛山加密文档软件 浏览:813