- 註冊時間
- 2012-2-10
- 最後登錄
- 2022-9-18
- 主題
- 查看
- 積分
- 15
- 閱讀權限
- 20
- 文章
- 1
- 相冊
- 0
- 日誌
- 0
![Rank: 2](static/image/common/star_level2.gif)
狀態︰
離線
|
//****************************************************************//
// DHT21 8051範例程式
//功能 :透過RS232串列埠將溫濕度資料傳送回電腦端,串列埠傳輸速率 9600
//硬體連接: P2.0上拉電阻5K連接DHT11的PIN2
// PIN1接電源, PIN4接地
//****************************************************************//
#include <AT89X51.H>
#include <intrins.h>
//****************************************************************//??
#define RS P3_7 /*定義LCD,RS*/
#define RW P3_6 /*定義LCD,RW*/
#define E P3_5 /*定義LCD,E*/
#define DB P1 /*定義LCD,DB*/
void init(void); /*宣告用到init程式*/
void position(char line,column); /*宣告用到position副程式*/
void wrins(char instruction); /*宣告用到wrins副程式*/
void display(char *string); /*宣告用到wrdata副程式*/
void wrdata(char d); /*宣告用到delayms副程式*/
void delayms(unsigned int time);
char keypad(void);
void WriteLCDstring(char,char *);
unsigned char KeyTemp=0xff;
unsigned char KeyData=0xff;
//****************************************************************//
typedef unsigned char U8; /* defined for unsigned 8-bits integer variable 無符號8位元整數 */
typedef signed char S8; /* defined for signed 8-bits integer variable 有符號8位元整數 */
typedef unsigned int U16; /* defined for unsigned 16-bits integer variable 無符號16位元整數 */
typedef signed int S16; /* defined for signed 16-bits integer variable 有符號16位元整數 */
typedef unsigned long U32; /* defined for unsigned 32-bits integer variable 無符號32位元整數 */
typedef signed long S32; /* defined for signed 32-bits integer variable 有符號32位元整數 */
typedef float F32; /* single ecision floating point variable (32bits) 單精確度浮點數(32位長度) */
typedef double F64; /* double precision floating point variable (64bits) 雙精確度浮點數(64位長度) */
#define uchar unsigned char
#define uint unsigned int
#define Data_0_time 4
//----------------------------------------------//
//----------------定義區--------------------//
//----------------------------------------------//
U8 U8FLAG1,k1;
U8 U8count1,U8temp1;
U8 U8T_data_H1,U8T_data_L1,U8RH_data_H1,U8RH_data_L1,U8checkdata1;
U8 U8T_data_H_temp1,U8T_data_L_temp1,U8RH_data_H_temp1,U8RH_data_L_temp1,U8checkdata_temp1;
U8 U8comdata1;
//----------------------------------------------//
//----------------定義區--------------------//
//----------------------------------------------//
U8 U8FLAG2,k2;
U8 U8count2,U8temp2;
U8 U8T_data_H2,U8T_data_L2,U8RH_data_H2,U8RH_data_L2,U8checkdata2;
U8 U8T_data_H_temp2,U8T_data_L_temp2,U8RH_data_H_temp2,U8RH_data_L_temp2,U8checkdata_temp2;
U8 U8comdata2;
//----------------------------------------------//
//----------------定義區--------------------//
//----------------------------------------------//
U8 outdata[5]; //定義發送的位元組數
U8 indata[5];
U8 count, count_r=0;
U8 str2[5]={"%"};
U8 str1[5]={"C"};
code char string1[]="F1:display"; /*宣告字串*/
code char string2[]="F2:enter";
//code char string[];
U16 U16temp1,U16temp2;
/*void SendData(U8 *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];
}*/
//延遲100us
void Delay(U16 j)
{
U8 i;
for(;j>0;j--)
{
for(i=0;i<27;i++);
}
}
//延遲10us
void Delay_10us(void)
{
U8 i;
i--;
i--;
i--;
i--;
i--;
i--;
}
void COM1(void)
{
U8 i;
for(i=0;i<8;i++)
{
U8FLAG1=2;
//----------------------
P2_1=0 ; //T
P2_1=1 ; //T
//----------------------
while((!P2_0)&&U8FLAG1++);
Delay_10us();
Delay_10us();
// Delay_10us();
U8temp1=0;
if(P2_0)U8temp1=1;
U8FLAG1=2;
while((P2_0)&&U8FLAG1++);
//----------------------
P2_1=0 ; //T
P2_1=1 ; //T
//----------------------
//超時則跳出for迴圈
if(U8FLAG1==1)break;
//判斷資料位元是0還是1
// 如果高電壓高過預定0高電平值則資料位元為 1
U8comdata1<<=1;
U8comdata1|=U8temp1; //0
}//rof
}
//--------------------------------
//-----濕度讀取副程式 ------------
//--------------------------------
//----以下變數均為全域變數--------
//----溫度高8位元== U8T_data_H1------
//----溫度低8位元== U8T_data_L1------
//----濕度高8位== U8RH_data_H1-----
//----濕度低8位== U8RH_data_L1-----
//----校驗 8位 == U8checkdata1-----
//----調用相關副程式如下----------
//---- Delay();, Delay_10us();,COM();
//--------------------------------
void RH1(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 !
{
U8FLAG1=2;
//判斷從機是否發出 80us 的低電平回應信號是否結束
while((!P2_0)&&U8FLAG1++);
U8FLAG1=2;
//判斷從機是否發出 80us 的高電平,如發出則進入資料接收狀態
while((P2_0)&&U8FLAG1++);
//資料接收狀態
COM1();
U8RH_data_H_temp1=U8comdata1;
COM1();
U8RH_data_L_temp1=U8comdata1;
COM1();
U8T_data_H_temp1=U8comdata1;
COM1();
U8T_data_L_temp1=U8comdata1;
COM1();
U8checkdata_temp1=U8comdata1;
P2_0=1;
//資料校驗
U8temp1=(U8T_data_H_temp1+U8T_data_L_temp1+U8RH_data_H_temp1+U8RH_data_L_temp1);
if(U8temp1==U8checkdata_temp1)
{
U8RH_data_H1=U8RH_data_H_temp1;
U8RH_data_L1=U8RH_data_L_temp1;
U8T_data_H1=U8T_data_H_temp1;
U8T_data_L1=U8T_data_L_temp1;
U8checkdata1=U8checkdata_temp1;
}//fi
}//fi
}
void COM2(void)
{
U8 i;
for(i=0;i<8;i++)
{
U8FLAG2=2;
//----------------------
P2_3=0 ; //T
P2_3=1 ; //T
//----------------------
while((!P2_2)&&U8FLAG2++);
Delay_10us();
Delay_10us();
// Delay_10us();
U8temp2=0;
if(P2_2)U8temp2=1;
U8FLAG2=2;
while((P2_2)&&U8FLAG2++);
//----------------------
P2_3=0 ; //T
P2_3=1 ; //T
//----------------------
//超時則跳出for迴圈
if(U8FLAG2==1)break;
//判斷資料位元是0還是1
// 如果高電壓高過預定0高電平值則資料位元為 1
U8comdata2<<=1;
U8comdata2|=U8temp2; //0
}//rof
}
//--------------------------------
//-----濕度讀取副程式 ------------
//--------------------------------
//----以下變數均為全域變數--------
//----溫度高8位元== U8T_data_H2------
//----溫度低8位元== U8T_data_L2------
//----濕度高8位== U8RH_data_H2-----
//----濕度低8位== U8RH_data_L2-----
//----校驗 8位 == U8checkdata2-----
//----調用相關副程式如下----------
//---- Delay();, Delay_10us();,COM();
//--------------------------------
void RH2(void)
{
//主機拉低18ms
P2_2=0;
Delay(180);
P2_2=1;
//匯流排由上拉電阻拉高 主機延時20us
Delay_10us();
Delay_10us();
Delay_10us();
Delay_10us();
//主機設為輸入 判斷從機回應信號
P2_2=1;
//判斷從機是否有低電平回應信號 如不回應則跳出,回應則向下運行
if(!P2_2) //T !
{
U8FLAG2=2;
//判斷從機是否發出 80us 的低電平回應信號是否結束
while((!P2_2)&&U8FLAG2++);
U8FLAG2=2;
//判斷從機是否發出 80us 的高電平,如發出則進入資料接收狀態
while((P2_2)&&U8FLAG2++);
//資料接收狀態
COM2();
U8RH_data_H_temp2=U8comdata2;
COM2();
U8RH_data_L_temp2=U8comdata2;
COM2();
U8T_data_H_temp2=U8comdata2;
COM2();
U8T_data_L_temp2=U8comdata2;
COM2();
U8checkdata_temp2=U8comdata2;
P2_2=1;
//資料校驗
U8temp2=(U8T_data_H_temp2+U8T_data_L_temp2+U8RH_data_H_temp2+U8RH_data_L_temp2);
if(U8temp2==U8checkdata_temp2)
{
U8RH_data_H2=U8RH_data_H_temp2;
U8RH_data_L2=U8RH_data_L_temp2;
U8T_data_H2=U8T_data_H_temp2;
U8T_data_L2=U8T_data_L_temp2;
U8checkdata2=U8checkdata_temp2;
}//fi
}//fi
}
//----------------------------------------------
//main()功能描述: AT89C51 11.0592MHz 串列埠發
//送溫濕度資料,串列傳輸速率 9600
//----------------------------------------------
void main()
{
init();
position(1,1);
display(string1);
position(2,1);
display(string2);
while(1);
//uchar str[6]={"RS232"};
/* 系統初始化 */
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);
if(KeyData=0xff)
{
//------------------------
//調用溫濕度讀取副程式
RH1();
RH2();
//串列埠顯示程式
//--------------------------
str1[0]=U8T_data_H1 /10 +0X30;
str1[1]=U8T_data_H1 %10 +0X30;
str2[0]=U8T_data_H2 /10 +0X30;
str2[1]=U8T_data_H2 %10 +0X30;
// SendData(str) ; //發送到串列埠
//讀取模組資料週期不易小於 2S
Delay(2000);
init();
position(1,1);
//choice();
display(str1);
position(2,1);
//choice();
display(str2);
}//elihw
}// main
void init(void)
{
delayms(30);
wrins(0x38);
wrins(0x38);
wrins(0x38);
wrins(0x38);
wrins(0x08);
wrins(0x01);
wrins(0x06);
wrins(0x0c);
}
void position(char line,column)
{
unsigned char instruction;
line--;
column--;
instruction=0x80+(0x40*line + column);
wrins(instruction);
}
void wrins(char instruction)
{
RS=0;
RW=0;
E=0;
delayms(1);
E=1;
DB=instruction;
delayms(1);
E=0;
delayms(8);
}
void display(char *string)
{
char k1=0;
while(string[k1] !=0x00)
{
wrdata(string[k1]);
k1++;
}
}
void wrdata(char d)
{
RS=1;
RW=0;
E=0;
delayms(1);
E=1;
DB=d;
delayms(1);
E=0;
delayms(1);
}
void delayms(unsigned int time)
{
unsigned int n;
while(time>0)
{
n=120;
while(n>0) n--;
time--;
}
} |
|