-
中了个灯。
-
等我再翻翻,如果找到个合适的显示器,或者无线模块,准备做个联网的,可以手机APP查看测量结果。
-
这个是AM2301.h
定义了端口和存储温湿度的数组,只要包含这个文件,并调用读取函数就行了,然后从数组了读取转换结果用于显示。
//AM2301
#include <AT89X52.h>
#include<intrins.h> //包含_nop_()函数定义的头文件
//读传感器 端口位定义,可修改
sbit AM2301_PIN = P2^3;
// 变量定义
unsigned char Sensor_Data[5]={0x00,0x00,0x00,0x00,0x00};
unsigned char Sensor_Check; //校验和
unsigned char Sensor_AnswerFlag; //收到起始标志位
unsigned char Sensor_ErrorFlag; //读取传感器错误标志
unsigned int Sys_CNT;
/********************************************\
|* 功能: 延时 晶振为12M时 *|
|* t = 1 为 20us 然后成倍增加10us左右 *|
\********************************************/
void Delay_N10us(unsigned char t)
{
while(t--)
{
_nop_();
}
}
/********************************************\
|* 功能: 延时 晶振为12M时 *|
|* 延时大约 1ms *|
\********************************************/
void Delay_N1ms(unsigned int t)
{
unsigned int i;
unsigned int j;
for(j=t;j>0;j--)
for(i=124;i>0;i--); //延时大约 1ms
}
/********************************************\
|* 功能: 读传感器发送的单个字节 *|
\********************************************/
unsigned char Read_SensorData(void)
{
unsigned char i,cnt;
unsigned char buffer,tmp;
buffer = 0;
for(i=0;i<8;i++)
{
cnt=0;
while(!AM2301_PIN) //检测上次低电平是否结束
{
if(++cnt >= 300)
{
break;
}
}
//延时Min=26us Max50us 跳过数据"0" 的高电平
Delay_N10us(2); //延时30us
//判断传感器发送数据位
tmp =0;
if(AM2301_PIN)
{
tmp = 1;
}
cnt =0;
while(AM2301_PIN) //等待高电平 结束
{
if(++cnt >= 200)
{
break;
}
}
buffer <<=1;
buffer |= tmp;
}
return buffer;
}
/********************************************\
|* 功能: 读传感器 *|
\********************************************/
unsigned char Read_Sensor(void)
{
unsigned char i;
//主机拉低(Min=800US Max=20Ms)
AM2301_PIN = 0;
Delay_N1ms(2); //延时2Ms
//释放总线 延时(Min=30us Max=50us)
AM2301_PIN = 1;
Delay_N10us(1);//延时30us
//主机设为输入 判断传感器响应信号
AM2301_PIN = 1;
Sensor_AnswerFlag = 0; // 传感器响应标志
//判断从机是否有低电平响应信号 如不响应则跳出,响应则向下运行
if(AM2301_PIN ==0)
{
Sensor_AnswerFlag = 1;//收到起始信号
Sys_CNT = 0;
//判断从机是否发出 80us 的低电平响应信号是否结束
while((!AM2301_PIN))
{
if(++Sys_CNT>300) //防止进入死循环
{
Sensor_ErrorFlag = 1;
return 0;
}
}
Sys_CNT = 0;
//判断从机是否发出 80us 的高电平,如发出则进入数据接收状态
while((AM2301_PIN))
{
if(++Sys_CNT>300) //防止进入死循环
{
Sensor_ErrorFlag = 1;
return 0;
}
}
// 数据接收 传感器共发送40位数据
// 即5个字节 高位先送 5个字节分别为湿度高位 湿度低位 温度高位 温度低位 校验和
// 校验和为:湿度高位+湿度低位+温度高位+温度低位
for(i=0;i<5;i++)
{
Sensor_Data[i] = Read_SensorData();
}
}
else
{
Sensor_AnswerFlag = 0; // 未收到传感器响应
}
return 1;
}
-
这个是LCD1602.h文件,定义了管教的分配,只要修改这个文件就可以在51工程里轻松移植到其他管脚去。
#include <AT89X52.h>
#include<intrins.h> //包含_nop_()函数定义的头文件
#define LCD1602_DATA_BUS P0
sbit LCD1602_RS=P2^0;
sbit LCD1602_RW=P2^1;
sbit LCD1602_EN=P2^2;
#define LCD1602_RS_High() LCD1602_RS=1
#define LCD1602_RS_Low() LCD1602_RS=0
#define LCD1602_RW_High() LCD1602_RW=1
#define LCD1602_RW_Low() LCD1602_RW=0
#define LCD1602_EN_High() LCD1602_EN=1
#define LCD1602_EN_Low() LCD1602_EN=0
/*从b里读数据写到a. 例如:tem=LCD1602_DATA_BUS;可以写作LCD1602_READ_DATA(tem,LCD1602_DATA_BUS);*/
#define LCD1602_READ_DATA(a_addr,b_addr) a_addr=b_addr
/*延时函数,延时时间=13+11*j,例如当j=17时,延时为200us*/
void delay(unsigned int j);
/*写指令函数。参数:指令*/
void LCD1602WriteCom(unsigned char com);
/*写数据函数。参数:写入数据*/
void LCD1602WriteData(unsigned char dat);
/*初始化函数。参数:无*/
void LCD1602Init(void);
/*检查忙指令。参数:无*/
void LCD1602CheckBusy(void);
/*写字符串。参数:地址(第一行0x80~0x8F,第二行0xC0~0xCF),字符串*/
void LCD1602DispString(unsigned char addr,unsigned char *str);
/*写1位数字到指定的位置。参数:位置,1位字符*/
void LCD1602Disp1(unsigned char addr,unsigned char num);
-
LCD1602.C 是主要文件,main函数也在这个里面了。方便LCD1602测试,也可以直接剪切到另外一个文件。
#include"LCD1602.h"
#include"AM2301.h"
void delay(unsigned int j)
{
for(; j>0; j--);
}
void LCD1602CheckBusy(void)
{
unsigned char tem;
LCD1602_RS_Low();
LCD1602_RW_High();
LCD1602_EN_Low();
while(1)
{
LCD1602_DATA_BUS=0xFF;
LCD1602_EN_High();
// tem=LCD1602_DATA_BUS;
LCD1602_READ_DATA(tem,LCD1602_DATA_BUS);
LCD1602_EN_Low();
if((tem&0x80)==0) break;
}
}
void LCD1602WriteCom(unsigned char com)
{
LCD1602CheckBusy();
LCD1602_RS_Low();
LCD1602_RW_Low();
LCD1602_EN_Low();
// LCD1602_DATA_BUS=com;
LCD1602_READ_DATA(LCD1602_DATA_BUS,com);
delay(2);
LCD1602_EN_High();
delay(2);
LCD1602_EN_Low();
}
void LCD1602WriteData(unsigned char dat)
{
LCD1602CheckBusy();
LCD1602_RS_High();
LCD1602_RW_Low();
LCD1602_EN_Low();
// LCD1602_DATA_BUS=dat;
LCD1602_READ_DATA(LCD1602_DATA_BUS,dat);
delay(2);
LCD1602_EN_High();
delay(2);
LCD1602_EN_Low();
}
void LCD1602Init(void)
{
LCD1602_EN_Low();
LCD1602WriteCom(0x38);
LCD1602WriteCom(0x0c);
LCD1602WriteCom(0x06);
LCD1602WriteCom(0x01);
LCD1602WriteCom(0x80);
}
/*
void LCD1602DispString(unsigned char addr,unsigned char *str)
{
unsigned char i=0;
LCD1602WriteCom(addr);
while(*str>0)
{
LCD1602WriteData(*str++);
delay(10);
}
}
*/
/*写1位数字到指定的位置。参数:位置,1位字符*/
void LCD1602Disp1(unsigned char addr,unsigned char num)
{
LCD1602WriteCom(addr);
LCD1602WriteData(num);
delay(2);//延时13+11*2 us,35us.
}
void main(void)
{
unsigned int shidu,wendu;
LCD1602Init();
{
// LCD1602DispString(0x80,"ABCDEFGHIJKLMNO");
// LCD1602DispString(0xC0,"123456789012345");
// LCD1602Disp1(0x8F,'0'+3);
// LCD1602Disp1(0xCF,':');
}
while(1)
{
Read_Sensor(); // 读取传感器数据
shidu=Sensor_Data[0];
shidu<<=8;
shidu=shidu|Sensor_Data[1];
wendu=Sensor_Data[2];
wendu<<=8;
wendu=wendu|Sensor_Data[3];
LCD1602Disp1(0x8B,'0'+shidu/100);
LCD1602Disp1(0x8C,'0'+shidu%100/10);
LCD1602Disp1(0x8D,'.');
LCD1602Disp1(0x8E,'0'+shidu%100%10);
LCD1602Disp1(0x8F,'%');
if(wendu&0x8000)
{
LCD1602Disp1(0xCA,'-');
wendu=wendu&0x7FFF;
}
else
LCD1602Disp1(0xCA,'+');
LCD1602Disp1(0xCB,'0'+wendu/100);
LCD1602Disp1(0xCC,'0'+wendu%100/10);
LCD1602Disp1(0xCD,'.');
LCD1602Disp1(0xCE,'0'+wendu%100%10);
LCD1602Disp1(0xCF,'C');
}
}
-
无误
-
什么时候发奖啊。。等着体验奖品
-
什么时候发奖
-
你们都收到了吗?
-
HT001 发表于 2018-6-8 08:47
感谢楼主,不藏不掖共同提高
haha,多谢赞美。这次重新整理了一下,比从前分享的内容更多。
-
链接: https://pan.baidu.com/s/1tBNsgZNenStSnV_Weic1cQ 密码: 9e8j
-
补上。链接: https://pan.baidu.com/s/1tBNsgZNenStSnV_Weic1cQ 密码: 9e8j
-
看看
-
你的域名被工信部封杀了。
-
如果需要这个可以联系我。
-
有的,我就用过。
-
哈哈,就算人品再差的人,也没见到饿死的。淡定。
-
这个确实好用。
-
明天就四周年了。
-
PowerAnts 发表于 2017-7-3 11:50
技术人需有三分傲骨, 你成天想着从那帮娘们手里领些金币, 成何体统?
我看你这边账号里的金币不就领了,前几天还380个金币呢,刚看了一下,140了。。:time: