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

📄 我的定时程序.c

📁 这是一个单片机的定时程序
💻 C
字号:

/**************************************************************************************************************************
**                                                                                                                        **
**                                         可编程控制器监控程序 V6.0版                                                    **
**                                                                                                                        **
**                                                 编者:邵亮                                                              **
**                                                                                                                        **
 **************************************************************************************************************************/
#include<reg52.h>
#include<stdio.h>
#include<absacc.h>
#include<string.h>
#include<intrins.h>
#define byte unsigned char
#define word unsigned int
#define uchar unsigned char
#define uint unsigned int
#define dword unsigned long

/*52寄存器定义*/
xdata uchar c52in _at_ 0xa000;
xdata uchar c52out _at_ 0xc000;
xdata uchar VB[0x2000] _at_ 0x6000;
bdata uchar MB[12] _at_ 0x20;
bdata uchar IB0 _at_ 0x2C;
bdata uchar QB0 _at_ 0x2E;
data uchar LB[16] _at_ 0x30;

data uchar sbufRam[32] _at_ 0x40;

sbit c52_run=P1^0;
/*CRC高位字节值表*/
uchar code auchCRCHi[]={0x00,0xC1,0X81,0X40,0x01,0xC0,0x80,0x41,0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40,
                        0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40,0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,
                        0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40,0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,
                        0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40,
                        0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40,0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,
                        0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40,
                        0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40,
                        0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40,0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,
                        0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40,0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,
                        0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40,
                        0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40,
                        0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40,0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,
                        0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40,
                        0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40,0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,
                        0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40,0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,
                        0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40};
/*CRC低位字节值表*/
uchar code auchCRCLo[]={0x00,0xC0,0xC1,0x01,0xC3,0x03,0x02,0xC2,0xC6,0x06,0x07,0xC7,0x05,0xC5,0xC4,
                        0x04,0xCC,0x0C,0x0D,0xCD,0x0F,0xCF,0xCE,0x0E,0x0A,0xCA,0xCB,0x0B,0xC9,0x09,
                        0x08,0xC8,0xD8,0x18,0x19,0xD9,0x1B,0xDB,0xDA,0x1A,0x1E,0xDE,0xDF,0x1F,0xDD,
                        0x1D,0x1C,0xDC,0x14,0xD4,0xD5,0x15,0xD7,0x17,0x16,0xD6,0xD2,0x12,0x13,0xD3,
                        0x11,0xD1,0xD0,0x10,0xF0,0x30,0x31,0xF1,0x33,0xF3,0xF2,0x32,0x36,0xF6,0xF7,0x37,
                        0xF5,0x35,0x34,0xF4,0x3C,0xFC,0xFD,0x3D,0xFF,0x3F,0x3E,0xFE,0xFA,0x3A,0x3B,
                        0xFB,0x39,0xF9,0xF8,0x38,0x28,0xE8,0xE9,0x29,0xEB,0x2B,0x2A,0xEA,0xEE,0x2E,                      
                        0x2F,0xEF,0x2D,0xED,0xEC,0x2C,0xE4,0x24,0x25,0xE5,0x27,0xE7,0xE6,0x26,0x22,
                        0xE2,0xE3,0x23,0xE1,0x21,0x20,0xE0,0xA0,0x60,0x60,0xA1,0x63,0xA3,0xA2,0x62,
                        0x66,0xA6,0xA7,0x67,0xA5,0x65,0x64,0xA4,0x6C,0xAC,0xAD,0x6D,0xAF,0x6F,0x6E,
                        0xAE,0xAA,0x6A,0x6B,0xAB,0x69,0xA9,0xA8,0x68,0x78,0xB8,0xB9,0x79,0xBB,0x7B,
                        0x7A,0xBA,0xBE,0x7E,0x7F,0xBF,0x7D,0xBD,0xBC,0x7C,0xB4,0x74,0x75,0xB5,0x77,
                        0xB7,0xB6,0x76,0x72,0xB2,0xB3,0x73,0xB1,0x71,0x70,0xB0,0x50,0x90,0x91,0x51,0x93,
                        0x53,0x52,0x92,0x96,0x56,0x57,0x97,0x55,0x95,0x94,0x54,0x9C,0x5C,0x5D,0x9D,0x5F,
                        0x9F,0x9E,0x5E,0x5A,0x9A,0x9B,0x5B,0x99,0x59,0x58,0x98,0x88,0x48,0x49,0x89,
                        0x4B,0x8B,0x8A,0x4A,0x4E,0x8E,0x8F,0x4F,0x8D,0x4D,0x4C,0x8C,0x44,0x84,0x85,
                        0x45,0x87,0x47,0x46,0x86,0x82,0x42,0x43,0x83,0x41,0x81,0x80,0x40};
/**********函数声明************/
void _dl5us(void);   /*延时5us*/
void _dl24us(void);  /*延时24us*/
void _dl50us(void);  /*延时50us*/
void initComm(void); /*串口初始化*/
void tran_serial_data(uchar *sbufRam); /*串口数据发送程序*/
uchar rec_serial_data(uchar *sbufRam); /*串口数据接收程序*/
void read_inport(uchar r_times);
void write_outport(void);
void main(void);

/**********函数体定义**********/
void _dl5us(void){   /*延时5us*/
     _nop_();
    }

void _dl24us(void){  /*延时24us*/
     _dl5us();
     _dl5us();
     _dl5us();
     _dl5us();
    }

void _dl50us(void){  /*延时50us*/
     _dl24us();
     _dl24us();
    }

void dl1ms(uint n){
      while(n!=0){
         uchar i;
         for(i=0;i<20;i++){_dl50us();}
         --n;
         }
}

/************************/
/****52通信口操作命令****/
/************************/

/*命令1查询输出继电器状态*/
void fun_01(void){
    sbufRam[2]=1;/*返回数据长度为1*/
    sbufRam[3]=QB0;
}
/*命令2 查询输入口状态*/
void fun_02(void){
    sbufRam[2]=1;/*返回数据长度为1*/
    sbufRam[3]=c52in;
}
/*命令3查询输出映像寄存器*/
void fun_03(void){
    sbufRam[2]=1;/*返回数据长度为1*/
    sbufRam[3]=QB0;
}
/*命令4查询输入映像寄存器*/
void fun_04(void){
    sbufRam[2]=1;/*返回数据长度为1*/
    sbufRam[3]=IB0;
}
/*命令5查询输入映像寄存器*/
void fun_05(void){
    sbufRam[2]=0;/*返回数据长度为0*/
    QB0=QB0||sbufRam[3];
    c52in=QB0;
}
/*命令6查询输入映像寄存器*/
void fun_06(void){
    sbufRam[2]=0;/*返回数据长度为0*/
    QB0==QB0&&sbufRam[3];
    c52in=QB0;
}
/*****命令字>=70为公用命令*******/
/*测试通信口*/
void fun_70(void){
    return;
}
/*返回程序完成时间日期,即版本号*/
void fun_75(void){
    sbufRam[2]=4;
    sbufRam[3]=0x03;
    sbufRam[4]=0x04;
    sbufRam[5]=0x11;
    sbufRam[6]=0x18;
}


/**********计算CRC16函数*********/
uint CRC16(puchMsg,usDataLen)
uchar *puchMsg;
uchar usDataLen;{
      uchar uchCRCHi=0xFF;
      uchar uchCRCLo=0xFF;
      uchar uIndex;
      while(usDataLen--){
             uIndex=uchCRCHi^*puchMsg++;
             uchCRCHi=uchCRCLo^auchCRCHi[uIndex];
             uchCRCLo=auchCRCLo[uIndex];
             }
      return (uchCRCHi<<8|uchCRCLo);
}

/**********处理通信命令,并准备发送数据*********/
void prepare_data(void)
{
     switch(sbufRam[1]){
           case 0x01:fun_01();
             break;
           case 0x02:fun_02();
             break;
           case 0x03:fun_03();
             break;
           case 0x04:fun_04();
             break;
           case 0x05:fun_05();
             break;
           case 0x06:fun_06();
             break;
           case 0x70:fun_70();
             break;
           case 0x75:fun_75();
             break;
           default:
                return;
           break;
           }
}


/**********串口数据发送程序*******/

void tran_serisl_data(sbutRam)
{uchar *sbufRam;
uchar i;
uint tran_crc16;
uchar tran_leng;
          tran_leng=sbufRam[2]+5;
          tran_crc16=CRC16(sbufRam,tran_leng-2);
          sbufRam[tran_leng-1]=tran_crc16&0x00ff;/*CRC16 低字节*/
          sbufRam[tran_leng-2]=tran_crc16>>8;    /*CRC16 高字节*/
     for(i=0;i<sbufRam[2]+5;i++){
            SBUF=sbufRam[i];
                 while(TI==0);TI=0;
     }
}

/**********串口初始化命令*********/
void initComm(void){
      TMOD=0X22;
      TL1=0XFD;
      TH1=0XFD;
      SCON=0X50;
      PCON=0X80;
      TR1=1;
      IE=0X90;
      EA=1;
}



/*查询接受数据是否有效*/
byte readRi(uint x){
      while(RI==0){
             if(x==0)return(0);
          x--;
      }
      RI=0;
      return(1);
}


/**********串口数据接收程序*******/
uchar rec_serial_data(sbufRam)
uchar *sbufRam; {                     /*接受数据存放地址*/
uchar i;
uchar rec_leng;
uint rec_crc16;
uchar crc16L,crc16H;
        sbufRam[0]=SBUF;RI=0;
     for(i=1;i<3;i++){
              if(readRi(888)==1) sbufRam[i]=SBUF;
     else return(1);                   /*数据接收超时,退出*/
     }
     rec_leng=5+sbufRam[2];
     for(i=3;i<rec_leng;i++){
              if(readRi(888)==1) sbufRam[i]=SBUF;
     else return(1);                   /*数据接收超时,退出*/
     }
     rec_crc16=CRC16(sbufRam,rec_leng-2);
     if(rec_crc16!=0){
          crc16L=rec_crc16&0x00ff;
          crc16H=rec_crc16>>8;
     }
     else{
         crc16L=0;
         crc16H=0;
     }
         if(crc16L!=sbufRam[rec_leng-2])return(0x80||sbufRam[1]);/*校验错,请求重发*/
         if(crc16H!=sbufRam[rec_leng-1])return(0x80||sbufRam[1]);/*校验错,请求重发*/
     return(0);
}

/*********串行中断0服务子程序*******/
void Com_Int(void) interrupt 4
{
uchar return_sign;
    EA=0;                             /*关中断*/
    return_sign=rec_serial_data(sbufRam);/*数据校验结果,0为数据完整接受,1反之*/
    if (return_sign==0){               /*如果从主机接受数据有效*/
          prepare_data();              /*处理通信口命令并准备发送的数据*/
          tran_serial_data(sbufRam);   /*发送数据到主机*/
          }
    else if (return_sign>=0x80)tran_serial_data(sbufRam);/*接受数据包校验错误,请求重发*/
    initComm();                        /*初始化串口*/
}


/****读输入端口并写入输入映像寄存器*****/
void read_inport(uchar r_times){
    uchar rRead;
    rRead=c52in;
    do{
       if(rRead!=c52in)return;
       r_times--;
       _dl50us();_dl50us();
      }while(r_times>0);
      IB0=rRead;
}

/*****将输出映像寄存器数据写入输出端口*****/
void write_outport(void){
    c52out=QB0;
}

/**********主程序**************/
void main(void){
   #define RTIMES 5                    /*定义读次数*/
   void (*c52_user)();
   c52_user=0x2000;                    /*用户程序入口地址*/
   initComm();                         /*串口初始化*/
   do{                                 /*循环执行c52的扫描*/
       read_inport(RTIMES);            /*读输入端口并写入映像寄存器*/
       if (c52_run){                   /*c52_run=1则执行用户程序*/
            c52_user();                /*跳到用户程序入口地址执行用户程序*/
       		 }
    write_outport();
     }while(1);
}

⌨️ 快捷键说明

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