|
- /*DHT11*/
- #include <reg52.h>
- #include <intrins.h>
- #define Uint unsigned int
- #define Uchar unsigned char
- #define Ulong unsigned long
- //数据类型定义
- 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 precision floating point variable (32bits) 单精度浮点数(32位长度) */
- typedef double F64; /* double precision floating point variable (64bits) 双精度浮点数(64位长度) */
- sbit DU = P2 ^ 6; // 数码管段选
- sbit WE = P2 ^ 7; // 位选
- sbit P3_6 = P3^6 ; //DHT11数据针脚
- /* 8位选参照表
- FE 1
- FD 2
- fb 3
- f7 4
- ef 5
- df 6
- bf 7
- 7f 8
- */
- // 段选参照表
- // 0x06, //"1"
- // 0x5B, //"2"
- // 0x4F, //"3"
- // 0x66, //"4"
- // 0x6D, //"5"
- // 0x7D, //"6"
- // 0x07, //"7"
- // 0x7F, //"8"
- // 0x6F, //"9"
- // 0x7C, //"B"
- // 0x39, //"C"
- // 0x5E, //"D"
- // 0x79, //"E"
- // 0x71, //"F"
- // 0x76, //"H"
- // 0x38, //"L"
- // 0x40, //"-"
- // 0x00, //熄灭
- // */
- //----------------------------------------------//
- //----------------数据存储和数据缓存区----------//
- //----------------------------------------------//
- U8 U8FLAG;
- U8 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;
- // 函数声明
- void showval(Uchar val, Uchar WEval);
- void delay(Uchar z, int mod);
- void display(Ulong Z);
- void Delay_10us(void);
- void COM(void);
- void RH(void);
- void Init(Ulong Z);
- int delay_display(Uchar z,Uchar val,uchar);
- U8 code led[10]={0x3F,0x06,0x5b, 0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
- Uchar code DUtabel[] = {
- 0x3F,
- 0x06,
- 0x5B,
- 0x4F,
- 0x66,
- 0x6D,
- 0x7D,
- 0x07,
- 0x7F,
- 0x6F,
- 0x77,
- 0x7C,
- 0x39,
- 0x5E,
- 0x79,
- 0x71,
- 0x76,
- 0x38,
- 0x40,
- 0x00,
- };
- Uchar code WEtabel[] = {
- 0x00, // 全亮,补位选空位
- 0xFE,
- 0xFD,
- 0xfb,
- 0xf7,
- 0xef,
- 0xdf,
- 0xbf,
- 0x7f,
- };
- void main()
- {
- //报警值区域
- // U8 tempAlarmMin = 20;
- // U8 tempALarmMax = 32;
- // U8 HumidityMin = 45;
- // U8 HumidityMax = 65;
- //显示循环次数
- U8 number = 250;
- U8 count = 0;
- //系统初始化
- //Init();
- while (1)
- {
-
- count =0;
- Init(17);//初始化
- delay(1,2);
- RH();
-
- Init(11);//湿度初始化标识
- delay(1,2);
- delay_display(50,U8T_data_H,12);
- Init(15);//温度初始化标识
- delay(1,2);
- delay_display(50,U8RH_data_H,16);
- Init(888);//初始化
-
-
-
- }
- }
- /*
- 数码管显示函数:
- 参数1:显示的数据0-9
- 参数2:需要在显示的位1-8
- */
- void showval(Uchar val, Uchar WEval)
- {
-
- WE = 1; // 打开位选锁存
- P0 = WEtabel[WEval]; // 选择位选
- WE = 0; // 位锁存
-
-
- DU = 1; // 打开段选锁存器
- P0 = DUtabel[val]; // 送数据
- DU = 0; // 段锁存
-
-
- }
- /*
- 延迟函数.
- 参数1:z为数量
- 参数2:mod为模式
- 1:毫秒
- 2:秒
- */
- void delay(Uchar z, int mod)
- {
- Ulong i;
- if (mod == 1) {
- for (i = 0; i < z; i++) {
- unsigned char a, b;
- for (b = 102; b > 0; b--)
- for (a = 3; a > 0; a--)
- ;
- }
- }
- else if (mod == 2) {
- for (i = 0; i < z * 1000; i++) {
- // 10000us //误差 -0.000000000002us
- unsigned char a, b;
- for (b = 102; b > 0; b--)
- for (a = 3; a > 0; a--) ;
- }
- }
- }
- /*显示长数字*/
- void display(Ulong Z)
- {
- // Z长度
- int Zlen = 0;
- /*存储Z每个位的数字数组变量*/
- int val[8];
- int i;
- while (Z != 0) {
- // 提取n的各个数位上的数
- val[Zlen++] = Z % 10;
- Z /= 10;
- }
- for (i = 0; i < Zlen; i++) {
- P0 = 0XFF; // 清除段码
- showval(val[i], 8 - i);
-
- delay(5, 1);
- }
-
-
- }
- /*延时程序10us*/
- void Delay_10us(void)
- {
- U8 i;
- i--;
- i--;
- i--;
- i--;
- i--;
- i--;
- }
- /*
- //--------------------------------
- //-----湿度读取子程序 ------------
- //--------------------------------
- //----以下变量均为全局变量--------
- //----温度高8位== U8T_data_H------
- //----温度低8位== U8T_data_L------
- //----湿度高8位== U8RH_data_H-----
- //----湿度低8位== U8RH_data_L-----
- //----校验 8位 == U8checkdata-----
- //----调用相关子程序如下----------
- //---- Delay();, Delay_10us();,COM();
- //--------------------------------
- */
- void COM(void)
- {
- U8 i;
- for(i=0;i<8;i++)
- {
- U8FLAG=2;
- while((!P3_6)&&U8FLAG++);
- Delay_10us();
- Delay_10us();
- Delay_10us();
- U8temp=0;
- if(P3_6)U8temp=1;
- U8FLAG=2;
- while((P3_6)&&U8FLAG++);
- //超时则跳出for循环
- if(U8FLAG==1)
- break;
- //判断数据位是0还是1
- // 如果高电平高过预定0高电平值则数据位为 1
- U8comdata<<=1;
- U8comdata|=U8temp; //0
- }//rof
- }
- /*总线数据读取*/
- void RH(void)
- {
- //主机拉低18ms
- P3_6=0;
- delay(18,1);
- //总线由上拉电阻拉高 主机延时20us
- P3_6=1;
- Delay_10us();
- Delay_10us();
- Delay_10us();
- Delay_10us();
- //主机设为输入 判断从机响应信号
- P3_6=1;
- //判断从机是否有低电平响应信号 如不响应则跳出,响应则向下运行
- if(!P3_6) //T !
- {
- U8FLAG=2;
- //判断从机是否发出 80us 的低电平响应信号是否结束
- while((!P3_6)&&U8FLAG++);
- U8FLAG=2;
- //判断从机是否发出 80us 的高电平,如发出则进入数据接收状态
- while((P3_6)&&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;
- //数据读取完后拉高总线电平
- P3_6=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;
- }
- }
- }
- /*
- //----------------------------------------------//
- //------------温度湿度数码管显示区--------------//
- //----------------------------------------------//
- //设置温度值
- */
- /*
- //----------------------------------------------//
- //-----系统初始化点亮报警灯和显示数码管---------//
- //-----点亮报警灯,显示数码管88------------------//
- //----------------------------------------------//
- //系统初始化
- */
- void Init(Ulong Z)
- {
- U8 number = 1000; //闪烁频率
- U8 count = 0; //计数
- while(count < number)
- {
- //设置温度
- // display(Z);
- if (Z==11)
- {
- P0 = 0XFF;
- showval(12, 1);
- //delay(5, 1);
- //P0 = 0XFF;
- }
- else if (Z==15)
- {
- P0 = 0XFF;
- showval(16, 1);
- //delay(5, 1);
- //P0 = 0XFF;
- }
- else
- {
- P0 = 0XFF;
- showval(18, 1);
- //delay(5, 1);
- // P0 = 0XFF;
- }
-
-
-
- count++;
- }
-
-
- }
- int delay_display(Uchar z,Uchar val,Uchar typeshow)
- {
- Ulong i;
-
- for (i = 0; i < z; i++) {
- unsigned char a, b;
- display(val);
- if(typeshow==12){
- showval(12, 1);
- }else if (typeshow==16)
- {
- showval(16, 1);
- }else{}
-
- for (b = 102; b > 0; b--)
-
- for (a = 3; a > 0; a--){
-
-
- }
- }
-
- return 0;
- }
复制代码 |
|