哪位大神知道此女名字有c51和sim900a通信程序,要求自己验证过有用的。。。发个谢谢

查看: 4204|回复: 8
51控制sim900a 发短信程序
主题帖子精华
新手上路, 积分 41, 距离下一级还需 9 积分
在线时间0 小时
菜鸟来请教一下,求助个大神啊!!用51串口控制,我只可以实现打电话的,但是发短信的无论如何我都实现不了,求解救!!
大家有没有代码发上来共享一下?
主题帖子精华
在线时间510 小时
根据我们SIM900A模块的教程,发送那些指令,就可以发送短信的。
估计是你最后的0X1A没发送对吧?呵呵,要16进制发送哦
我是开源电子网站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺:
微信公众平台:正点原子
主题帖子精华
新手上路, 积分 41, 距离下一级还需 9 积分
在线时间0 小时
回复【2楼】正点原子:
---------------------------------
我有写这一个的,那个是发送字节0x1a
主题帖子精华
在线时间510 小时
回复【3楼】欧洲的松露:
---------------------------------
那你检查下看看是哪个地方出错了,可以用串口助手接收你51单片机发送的指令,来分析一下
我是开源电子网站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺:
微信公众平台:正点原子
主题帖子精华
新手上路, 积分 41, 距离下一级还需 9 积分
在线时间0 小时
回复【4楼】正点原子:
---------------------------------
sim900a的波特率是115200,我将51单片机的初值设为0xff,smod=1;可是用串口助手接收到单片机发送的指令是乱码,(接线完全正确),这个是因为波特率吗,似乎51单片机达不到115200的波特率吧
主题帖子精华
在线时间510 小时
回复【5楼】欧洲的松露:
---------------------------------
SIM900A是自适应波特率的,不一定是115200,你9600也可以啊
我是开源电子网站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺:
微信公众平台:正点原子
主题帖子精华
新手上路, 积分 22, 距离下一级还需 28 积分
在线时间0 小时
回复【6楼】正点原子:
---------------------------------
我正在用mega16控制SIM900A打电话,可是不知道是波特率不同步还是延时的问题,苦无成果,这是程序,还请各位高手指点一下,谢谢!!!!!
#include&&iom16v.h&
#include&&macros.h&
#define&uchar&unsigned&char
#define&uint&&unsigned&int
#define&RxIn&90
//定义接收的数组长度为90
#define&mclk&8000000
#define&RXD_PORT&&DDRD&=&0XFFORTD&|=&BIT(PD0)&
#define&realy0&&&DDRB&=&0XFFORTB&=&~BIT(PB0)
uchar&&AT[]=&AT&; //握手信号
uchar&&ATE[]=&ATE0&; //关回显
uchar&&AT_CNMI[]=&AT+CNMI=2,1&; //设置这组参数来了新信息直接显示到串口,不作存储
//uchar&&AT_CSCA[]=&AT+CSCA=\&+0\&&; //设置服务中心号码
uchar&&AT_CSCS[]=&AT+CSCS=\&GSM\&&;
uchar&&AT_CMGS_TPYTONGXIN[]=&AT+CMGS=\&\&\r\n&;
uchar&&ok[]=&OK!&; //发送操作成功信息到目标号码
uchar&&fail[]=&Operate&Failed,&Try&again!&;
//发送操作失败信息到目标号码
uchar&at[]=&ATD;&;
uchar&SystemBuf[RxIn]; //储存出口接收数据
uchar&CommandBuf[6];
//用来存储指令
uchar&state[17]; //用来存储IO口状态
uchar&state1[17]; //用来存储IO口状态
uchar&Rx=0;
uint& //记录状态
uchar&temp1; //用记录P0口状态
uchar&temp2; //用于记录P2口状态
uchar&check=0; //查询标志位
uchar&flag=0;
//指令标志位
uchar&sign=0;
//&uchar&nbsp3_7=P3^7; //启动GSM的启动线连IGT
//&uchar&
//&UART0&initialize
//&desired&baud&rate:&9600
//&actual:&baud&rate:%)
void&uart0_init(uint&baud)
{
&&&&UCSRB&=&0x00;&//disable&while&setting&baud&rate
&&&&UCSRA&=&0x00;
&&&&UCSRC=(1&&URSEL)|(0&&UPM0)|(3&&&UCSZ0);
&&&&baud=mclk/16/baud-1;
&&&&UBRR=0x03;
&&&&UCSRB=(1&&TXEN)|(1&&&RXEN)|(1&&RXCIE);
&&&&DDRD|=0X02;
}
#pragma&interrupt_handler&uart0_rx_isr:iv_USART0_RXC
void&uart0_rx_isr(void)
{
&&&&DDRB&=&0XFF;
&&&&nbspORTB&&=&~0X01;
&&&&//uart&has&received&a&character&in&UDR
&&&&if(Rx&&RxIn)
&&&&{
&&&&&&&&SystemBuf[Rx]=UDR;
&&&&&&&&Rx++;
&&&&}
&&&&//Rx=0;
&&&&nbspORTB&|=&0X01;
//call&this&routine&to&initialize&all&peripherals
void&init_devices(void)
{
&&&&//stop&errant&interrupts&until&set&up
&&&&CLI();&//disable&all&interrupts
&&&&//port_init();
&&&&uart0_init(115200);
&&&&MCUCR&=&0x00;
&&&&GICR&&=&0x00;
&&&&TIMSK&=&0x00;&//timer&interrupt&sources
&&&&SEI();&//re-enable&interrupts
&&&&//all&peripherals&are&now&initialized
}
/********************************************************
**
函数void&Delay_ms(uint&i);
实现功能:进行毫秒延时
&&&**
********************************************************/
void&Delay_ms(uint&i)
{
&&&&uint&x,y;
&&&&for(x=0;x&i;x++)
&&&&&&&&for(y=0;y&1141;y++);
}
/***********************************************************************
**
函数void&sendchar(uchar&ch);
实现功能:发送一字节数据
***********************************************************************/
void&sendchar(uchar&ch)
{
&&&&while(!(UCSRA&(BIT(UDRE))));&&&
&&&&UDR&=&&&&
&&&&while(!(UCSRA&(BIT(TXC))));&&
&&&&UCSRA&|=&BIT(TXC);&&&//清零
}
/***********************************************************************
** 函数void&sendstring(uchar&*p);
实现功能:通过串口发送字符串
***********************************************************************/
void&sendstring(uchar&*p)
{
&&&&while(*p)
&&&&{
&&&&&&&&sendchar(*p);
&&&&&&&&p++;
&&&&}
&&&&sendchar(0x0D);
&&&&sendchar(0x0A);&&&&&&&//回车
}
/***********************************************************************
** 函数void&sendstringEx(uchar&*p);
&&&&&&&&实现功能:通过串口发送字符串
***********************************************************************/
void&sendstringEx(uchar&*p)
{
&&&&while(*p)
&&&&{
&&&&&&&&sendchar(*p);
&&&&&&&&p++;
&&&&}
}
/************************************************************************
**& 函数void&GSM_INIT(void);
实现功能:初始化TC35模块
************************************************************************/
void&GSM_INIT(void)
{
&&&&LOOP:
&&&&Delay_ms(5000);
&&&&sendstring(AT);
&&&&Delay_ms(5000);
&&&&sendstring(ATE);
&&&&Delay_ms(5000);
&&&&sendstring(AT_CSCS);
&&&&Delay_ms(5000);
&&&&sendstring(AT_CNMI);&&&//直接显示,不做存储
&&&&Delay_ms(5000);
&&&&for(Rx=0;Rx&RxIn;Rx++)
&&&&{
&&&&&&&&SystemBuf[Rx]=0x00;
&&&&}
&&&&Rx=0;
&&&&Delay_ms(1000);
&&&&sendstring(AT_CMGF);
&&&&Delay_ms(2000);
&&&&//&&Delay_ms(2000);
&&&&//2,3
&&&&if((SystemBuf[2]==0X4F)&&&&(SystemBuf[3]==0X4B)) //判断是否模块初始化成功,成功的话模块会回复“OK”给单片机
&&&&{
&&&&&&&&//sign=1;
&&&&&&&&nbspORTB&=&0X01;&
//如果单片机没有收到OK,就继续发送初始化指令
&&&&&&&&for(Rx=0;Rx&RxIn;Rx++)
&&&&&&&&{
&&&&&&&&&&&&SystemBuf[Rx]=0x00;
&&&&&&&&}
&&&&&&&&Rx=0;
&&&&}
&&&&else
&&&&{
&&&&&&&&for(Rx=0;Rx&RxIn;Rx++)
&&&&&&&&{
&&&&&&&&&&&&SystemBuf[Rx]=0x00;
&&&&&&&&}
&&&&&&&&Rx=0;
&&&&&&&&goto&LOOP;
&&&&}
}
void&main(void)
{
&&&&Delay_ms(500); //延时大约10秒,等待模块联网
&&&&init_devices();
&&&&
&&&&GSM_INIT();
&&&&sendstringEx(AT_CMGS_TPYTONGXIN);
&&&&Delay_ms(100);
&&&&sendstring("ATD;");
&&&&Delay_ms(100);
&&&&sendchar(0X1A);
&&&&while(1);
}&
主题帖子精华
新手上路, 积分 23, 距离下一级还需 27 积分
在线时间0 小时
菜鸟最近在弄一个项目,用STC89系列单片机控制SIM900A给指定手机发送短信,求大神给分享个程序!!!
主题帖子精华
在线时间510 小时
回复【7楼】李慧娟199310:
---------------------------------
你自己分析问题在哪里?
我是开源电子网站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺:
微信公众平台:正点原子
Powered by文章数:356
评论数:36
访问量:40081
注册日期:
阅读量:5863
阅读量:12276
阅读量:382962
阅读量:1074564
51CTO推荐博文
为什么51CTO的代码域,总是对不齐,明明在编辑器整理的好了。为何要实施这个项目?一般小区楼下,每幢都会有一个门禁系统,可以使用钥匙打开门禁,有的可以使用刷卡打开门禁,有的可以使用密码打开门禁,但是,长期下来,因为小区人多,锁的钥匙孔会被捅坏,物业修起来也很怠慢使用密码按键解锁门禁,按键也会失灵每家都会安装一个【楼宇对讲器】,用来与楼下人对话,或者可以从视频看出,是哪位亲朋,并且可以门禁解锁。目标:使用智能家居,嵌入楼宇对讲机,模拟开门按键,完成开门动作。适用对象:家里人多,拥有门禁的钥匙不够用的家庭出入门禁不想带钥匙的人大冬天,懒得拿冰冷的钥匙开门的人物业门禁钥匙,密码不好使的人使用方法:1,给模块插入一张有来电显示功能的移动/联通SIM卡,上电初始化,一个短的嘀的一声提示,初始化完成。2,在任何时候任何地点,手机呼叫SIM900A GSM通信模块的号码,门禁解锁。【小区楼幢-门禁外观】钥匙+键盘+刷卡+摄像头【小区楼幢-门禁外观】键盘+摄像头+刷卡【小区楼幢-门禁外观】 &钥匙室内【楼宇对讲机】外观室内【楼宇对讲机】内部图室内【楼宇对讲机】结合单片机【SIM900A模块】结合单片机【单片机串口通信 &波特率计算器】Ver2.0版本程序C51 &SIM900A 判断来电身份,蜂鸣器响起 远程控制工程名 &:手机呼叫SIM900A,门禁解锁1 &先用USB转TTL模块测试模块好用,发送AT,波特率到9600同步2 &STC12C4052AD单片机晶振 11.0592MHz,12M不可以用 &版本号:V1.0手机呼叫SIM900A的号码,蜂鸣器亮500MS;具体实现看程序,注释我写的非常详细了/******************************
工程名&&:手机呼叫SIM900A,门禁解锁
1&先用USB转TTL模块测试模块好用,发送AT,波特率到9600同步
2&51单片机晶振&11.0592MHz,12M不可以用&&
手机呼叫SIM900A的号码,LED亮500MS;
*******************************/
#include&"string.h"
#include&"STC12C2052AD.h"
#define&cache_max&200&&&&&&&&&&&&&&&&&&&&&&//串口接收缓存长度
xdata&unsigned&char&uart_cache[cache_max];&//&xdata&把变量存在flash中,而不存在RAM中
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&//code&定义的数据要放在ROM里面,写入后就不能再更改
bdata&unsigned&char&F&&&&//定时器标志位&&bdata&把变量定义为可拆成8位寻址
sbit&Timer_start&=Flag^0;&&&&//延时计数功能开关
sbit&RUNING&&=&P3^7;&&&&&&&&&//SIM900A运行指示灯,1秒闪烁一次
sbit&unlock&&=&P1^7;&&&&&&&&&//解锁
unsigned&char&code&*ring="CLIP";&&&&&&&&&&&//来电标记
unsigned&char&code&*phone1="1336218****";&&//管理员1的手机号
unsigned&char&code&*phone2="1395804****";&&//管理员2的手机号
unsigned&char&code&*phone3="1776715****";&&//管理员3的手机号
unsigned&char&Times=0;&&&&&&&&//&定时器中断次数累加
unsigned&char&First_Int&=&0;&&//&串口数组字符索引
unsigned&char&delay=0;&&&&&&&&//中断定时器,实际数据delay*50次
void&SendData(unsigned&char&dat){&&&//&发一个8位数据到串口SBUF
&&&&ES=0;&&&&&&&&&&&&&&&&&&
&&&&SBUF=&&&&&&&&&&
&&&&while(TI!=1);&&
&&&&TI=0;&&&&&&&&&&&&&&&&&&
&&&&ES=1;&&&&&&&&&&&&&&&&&&
void&SendString(unsigned&char&*s){&&//&发多个8位数据到串口SBUF
&&&&while(*s)
&&&&SendData(*s++);
void&SendLR(void)&{&&&&&&//&发回车换行
&&&&SendString("\r\n");
void&DELAY_MS&(unsigned&int&a){&&&//&延时
&&&&unsigned&int&i;
&&&&while&(&--a&!=&0&)&&&&
&&&&for&(i=0;i&=600;i++);
void&Uart1Init(void)&&&{&&&//9600bps@11.0592MHz
&&&&PCON&&=&0x7F;&&&&&&&&&&//波特率不倍速
&&&&SCON&&=&0x50;&&&&&&&&&&//8位数据,可变波特率
&&&&AUXR&&=&0xBF;&&&&&&&&&&//定时器1时钟为Fosc/12,即12T
&&&&AUXR&&=&0xFE;&&&&&&&&&&//串口1选择定时器1为波特率发生器
&&&&TMOD&&=&0x0F;&&&&&&&&&&//清除定时器1模式位
&&&&TMOD&|=&0x20;&&&&&&&&&&//设定定时器1为8位自动重装方式
&&&&TL1&=&0xFD;&&&&&&&&&&&&//设定定时初值
&&&&TH1&=&0xFD;&&&&&&&&&&&&//设定定时器重装值
&&&&ET1&=&0;&&&&&&&&&&&&&&&//禁止定时器1中断
&&&&TR1&=&1;&&&&&&&&&&&&&&&//启动定时器1
&&&&ES=1;&&&&&&&&&&&&&&&&&&//开串口中断
void&Uart1()&interrupt&4{
&&&&uart_cache[First_Int]&=&SBUF;&&&&&//将接收到的字符串存到缓存中
&&&&First_Int++;&&&&&&&&&&&&&&&&&&&&&&//缓存指针向后移动
&&&&if(First_Int&&&cache_max)&&&&&&&&&//如果缓存满,将缓存指针指向缓存的首地址
&&&&&&First_Int&=&0;&&&&&&&&&&&&&&&&&&//数组索引,归位
&&&&RI&=&0;&&&&&&&&&&&&&&&&&&&&&&&&&&&//清除RI位
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中断
&&&&EA=1;&&&&&&&&&&&&&&&&&&//开总中断
void&Timer0_ISR()&interrupt&1{&&&&&&&&&&//最高级别中断服务程序
&&&&static&unsigned&char&Time_count=0;&&//&定时器计数器&static全局生命周期
&&&&TR0=0;&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&//关定时器
&&&&TL0&=&0x00;&&&&&&&&&&&&&&&&&&&&&&&&&//重设定时器初值
&&&&TH0&=&0xB8;&&&&&&&&&&&&&&&&&&&&&&&&&//重设定时器初值
&&&&Time_count++;&&&&&&&&&&&&&
&&&&if(Time_count&=50)&&&{
&&&&&&&&Time_count&=&0;
&&&&&&&&RUNING&=~RUNING;&&&&&&//SIM900A运行指示灯,1秒闪烁一次
&&&&if(Timer_start)&Times++;&&//如果收到允许定时,开始计时
&&&&if(Times&&&(50*delay)){&&&//如果Times&到达设定时间
&&&&&&&&Timer_start&=&0;
&&&&&&&&Times&=&0;&&&&&&&&&&&&//&全部变量Times,通知程序&计时时间已到
&&&&TR0=1;&&&&&&&&&&&&&&&&&&&&&//开定时器
void&CLR_Buf1(void){
&&&&unsigned&int&k;
&&&&for(k=0;k&cache_k++)&&&&&//将缓存内容清零
&&&&uart_cache[k]&=&0x00;
&&&&First_Int&=&0;&&&&&&&&&&&&&&//接收字符串的起始存储位置
void&Send_Command(unsigned&char&*b,unsigned&char&*a,unsigned&char&wait_time){&&&&&&&&&
&&&&unsigned&char&i;
&&&&unsigned&char&*c;
&&&&c&=&b;&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&//保存字符串地址到c
&&&&CLR_Buf1();&
&&&&i&=&0;
&&&&while(i&==&0)&{&
&&&&&&&&if(strstr(uart_cache,a)==NULL)&&{&&//查找需要应答的字符
&&&&&&&&&&&&if(Timer_start&==&0){
&&&&&&&&&&&&&&&&b&=&c;&&&&&&&&&&&&&&&&&&&&&//将字符串地址给b
&&&&&&&&&&&&&&&&for&(b;&*b!='\0';b++)
&&&&&&&&&&&&&&&&SendData(*b);
&&&&&&&&&&&&&&&&SendLR();&&
&&&&&&&&&&&&&&&&Times&=&0;
&&&&&&&&&&&&&&&&delay&=&wait_
&&&&&&&&&&&&&&&&Timer_start&=&1;&&&&&&&&&&&//&开启定时器,
&&&&&&&&&&&&&&}
&&&&&&&&&&}
&&&&&&&&else{
&&&&&&&&&&&&i&=&1;
&&&&&&&&&&&&Timer_start&=&0;
&&&&&CLR_Buf1();
void&Unlock(void)&&&{//执行函数,会有一个持续1秒低电平的动作,然后电平拉高
&&&&unlock&=&0;
&&&&DELAY_MS(200);&&
&&&&unlock&=&1;
void&Wait_CREG(void)&{&//等待模块注册成功
&&&&unsigned&char&i;
&&&&unsigned&char&k;
&&&&i&=&0;
&&&&CLR_Buf1();
&&&&while(i&==&0)&{&&
&&&&&&&&CLR_Buf1();&
&&&&&&&&SendString("AT+CREG?");&&//查询模块网络注册状态
&&&&&&&&SendLR();
&&&&&&&&DELAY_MS(1000);&&&&&&&&&&&&&&&&&&
&&&&&&&&for(k=0;k&cache_k++)&{
&&&&&&&&if(uart_cache[k]&==&':')&&{
&&&&&&&&&&&&if((uart_cache[k+4]&==&'1')||(uart_cache[k+4]&==&'5')){&&//表明网络注册成功
&&&&&&&&&&&&&&&&i&=&1;&
&&&&&&&&&&&&&&&&
&&&&&&&&&&&&}
void&Check_Ring(void)&&&{&&&&&&&&&&&&&&&&&&&&&&&//检查是否有新信息,并执行信息内容指令
&&&&if(strstr(uart_cache,ring)!=NULL)&&{&&&&&&&&//若缓存字符串中含有来电标记
&&&&&&&&&DELAY_MS(100);&&&&&&&&&&&&&&&&&&&&&&&&&//等待数据全部接收完成
&&&&&&&&if((strstr(uart_cache,phone1)!=NULL)||(strstr(uart_cache,phone2)!=NULL)||(strstr(uart_cache,phone3)!=NULL))&&
&&&&&&&&&Unlock();&&&&//如果管理员来电,就解锁
&&&&&&&&&CLR_Buf1();&&//&清空SBUF缓存
void&main(void){
&&&&Timer0Init();&&&&&&&&&&&&&&&&&&&&&&//初始化定时器0
&&&&Uart1Init();&&&&&&&&&&&&&&&&&&&&&&&//初始化串口9600
&&&&Send_Command("AT","OK",3);&&&&&&&&&//波特率同步
&&&&Send_Command("ATE0","OK",3);&&&&&&&//取消回显&
&&&&Send_Command("AT+CLIP=1","OK",3);&&//开启来电显示
&&&&Wait_CREG();&&&&&&&&&&&&&&&&&&&&&&&//查询等待模块注册成功
&&&&while(1){&
&&&&&&&&Check_Ring();
}编译结果:0错误,0警告Ver3.0版本程序/******************************
工程名&&:手机呼叫SIM900A,门禁解锁
1&先用USB转TTL模块测试模块好用,发送AT,波特率到9600同步
2&STC12C2052AD单片机,晶振&11.0592MHz,12M不可以用&&
软件功能:
1,联网成功,一个短的嘀的一声提示
2,手机呼叫SIM900A的号码,一个长的嘀的一声提示,并完成门禁解锁动作
*******************************/
#include&"string.h"
#include&"STC12C2052AD.h"
#define&cache_max&100&&&&&&&&&&&&&&&&&&&&&&//串口接收缓存长度
//&xdata&把变量存在flash中,而不存在RAM中
//code&定义的数据要放在ROM里面,写入后就不能再更改
//&Timer_start&=Flag^0&定时器标志位&&bdata&把变量定义为可拆成8位寻址
xdata&unsigned&char&uart_cache[cache_max];&
bdata&unsigned&char&F&&&&
sbit&beep&&&&&=&P1^3;&&&&&&&&&&//蜂鸣器
sbit&control&&=&P1^4;&&&&&&&&&//解锁控制
sbit&power&&&&=&P1^7;&&&&&&&&&//运行指示灯
unsigned&char&code&*ring="CLIP";&&&&&&&&&&&//SIM900A的来电标记
unsigned&char&code&*phone1="1395719????";&&//授权手机号1
unsigned&char&code&*phone2="1395804????";&&//授权手机号2
unsigned&char&code&*phone3="1358812????";&&//授权手机号3
sbit&Timer_start&=Flag^0;&&&&&//计时器,功能开关
unsigned&char&Times=0;&&&&&&&&//&定时计数器
unsigned&char&First_Int&=&0;&&//&串口数组字符索引
unsigned&char&delay=0;&&&&&&&&//中断定时器,实际延时delay*50次
void&SendData(unsigned&char&dat){&&&//&发一个英文8位数据到串口SBUF
&&&&ES=0;&&&&&&&&&&&&&&&&&&
&&&&SBUF=&&&&&&&&&&
&&&&while(TI!=1);&&
&&&&TI=0;&&&&&&&&&&&&&&&&&&
&&&&ES=1;&&&&&&&&&&&&&&&&&&
void&SendString(unsigned&char&*s){&&//&发英文字符到串口SBUF
&&&&while(*s)
&&&&SendData(*s++);
void&SendLR(void)&{&&&&&&//&发回车换行
&&&&SendString("\r\n");
void&DELAY_MS&(unsigned&int&a){&&&//&延时
&&&&unsigned&int&i;
&&&&while&(&--a&!=&0&)&&&&
&&&&for&(i=0;i&=600;i++);
void&Beep_Ring(unsigned&int&a)&&&{//发出嘀的一声,或者解锁
&&&&beep&=&control=0;&&
&&&&DELAY_MS(500);&&
&&&&beep&=&control=1;
&&&&beep=0;&&
&&&&DELAY_MS(100);&&
&&&&beep=1;
void&Uart1Init(void)&&&{&&&//9600bps@11.0592MHz
&&&&PCON&&=&0x7F;&&&&&&&&&&//波特率不倍速
&&&&SCON&&=&0x50;&&&&&&&&&&//8位数据,可变波特率
&&&&AUXR&&=&0xBF;&&&&&&&&&&//定时器1时钟为Fosc/12,即12T
&&&&AUXR&&=&0xFE;&&&&&&&&&&//串口1选择定时器1为波特率发生器
&&&&TMOD&&=&0x0F;&&&&&&&&&&//清除定时器1模式位
&&&&TMOD&|=&0x20;&&&&&&&&&&//设定定时器1为8位自动重装方式
&&&&TL1&=&0xFD;&&&&&&&&&&&&//设定定时初值
&&&&TH1&=&0xFD;&&&&&&&&&&&&//设定定时器重装值
&&&&ET1&=&0;&&&&&&&&&&&&&&&//禁止定时器1中断
&&&&TR1&=&1;&&&&&&&&&&&&&&&//启动定时器1
&&&&ES=1;&&&&&&&&&&&&&&&&&&//开串口中断
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中断
&&&&EA=1;&&&&&&&&&&&&&&&&&&//开总中断
void&CLR_Buf1(void){
&&&&unsigned&int&k;
&&&&for(k=0;k&cache_k++)&&&&&//将缓存内容清零
&&&&uart_cache[k]&=&0x00;
&&&&First_Int&=&0;&&&&&&&&&&&&&&//接收字符串的起始存储位置
void&Send_Command(unsigned&char&*command,unsigned&char&*ack,unsigned&char&wait_time){&&&&&&&&&
&&&&unsigned&char&*
&&&&pointer&=&&&&&&&&&&&&&&&&&&&&&&//保存字符串command的首地址到c
&&&&CLR_Buf1();&&&&&&&&&&&&&&&&&&&&&&&&&&&&//清除串口缓存
&&&&while(1)&{&
&&&&&&&&if(!strstr(uart_cache,ack))&&{&&&&&//查找需要应答的字符
&&&&&&&&&&&&if(Timer_start&==&0){
&&&&&&&&&&&&&&&&command&=&&&&&&&&&&//将字符串地址给b
&&&&&&&&&&&&&&&&for&(&*command!='\0';command++)
&&&&&&&&&&&&&&&&&&&SendData(*command);
&&&&&&&&&&&&&&&&SendLR();&&
&&&&&&&&&&&&&&&&Times&=&0;
&&&&&&&&&&&&&&&&delay&=&wait_
&&&&&&&&&&&&&&&&Timer_start&=&1;&&&&&&&&&&&//&开启定时器
&&&&&&&&&&&&&&}
&&&&&&&&else{
&&&&&&&&&&&&Timer_start&=&0;&&&&&&&&&&&&&&//关闭定时器
&&&&&&&&&&&&&
&&CLR_Buf1();&&&&&&&&&&&&&&&&&&&&&&&&&&&&//清除串口缓存
void&Wait_CREG(void)&{&&&&&&&&&&//等待模块注册成功
&&&&unsigned&char&i,k;
&&&&i&=&0;
//&&&&CLR_Buf1();&想想本处串口缓存该不该注释
&&&&while(i&==&0)&{&&
&&&&&&&&CLR_Buf1();&
&&&&&&&&SendString("AT+CREG?");&&//查询模块网络注册状态
&&&&&&&&SendLR();
&&&&&&&&DELAY_MS(1000);&&&&&&&&&&&&&&&&&&
&&&&&&&&for(k=0;k&cache_k++)&{
&&&&&&&&if(uart_cache[k]&==&':')&&{
&&&&&&&&&&&&if((uart_cache[k+4]&==&'1')||(uart_cache[k+4]&==&'5')){//表明网络注册成功
&&&&&&&&&&&&&&&&i&=&1;&&&
&&& CLR_Buf1();
&&&&&&&&&&&&}
void&Check_Ring(void)&&&{&&&&&&&&&&&&&&&&&&&&&&&
&&&&if(strstr(uart_cache,ring)!=NULL)&&{&&&&&&&&//检测是否有来电标记
&&&&&&&&&DELAY_MS(100);&&&&&&&&&&&&&&&&&&&&&&&&&//等待数据全部接收完成
&&&&&&&&if((strstr(uart_cache,phone1))||&&&&&&&&//注释要写得清晰明了
&&&&&&&&&(strstr(uart_cache,phone2))||
&&&&&&&&&&&(strstr(uart_cache,phone3)))&&
&&&&&&&&&Beep_Ring(1);&&&&&&&&&&&&&&&&&&&&&&&&&&//符合权限,就解锁
&&&&&&&&&CLR_Buf1();&&&&&&&&&&&&&&&&&&&&&&&&&&&&//&清空SBUF缓存
void&SIM900aInit(void){
&&&&Send_Command("AT","OK",3);&&&&&&&&&&&&&&&&&&//波特率同步
&&&&Send_Command("AT+CLIP=1","OK",3);&&&&&&&&&&&//开启来电显示
&&&&Wait_CREG();&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&//查询等待模块注册成功
&&&&Beep_Ring(2);&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&//联网成功提示音
void&main(void){
&&&&Timer0Init();&&&&&&&&&&&&&&&&&&&&&&//初始化定时器0
&&&&Uart1Init();&&&&&&&&&&&&&&&&&&&&&&&//初始化串口9600
&&&&SIM900aInit();&&&&&&&&&&&&&&&&&&&&&//初始化SIM900A模块
&&while(1){
&&&&&&Check_Ring();
//4级串口中断函数
void&Uart1()&interrupt&4{
&&&&uart_cache[First_Int]&=&SBUF;&&&&&//将接收到的字符串存到缓存中
&&&&First_Int++;&&&&&&&&&&&&&&&&&&&&&&//缓存指针向后移动
&&&&if(First_Int&&&cache_max)&&&&&&&&&//如果缓存满,将缓存指针指向缓存的首地址
&&&&&&First_Int&=&0;&&&&&&&&&&&&&&&&&&//数组索引,归位
&&&&RI&=&0;&&&&&&&&&&&&&&&&&&&&&&&&&&&//清除RI位
//1级最高级别,定时器中断函数
void&Timer0_ISR()&interrupt&1{&&&&&&&&&&//最高级别中断服务程序
&&&&static&unsigned&char&Time_count=0;&&//&定时器计数器&static全局生命周期
&&&&TR0=0;&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&//关定时器
&&&&TL0&=&0x00;&&&&&&&&&&&&&&&&&&&&&&&&&//重设定时器初值
&&&&TH0&=&0xB8;&&&&&&&&&&&&&&&&&&&&&&&&&//重设定时器初值
&&&&Time_count++;&&&&&&&&&&&&&
&&&&if(Time_count&=50)&&&{
&&&&&&&&Time_count&=&0;
&&&&&&&&power=~&&&&&&&&&//SIM900A运行指示灯,1秒闪烁一次
&&&&if(Timer_start)&Times++;&&//如果收到允许定时,开始计时
&&&&if(Times&&&(50*delay)){&&&//如果Times&到达设定时间
&&&&&&&&Timer_start&=&0;&&&&&&//&完成定时,关闭定时功能
&&&&&&&&Times&=&0;&&&&&&&&&&&&//&完成定时,清空定时计数器
&&&&TR0=1;&&&&&&&&&&&&&&&&&&&&&//开定时器
}Ver4.0版本,加入自动挂机,关闭睡眠/******************************
工程名&&:手机呼叫SIM900A,门禁解锁
1&先用USB转TTL模块测试模块好用,发送AT,波特率到9600同步
2&STC12C2052AD单片机,晶振&11.0592MHz,12M不可以用&&
软件功能:
1,&联网成功,一个短的嘀的一声提示
2,&手机呼叫SIM900A的号码,一个长嘀的一声提示,并完成门禁解锁动作
3,&响铃后,自动挂断回应对方
*******************************/
#include&"string.h"
#include&"STC12C2052AD.h"
#define&cache_max&100&&&&&&&&&&&&&&&&&&&&&&//串口接收缓存长度
//&xdata&把变量存在flash中,而不存在RAM中
//code&定义的数据要放在ROM里面,写入后就不能再更改
//&Timer_start&=Flag^0&定时器标志位&&bdata&把变量定义为可拆成8位寻址
xdata&unsigned&char&uart_cache[cache_max];&
bdata&unsigned&char&F&&&&
sbit&beep&&&&=&P1^3;&&&&&&&&&//蜂鸣器
sbit&control&=&P1^4;&&&&&&&&&//解锁控制
sbit&power&&&=&P1^7;&&&&&&&&&//运行指示灯
unsigned&char&code&*ring="CLIP";&&&&&&&&&&&//SIM900A的来电标记
unsigned&char&code&*phone1="1395719????";&&//授权手机号1
unsigned&char&code&*phone2="1395804????";&&//授权手机号2
unsigned&char&code&*phone3="1358812????";&&//授权手机号3
sbit&Timer_start&=Flag^0;&&&&&//计时器,功能开关
unsigned&char&Times=0;&&&&&&&&//&定时计数器
unsigned&char&First_Int&=&0;&&//&串口数组字符“指针”
unsigned&char&delay=0;&&&&&&&&//中断定时器,实际延时delay*50次
void&SendData(unsigned&char&dat){&&&//&发一个英文8位数据到串口SBUF
&&&&ES=0;&&&&&&&&&&&&&&&&&&
&&&&SBUF=&&&&&&&&&&
&&&&while(TI!=1);&&
&&&&TI=0;&&&&&&&&&&&&&&&&&&
&&&&ES=1;&&&&&&&&&&&&&&&&&&
void&SendString(unsigned&char&*s){&&//&发英文字符到串口SBUF
&&&&while(*s)
&&&&SendData(*s++);
void&SendLR(void)&{&&&&&&&&&&&&&//&发回车换行
&&&&SendString("\r\n");
void&DELAY_MS&(unsigned&int&a){&&&//&延时
&&&&unsigned&int&i;
&&&&while&(&--a&!=&0&)&&&&
&&&&for&(i=0;i&=600;i++);
void&Uart1Init(void)&&&{&&&//定时器1,9600bps@11.0592MHz
&&&&PCON&&=&0x7F;&&&&&&&&&&//波特率不倍速
&&&&SCON&&=&0x50;&&&&&&&&&&//8位数据,可变波特率
&&&&AUXR&&=&0xBF;&&&&&&&&&&//定时器1时钟为Fosc/12,即12T
&&&&AUXR&&=&0xFE;&&&&&&&&&&//串口1选择定时器1为波特率发生器
&&&&TMOD&&=&0x0F;&&&&&&&&&&//清除定时器1模式位
&&&&TMOD&|=&0x20;&&&&&&&&&&//设定定时器1为8位自动重装方式
&&&&TL1&=&0xFD;&&&&&&&&&&&&//设定定时初值
&&&&TH1&=&0xFD;&&&&&&&&&&&&//设定定时器重装值
&&&&ET1&=&0;&&&&&&&&&&&&&&&//禁止定时器1中断
&&&&TR1&=&1;&&&&&&&&&&&&&&&//启动定时器1
&&&&ES=1;&&&&&&&&&&&&&&&&&&//开串口中断
void&Timer0Init(void)&&{&&&//20毫秒@11.0592MHz
&&&&AUXR&&=&0x7F;&&&&&&&&&&//定时器0时钟12T模式
&&&&TMOD&&=&0xF0;&&&&&&&&&&//设置定时器模式
&&&&TMOD&|=&0x01;&&&&&&&&&&//设置定时器模式,16位定时器,非自动重载模式
&&&&TL0&=&0x00;&&&&&&&&&&&&//设置定时器初值
&&&&TH0&=&0xB8;&&&&&&&&&&&&//设置定时器初值
&&&&TF0&=&0;&&&&&&&&&&&&&&&//清TF0标志
&&&&TR0&=&1;&&&&&&&&&&&&&&&//定时器0开始计时
&&&&ET0&=&1;&&&&&&&&&&&&&&&//使能定时器0中断
&&&&EA=1;&&&&&&&&&&&&&&&&&&//开总中断
void&CLR_Buf1(void){
&&&&unsigned&int&k;
&&&&for(k=0;k&cache_k++)&&&&&//将缓存内容清零
&&&&uart_cache[k]&=&0x00;
&&&&First_Int&=&0;&&&&&&&&&&&&&&//接收字符串的起始存储位置
void&Send_Command(unsigned&char&*command,unsigned&char&*ack,unsigned&char&wait_time){&&&&&&&&&
&&&&unsigned&char&*
&&&&pointer&=&&&&&&&&&&&&&&&&&&&&&&//保存字符串command的首地址到c
&&&&CLR_Buf1();&&&&&&&&&&&&&&&&&&&&&&&&&&&&//清除串口缓存
&&&&while(1)&{&
&&&&&&&&if(!strstr(uart_cache,ack))&&{&&&&&//查找需要应答的字符
&&&&&&&&&&&&if(Timer_start&==&0){
&&&&&&&&&&&&&&&&command&=&&&&&&&&&&//将字符串地址给b
&&&&&&&&&&&&&&&&for&(&*command!='\0';command++)
&&&&&&&&&&&&&&&&&&&SendData(*command);
&&&&&&&&&&&&&&&&SendLR();&&
&&&&&&&&&&&&&&&&Times&=&0;
&&&&&&&&&&&&&&&&delay&=&wait_
&&&&&&&&&&&&&&&&Timer_start&=&1;&&&&&&&&&&&//&开启定时器
&&&&&&&&&&&&&&}
&&&&&&&&else{
&&&&&&&&&&&&Timer_start&=&0;&&&&&//关闭定时器
&&&&&&&&&&&&&
&&CLR_Buf1();&&&&&&&&&&&&&&&&&&&&//清除串口缓存
void&Wait_CREG(void)&{&&&&&&&&&&//等待模块注册成功
&&&&unsigned&char&i,k;
&&&&i&=&0;
&&&&CLR_Buf1();&&&&&&&&&&&&&&&&&&//想想本处串口缓存该不该注释
&&&&while(i&==&0)&{&&
&&&&&&&&CLR_Buf1();&
&&&&&&&&SendString("AT+CREG?");&&//查询模块网络注册状态
&&&&&&&&SendLR();
&&&&&&&&DELAY_MS(1000);&&&&&&&&&&&&&&&&&&
&&&&&&&&for(k=0;k&cache_k++)&{
&&&&&&&&if(uart_cache[k]&==&':')&&{
&&&&&&&&&&&&if((uart_cache[k+4]&==&'1')||(uart_cache[k+4]&==&'5')){//表明网络注册成功
&&&&&&&&&&&&&&&&i&=&1;&&&
&&&&&CLR_Buf1();
&&&&&&&&&&&&}
void&Beep_Ring(unsigned&int&a)&&&{&&&&//发出嘀的一声,或者解锁
&&&&beep&=&control=0;&&
&&&&DELAY_MS(500);&&
&&&&beep&=&control=1;
Send_Command("ATH","OK",2);
&&&&beep=0;&&
&&&&DELAY_MS(100);&&
&&&&beep=1;
void&Check_Ring(void)&&&{
&&if(strstr(uart_cache,ring)){&&&&&&&&&&&&&&&&//检测是否有来电标记
&&&&&&&&&DELAY_MS(100);&&&&&&&&&&&&&&&&&&&&&&&&&&//等待数据全部接收完成
&&&&&&&&if((strstr(uart_cache,phone1))||(strstr(uart_cache,phone2))||(strstr(uart_cache,phone3)))&&
&&&&&&&&&&&Beep_Ring(1);&&&&&&&&&&&&&&&&&&&&&&&&//符合权限,就解锁
&&&&&&&&&CLR_Buf1();&&&&&&&&&&&&&&&&&&&&&&&&&&&&//&清空SBUF缓存
void&SIM900aInit(void){
&&&&Send_Command("AT","OK",3);&&&&&&&&&&&&&&&&&&//波特率同步
&&&&Send_Command("AT+CLIP=1","OK",3);&&&&&&&&&&&//开启来电显示
&&&&Send_Command("AT+CSCLK=0","OK",3);&&&&&&&&&&//关闭SIM900A睡眠
&& Wait_CREG();&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&//查询等待模块注册成功
&&&&Beep_Ring(2);&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&//联网成功提示音
void&main(void){
&&&&Timer0Init();&&&&&&&&&&&&&&&&&&&&&&//初始化定时器0
&&&&Uart1Init();&&&&&&&&&&&&&&&&&&&&&&&//初始化串口9600
&&&&SIM900aInit();&&&&&&&&&&&&&&&&&&&&&//初始化SIM900A模块
&&while(1){
&&&&&&Check_Ring();
//4级串口中断函数
void&Uart1()&interrupt&4{
&&&&uart_cache[First_Int]&=&SBUF;&&&&&//将接收到的单个字符存到缓存中
&&&&First_Int++;&&&&&&&&&&&&&&&&&&&&&&//缓存指针向后移动
&&&&if(First_Int&&&cache_max)&&&&&&&&&//如果缓存满,将缓存指针指向缓存的首地址
&&&&&&First_Int&=&0;&&&&&&&&&&&&&&&&&&//数组索引,归位
&&&&RI&=&0;&&&&&&&&&&&&&&&&&&&&&&&&&&&//清除RI位
//1级最高级别,定时器中断函数
void&Timer0_ISR()&interrupt&1{&&&&&&&&&&//最高级别中断服务程序
&&&&static&unsigned&char&Time_count=0;&&//&定时器计数器&static全局生命周期
&&&&TR0=0;&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&//关定时器
&&&&TL0&=&0x00;&&&&&&&&&&&&&&&&&&&&&&&&&//重设定时器初值
&&&&TH0&=&0xB8;&&&&&&&&&&&&&&&&&&&&&&&&&//重设定时器初值
&&&&Time_count++;&&&&&&&&&&&&&&&&&&&&&&&//每隔20毫秒进入中断,Time_count无条件自加运算&&&&&&&&&&&&
&&&&if(Time_count&=50)&&&{
&&&&&&&&Time_count&=&0;
&&&&&&&&power=~&&&&&&&&&//SIM900A运行指示灯,1秒闪烁一次
&&&&if(Timer_start)&Times++;&&//如果收到允许定时,开始计时
&&&&if(Times&&&(50*delay)){&&&//如果Times&到达设定时间,50*delay就是秒数
&&&&&&&&Timer_start&=&0;&&&&&&//&定时结束,定时功能标记Timer_start一定为0
&&&&&&&&Times&=&0;&&&&&&&&&&&&//&完成定时,清空计数器
&&&&TR0=1;&&&&&&&&&&&&&&&&&&&&&//开定时器
}编译结果:Rebuild&target&'Target&1'
compiling&DS18B20.C...
linking...
Program&Size:&data=46.0&xdata=100&code=1116
creating&hex&file&from&"DS18B20"...
"DS18B20"&-&0&Error(s),&0&Warning(s).本文出自 “” 博客,请务必保留此出处
了这篇文章
类别:┆阅读(0)┆评论(0)

我要回帖

更多关于 跪求哪位大神网站 的文章

 

随机推荐