代码学习
16MS定时的使用
tdat&0x0F //取余16,为0的意思;
溢出会从0开始;所以不用做溢出处理;
#define _bit(x) 1<<x
_bit(1) 数值为0x02;
tflag |= _bit(1); //tflag=0x02; 原来的值的低第1位置1的意思;
if(tflag&_bit(1)) //判断低第1位是否置1
tflag &= ~_bit(1); //原来的值的低第1位置0的意思;
#include <stdio.h> #define _bit(x) 1<<x #define _cont 5000 typedef unsigned short u16; typedef unsigned char u8; u8 tdat=0; u16 tflag=0; int main() { int i=_cont; int k=0; int j=0; while(i) { i--; tdat++; if(!(tdat&0x0F)) //16MS { tflag |= _bit(1); // printf("Hello %d\n",k++); //printf("Hello %d\n",tdat); printf("Hello %d\n",tflag); } if(tflag&_bit(1)) //16MS { tflag &= ~_bit(1); printf(" World! %d \n",tflag); } } return 0; }
#define _maxbuf 100
typedef struct
{
 u8 rcbuf[_maxbuf]; //MODBUS接收缓冲区
 u16 timout;//MODbus的数据断续时间	
 u8 recount;//MODbus端口已经收到的数据个数
 u8  reflag;//收到一帧数据的标志
 u8 Sendbuf[_maxbuf]; //MODbus发送缓冲区	
 
}MYUSART;
MYUSART myusart;
extern MYUSART myusart;
 if(myusart.reflag>0)
		{					
			Com_Handle();		
			myusart.recount=0;   
			myusart.reflag=0;				
		}
//串口每接收一个字节都赋值myusart.timout=10;
//当接收完成,计数器会知道超时了,完成一帧的数据接收;
if( myusart.reflag==0)
{	
	myusart.timout=10;
	if(myusart.recount<_maxbuf) 
	{
		myusart.rcbuf[myusart.recount++]=sbuf;
	}
}
		
if(myusart.timout>0)
{
	if(--myusart.timout==0)
	{
		myusart.reflag=1;  //收到一帧数据
	}
}
//这个不需要判断;启动定时器的标志不需要使用了;
if(myusart.recount==1)  //收到主机发来的一帧数据的第一字节
{
	myusart.timrun=1;  //启动定时
}
#define _addr 0x01
static u8 TEMP_BUF[24];
static u8 TEMP_BUF_BAK[24];
void sendreplay(void)
{
	u8 i;
	
	for(i=0;i<18;i++)
	{
		if(TEMP_BUF[i] != TEMP_BUF_BAK[i]) break;
	}
	
	if(i<18)
	{
		for(i=0;i<18;i++) TEMP_BUF_BAK[i] = TEMP_BUF[i];
		
		//给第一路继电器发送数据后,400MS?
		TI74HC595_SendMultiByte_1(TEMP_BUF,4);
		TI74HC595_SendMultiByte_2(&(TEMP_BUF[4]),4);
		TI74HC595_SendMultiByte_3(&(TEMP_BUF[8]),4);
		TI74HC595_SendMultiByte_4(&(TEMP_BUF[12]),4);
		TI74HC595_SendMultiByte_5(&(TEMP_BUF[16]),4);	
		TI74HC595_SendMultiByte_6(&(TEMP_BUF[20]),4);	
	}
}
void sendback(void)
{
	  u8 t;
		//串口答复数据,通讯完成
	  USART_TX_BUF[0] = 0xAA;
	  USART_TX_BUF[1] = _addr;
	  USART_TX_BUF[2] = 0x03;
		USART_TX_BUF[3] = 0x01;//答复写入成功
		USART_TX_BUF[4] = 0XBB;
		for(t=0;t<5;t++)
		{
			USART_SendData(USART1, USART_TX_BUF[t]);//向串口1发送数据
			while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);//等待发送结束
		}	
}
                    
                
                
            
        
浙公网安备 33010602011771号