導航:首頁 > 操作系統 > 單片機連接sim900a

單片機連接sim900a

發布時間:2022-12-07 09:35:25

❶ 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可以和STC89C51單片機的txd和rxd直接相連嗎

SIM900A模塊是可以直接與單片機的TXD和RXD連接。
需要設置一下波特率,然後就可以直接通信了。

❸ 51單片機與sim900a相連接的最簡單的程序是什麼

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

程序說明:

本程序運行後如果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!='')

{

SBUF=*str;

while(!TI);//等待發送完成信號(TI=1)出現

TI=0;

str++;

}

}

//延時函數大概是1s鍾,不過延時大的話不準...

void DelaySec(int sec)

{

uint i , j= 0;

for(i=0; i<sec; i++)

{

for(j=0; j<65535; j++)

{

}

}

}

void main()

{

uchar i = 0;

LED1_OFF;

LED2_OFF;

LED3_OFF;

LED4_OFF;

SerialInti();

while(1)

{

LED1_ON;

LED2_OFF;

Uart1Sends("AT+CMGF=1 ");

DelaySec(3);//延時3秒

Uart1Sends("AT+CSCS="GSM" ");

DelaySec(3);//延時3秒

Uart1Sends("AT+CSMP=17,167,0,250 ");//設備簡訊模式(手機自動保存模式)

// Uart1Sends("AT+CSMP=17,167,0,240 ");//設備簡訊模式(手機非自動保存模式)

DelaySec(3);//延時3秒

Uart1Sends("AT+CMGS="18332563682" ");

DelaySec(5);//延時3秒

Uart1Sends(sms_text);

Uart1Send(0x1a);

LED2_ON;

LED1_OFF;

DelaySec(15);//延時20秒

}

}

//你接p3.0和p3.1吧

❹ 關於單片機控制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);
}
}

❻ sim900a和單片機stc89c51怎麼連接

這么有科技含量的東西,居然不會連接,難道只會編程?串口 直接連接就行

閱讀全文

與單片機連接sim900a相關的資料

熱點內容
伺服器被ban的物品怎麼合成 瀏覽:989
如何理解壓和垂 瀏覽:481
程序員的愛情秘密 瀏覽:266
量子計算機會影響程序員嗎 瀏覽:659
安卓開發如何與伺服器連接電腦 瀏覽:993
式數學pdf 瀏覽:773
伺服器如何連接vcenter管理界面 瀏覽:23
php解析域名ip 瀏覽:440
java單例多例 瀏覽:485
51單片機唱 瀏覽:86
csgo如何加入好友伺服器 瀏覽:115
bresenham演算法畫圓簡單代碼 瀏覽:827
怎麼做反詐app 瀏覽:459
亞信面試java 瀏覽:852
生化危機1解壓視頻 瀏覽:347
miui安卓怎麼設置 瀏覽:781
美團app套餐相冊怎麼改 瀏覽:607
單片機程序存儲c 瀏覽:489
賽高網解壓密碼 瀏覽:775
雲伺服器安裝賺錢寶 瀏覽:107