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

📄 20090309161950f65785[1].txt

📁 /8051单片机TLC1549数据采集程序源代码 //单片机:At89S52 //连接类型:232 |485 接口
💻 TXT
📖 第 1 页 / 共 5 页
字号:
                  /8051单片机TLC1549数据采集程序源代码
                  //单片机:At89S52
                  //连接类型:232 |485 接口
                  //校验方式:checksum
                  //开发环境:keil C

                  #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() 
                  { 
                  uchar n=0; 
                  RI=0; 
                  while (1) 
                  { 
                  while(!RI);//等接收数据 
                  //----------------- 
                  ComBuf[n]=SBUF; 
                  RI=0; 
                  // SBUF=ComBuf[n]; 
                  if (ComBuf[n]==0x7e) break;//接收到结束符则退出 
                  if (n>=MAXCMD_LENGTH) 
                  n=0;//接收10个字节,如果还没有接收到0x7e结束符,就重新记录 
                  else 
                  n++; 
                  } 
                  } 


                  /*------------------------------- 
                  * * 
                  * 发送combuf数据至上位机 * 
                  * * 
                  --------------------------------*/ 
                  void SendByteArray() 
                  { 
                  unsigned i; 
                  SetCheckSUM();//加入ComBuf[5]的checkSUM校验码 
                  ComBuf[4]=P0;//取读本模块地址 
                  ComBuf[6]=0x7e;//结束符 
                  for(i=0;i<=MAXCMD_LENGTH-1;i++) 
                  { 
                  SendByte(ComBuf[i]); 
                  } 
                  } 

                  /*------------------------------- 
                  * * 
                  * 送端口状态至上位机 * 
                  * * 
                  --------------------------------*/ 
                  void GetP0() 
                  { 
                  switch(ComBuf[2]) 
                  { 
                  case 0x00: ComBuf[3]=P0_0; break; 
                  case 0x01: ComBuf[3]=P0_1; break; 
                  case 0x02: ComBuf[3]=P0_2; break; 
                  case 0x03: ComBuf[3]=P0_3; break; 
                  case 0x04: ComBuf[3]=P0_4; break; 
                  case 0x05: ComBuf[3]=P0_5; break; 
                  case 0x06: ComBuf[3]=P0_6; break; 
                  case 0x07: ComBuf[3]=P0_7; break; 
                  default: 
                  ComBuf[3]=P0;//为8时...则以上传整个port状态 
                  } 
                  } 
                  //-------------------- 
                  void GetP1() 
                  { 
                  switch(ComBuf[2]) 
                  { 
                  case 0x00: ComBuf[3]=P1_0; break; 
                  case 0x01: ComBuf[3]=P1_1; break; 
                  case 0x02: ComBuf[3]=P1_2; break; 
                  case 0x03: ComBuf[3]=P1_3; break; 
                  case 0x04: ComBuf[3]=P1_4; break; 
                  case 0x05: ComBuf[3]=P1_5; break; 
                  case 0x06: ComBuf[3]=P1_6; break; 
                  case 0x07: ComBuf[3]=P1_7; break; 
                  default: 
                  ComBuf[3]=P1;//为8时...则以上传整个port状态 
                  } 
                  } 
                  //--------------- 
                  void GetP2() 
                  { 
                  switch(ComBuf[2]) 
                  { 
                  case 0x00: ComBuf[3]=P2_0; break; 
                  case 0x01: ComBuf[3]=P2_1; break; 
                  case 0x02: ComBuf[3]=P2_2; break; 
                  case 0x03: ComBuf[3]=P2_3; break; 
                  case 0x04: ComBuf[3]=P2_4; break; 
                  case 0x05: ComBuf[3]=P2_5; break; 
                  case 0x06: ComBuf[3]=P2_6; break; 
                  case 0x07: ComBuf[3]=P2_7; break; 
                  default: 
                  ComBuf[3]=P2;//为8时...则以上传整个port状态 
                  } 
                  } 
                  //-------------- 
                  void GetP3() 
                  { 
                  switch(ComBuf[2]) 
                  { 
                  case 0x00: ComBuf[3]=P3_0; break; 
                  case 0x01: ComBuf[3]=P3_1; break; 
                  case 0x02: ComBuf[3]=P3_2; break; 
                  case 0x03: ComBuf[3]=P3_3; break; 
                  case 0x04: ComBuf[3]=P3_4; break; 
                  case 0x05: ComBuf[3]=P3_5; break; 
                  case 0x06: ComBuf[3]=P3_6; break; 
                  case 0x07: ComBuf[3]=P3_7; break; 
                  default: 
                  ComBuf[3]=P3;//为8时...则以上传整个port状态 
                  } 
                  } 
                  //-------发送AT89S5x的指定端口状态到上位机----- 
                  void SendPortData() 
                  { 
                  switch (ComBuf[1])/*Port号*/ 
                  { 
                  case 0x00: GetP0(); break; 
                  case 0x01: GetP1(); break; 
                  case 0x02: GetP2(); break; 
                  case 0x03: GetP3(); break; 
                  } 

                  /*--------------------*/ 
                  SendByteArray();//发送数据 
                  } 




                  /*------------------------------- 
                  * * 
                  * 各个端口的状态设定 * 
                  * * 
                  --------------------------------*/ 
                  void SetP0() 
                  { 
                  switch(ComBuf[2]) 
                  { 
                  case 0x00: P0_0=ComBuf[3]; break; 
                  case 0x01: P0_1=ComBuf[3]; break; 
                  case 0x02: P0_2=ComBuf[3]; break; 
                  case 0x03: P0_3=ComBuf[3]; break; 
                  case 0x04: P0_4=ComBuf[3]; break; 
                  case 0x05: P0_5=ComBuf[3]; break; 
                  case 0x06: P0_6=ComBuf[3]; break; 
                  case 0x07: P0_7=ComBuf[3]; break; 
                  default: 
                  P0=ComBuf[3];//为8时...则设置整个port状态 
                  } 
                  } 
                  //================================= 
                  void SetP1() 
                  { 
                  switch(ComBuf[2]) 
                  { 
                  case 0x00: P1_0=ComBuf[3]; break; 
                  case 0x01: P1_1=ComBuf[3]; break; 
                  case 0x02: P1_2=ComBuf[3]; break; 
                  case 0x03: P1_3=ComBuf[3]; break; 
                  case 0x04: P1_4=ComBuf[3]; break; 
                  case 0x05: P1_5=ComBuf[3]; break; 
                  case 0x06: P1_6=ComBuf[3]; break; 
                  case 0x07: P1_7=ComBuf[3]; break; 
                  default: 
                  P1=ComBuf[3];//为8时...则设置整个port状态 
                  } 
                  } 
                  //================================= 
                  void SetP2() 
                  { 
                  switch(ComBuf[2]) 
                  { 
                  case 0x00: P2_0=ComBuf[3]; break; 
                  case 0x01: P2_1=ComBuf[3]; break; 
                  case 0x02: P2_2=ComBuf[3]; break; 
                  case 0x03: P2_3=ComBuf[3]; break; 
                  case 0x04: P2_4=ComBuf[3]; break; 
                  case 0x05: P2_5=ComBuf[3]; break; 
                  case 0x06: P2_6=ComBuf[3]; break; 
                  case 0x07: P2_7=ComBuf[3]; break; 
                  default: 
                  P2=ComBuf[3];//为8时...则设置整个port状态 
                  } 

⌨️ 快捷键说明

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