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

📄 wirecomm232.c

📁 原创的msp430单片机的整套编码 包括通信,红外检测,软件计时等多种功能
💻 C
字号:
//=========================================================================
//              通信程序(szb 2006/03/13)	v1.0.0
//				
//		
//=========================================================================
#ifndef _COMM232
#define _COMM232
#include	"datastru.h"
#include	"func.h"
#endif

///////////////////////////////////////////////////////////////////////////
//name:RS232comminit()
//function:RS232通信初始化,USART0
//parameter:none
//return:none
//现将波特率设定为9600bps
///////////////////////////////////////////////////////////////////////////
void RS232comminit(void)				  
{										  
	unsigned char i;
	origRS232 = RqueueRS232;
	headRS232 = RqueueRS232;
	tailRS232 = RqueueRS232;
	hoffsetRS232 = 0;
	toffsetRS232 = 0;
	RnumberBIT232 = 0;

  for (i=0;i<RqueueRS232_Length;i++) //每次复位后,清除接收和发送队列
      RqueueRS232[i] = 0;

  
}

///////////////////////////////////////////////////////////////////////////
//name:RS232offset()
//function:计算循环队列头尾指针偏移量的函数
//parameter:Offset-原偏移量的值,n为移位位数,length为接收队列长度
//return:Offset-新的指针偏移量
//explain:每次在对接收队列进行写入和读出操作时,需要移动头尾指针。我们所
//        设计的接收队列是一个循环队列。为了使头尾指针不超出循环队列规定
//        的范围,我们将接收队列的首地址定位在orig变量中,又分别定义头尾
//        指针的偏移量hoffset以及toffset。每次头尾指针移位的时候,先计算
//        他们的偏移量。最终的头尾指针的位置由偏移量加上orig得到。而偏移
//        量由以下计算函数确定,保证了偏移量的范围在0-(length-1)之间,
//		  从而保证了头尾指针不会超出循环队列的范围。
///////////////////////////////////////////////////////////////////////////
int RS232offset(int Offset, int n, int length)
{
	return Offset = (Offset + n) % length;
} 

///////////////////////////////////////////////////////////////////////////
//name:*RS232voffset()
//function:已知头指针head在循环队列中的指向,求*(headRS232 + n)的值.n可正可负.
//parameter:int n为head前或后偏移量的位数
//return:Pdata = headRS232 + n
//explain:当头指针head比较靠近循环队列的末尾时,(head+n)很可能就指到循环队列外
//		  面去了为了防止这种情况发生,需要根据情况先判断(headRS232 + n)是否会溢出,如果
//		  溢出则将其重新指回循环队列内部的元素,使队列真正成为一个循环队列.
//update:2003.2.20 by wjg
///////////////////////////////////////////////////////////////////////////
unsigned char *RS232voffset(int n)
{
	unsigned char *Pdata;
	
	Pdata = origRS232 + RS232offset(headRS232 - origRS232, n, RqueueRS232_Length);

	return Pdata;
}

///////////////////////////////////////////////////////////////////////////
//name:RS232MoveHead()
//function:将头指针在循环队列中移动n位
//parameter:int step,头指针要移动的步数;unsigned char *CommType,通信类型
//return:none
//update:2003.2.20 by wjg
///////////////////////////////////////////////////////////////////////////
void RS232MoveHead(int step)
{
	hoffsetRS232 = RS232offset(hoffsetRS232, step, RqueueRS232_Length);
    headRS232 = origRS232 + hoffsetRS232;
				 
}

 
///////////////////////////////////////////////////////////////////////////
//name:COMM232()
//function:RS232通信主函数
//parameter:通信类型RS232
//return:none
///////////////////////////////////////////////////////////////////////////
void COMM232(void)
{
	while (headRS232 > tailRS232 && headRS232 - tailRS232 <= RqueueRS232_Length - 3 || tailRS232 - headRS232 >= 3)
		{
			if ((unsigned char)(*headRS232 + *RS232voffset(1)) == *RS232voffset(2) && (*headRS232 == SlaveAddress || *headRS232 == 0xAA))
				{
					
					if (0 != *RS232voffset(1))
					{
						OnSaleRow = *RS232voffset(1) >> 4; 
						OnSaleCol = *RS232voffset(1) & 0x0F;
						MotorRunEnable = ON;
						//MotorPushNum = Clocktime[5];
	                    //CBFNum = Clocktime[5];
					}
					else if (!(P1IN & BIT7))//只对正转实行松开停止键停转电机的操作
					{
						MotorStopEnable = ON;
					}
					RS232MoveHead(3); 
				}
			else
				RS232MoveHead(1);
		}	
}

interrupt[PORT2_VECTOR] void Port2_sensor (void)
{
	_DINT();
	if (P2IFG & BIT3)
		{
			TACCR0 = TAR + 110;							// 初始值设定为TAR + 19,为了在每个bit中间采样
			TACCTL0 = CCIE;  //CCR0 interrupt enabled
			
			P2IE = 0;//禁止2.3端口中断
			P2IFG = 0; //清除中断标志
			
			RnumberBIT232 = 0;//准备接收第一个bit
		}
		_EINT();
}

⌨️ 快捷键说明

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