单片机gprs接mysql_基于51单片机GPRS打电话等功能的实现 详细教程
#include
#include
#define uchar unsigned char
#define uint unsigned int
#define RxIn 90 //定义接收的数组长度为90
uchar code AT[]="AT"; //握手信号
uchar code ATE[]="ATE"; //关回显
uchar code AT_CNMI[]="AT+CNMI=2,1";//设置这组参数来了新信息直接显示到串口,不作存储
uchar code AT_CSCA[]="AT+CSCA=\"+8613800571500\"";//设置服务中心号码 AT+CSCA=\"+8613010360500\"
uchar code AT_CMGF[]="AT+CMGF=1";//设置短信的格式为text格式
uchar code AT_CMGR[]="AT+CMGR=";//读取短信指令
uchar code AT_CMGS[]="AT+CMGS=";//发送短信指令
uchar code AT_CMGD[]="AT+CMGD=";//发送短信指令
uchar AT_delete[12];
uchar AT_Read[12]; //用来存储发送读取短信指令
uchar AT_SendNumber[22]; //用来存储发送短信号码指令
uchar numberbuf[3]; //用来保存短信条数
uchar idata SystemBuf[RxIn]; //储存出口接收数据
uchar CommandBuf[4]; //用来储存指令
uchar Rx=0;
bit receiveready=0; //接收短信标志位
bit sendready=0; //发送短信准备标志位
bit send=0; //发送短信标志位
sbit IGT=P2^7;//启动GSM的启动线连IGT
sbit sw1=P3^3; //打电话
sbit sw2=P3^4; //发测试短信
sbit sw3=P3^5; //发温度
sbit beep=P3^2; //蜂鸣器
void Delay_ms(uint i);
void Start_GSM(void);
void UART_init (void);
void sendchar(uchar ch);
void sendstring(uchar *p);
void GSM_INIT(void);
void receive_ready(void);
void message_read(void);
void read_message(void);
void sendmessage(void);
uchar code AT7[]={0x41,0x54,0x2B,0x43,0x4D,0x47,0x53,0x3D};//AT+CMGS= AT+CMGS=“+8613xxxxxxxxx”回车>输入短消息。Crtl+Z结束并发送。
uchar code AT12[]={0x41,0x54,0x44,0x3E};//ATD> ATD*****; (拨号,"*"为需要拨的号码,如呼叫13973292929,则为ATD13973292929;
uchar code neirong[11]="15158107675"; //13185018567
sbit DQ=P3^7; //DS18B20数据传输线接单片机的相应的引脚
unsigned char tempL=0; //临时变量低位
unsigned char tempH=0; //临时变量高位
float temperature; //温度值
unsigned char k,ge,shi,bai;
uchar code atshanchu[]={ "AT+CMGD=9"};
sbit lcdrs=P1^0;
sbit lcdrw=P1^1;
sbit lcden=P1^2;
void delaymm(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void delay(unsigned int k)
{
unsigned int n;
n=0;
while(n < k)
{n++;}
return;
}
void write_cmd(uchar cmd)
{
lcden=0;
lcdrs=0;
lcdrw=0;
P0=cmd;
_nop_();
lcden=1;
delaymm(1);
lcden=0;
_nop_();
}
void write_dat(uchar dat)
{
lcden=0;
lcdrs=1;
P0=dat;
_nop_();
lcden=1;
delaymm(1);
lcden=0;
_nop_();
}
void lcdint()
{
lcden=0;
write_cmd(0x38);
write_cmd(0x0c);
write_cmd(0x06);
write_cmd(0x01);
delaymm(5);
}
ReadOneChar(void) /*函数功能:向DS18B20读一字节数据*/
{
unsigned char i=0;
unsigned char dat=0;
for (i=8;i>0;i--)
{
DQ=1;
delay(1);
DQ=0;
dat>>=1;
DQ=1;
if(DQ)
dat|=0x80;
delay(4);
}
return(dat);
}
void WriteOneChar(unsigned char dat) /*函数功能:向DS18B20写一字节数据*/
{
unsigned char i=0;
for(i=8;i>0;i--)
{
DQ=0;
DQ=dat&0x01;
delay(5);
DQ=1;
dat>>=1;
}
delay(4);
}
void Init_DS18B20(void)/*函数功能:DS18B20初始化子程序*/
{
unsigned char x=0;
DQ=1; //DQ先置高
delay(8); //延时
DQ=0; //发送复位脉冲
delay(85); //延时(>480ms)
DQ=1; //拉高数据线
delay(14); //等待(15~60ms)
}
ReadTemperature(void) /*函数功能:向DS18B20读温度值*/
{
Init_DS18B20(); //初始化
WriteOneChar(0xcc); //跳过读序列号的操作
WriteOneChar(0x44); //启动温度转换
delaymm(125); //转换需要一点时间,延时
Init_DS18B20(); //初始化
WriteOneChar(0xcc); //跳过读序列号的操作
WriteOneChar(0xbe); //读温度寄存器(头两个值分别为温度的低位和高位)
delaymm(125);
tempL=ReadOneChar(); //读出温度的低位LSB
tempH=ReadOneChar(); //读出温度的高位MSB
//温度转换,把高低位做相应的运算转化为实际温度
temperature=((tempH*256)+tempL)*0.0625;
delay(200);
return(temperature);
}
void senddata(uchar dat) /*发送数据函数*/
{
SBUF =dat;
while(!TI);
TI = 0;
}
void mingling(uchar zijie,uchar *p) /*发送数组函数*/
{ uchar m;
for(m=0;m
}
void Delay_ms(uint i) /*毫秒延时*/
{
unsigned int j;
for(;i>0;i--)
{
for(j=0;j<125;j++)
{;}
}
}
/*启动TC35,在 15脚IGT加时长至少为100ms的低电平,该信号下降沿时间小于1ms。启动后,15 脚的信号保持高电平*/
void Start_GSM(void)
{
IGT=0;
Delay_ms(1000);
IGT=1;
Delay_ms(1000);
}
void UART_init (void) /*对串口进行初始化*/
{
TMOD=0x20; //选择定时器1
PCON=0x00; ///波特率不加倍
SCON=0x50; //串行工作方式1允许串行接收
TH1=0xFD; //实验板上晶振位11.0592MHZ,选择波特率为9600
TL1=0xFD; //在相应计数器上赋值
EA=1; //总中断开启
ES=1; //串行中断开启
TR1=1; //开启定时器1
}
void sendchar(uchar ch)/*单片机发送一字节数据*/
{
SBUF=ch;
while(TI==0);
TI=0;
}
void sendstring(uchar *p) /*通过串口发送字符串*/
{
while(*p)
{
sendchar(*p);
p++;
}
sendchar(0x0D);
sendchar(0x0A);
}
void receive(void) interrupt 4 using 1 /*通过中断,串口接收数据*/
{
if(RI)
{
if(Rx
{
SystemBuf[Rx]=SBUF;
Rx++;
}
RI=0;
}
}
void GSM_INIT(void) /*初始化TC35模块*/
{
LOOP:
Delay_ms(1000);
sendstring(AT);
Delay_ms(1000);
sendstring(ATE);
Delay_ms(1000);
sendstring(AT_CNMI);
Delay_ms(1000);
sendstring(AT_CSCA);
Delay_ms(1000);
for(Rx=0;Rx
{
SystemBuf[Rx]=0x00;
}
Rx=0;
sendstring(AT_CMGF);
Delay_ms(1000);
if((SystemBuf[2]=='O')&&(SystemBuf[3]=='K')) //判断是否模块初始化成功,成功的话模块会回复"OK"给单片机
{ //如果单片机没有收到OK,就继续发送初始化指令/
for(Rx=0;Rx
{
SystemBuf[Rx]=0x00;
}
Rx=0;
}
else
{
for(Rx=0;Rx
{
SystemBuf[Rx]=0x00;
}
Rx=0;
goto LOOP;
}
}
void receive_ready(void) /*接收短信准备*/
{
uchar i;
if((SystemBuf[5]==0x54)&&SystemBuf[6]==0x49) //如果有新短信来,模块会通过串口向单片机发送字符串, TI
{ // 此函数的功能是判断是否有新短信来,如果来的话就置位准备接受位标志为1
receiveready=1; //如果不是新短信的指令,就舍弃,并将接收数组清零
/* write_cmd(0x01);
write_cmd(0x80);
for(i=0;i<16;i++)
{
write_dat(SystemBuf[i]);
delaymm(1);
}
write_cmd(0xc0);
for(i=16;i<32;i++)
{
write_dat(SystemBuf[i]);
delaymm(1);
} //返回的是&&+CMTI: "SM",10 10表示我当前的短信数,说明我之前有9条,加上现在的共10条
while(1); //删除短信的话我不会把以前存在卡里的短信的删掉 */
}
else{
for(i=0;i
{
SystemBuf[i]=0x00;
}
Rx=0;
}
}
void message_read(void) /*准备是否回复短信给目标号码*/
{
if((sendready==1)&&(SystemBuf[5]==0x47)&&(SystemBuf[6]==0x52))
send=1;
}
void read_message(void) /*发送读取短信指令*/
{
uchar i;
Delay_ms(1000);
for(i=0;i<3;i++)
{
numberbuf[i]=SystemBuf[14+i]; //读走,10
}
for(i=0;i<8;i++)
{
AT_Read[i]=AT_CMGR[i]; //读取短信指令
}
for(i=8;i<11;i++)
{
AT_Read[i]=numberbuf[i-8]; //读走,10,是地址
}
for(Rx=0;Rx
{
SystemBuf[Rx]=0x00;
}
Rx=0;
sendstring(AT_Read); //发送AT+CMGR=,10 10代表短信储存所在位置
}
void readcommend(void) /*读取短信内容,判断相应指令是否正确*/
{
uchar i;
for(i=0;i<4;i++) //将短信内容中的指令部分截取出来放到
{ //CommandBuf数组中
CommandBuf[i]=SystemBuf[64+i];
}
if((CommandBuf[0]=='b')&&(CommandBuf[1]=='a')&&(CommandBuf[2]=='n')&&(CommandBuf[3]=='g')) //判断指令是否为开发光管指令
{
write_cmd(0x01); //测试接收
write_cmd(0x80);
write_dat('b');
write_dat('a');
write_dat('n');
write_dat('g');
sendmessage();
} //如果发送的指令既不是bang就定义为错误操作,不干别的
}
void delete_message(void) /*删除短信指令*/
{
uchar i;
Delay_ms(1000);
Delay_ms(1000);
Delay_ms(5000);
for(i=0;i<8;i++)
{
AT_delete[i]=AT_CMGD[i];
}
for(i=8;i<11;i++)
{
AT_delete[i]=numberbuf[i-8];
}
for(Rx=0;Rx
{
SystemBuf[Rx]=0x00;
}
Rx=0;
sendstring(AT_delete); //发送AT+CMGR=,?? ??代表短信储存所在位置
}
void sendmessage(void) /*发送回复短信指令*/
{
uchar i;
for(i=0;i<8;i++)
{
AT_SendNumber[i]=AT_CMGS[i];
}
for(i=8;i<19;i++)
{
AT_SendNumber[i]=SystemBuf[18+i]; //位置26~36 将对方号码提取用来回复给对方
}
sendstring(AT_SendNumber);senddata(0x0d);delaymm(100);
senddata('P');senddata('H');senddata('=');senddata('7');senddata('.');senddata('0');//内容
senddata(0x20);senddata(0x1a);senddata(0x0d);Delay_ms(30);
}
void main()
{
uchar x;
uchar i;
lcdint();
Start_GSM(); //开启TC35
Delay_ms(10000); //延时大约10秒 ,等待模块联网/
UART_init(); //串口初始化/
GSM_INIT(); //对tc35模块进行初始化
write_cmd(0x80);
write_dat('r');
write_dat('e');
write_dat('a');
write_dat('d');
write_dat('y');
Delay_ms(1000);
while(1)
{
if (!sw1)
{
Delay_ms(5);
if(!sw1)
{
write_cmd(0x01);
write_cmd(0x80);
write_dat('r');
write_dat('i');
write_dat('n');
write_dat('g');
mingling(3,AT12);for(x=0;x<11;x++)senddata(neirong[x]); senddata(0x3b);senddata(0x0D);while(sw1==0);
senddata(0x0D); //发0x0d停止打电话
}
}
if (!sw2) //短信读取温度值
{
Delay_ms(5);
if(!sw2)
{
while(sw2==0);
k=ReadTemperature();
delaymm(500);
k=ReadTemperature();
bai=(k%1000)/100;
shi=(k%100)/10;
ge=k%10;
write_cmd(0x01);
write_cmd(0x80);
write_dat(0x30+bai);
write_dat(0x30+shi);
write_dat(0x30+ge);
ES=0;mingling(8,AT7); for(i=0;i<11;i++)senddata(neirong[i]);senddata(0x0d);delaymm(100);
senddata(shi+0x30);senddata(ge+0x30); //发送数据内容
senddata(0x20);senddata(0x1a);senddata(0x0d);ES=1;
delaymm(15000);
ES=0;mingling(9,atshanchu);senddata(0x0D);ES=1;delaymm(2500);//删除短信,不过本来就没存到9
}
}
if (!sw3) //发送测试短信
{
Delay_ms(500);
if(!sw3)
{
while(sw3==0);
write_cmd(0x01);
write_cmd(0x80);
write_dat('t');
write_dat('e');
write_dat('x');
write_dat('t');
ES=0;mingling(8,AT7); for(i=0;i<11;i++)senddata(neirong[i]);senddata(0x0d);delaymm(100);
senddata('C');senddata('A');senddata('I');
senddata(0x20);senddata(0x1a);senddata(0x0d);ES=1;
delaymm(15000);
ES=0;mingling(9,atshanchu);senddata(0x0D);ES=1;delaymm(2500);
}
}
receive_ready();
if(receiveready==1)
{
read_message();
receiveready=0;
sendready=1;
}
Delay_ms(300);
message_read();
if(send==1)
{
/* write_cmd(0x01);
write_cmd(0x80);
for(i=64;i<80;i++)
{
write_dat(SystemBuf[i]);
delaymm(1);
}
write_cmd(0xc0);
for(i=80;i<91;i++)
{
write_dat(SystemBuf[i]);
delaymm(1);
}
while(1);//读出来看下,结果是
//&&+CMGR: "REC UN 0~15
//READ","+86151581 16~31
//07680",,"11/06/1 32~47
//1,14:01:09+32"&& 48~63
//1234567891234567 64~79
//8912345678 80~89 */
Delay_ms(2000);
readcommend();//检测密码,如果对就发送要发的东西
Delay_ms(1000);
delete_message();
for(Rx=0;Rx
{
SystemBuf[Rx]=0x00;
}
Rx=0;
send=0;
}
}
}
单片机gprs接mysql_基于51单片机GPRS打电话等功能的实现 详细教程相关推荐
- 51单片机计算机实物焊接,基于51单片机的最小系统焊接图 浅谈单片机最小系统...
本文主要是关于51单片机的相关介绍,并对基于51单片机的最小系统焊接进行了详尽的阐述. 单片机最小系统 单片机最小系统主要由电源.复位.振荡电路以及扩展部分等部分组成. 对于一个完整的电子设计来讲,首 ...
- 51单片机 外部时钟_基于51单片机的LCD12864显示模拟时钟
今天要分享的仿真和程序是基于51单片机的LCD12864显示模拟时钟.公众号之前也分享过数字时钟,但是那些时钟都是采用数字显示的形式来显示时间,而今天分享一个采用LCD12864显示的模拟指针式时钟. ...
- 单片机应用系统设计技术——基于51单片机篮球计时计分器的设计
基于51单片机篮球计时计分器的设计 一.实验目的 二.实验内容 三.实验步骤 四.C代码如下 五.实验结果
- 51单片机用c语言在液晶1602上显示汉字,lcd1602与单片机连接图,基于51单片机的lcd1602液晶显示屏连接电路图...
描述 LCD1602是一种工业字符型液晶,能够同时显示16x02即32个字符.LCD1602液晶显示原理 LCD1602液晶显示的原理是利用液晶的物理特性,通过电压对其显示区域进行控制,有电就有显示, ...
- c语言单片机计程车车费问题,基于51单片机的计程车计价器.doc
基于51单片机的计程车计价器 1.绪论 1.1课题背景及意义 随着出租车行业的发展,出租车已经是城市交通的重要组成部分,从加强行业管理以及减少司机与乘客的纠纷出发,具有良好性能的计价器对出租车司机和乘 ...
- stc89c51单片机音乐盒系统设计_基于51单片机音乐盒课程设计1.doc
基于51单片机音乐盒课程设计1 课程名称: 微机原理课程设计 题 目: 基于单片机的音乐盒设计 摘要 随着人类社会的发展,人们对视觉.听觉方面的享受提出了越来越高的要求.小小的音乐盒可以给人们带来美好 ...
- c语言单片机停车场收费系统,基于51单片机停车场车位引导系统设计
?周明彬 曾伊玲 摘要:在很多人流量大的地方,因为车辆集中的情况,所以每次经过停车场时都需要工作人员来指挥车辆,告诉车主停车场那些地方还有空余车位可以泊车.所以很多地方的旧停车场使用的管理方式,是十分 ...
- 51单片机距离测试软件,基于51单片机的红外线(强度)测距离
一.原理:根据红外线强度随距离的增大而衰减的特性,只要找到距离与强度的关系,就可以得到要测量的距离了. 二.主要元器件清单 1. STC89C52 单片机 1 片 2. ICL 7109 A/D 转换 ...
- 单片机ch2o程序_基于51单片机的室内甲醛测试系统
1.2 5G14433A/D转换器 5G14433A/D转换器是国产的广为流行的最典型的双积分3位半A/D转换器它具有抗干扰性能好,转换精度高(相当于11位二进制数),自动校零,自动极性输出,自动量程 ...
最新文章
- ArcGIS符号异常问题
- Python中的Numpy(4.矩阵操作(算数运算,矩阵积,广播机制))
- 小师妹学JavaIO之:File copy和File filter
- maven设置jdk版本
- 334. Increasing Triplet Subsequence
- Tomcat学习--配置tomcat
- C++ Primer 第二章 学习笔记及习题答案
- 大咖讲|中国AGV技术发展历程及关键点
- 新型单词记忆法汇总(沪江英语):
- CSS实现元素固定宽高比
- Git - 学习/实践 - 以及相关操作
- APP开发流程实例讲解-儒释道网络电台八天开发全程-百度云深度兼容测试并进一步优化排错
- dwz交互式弹窗处理
- tp6框架结合阿里短信接口发送短信并记录redis
- Oracle数据库配置二
- CPP2022-28-期末模拟测试01
- 2022年第四季度DAMA-CDGA/CDGP数据治理认证报名开启啦!
- VS2019官方的免费打印控件
- 如何衡量算法的优劣??
- dpt rp1维修 sony_你们的sony dpt rp1有变弯和开裂的现象么?
热门文章
- 以太坊:主对象 web3
- 数学教学通讯杂志数学教学通讯杂志社数学教学通讯编辑部2023年第5期目录
- JZOJ5620. 【NOI2018模拟4.1】修炼
- flask接收数据流(图像文件、视频文件)的几种方式
- 原创:是什么改变了我当初的模样?
- C#学习之ASP.NET概述
- idea log 不输出error_Python之log
- Lumerical Python API学习(八)——在纳米线应用示例中使用 Python API
- iMindMap思维导图如何创造独特的3D视图
- oracle 分区01688,ORA-01688:扩展ORACLE表空间操作