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

📄 20090309161950f65785[1].txt

📁 /8051单片机TLC1549数据采集程序源代码 //单片机:At89S52 //连接类型:232 |485 接口
💻 TXT
📖 第 1 页 / 共 5 页
字号:
                  temp1=Count/1000;//取前1-2位 
                  ComBuf[1]=temp1; 
                  temp2=Count/10-temp1*100;//得到3-4位 
                  ComBuf[2]=temp2; 
                  ComBuf[3]=Count-(temp1*1000+temp2*10); 
                  SendByteArray();//发送数据 
                  } 
                  //--------------------------------------------------------------------------// 


                  //写一个字节到AT24C04EEPROM 
                  void WriteAT24C04() 
                  { 
                  uchar address,RomData; 
                  address=ComBuf[1]; 
                  RomData=ComBuf[2]; 
                  WriteByte_24c04(RomData,address); 
                  } 

                  //读取AT24C04EEPROM一个字节 
                  void ReadAT24C04() 
                  { 
                  ComBuf[2]=ReadByte_24c04(ComBuf[1]); 
                  SendByteArray();//发送数据 
                  } 

                  //================================= 
                  // 看门狗设置 
                  //================================= 
                  //void watchdog() 
                  //{ 
                  //WDTRST=0x1E; 
                  //WDTRST=0xE1;//喂狗指令 
                  //} 


                  void SetLedData() 
                  { 
                  uchar ShowData,ShowBit; 
                  Timer_Pro_Flag=0;//0为显示处理,1为时序采集处理 
                  ShowBit=ComBuf[1]; 
                  ShowData=LED_NUM[ShowBit];//选择位 
                  ShowData|=ComBuf[2];//显示内容 
                  LED_BIT[ShowBit]=0x00; 
                  LED_BIT[ShowBit]=ShowData; 
                  TH0=(65536-4000)>>8; 
                  TL0=(65536-4000)&0xff; 
                  TR0=ComBuf[3]; 
                  if(ComBuf[3]) P0=0x00;//关闭显示 
                  } 

                  /*========================================= 
                  PluckPulse----时序采集 
                  ===========================================*/ 
                  void PluckPulse() 
                  { 
                  Timer_Pro_Flag=1;//0为显示处理,1为时序采集处理 
                  OLD_TH0=ComBuf[2]; 
                  OLD_TL0=ComBuf[3]; 
                  TH0=OLD_TH0; 
                  TL0=OLD_TL0; 
                  TR0=ComBuf[1];//关闭或启动计时器 
                  } 
                  //------------ 
                  /*========================================= 
                  PWM----时序采集 
                  ===========================================*/ 
                  void PWM() 
                  { 
                  Timer_Pro_Flag=2;//0为显示处理,1为时序采集处理 
                  OLD_TH0=ComBuf[2]; 
                  OLD_TL0=ComBuf[3]; 
                  TH0=OLD_TH0; 
                  TL0=OLD_TL0; 
                  TR0=ComBuf[1];//关闭或启动计时器 
                  } 

                  //------------ 
                  void timer0(void) interrupt 1 using 1 
                  { 
                  //------------------- 
                  switch(Timer_Pro_Flag) 
                  { 
                  case 0: 
                  //LED显示处理 
                  TH0=(0xffff-4000)>>8; 
                  TL0=(0xffff-4000)&0xff; 

                  if (LedCount>4) LedCount=0; 
                  P0=0x00; 
                  P0=LED_BIT[LedCount++]; 
                  break; 
                  case 1: 
                  // 时序采集 
                  TH0=OLD_TH0; 
                  TL0=OLD_TL0; 
                  SendByte(IrDA_in_Pin);//发送P1^0引脚状态 
                  break; 
                  case 2://模拟PWM输出 
                  if(!PWMFlag) 
                  { 
                  TH0=OLD_TH0; 
                  TL0=OLD_TL0; 
                  TR0=1; 
                  PWMFlag=1; 
                  PWM_Pin=0; 
                  } 
                  else 
                  { 
                  PWM_Pin=1; 
                  TR0=0; 
                  TH0=OLD_TH0; 
                  TL0=OLD_TL0; 
                  TR0=1; 
                  PWMFlag=0; 
                  } 
                  break; 
                  } 
                  } 




                  /*=================================================================== 


                  主程序开始处 
                  ===================================================================*/ 

                  void main() 
                  { 
                  //晶振:11.0592,波特率:19200 
                  TMOD=0x21; 
                  TL1=0xfd; 
                  TH1=0xfd; 
                  SCON=0xd8; 
                  PCON=0x80;//高位为0时不倍频:9600pbf,1时倍频:19200bpf 
                  TR1=1; 

                  //------------------ 
                  // TMOD=0x01;//工作在定时器方式1,16位计数器 
                  TH0=(65536-4000)/256; 
                  TL0=(65536-4000)%256; 
                  ET0=1; 
                  EA=1;//中断允许 
                  //------------- 

                  while(1) 
                  { 
                  WaitComm();//等待接收数据 
                  //校对checksum校验码是否正确,如正确则进行相关的操作 
                  if(ISCheckSUM()) 
                  { 
                  switch (ComBuf[0]) 
                  { 
                  case 0x01:WritePortData(); break; //响应上位机发送的写操作 
                  case 0x02:SendPortData(); break; //响应上位机发送的读操作 
                  case 0x03:SetEA();break; //中断允许设定 
                  case 0x04:GetAD();break; //TLC1549数据采集 
                  case 0x05:GetAD_With_VOL_Filter();break;//采软件滤软件的TLC1549数据采集 
                  case 0x06:CD4051_PickVol();break; //CD4051--8选1TLC1549采集 
                  case 0x07:CD4051_LoopPickVol();break; //8路巡检TLC1549采集 
                  case 0x08:ReadAT24C04();break; //读取AT24C04EEPROM一个字节 
                  case 0x09:WriteAT24C04();break; //写一个字节到AT24C04EEPROM 
                  case 0x0a:SetLedData();break; //设定显示的数据 
                  case 0x0b:TestCapCount();break; //电容放电时间计数测试 
                  case 0x0c:PluckPulse();break; //时序采集 
                  case 0x0d:PWM();break; //控制P2_7模拟输出PWM 
                  } 
                  } 
                  else//如检验错误则返回上位机错误信息 
                  { 
                  ComBuf[0]=0xFF; 
                  SendByteArray();//返回错误信息 
                  } 
                  } 
                  }
                   

                        #i nclude <stdio.h> 
                        #i nclude <REGX51.H> 
                        #i nclude "iic.h" 

                        #define uchar unsigned char 
                        #define uint unsigned int 

                        uint Timer_Pro_Flag=0;//0为显示处理,1为时序采集处理 

                        sbit TEST_CAP_VOL_CRLT=P1^0;//用于控制外部继电器 
                        sbit PWM_Pin=P3^7;//PWM输出 
                        sbit IrDA_in_Pin=P1^0;//红外脉冲输入检测脚 

                        bit PWMFlag=0; 
                        uchar OLD_TH0,OLD_TL0; 


                        #define MAXCMD_LENGTH 7 

                        #define AD_VOL_PER 1.04058 //正常采集时的电压校准值 
                        #define AD_Loop_PickVol_PER 1.04058 //CD4051循环采集时的电压校准值 

                        sbit WDTRST=0xA6;//At89S5x看门狗寄存器 
                        sbit ADCLK=P2^0; 
                        sbit ADOUT=P2^1; 
                        sbit ADCS=P2^2; 
                        //-------------------------- 
                        /************CD4051---8选1模拟开关芯片*****************/ 
                        /* 
                        |------------------------------------------------------| 

                        | 4 2 1 | 
                        |-----------------------------------------------|------| 

                        |端口 | INH C B A | | | 
                        |------ 7 6 5 4 3 2 1 0 | 正值 | 取反 | 
                        | 通道 |--------------------------------|-------|------| 
                        |------|...............|8 4 2 1 | | | 
                        |------|---------------|----------------|-------|------| 

                        | 0 |0 0 0 0 0 0 0 0 | 0x00 | 0xff | 
                        | 1 |0 0 0 0 0 0 1 0 | 0x02 | 0xf7 | 
                        | 2 |0 0 0 0 0 1 0 0 | 0x04 | 0xfb | 
                        | 3 |0 0 0 0 0 1 1 0 | 0x06 | 0xf3 | 
                        | 4 |0 0 0 0 1 0 0 0 | 0x08 | 0xfd | 
                        | 5 |0 0 0 0 1 0 1 0 | 0x0A | 0xf8 | 
                        | 6 |0 0 0 0 1 1 0 0 | 0x0C | 0xf9 | 
                        | 7 |0 0 0 0 1 1 1 0 | 0x0e | 0xf1 | 
                        |---------------------------------------|-------|------| 


                        */ 

                        uchar 
                        CD4051_NUM[]={0x00,0x02,0x04,0x06,0x08,0x0A,0x0C,0x0e}; 
                        //0~7编码 
                        sbit CD4051_A=P1^1; 
                        sbit CD4051_B=P1^2; 
                        sbit CD4051_C=P1^3; 
                        sbit CD4051_INH=P1^4; //CD4051_INH为1时,,所有通导都不导通 

                        bit CD4051_Vol_Conver_Flag=0; //0时为正常采集,1为CD4051循环采集 
                        //-------------------------- 
                        //LED显示 
                        //-------------------------- 
                        uchar LedCount=0; 
                        uchar LED_BIT[5]; //用于显示的每一位数据码的内容 
                        uchar LED_NUM[]={0x00,0x10,0x20,0x40,0x80};//选择显示位 
                        //-------------------------------------------------------- 


                        void SendByte(unsigned char word) 
                        { 
                        TI=0; 
                        SBUF=word; 
                        while(TI==0); 
                        TI=0; 
                        } 

                        uchar ComBuf[MAXCMD_LENGTH];//用于保存串口的数据 

                        /*---少量延时---*/ 
                        void delay(uint t) 
                        { 
                        uint i=0; 
                        for(;i<=t;i++); 
                        } 

                        void Pluckdelay(uint t) 
                        { 
                        uint i=0,j; 
                        for(;i<=t;i++) 
                        for(j=1;j<=1000;j++); 
                        } 
                        /*================================= 
                        ComBuf[5]加入CheckSUM校验码 
                        算法:0x01+not(字节1+字节2+...+字节N) 
                        =================================*/ 
                        void SetCheckSUM() 
                        { 
                        ComBuf[5]=0x01+~(ComBuf[0]+ComBuf[1]+ComBuf[2]+ComBuf[3]+ComBuf[4]); 

                        } 
                        /*============================================================= 

                        检测上位机发送来的ComBuf[5]checksum校验码和计算后的是否相等 
                        正确则返回:1 
                        错误则返回:0 
                        ==============================================================*/ 

                        bit ISCheckSUM() 
                        { 
                        uchar crc; 
                        crc=0x01+~(ComBuf[0]+ComBuf[1]+ComBuf[2]+ComBuf[3]+ComBuf[4]); 

                        if(ComBuf[5]==crc) 
                        return 1; 
                        else 
                        { 
                        ComBuf[1]=crc;//如果错误,则返回计算后得到的CHECKSUM校验码 
                        ComBuf[2]=ComBuf[5];//返回原来上位机发送来的CHECKSUM校验码 
                        return 0; 
                        } 
                        } 

                        /*----------------------------------- 
                        * * 
                        * 等待接收上位机发来的指令 * 
                        * * 
                        -------------------------------------*/ 
                        void WaitComm() 

⌨️ 快捷键说明

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