include <reg52.h> #include<intrins.h> // typedef unsignedchar U8; /* defined for unsigned 8-bits integervariable 无符号8位整型变量 */ typedefsigned char S8; /* defined for signed 8-bits integer variable 有符号8位整型变量 */ typedef unsignedint U16; /* defined for unsigned 16-bits integervariable 无符号16位整型变量 */ typedefsigned int S16; /* defined for signed 16-bits integer variable 有符号16位整型变量 */ typedef unsignedlong U32; /* defined for unsigned 32-bits integervariable 无符号32位整型变量 */ typedefsigned long S32; /* defined for signed 32-bits integer variable 有符号32位整型变量 */ typedeffloat F32; /* single precision floating pointvariable (32bits) 单精度浮点数(32位长度) */ typedefdouble F64; /* double precision floating pointvariable (64bits) 双精度浮点数(64位长度) */ // #define ucharunsigned char #define uintunsigned int #define Data_0_time 4 //----------------------------------------------// //--------------步进电机定义部分----------------// //----------------------------------------------// #define MotorDataP0 //步进电机控制接口定义 uchar phasecw[4]={0x08,0x04,0x02,0x01};//正转 电机导通相序 D-C-B-A uchar phaseccw[4]={0x01,0x02,0x04,0x08};//反转 电机导通相序 A-B-C-D uchar speed; //----------------------------------------------// //----------------IO口定义区--------------------// //----------------------------------------------// sbit P1_0 =P1^0 ; sbit P1_1 =P1^1 ; //----------------------------------------------// //----------------定义区--------------------// //----------------------------------------------// U8 U8FLAG,k; U8 U8count,U8temp; U8 U8T_data_H,U8T_data_L,U8RH_data_H,U8RH_data_L,U8checkdata; U8 U8T_data_H_temp,U8T_data_L_temp,U8RH_data_H_temp,U8RH_data_L_temp,U8checkdata_temp; U8 U8comdata; U16U16temp1,U16temp2; //----------------------------------------------// //--------------步进电机正反转控制----------------// //----------------------------------------------// //ms延时函数 voidDelay_xms(uint x) { uint m,n; for(m=0;m<x;m++) for(n=0;n<112;n++); } //顺时针转动 voidMotorCW(void) { uchar l; for(l=0;l<4;l++) { MotorData=phasecw[l]; Delay_xms(speed);//转速调节 } } //逆时针转动 voidMotorCCW(void) { uchar q; for(q=0;q<4;q++) { MotorData=phaseccw[q]; Delay_xms(speed);//转速调节 } } //停止转动 voidMotorStop(void) { MotorData=0x00; } void Delay(U16 j) { U8 i; for(;j>0;j--) { for(i=0;i<27;i++); } } void Delay_10us(void) { U8 i; i--; i--; i--; i--; i--; i--; } void COM(void) { U8 i; for(i=0;i<8;i++) { U8FLAG=2; while((!P1_0)&&U8FLAG++); Delay_10us(); Delay_10us(); Delay_10us(); U8temp=0; if(P1_0)U8temp=1; U8FLAG=2; while((P1_0)&&U8FLAG++); //超时则跳出for循环 if(U8FLAG==1)break; //判断数据位是0还是1 // 如果高电平高过预定0高电平值则数据位为 1 U8comdata<<=1; U8comdata|=U8temp; //0 }//rof } //-------------------------------- //-----湿度读取子程序 ------------ //-------------------------------- //----以下变量均为全局变量-------- //----温度高8位==U8T_data_H------ //----温度低8位==U8T_data_L------ //----湿度高8位==U8RH_data_H----- //----湿度低8位==U8RH_data_L----- //----校验 8位 ==U8checkdata----- //----调用相关子程序如下---------- //---- Delay();, Delay_10us();,COM(); //-------------------------------- void RH(void) { //主机拉低18ms P1_0=0; Delay(180); P1_0=1; //总线由上拉电阻拉高 主机延时20us Delay_10us(); Delay_10us(); Delay_10us(); Delay_10us(); //主机设为输入 判断从机响应信号 P1_0=1; //判断从机是否有低电平响应信号 如不响应则跳出,响应则向下运行 if(!P1_0) //T ! { U8FLAG=2; //判断从机是否发出 80us 的低电平响应信号是否结束 while((!P1_0)&&U8FLAG++); U8FLAG=2; //判断从机是否发出 80us 的高电平,如发出则进入数据接收状态 while((P1_0)&&U8FLAG++); //数据接收状态 COM(); U8RH_data_H_temp=U8comdata; COM(); U8RH_data_L_temp=U8comdata; COM(); U8T_data_H_temp=U8comdata; COM(); U8T_data_L_temp=U8comdata; COM(); U8checkdata_temp=U8comdata; P1_0=1; //数据校验 U8temp=(U8T_data_H_temp+U8T_data_L_temp+U8RH_data_H_temp+U8RH_data_L_temp); if(U8temp==U8checkdata_temp) { U8RH_data_H=U8RH_data_H_temp; U8RH_data_L=U8RH_data_L_temp; U8T_data_H=U8T_data_H_temp; U8T_data_L=U8T_data_L_temp; U8checkdata=U8checkdata_temp; } } } //---------------------------------------------- //main()功能描述: AT89C51 11.0592MHz 串口发 //送温湿度数据,波特率 9600 //---------------------------------------------- void main() { while(1) { RH(); while(U8T_data_H>0x23) { P1_1=0; for(k=0;k<100;k++) { Delay(6000); } P1_1=1; RH(); } } }
|