代码学习

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);//等待发送结束
}
}

posted @ 2023-12-26 12:01  不折不扣  阅读(31)  评论(0)    收藏  举报