📄 system.c
字号:
//--------------------------------
//-----湿度读取子程序 ------------
//--------------------------------
//----以下变量均为全局变量--------
//----温度高8位== U8T_data_H------
//----温度低8位== U8T_data_L------
//----湿度高8位== U8RH_data_H-----
//----湿度低8位== U8RH_data_L-----
//----校验 8位 == U8checkdata-----
//----调用相关子程序如下----------
//---- Delay();, Delay_10us();,COM();
//--------------------------------
#include <reg51.h>
#include <intrins.h>
#include <stdio.h>
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位长度) */
//
#define uchar unsigned char
#define uint unsigned int
#define Data_0_time 4
sbit DIN=P2^0;
sbit LOAD=P2^1;
sbit CLK=P2^2;
sbit dout=P2^5;
sbit nullio=P2^3;
sbit sound =P3^2;
sbit mode=P1^2;
sbit set= P1^3;
uchar mode_flag;
uchar set_flag;
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;
U8 outdata[5]; //定义发送的字节数
U8 indata[5];
U8 count, count_r=0;
U16 U16temp1,U16temp2;
unsigned char th,tl,hh,hl;
unsigned char th0,tl0,hh0,hl0;
bit time_flag;
uchar criterion_hum;
uchar criterion_temp;
void RH(void);
void s_seg(uchar ,uchar ,uchar, uchar );
void send(uchar ,uchar);
void COM(void);
void process(void);
void Delay(U16 );
void Delay_10us(void);
void key_scan(void);
void winkling(void);
void delayMs(unsigned int i);
void special(unsigned char i);
void init(void);
void main(void)
{
init();
while(1)
{
RH();//读取数据
process(); //数据处理
s_seg(th,tl,hh,hl); //显示温湿度
key_scan();//按键扫描
winkling();
criterion_temp=th0*10+tl0;
criterion_hum=hh0*10+hl0;
if ((U8T_data_H>criterion_temp)||(U8RH_data_H>criterion_hum)) sound=0;
else sound =1;
// delayMs(150);
special(180);//延时
}
}
void init(void)
{
// s_seg(0x81,0x82,0x83,4,5,6,7,8);
criterion_temp=19;
criterion_hum=50;
th0=criterion_temp/10;
tl0=criterion_temp%10;
hh0=criterion_hum/10;
hl0=criterion_hum%10;
}
void special(unsigned char i)
{
unsigned int j;
while(i--)
{
for(j = 0; j < 125; j++);
key_scan();
}
}
void delayMs(unsigned int i)
{
unsigned int j;
while(i--)
{
for(j = 0; j < 125; j++);
}
}
void key_scan(void)
{
if(!set)
{
delayMs(10);//延时10ms
if(!set) { set_flag ++ ;while(!set);}
}
if(!mode)
{
delayMs(10);//延时10ms
if(!mode){ mode_flag ++ ; while(!mode) ;}
} }
void COM(void)
{
U8 i;
for(i=0;i<8;i++)
{
U8FLAG=2;
//----------------------
// P2_1=0 ; //T
// P2_1=1 ; //T
//----------------------
while((!dout)&&U8FLAG++);
Delay_10us();
Delay_10us();
// Delay_10us();
U8temp=0;
if(dout)U8temp=1;
U8FLAG=2;
while((dout)&&U8FLAG++);
//----------------------
// P2_1=0 ; //T
// P2_1=1 ; //T
//----------------------
//超时则跳出for循环
if(U8FLAG==1)break;
//判断数据位是0还是1
// 如果高电平高过预定0高电平值则数据位为 1
U8comdata<<=1;
U8comdata|=U8temp; //0
}//rof
}
void send(uchar add,uchar dat)
{
uchar ADS,i,j;
CLK=0;
LOAD=0;
DIN=0;
i=4;
while(i<16)
{
if(i<8)
{
ADS=add;
}
else
{
ADS=dat;
}
for(j=8;j>=1;j--)
{
if((ADS&0x80)==0)
{ DIN=0 ;}
else
{ DIN=1;}
ADS=ADS<<1;
CLK=1;
CLK=0;
}
i=i+8;
}
LOAD=1;
}
//void s_seg(uchar X1,uchar X2,uchar X3,uchar X4,uchar X5,uchar X6,uchar X7, uchar X8)
void s_seg(uchar X5,uchar X6,uchar X7, uchar X8)
{
send(0x0c,0x01);//正常状态
send(0x0b,0x07);//设置扫描范围DIG0-7
send(0x0a,0x05);//设置亮度11/32
send(0x09,0xff);//采用译码方式
// send(0x01,X1);
// send(0x02,X2);
// send(0x03,X3);
// send(0x04,X4);
send(0x05,X5);
send(0x06,X6);
send(0x07,X7);
send(0x08,X8);
}
void RH(void)
{
//主机拉低18ms
dout=0;
Delay(180);
dout=1;
//总线由上拉电阻拉高 主机延时20us
Delay_10us();
Delay_10us();
Delay_10us();
Delay_10us();
//主机设为输入 判断从机响应信号
dout=1;
//判断从机是否有低电平响应信号 如不响应则跳出,响应则向下运行
if(!dout) //T !
{
U8FLAG=2;
//判断从机是否发出 80us 的低电平响应信号是否结束
while((!dout)&&U8FLAG++);
U8FLAG=2;
//判断从机是否发出 80us 的高电平,如发出则进入数据接收状态
while((dout)&&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;
dout=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
}
void process(void)
{
if(U8RH_data_H==0)
{ hh=0;
hl=0;
}
else
{
hh=U8RH_data_H/10;
hl=U8RH_data_H%10;
}
if(U8T_data_H==0)
{ th=0;
tl=0;
}
else
{
th=U8T_data_H/10;
tl=U8T_data_H%10;
}
}
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 winkling(void)
{
switch(mode_flag)
{
case 0:break;
case 1:
{
while(mode_flag==1)
{
send(0x05,0xf);
special(100);
if(mode_flag!=1) { send(0x05,th0); goto XX2; }
if(set_flag==1)
{
set_flag=0;
th0++;
if(th0>9) th0=0;
}
send(0x05,th0);
special(100);
if(set_flag==1)
{
set_flag=0;
th0++;
if(th0>9) th0=0;
}
}
}
case 2:
{
XX2: while(mode_flag==2)
{
send(0x06,0xf);
special(100);
if(mode_flag!=2){ send(0x06,tl0); goto XX3;}
if(set_flag==1)
{
set_flag=0;
tl0++;
if(tl0>9)tl0=0;
}
send(0x06,tl0);
special(100);
if(set_flag==1)
{
set_flag=0;
tl0++;
if(tl0>9)tl0=0;
}
}
}
case 3:
XX3: { while(mode_flag==3)
{
send(0x07,0xf);
special(100);
if(mode_flag!=3) { send(0x07,hh0); goto XX4;}
if(set_flag==1)
{
set_flag=0;
hh0++;
if(hh0>9)hh0=0;
}
send(0x07,hh0);
special(100);
if(set_flag==1)
{
set_flag=0;
hh0++;
if(hh0>9) hh0=0;
}
}
}
case 4:
XX4: { while(mode_flag==4)
{
send(0x08,0xf);
special(100);
if(mode_flag!=4) { send(0x08,hl0); goto XX5; }
if(set_flag==1)
{
set_flag=0;
hl0++;
if(hl0>9) hl0=0;
}
send(0x08,hl0);
special(100);
if(set_flag==1)
{
set_flag=0;
hl0++;
if(hl0>9) hl0=0;
}
}
}
case 5:
{
XX5: while(mode_flag==5)
{
s_seg(th0,tl0,hh0,hl0);
special(100);
if (mode_flag!=5) { s_seg(th0,tl0,hh0,hl0); goto XX6;}
s_seg(0xf,0xf,0xf,0xf);
special(100);
}
}
}
XX6: mode_flag=0;
s_seg(th,tl,hh,hl);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -