#include <reg52.h> //调用单片机头文件
#define uchar unsigned char //无符号字符型 宏定义 变量范围0~255
#define uint unsigned int //无符号整型 宏定义 变量范围0~65535
#include <intrins.h>
bit flag_200ms ;
bit flag_100ms ;
uint count=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;
sbit DATA=P2^3;
uchar humi;
uchar temp;
uint ah=20; //温度报警值
uint al=75; //湿度报警值
uint tl=500;//光照报警值
uchar menu_1,menu_2;
uchar flag=0;
uchar biaozhi=0;
sbit s1=P3^2;
sbit s2=P3^3;
sbit s3=P3^4;
sbit s4=P3^5;
uint time=0;
uchar flag;
uchar en_flag=0;
uint co;
sbit led1=P1^4;
sbit led2=P1^5;
sbit led3=P1^6;
sbit led4=P1^7;
sbit k1=P3^6;
sbit k2=P3^7;
unsigned long beats1 = 0;
uchar mode1=2;
sbit beep=P2^7;
uchar mode=0;
#define data_1602 P0
uchar code table_num[]="0123456789abcdefg";
sbit rs=P2^0; //寄存器选择信号 H:数据寄存器 L:指令寄存器
sbit rw=P2^1; //寄存器选择信号 H:数据寄存器 L:指令寄存器
sbit e =P2^2; //片选信号 下降沿触发
sbit SCL=P2^4; // 将p2.1口模拟时钟口
sbit SDA=P2^5; // 将p2.0口模拟数据口
bit askflag;
uint dianya;
//定义3个显示数据单元和1个数据存储单元
#define delayNOP(); {_nop_();_nop_();_nop_();_nop_();};
bit bdata SystemError; //从机错误标志位
/*********************** PCF8591专用变量定义 ***********************/
#define PCF8591_WRITE 0x90
#define PCF8591_READ 0x91
#define NUM 4 //接收和发送缓存区的深度
uchar idata receivebuf[NUM]; //数据接收缓冲区
//-------------------------------------------------------------------
// 函数名称: iic_start()
// 函数功能: 启动I2C总线子程序
//-------------------------------------------------------------------
void iic_start(void)
{ //时钟保持高,数据线从高到低一次跳变,I2C通信开始
SDA = 1;
SCL = 1;
delayNOP(); // 延时5us
SDA = 0;
delayNOP();
SCL = 0;
}
//-------------------------------------------------------------------
// 函数名称: iic_stop()
// 函数功能: 停止I2C总线数据传送子程序
//-------------------------------------------------------------------
void iic_stop(void)
{
SDA = 0; //时钟保持高,数据线从低到高一次跳变,I2C通信停止
SCL = 1;
delayNOP();
SDA = 1;
delayNOP();
SCL = 0;
}
//------------------------------------------------------------------
// 函数名称: iicInit_()
// 函数功能: 初始化I2C总线子程序
//------------------------------------------------------------------
void iicInit(void)
{
SCL = 0;
iic_stop();
}
//-------------------------------------------------------------------
// 函数名称: slave_ACK
// 函数功能: 从机发送应答位子程序
//-------------------------------------------------------------------
void slave_ACK(void)
{
SDA = 0;
SCL = 1;
delayNOP();
SCL = 0;
}
//-------------------------------------------------------------------
// 函数名称: slave_NOACK
// 函数功能: 从机发送非应答位子程序,迫使数据传输过程结束
//-------------------------------------------------------------------
void slave_NOACK(void)
{
SDA = 1;
SCL = 1;
delayNOP();
SDA = 0;
SCL = 0;
}
//-------------------------------------------------------------------
// 函数名称: check_ACK
// 函数功能: 主机应答位检查子程序,迫使数据传输过程结束
//-------------------------------------------------------------------
void check_ACK(void)
{
SDA = 1; // 将p1.1设置成输入,必须先向端口写1
SCL = 1;
askflag = 0;
delayNOP();
if(SDA == 1) // 若SDA=1表明非应答,置位非应答标志askflag
askflag = 1;
SCL = 0;
}
//-------------------------------------------------------------------
// 函数名称: IICSendByte
// 入口参数: ch
// 函数功能: 发送一个字节
//-------------------------------------------------------------------
void IICSendByte(uchar ch)
{
unsigned char idata n=8; // 向SDA上发送一位数据字节,共八位
while(n--)
{
if((ch&0x80) == 0x80) // 若要发送的数据最高位为1则发送位1
{
SDA = 1; // 传送位1
SCL = 1;
delayNOP();
// SDA = 0;
SCL = 0;
}
else
{
SDA = 0; // 否则传送位0
SCL = 1;
delayNOP();
SCL = 0;
}
ch = ch<<1; // 数据左移一位
}
}
//-------------------------------------------------------------------
// 函数名称: IICreceiveByte
// 返回接收的数据
// 函数功能: 接收一字节子程序
//-------------------------------------------------------------------
uchar IICreceiveByte(void)
{
uchar idata n=8; // 从SDA线上读取一上数据字节,共八位
uchar tdata=0;
while(n--)
{
SDA = 1;
SCL = 1;
tdata =tdata<<1; //左移一位
if(SDA == 1)
tdata = tdata|0x01; // 若接收到的位为1,则数据的最后一位置1
else
tdata = tdata&0xfe; // 否则数据的最后一位置0
SCL = 0;
}
return(tdata);
}
//-------------------------------------------------------------------
// 函数名称: ADC_PCF8591
// 入口参数: controlbyte控制字
// 函数功能: 连续读入4路通道的A/D转换结果到receivebuf
//-------------------------------------------------------------------
void ADC_PCF8591(uchar controlbyte)
{
uchar idata receive_da,i=0;
iic_start();
IICSendByte(PCF8591_WRITE); //控制字
check_ACK();
if(askflag == 1)
{
SystemError = 1;
return;
}
IICSendByte(controlbyte); //控制字
check_ACK();
if(askflag == 1)
{
SystemError = 1;
return;
}
iic_start(); //重新发送开始命令
IICSendByte(PCF8591_READ); //控制字
check_ACK();
if(askflag == 1)
{
SystemError = 1;
return;
}
IICreceiveByte(); //空读一次,调整读顺序
slave_ACK(); //收到一个字节后发送一个应答位
while(i<4)
{
receive_da=IICreceiveByte();
receivebuf[i++]=receive_da;
slave_ACK(); //收到一个字节后发送一个应答位
}
slave_NOACK(); //收到最后一个字节后发送一个非应答位
iic_stop();
}
/***********************延时函数************************/
void delay_uint(uint q)
{
while(q--);
}
/***********************lcd1602写命令函数************************/
void write_com(uchar com)
{
e=0;
rs=0;
rw=0;
P0=com;
delay_uint(3);
e=1;
delay_uint(25);
e=0;
}
/***********************lcd1602写数据函数************************/
void write_data(uchar dat)
{
e=0;
rs=1;
rw=0;
P0=dat;
delay_uint(3);
e=1;
delay_uint(25);
e=0;
}
/***********************lcd1602初始化设置************************/
void init_1602() //lcd1602初始化设置
{
write_com(0x38);
write_com(0x0c);
write_com(0x06);
}
/***********************lcd1602上显示这字符函数************************/
void write_string(uchar hang,uchar add,uchar *p)
{
if(hang==1)
write_com(0x80+add);
else
write_com(0x80+0x40+add);
while(1)
{
if(*p == '\0') break;
write_data(*p);
p++;
}
}
/*****************控制光标函数********************/
void write_guanbiao(uchar hang,uchar add,uchar date)
{
if(hang==1)
write_com(0x80+add);
else
write_com(0x80+0x40+add);
if(date == 1)
write_com(0x0f); //显示光标并且闪烁
else
write_com(0x0c); //关闭光标
}
/***********************lcd1602上显示特定的字符************************/
void write_zifu(uchar hang,uchar add,uchar date)
{
if(hang==1)
write_com(0x80+add);
else
write_com(0x80+0x40+add);
write_data(date);
}
/****************开机液晶显示函数 初始化液晶的内容********************************/
void init_1602_dis_csf() //初始化液晶
{
write_string(1,0," ");
write_string(2,0," ");
}
void Delay1(uint j)
{
uchar i;
for(;j>0;j--)
{
for(i=0;i<27;i++);
}
}
void Delay_10us(void)
{
uchar i;
i--;
i--;
i--;
i--;
i--;
i--;
}
void COM(vo
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
1.本设计采用52单片机作为主控器。 2.DHT11采集温湿度,光敏电阻测量光照强度。送到液晶显示温湿度,光照强度。 3.光照强度大于设置值,电机正转,到达指定位置,碰到正转限位开关,电机停止转动,小于设置值,电机反转,到达指定位置,碰到反转限位开关,电机停止转动。 4.按键设置温湿度、光照阀值。 5.实际测量值大于设置值,对应指示灯点亮、蜂鸣器报警。
资源推荐
资源详情
资源评论
收起资源包目录
基于单片机DHT11-PCF8591光照检测-步进电机控制(proteus仿真+源程序).rar (20个子文件)
基于单片机DHT11-PCF8591光照检测-步进电机控制(proteus仿真+源程序)
仿真程序
仿真图.jpg 86KB
程序图.png 83KB
源程序
程序.uvproj 14KB
程序.c 16KB
Objects
程序 29KB
程序.hex 9KB
程序.build_log.htm 1KB
程序.lnp 89B
程序.obj 34KB
程序.uvgui.pc 84KB
程序.uvopt 5KB
Listings
程序.lst 30KB
程序.m51 40KB
程序.uvgui.Administrator 84KB
LCDShow-8.6.pdsprj 33KB
__Previews
原理图.SchDocPreview 71KB
LCDShow-8.11.pdsprj 33KB
功能需求.doc 12KB
__Previews
原理图.SchDocPreview 81KB
原理图.$$$Preview 81KB
共 20 条
- 1
bbxyliyang
- 粉丝: 103
- 资源: 181
下载权益
C知道特权
VIP文章
课程特权
开通VIP
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
- 1
- 2
前往页