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

📄 test.c

📁 测试电动调节阀用处 测试电动调节阀用处
💻 C
📖 第 1 页 / 共 2 页
字号:
/*====================================================
设计项目:电动调节阀的校验装置的测试
单片机:	  AT89S52
连接方式:RS-232C
开发环境:Keil C
设 计 人:祝亮平
======================================================*/
#include <reg51.h>
#include <stdio.h> 
//#include "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;      //红外脉冲输入检测脚
sbit P0_0=P0^0;
sbit P0_1=P0^1;
sbit P0_2=P0^2;
sbit P0_3=P0^3;
sbit P0_4=P0^4;
sbit P0_5=P0^5;
sbit P0_6=P0^6;
sbit P0_7=P0^7;

sbit P1_0=P1^0;
sbit P1_1=P1^1;
sbit P1_2=P1^2;
sbit P1_3=P1^3;
sbit P1_4=P1^4;
sbit P1_5=P1^5;
sbit P1_6=P1^6;
sbit P1_7=P1^7;

sbit P2_0=P2^0;
sbit P2_1=P2^1;
sbit P2_2=P2^2;
sbit P2_3=P2^3;
sbit P2_4=P2^4;
sbit P2_5=P2^5;
sbit P2_6=P2^6;
sbit P2_7=P2^7;

sbit P3_0=P3^0;
sbit P3_1=P3^1;
sbit P3_2=P3^2;
sbit P3_3=P3^3;
sbit P3_4=P3^4;
sbit P3_5=P3^5;
sbit P3_6=P3^6;
sbit P3_7=P3^7;  //	设定I/O口各个脚位
 
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状态 
} 
} 
//================================= 
void SetP3() 
{ 
switch(ComBuf[2]) 
{ 
case 0x00: P3_0=ComBuf[3]; break; 
case 0x01: P3_1=ComBuf[3]; break; 
case 0x02: P3_2=ComBuf[3]; break; 
case 0x03: P3_3=ComBuf[3]; break; 
case 0x04: P3_4=ComBuf[3]; break; 
case 0x05: P3_5=ComBuf[3]; break; 
case 0x06: P3_6=ComBuf[3]; break; 
case 0x07: P3_7=ComBuf[3]; break; 
default: 
P3=ComBuf[3];   //为8时...则设置整个port状态 
} 
} 

/*================================= 
WritePortData() 

按上位机传来的格式进行端口的设置 
=================================*/ 
void WritePortData() 
{ 
switch (ComBuf[1])/*Port号*/ 
{ 
case 0x00: SetP0(); break; 
case 0x01: SetP1(); break; 
case 0x02: SetP2(); break; 
case 0x03: SetP3(); break; 
} 
} 

/*---------------------------------- 
* SetEA() * 
* * 
* 中断允许设定,(EA寄存器) * 
* ComBuf[1]==>0x00为EA设定 * 
* 0x01为读取EA值 * 
------------------------------------*/ 
void SetEA() 
{ 
if (ComBuf[1]==0x00) 
EA=ComBuf[3]; 
else 
{ 
ComBuf[3]=EA; 
SendByteArray();//发送数据 
} 
}
/*--------------------------------------------------------------- 
* * 
* float型转为2位char型,并发送至串行 * 
* void Convert_AD_VOL_ValueToChar() * 
* * 
---------------------------------------------------------------*/ 
void Convert_AD_VOL_ValueToChar(uint vol) 
{ 
float temp_float_vol; 
unsigned int temp; 
uchar AD_Hight,AD_Low; 

temp_float_vol=vol*0.0048*AD_VOL_PER; 
temp=temp_float_vol*100; 
AD_Hight=temp /100;         //取个位数 
AD_Low=temp-AD_Hight*100;   //取2位小数 

⌨️ 快捷键说明

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