#include <reg51.h> #include <intrins.h> #define uchar unsigned char #define uint unsigned int //----------------IO口定義區--------------------// sbit P2_0 = P1^0 ; //----------------定義區--------------------// uchar U8FLAG,k; uchar U8count,U8temp; uchar U8T_data_H,U8T_data_L,U8RH_data_H,U8RH_data_L,U8checkdata; uchar U8T_data_H_temp,U8T_data_L_temp,U8RH_data_H_temp,U8RH_data_L_temp,U8checkdata_temp; uchar U8comdata; uchar outdata[5]; //定義發送的字節數 uchar indata[5]; uchar count, count_r=0; uchar str[5]={"RS232"}; uint U16temp1,U16temp2; SendData(uchar *a) { outdata[0] = a[0]; outdata[1] = a[1]; outdata[2] = a[2]; outdata[3] = a[3]; outdata[4] = a[4]; count = 1; SBUF=outdata[0]; while(!TI); TI = 0; SBUF=outdata[1]; while(!TI); TI = 0; SBUF=outdata[2]; while(!TI); TI = 0; SBUF=outdata[3]; while(!TI); TI = 0; SBUF=outdata[4]; while(!TI); TI = 0; } void Delay(uint j) { uchar i; for(;j>0;j--) { for(i=0;i<27;i++); } } void Delay_10us(void) { unsigned char a,b; for(b=1;b>0;b--) for(a=2;a>0;a--); } void COM(void) { uchar i; for(i=0;i<8;i++) { U8FLAG=2; while((!P2_0)&&U8FLAG++); Delay_10us(); Delay_10us(); Delay_10us(); U8temp=0; if(P2_0)U8temp=1; U8FLAG=2; while((P2_0)&&U8FLAG++); //超時則跳出for循環 if(U8FLAG==1)break; //判斷數據位是0還是1 // 如果高電平高過預定0高電平值則數據位為 1 U8comdata<<=1; U8comdata|=U8temp; //0 }//rof } void RH(void) { //主機拉低18ms P2_0=0; Delay(180); P2_0=1; //總線由上拉電阻拉高 主機延時20us Delay_10us(); Delay_10us(); Delay_10us(); Delay_10us(); //主機設為輸入 判斷從機響應信號 P2_0=1; //判斷從機是否有低電平響應信號 如不響應則跳出,響應則向下運行 if(!P2_0) //T ! { U8FLAG=2; //判斷從機是否發出 80us 的低電平響應信號是否結束 while((!P2_0)&&U8FLAG++); U8FLAG=2; //判斷從機是否發出 80us 的高電平,如發出則進入數據接收狀態 while((P2_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; P2_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; }//fi }//fi } //---------------------------------------------- //main()功能描述: AT89C51 11.0592MHz 串口發 //送溫濕度數據,波特率 9600 //---------------------------------------------- void main() { /* 系統初始化 */ TMOD = 0x20; //定時器T1使用工作方式2 TH1 = 253; // 設置初值 TL1 = 253; TR1 = 1; // 開始計時 SCON = 0x50; //工作方式1,波特率9600bps,允許接收 ES = 1; EA = 1; // 打開所以中斷 TI = 0; RI = 0; SendData(str) ; //發送到串口 Delay(1); //延時100US(12M晶振) while(1) { //------------------------ //調用溫濕度讀取子程序 RH(); //串口顯示程序 //-------------------------- str[0]=U8RH_data_H; str[1]=U8RH_data_L; str[2]=U8T_data_H; str[3]=U8T_data_L; str[4]=U8checkdata; SendData(str) ; //發送到串口 //讀取模塊數據周期不易小于 2S Delay(20000); }//elihw }// main void RSINTR() interrupt 4 using 2 { //if(TI==1) //發送中斷 //{ // TI = 0; //} if(RI==1) //接收中斷 { RI = 0; } }
|