導航:首頁 > 操作系統 > 單片機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相關的資料

熱點內容
php查殺軟體 瀏覽:873
教育管理學pdf 瀏覽:543
伺服器均衡怎麼使用 瀏覽:622
linux中jps 瀏覽:952
單片機實驗感想 瀏覽:560
程序員級別數學演算法邏輯 瀏覽:899
2k21公園怎麼換伺服器 瀏覽:724
php釋放資料庫連接 瀏覽:722
php網頁抓取工具 瀏覽:726
android設置對齊方式 瀏覽:23
linux創建網頁 瀏覽:280
凈化車間門演算法 瀏覽:934
安卓怎麼搞jpg 瀏覽:546
如來佛祖命令雷神去下界 瀏覽:856
新電腦管家下載好怎麼解壓 瀏覽:530
php獲取介面數據 瀏覽:767
最後的命令 瀏覽:921
如何添加手機app桌面快捷圖標 瀏覽:427
ui設計師與程序員 瀏覽:418
壽司pdf 瀏覽:828