|
我有一個(gè),你看看。
/****************************************************************
// DHT21使用范例
//單片機(jī) AT89S52 或 STC89C52RC
//功能 數(shù)碼管顯示溫度、濕度數(shù)據(jù)
//硬件 P1.0口為通訊口連接DHT11,DHT11的電源和地連接單片機(jī)的電源和地,單片機(jī)串口加MAX232連接電腦
//公司 雁凌電子
****************************************************************/
#include <reg51.h>
#include <intrins.h>
#define GPIO_DIG P0
sbit P1_0 = P1^0 ;//溫濕度傳感器的數(shù)據(jù)接口
sbit LSA = P2^2;//138譯碼器的控制輸出
sbit LSB = P2^3;
sbit LSC = P2^4;
unsigned char ly_disdate[8]={0,0,0,0,0,0,0,0};
unsigned char U8FLAG;
unsigned char U8temp;
unsigned char U8T_data_H,U8T_data_L,U8RH_data_H,U8RH_data_L,U8checkdata;
unsigned char U8T_data_H_temp,U8T_data_L_temp,U8RH_data_H_temp,U8RH_data_L_temp,U8checkdata_temp;
unsigned char U8comdata;
code unsigned char table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,
0x7c,0x39,0x5e,0x79,0x71}; //共陽數(shù)碼管段值表 0-9 a-f
void Delay(unsigned int j)//延時(shí)888.1725us
{
unsigned char i;
for(j;j>0;j--)
{
for(i=0;i<27;i++);
}
}
void Delay_10us(void)
{
unsigned char i;
i--;
i--;
i--;
i--;
i--;
i--;
}
void COM (void)//讀數(shù)據(jù)
{
unsigned char 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++);
//超時(shí)則跳出for循環(huán)
if(U8FLAG==1)break;
U8comdata<<=1;
U8comdata|=U8temp;
}
}
void RH (void)//溫濕度讀取子程序
{
P1_0=0;
Delay(200);
P1_0=1;
Delay_10us();
Delay_10us();
Delay_10us();
Delay_10us();
P1_0=1;
if(!P1_0)
{
U8FLAG=2;
while((!P1_0)&&U8FLAG++);
U8FLAG=2;
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;//濕度高8位
U8RH_data_L=U8RH_data_L_temp;//濕度低8位
U8T_data_H=U8T_data_H_temp;//溫度高8位
U8T_data_L=U8T_data_L_temp;//溫度低8位
U8checkdata=U8checkdata_temp;//校驗(yàn)8位
}
}
}
void display()//顯示函數(shù)
{
unsigned char i,j;
for(i=0;i<8;i++)//只有8個(gè)數(shù)碼管
{
switch(i) //位選,選擇點(diǎn)亮的數(shù)碼管,
{
case(0):
LSC=0;LSB=0;LSA=0; break;//顯示第0位
case(1):
LSC=0;LSB=0;LSA=1; break;//顯示第1位
case(2):
LSC=0;LSB=1;LSA=0; break;//顯示第2位
case(3):
LSC=0;LSB=1;LSA=1; break;//顯示第3位
case(4):
LSC=1;LSB=0;LSA=0; break;//顯示第4位
case(5):
LSC=1;LSB=0;LSA=1; break;//顯示第5位
case(6):
LSC=1;LSB=1;LSA=0; break;//顯示第6位
case(7):
LSC=1;LSB=1;LSA=1; break;//顯示第7位
}
if ((i==2)||(i==6))
{
GPIO_DIG=table[ly_disdate[i]]+0x80;//發(fā)送段碼
}
else
{
GPIO_DIG=table[ly_disdate[i]];//發(fā)送段碼
}
j=10; //掃描間隔時(shí)間設(shè)定
while(j--);
GPIO_DIG=0x00;//消隱
}
}
void main()
{
unsigned int i=20000;
while(1)
{
RH();
i=5000;
while (i)
{
ly_disdate[7]=U8RH_data_H/10;
ly_disdate[6]=U8RH_data_H%10;
ly_disdate[5]=U8RH_data_L/10;
ly_disdate[4]=U8RH_data_L%10;
ly_disdate[3]=U8T_data_H/10;
ly_disdate[2]=U8T_data_H%10;
ly_disdate[1]=U8T_data_L/10;
ly_disdate[0]=U8T_data_L%10;
i--;
display();
}
}
}
|
|