⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 串口短信c51代码示例.txt

📁 利用c51实现西门子tc35i串口通信
💻 TXT
字号:
/*
//*********************************************************
//程序:	串口通信示例程序
//编制:	苏建阳	2008-3-9
//*********************************************************
说明:
  本文是单片机通过串口与Modem等外部设备通信的示例,
因为不同的单片机和开发环境会有差异,要按照实际硬件进行修改。

中断方式工作逻辑:

建立自己的发送、接收缓存存储区gcRx0Buf,gcTx0Buf及其指针*gpRx0、*gpTx0
配置端口和UART波特率,设置串口接收发送中断、总中断。

发送开始向发送存储区gcTx0Buf写字符串,软件置TI触发串口中断(否则不会进入中断,需要定时查询)。

发送中断里将下一个字符送发送端口,直到发送结束

接收到字符放入接收字符串等待处理(51较慢注意接收时不要占用太多时间)
等待超过一定时间没有新数据就结束(可以进行数据处理了,但是不要在中断里做太多事)

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

//#include <MCS51.h> 
#include<reg52.h>


unsigned char xdata gcRx0Buf[128];		//串口0接收缓存
unsigned char data *gpRx0 = gcRx0Buf;		//接收缓存指针

unsigned char xdata gcTx0Buf[128];		//串口0发送缓存
unsigned char xdata *gpTx0 = gcTx0Buf;	  	//发送缓存指针

unsigned char data gcRx0Busy;			//接收忙
unsigned char data gcTx0Busy;			//发送忙

/************************************************************
程序:	CpuSet
功能:	设置CPU、端口、UART波特率和中断
参数:	无
返回:
描述:	
修改:
************************************************************/
void CpuSet()
{//按照自己的CPU设置端口和UART波特率和中断
	/*
	//8052
	   TR1=1;
	   SM0=0;
	   SM1=1;
	   TMOD=0x20;
	   TH1=0xfd;
	   TL1=0xfd;
	   EA=1;
	   ES=1;

	   REN=1;
	   PCON=0x80;
	*/

	//--------------中断设置-----------------
	/*
	8051 中断优先级寄存器IP。 其操作控制为标准8051 方式,
	中断入口地址仍然如下:
	0 INT0 :0003H	 	外部中断
	1 T0 :000BH		 定时/计数器T0 溢出中断
	2 INT1 :0013H	 	外部中断INT 1
	3 T1 :001BH		 定时/计数器T1 溢出中断
	4 UART:0023H		 串行口中断UART
	*/

	EA = 1;				//开放中断,IE 的EA 位,总中断允许设置

}

/************************************************************
程序:	Uart0Int (串口0中断)
功能:	接收中断的数据缓存到gcRx0Buf,发送中断将gcTx0Buf数据到串口
参数:	无
返回:
描述:	程序分两部分,1接收,2发送.
修改:
************************************************************/
void Uart0Int(void) interrupt 4	//中断的写法要按照开发软件要求写
{	char C;
	if (RI)	//接收有数据
	{	C = SBUF;	//读取缓存到变量备用(有些CPU读后将清除缓存)
		RI = 0;		//接收中断标志清零
		if (C > 0)	//判断接收的数据是否有效(不要直接读取CPU的缓存)
		{	*gpRx0 = C;	//保存到接收缓存串
			gpRx0 ++;	//准备接收下一个数据
			*gpRx0 = 0;	//结尾
			gcRx0Busy = 127;	//置超时处理标志,超时将认为接收结束
		} 
	}

	if (TI)	//发送中断
	{	TI = 0;		//发送中断标志清零
		if (*gpTx0 > 0)		//判断发送结尾
		{	SBUF = *gpTx0;	//取一个字符发送写到端口
			gcTx0Busy = 255;	//置超时处理标志,超时将认为发送失败结束
			gpTx0 ++;		//指向下一个空位
		}
		else
		{	gpTx0 = gcTx0Buf;	//指针到串头
			*gpTx0 = 0;		//标记成空串
		}
	}
}

/************************************************************
程序:	Main
功能:	主程序
参数:	无
返回:
描述:	
修改:
************************************************************/
void Main()
{	int iDelay = 0;
	CpuSet();	//设置工作环境
	//逐步发送下面的AT命令,注意模块休眠后第一个命令不会正常应答要发2遍
	strcpy(gcTx0Buf,"AT+CMGF=1\r\n");	//准备要发送的数据
	//strcpy(gcTx0Buf,"AT$NOSLEEP=1\r\n");//M22,M23,M23G用
	//strcpy(gcTx0Buf,"AT+CSCS=\"GSM\"\r\n");	//GSM通信
	//strcpy(gcTx0Buf,"AT+CSMP=17,168,0,0\r\n");	//通信参数
	//strcpy(gcTx0Buf,"AT+CNMI=2,2\r\n");	//可选来信提示方式
	//strcpy(gcTx0Buf,"AT+CSMP=AT+CSQ\r\n");//测试天线信号强度
	//strcpy(gcTx0Buf,"AT+CMGR=1\r\n");	//读取第1单元数据
	//strcpy(gcTx0Buf,"AT+CMGD=1\r\n");	//删除第1单元数据
	//strcpy(gcTx0Buf,"AT+CMGS=\"+8613658150338\r\n");	//发送短信,等待返回"> "
	//strcpy(gcTx0Buf,"This Try");	//删除第1单元数据
	//strcpy(gcTx0Buf,"\0x1A");	//信息结尾

	ES = 1;		//串口中断使能

	whule(1)
	{
		if(!gcTx0Busy)			//发送空闲
		{	if(*gpTx0)		//有要发送的数据没有发完
			{	TI = 1;		//软件置中断标志启动发送中断过程
			}
		}
		else
		{	gcTx0Busy --;		//监督发送状态
		}

		if(gcRxBusy)			//监督接收完成状态
		{	if(gcRxBusy == 1)
			{	//处理接收的数据,比如收到"OK"
			}
			gcRxBusy --;	//接收处理结束
		}

		while(iDelay ++);		//进行其它工作或等待
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -