❶ 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怎麼連接
這么有科技含量的東西,居然不會連接,難道只會編程?串口 直接連接就行