单片机/MCUwilliam hill官网
登录
直播中
天使de距离
8年用户
55经验值
擅长:嵌入式技术 制造/封装 模拟技术 RF/无线
私信
关注
[问答]
求助,AT89C52做温湿度测量计仿真不出结果,请大神帮忙看下哪里出错
开启该帖子的消息推送
测量
本帖最后由 天使de距离 于 2016-8-27 14:36 编辑
at89c52做温湿度测量计,用
proteus
做的
仿真
,仿真以后1602液晶没反映,调传感器或者液晶接的电位器,动一下就弹窗口然后软件自动关闭,求大神帮看下是不是
威廉希尔官方网站
或者程序哪里不对。
在线等,急求~
回帖
(4)
天使de距离
2016-8-27 12:37:11
#include
#include
#include
#define uchar unsigned char
#define uint unsigned int
#define noACK 0
#define ACK 1
#define STATUS_REG_W 0x06
#define STATUS_REG_R 0x07
#define MEASURE_TEMP 0x03
#define MEASURE_HUMI 0x05
#define RESET 0x1e
***it SCK =P1^0;
***it DATA=P1^1;
***it led1=P1^7;
***it rs=P2^3; //H数据寄存器,L命指令寄存器
***it en=P2^5; //高脉冲使能,使能脉宽最小150ns,写操作下降沿,读操作高电平有效
***it rw=P2^4; //1进行写操作,0进行读操作
uchar code table_temp[]=" TEMP: ";
uchar code table_humi[]=" HUMI: ";
uchar code table_c[]=" C ";
uchar code table_p[]=" % ";
uchar error=0;
void delayms(uint z)
{
uint i,j;
for(i=z;i>0;i--)
for( j=110;j>0;j--);
}
void transstart() //启动时序
{
SCK=1;
_nop_();
DATA=0;
_nop_();
SCK=0;
_nop_();
_nop_();
_nop_();
SCK=1;
_nop_();
DATA=1;
_nop_();
SCK=0;
}
uchar write_byte(uchar value) //写入命令子函数
{
uchar i;
for(i=0x80;i>0;i=i/2)
{
if(i&value)
DATA=1;
else
DATA=0;
SCK=1;
_nop_();
_nop_();
_nop_();
SCK=0;
}
DATA=1;
SCK=1;
error=DATA;
SCK=0;
return error;
}
uchar read_byte(bit ack) //从传感器读数据
{
uchar i,val=0;
DATA=1;
for(i=0x80;i>0;i=i/2)
{
SCK=1;
if(DATA)
val=val|i;
SCK=0;
}
DATA=!ack;
SCK=1;
_nop_();
_nop_();
_nop_();
SCK=0;
DATA=1;
return val;
}
void connectionreset()
{
uchar i;
DATA=1;
SCK=0;
for(i=0;i<9;i++)
{
SCK=1;
SCK=0;
}
transstart();
}
uint measure1() //测量温度函数
{
uchar value_1,value_2;
uint tempvalue;
transstart();
error+=write_byte(MEASURE_TEMP);
if(error!=0)
{
connectionreset();
}
else
{
while(DATA==1)
{
_nop_();
}
if(DATA==0)
{
value_1=read_byte(ACK);
value_2=read_byte(noACK);
tempvalue=value_2+value_1*256; //转换成 16 位的 int 型
}
else error=1;
}
return tempvalue;
}
uint measure2() //测量湿度函数
{
uchar value_1,value_2;
uint tempvalue;
transstart();
error+=write_byte(MEASURE_HUMI);
if(error!=0)
connectionreset();
else
{
while(DATA==1)
_nop_();
if(DATA==0)
{
value_1=read_byte(ACK);
value_2=read_byte(noACK);
tempvalue=value_2+value_1*256;
}
else error=1;
}
return tempvalue;
}
void lcdwrdata(uchar dat)
{
dat = ((dat&0x01)<<7)|((dat&0x02)<<5)|((dat&0x04)<<3)|((dat&0x08)<<1)|((dat&0x10)>>1)|((dat&0x20)>>3)|((dat&0x40)>>5)|((dat&0x80)>>7);
rs=1;//写数据时RS拉高
en=1;
P0=dat;
delayms(6);
en=0;
delayms(6);
}
void lcdwrcom(uchar cdat)//写指令数据到LCD
{
cdat = ((cdat&0x01)<<7)|((cdat&0x02)<<5)|((cdat&0x04)<<3)|((cdat&0x08)<<1)|((cdat&0x10)>>1)|((cdat&0x20)>>3)|((cdat&0x40)>>5)|((cdat&0x80)>>7);
rs=0;//写指令时RS拉低
en=1;
P0=cdat;//
delayms(6);//不加此延时将导致不能写入指令,但能写入显示数据
en=0;
delayms(6);
}
void lcd_init()
{
lcdwrcom(0x38); //0x38设置显示模式为:16X2显示,5X7点阵,8位数据接口
lcdwrcom(0x0c); //打开显示光标闪烁
lcdwrcom(0x06); //
lcdwrcom(0x01); //
}
void display(float temp,float humi) //1602显示函数(温度,湿度)
{
uint a,b,c,d,e,f,g,h;
a=(temp/1000);
b=((temp-a*1000)/100);
c=((temp-a*1000-b*100)/10);
d=(temp-a*1000-b*100-c*10);
e=(humi/1000);
f=((humi-e*1000)/100);
g=((humi-e*1000-f*100)/10);
h=(humi-e*1000-f*100-g*10);
lcdwrcom(0x80+0x07);lcdwrdata('0'+a);
lcdwrcom(0x80+0x08);lcdwrdata('0'+b);
lcdwrcom(0x80+0x09);lcdwrdata('.') ;
lcdwrcom(0x80+0x0A);lcdwrdata('0'+c);
lcdwrcom(0x80+0x0B);lcdwrdata('0'+d);
lcdwrcom(0x80+0x47);lcdwrdata('0'+e);
lcdwrcom(0x80+0x48);lcdwrdata('0'+f);
lcdwrcom(0x80+0x49);lcdwrdata('.') ;
lcdwrcom(0x80+0x4A);lcdwrdata('0'+g);
lcdwrcom(0x80+0x4B);lcdwrdata('0'+h);
}
float calc_temp(uint tempvalue) //计算温度值子函数
{
const float d1=-39.9;
const float d2=+0.01;
float temp_final;
tempvalue=tempvalue&0x3fff; //取出低 14 位
temp_final=d1+d2*((float)tempvalue);
return temp_final; //返回温度值
}
float calc_humi(float humivalue) //计算湿度值子函数
{
const float c1=-4.0,c2=0.0405,c3=-0.0000028,t1=0.01,t2=0.00008;
float rh=humivalue;
float rhlin;
float rhtrue;
rhlin=c1+c2*rh+c3*rh*rh;
rhtrue=(27.87-25)*(t1+t2*rh)+rhlin;
if(rhtrue>100)
rhtrue=100;
if(rhtrue<0.1)
rhtrue=0.1;
humivalue=rhtrue;
return humivalue;
}
void main()
{
uint i; //定义计数器
uint value1; //定义传感器传出来的数值(16位)
uint value2; //定义传感器传出来的数值(16位)
float dis_tempvalue; //定义温度变量
float dis_humivalue; //定义湿度变量
//以下是初始化液晶操作
rw=0;
delayms(200);
en=0;
lcd_init();
//以下是液晶固定显示
lcdwrcom(0x80+0x00); //第1行00位置
for(i=0;i<7;i++)
{
lcdwrdata(table_temp[i]);
}
lcdwrcom(0x80+0x0C); //第1行0C位置
for(i=0;i<4;i++)
{
lcdwrdata(table_c[i]);
}
lcdwrcom(0x80+0x40); //第2行40位置
for(i=0;i<7;i++)
{
lcdwrdata(table_humi[i]);
}
lcdwrcom(0x80+0x4C); //第2行4C位置
for(i=0;i<4;i++)
{
lcdwrdata(table_p[i]);
}
//
while(1)
{
connectionreset();
error=0;
value1=measure1();
value2=measure2();
if(error==0)
{
led1=0;
delayms(200);
led1=1;
delayms(200);
dis_tempvalue=calc_temp(value1); //计算温度值
dis_humivalue=calc_humi(value2); //计算湿度值
display(dis_tempvalue*100,dis_humivalue*100); //LCD1602显示温湿度
}
else
{
continue;
}
}
}
#include
#include
#include
#define uchar unsigned char
#define uint unsigned int
#define noACK 0
#define ACK 1
#define STATUS_REG_W 0x06
#define STATUS_REG_R 0x07
#define MEASURE_TEMP 0x03
#define MEASURE_HUMI 0x05
#define RESET 0x1e
***it SCK =P1^0;
***it DATA=P1^1;
***it led1=P1^7;
***it rs=P2^3; //H数据寄存器,L命指令寄存器
***it en=P2^5; //高脉冲使能,使能脉宽最小150ns,写操作下降沿,读操作高电平有效
***it rw=P2^4; //1进行写操作,0进行读操作
uchar code table_temp[]=" TEMP: ";
uchar code table_humi[]=" HUMI: ";
uchar code table_c[]=" C ";
uchar code table_p[]=" % ";
uchar error=0;
void delayms(uint z)
{
uint i,j;
for(i=z;i>0;i--)
for( j=110;j>0;j--);
}
void transstart() //启动时序
{
SCK=1;
_nop_();
DATA=0;
_nop_();
SCK=0;
_nop_();
_nop_();
_nop_();
SCK=1;
_nop_();
DATA=1;
_nop_();
SCK=0;
}
uchar write_byte(uchar value) //写入命令子函数
{
uchar i;
for(i=0x80;i>0;i=i/2)
{
if(i&value)
DATA=1;
else
DATA=0;
SCK=1;
_nop_();
_nop_();
_nop_();
SCK=0;
}
DATA=1;
SCK=1;
error=DATA;
SCK=0;
return error;
}
uchar read_byte(bit ack) //从传感器读数据
{
uchar i,val=0;
DATA=1;
for(i=0x80;i>0;i=i/2)
{
SCK=1;
if(DATA)
val=val|i;
SCK=0;
}
DATA=!ack;
SCK=1;
_nop_();
_nop_();
_nop_();
SCK=0;
DATA=1;
return val;
}
void connectionreset()
{
uchar i;
DATA=1;
SCK=0;
for(i=0;i<9;i++)
{
SCK=1;
SCK=0;
}
transstart();
}
uint measure1() //测量温度函数
{
uchar value_1,value_2;
uint tempvalue;
transstart();
error+=write_byte(MEASURE_TEMP);
if(error!=0)
{
connectionreset();
}
else
{
while(DATA==1)
{
_nop_();
}
if(DATA==0)
{
value_1=read_byte(ACK);
value_2=read_byte(noACK);
tempvalue=value_2+value_1*256; //转换成 16 位的 int 型
}
else error=1;
}
return tempvalue;
}
uint measure2() //测量湿度函数
{
uchar value_1,value_2;
uint tempvalue;
transstart();
error+=write_byte(MEASURE_HUMI);
if(error!=0)
connectionreset();
else
{
while(DATA==1)
_nop_();
if(DATA==0)
{
value_1=read_byte(ACK);
value_2=read_byte(noACK);
tempvalue=value_2+value_1*256;
}
else error=1;
}
return tempvalue;
}
void lcdwrdata(uchar dat)
{
dat = ((dat&0x01)<<7)|((dat&0x02)<<5)|((dat&0x04)<<3)|((dat&0x08)<<1)|((dat&0x10)>>1)|((dat&0x20)>>3)|((dat&0x40)>>5)|((dat&0x80)>>7);
rs=1;//写数据时RS拉高
en=1;
P0=dat;
delayms(6);
en=0;
delayms(6);
}
void lcdwrcom(uchar cdat)//写指令数据到LCD
{
cdat = ((cdat&0x01)<<7)|((cdat&0x02)<<5)|((cdat&0x04)<<3)|((cdat&0x08)<<1)|((cdat&0x10)>>1)|((cdat&0x20)>>3)|((cdat&0x40)>>5)|((cdat&0x80)>>7);
rs=0;//写指令时RS拉低
en=1;
P0=cdat;//
delayms(6);//不加此延时将导致不能写入指令,但能写入显示数据
en=0;
delayms(6);
}
void lcd_init()
{
lcdwrcom(0x38); //0x38设置显示模式为:16X2显示,5X7点阵,8位数据接口
lcdwrcom(0x0c); //打开显示光标闪烁
lcdwrcom(0x06); //
lcdwrcom(0x01); //
}
void display(float temp,float humi) //1602显示函数(温度,湿度)
{
uint a,b,c,d,e,f,g,h;
a=(temp/1000);
b=((temp-a*1000)/100);
c=((temp-a*1000-b*100)/10);
d=(temp-a*1000-b*100-c*10);
e=(humi/1000);
f=((humi-e*1000)/100);
g=((humi-e*1000-f*100)/10);
h=(humi-e*1000-f*100-g*10);
lcdwrcom(0x80+0x07);lcdwrdata('0'+a);
lcdwrcom(0x80+0x08);lcdwrdata('0'+b);
lcdwrcom(0x80+0x09);lcdwrdata('.') ;
lcdwrcom(0x80+0x0A);lcdwrdata('0'+c);
lcdwrcom(0x80+0x0B);lcdwrdata('0'+d);
lcdwrcom(0x80+0x47);lcdwrdata('0'+e);
lcdwrcom(0x80+0x48);lcdwrdata('0'+f);
lcdwrcom(0x80+0x49);lcdwrdata('.') ;
lcdwrcom(0x80+0x4A);lcdwrdata('0'+g);
lcdwrcom(0x80+0x4B);lcdwrdata('0'+h);
}
float calc_temp(uint tempvalue) //计算温度值子函数
{
const float d1=-39.9;
const float d2=+0.01;
float temp_final;
tempvalue=tempvalue&0x3fff; //取出低 14 位
temp_final=d1+d2*((float)tempvalue);
return temp_final; //返回温度值
}
float calc_humi(float humivalue) //计算湿度值子函数
{
const float c1=-4.0,c2=0.0405,c3=-0.0000028,t1=0.01,t2=0.00008;
float rh=humivalue;
float rhlin;
float rhtrue;
rhlin=c1+c2*rh+c3*rh*rh;
rhtrue=(27.87-25)*(t1+t2*rh)+rhlin;
if(rhtrue>100)
rhtrue=100;
if(rhtrue<0.1)
rhtrue=0.1;
humivalue=rhtrue;
return humivalue;
}
void main()
{
uint i; //定义计数器
uint value1; //定义传感器传出来的数值(16位)
uint value2; //定义传感器传出来的数值(16位)
float dis_tempvalue; //定义温度变量
float dis_humivalue; //定义湿度变量
//以下是初始化液晶操作
rw=0;
delayms(200);
en=0;
lcd_init();
//以下是液晶固定显示
lcdwrcom(0x80+0x00); //第1行00位置
for(i=0;i<7;i++)
{
lcdwrdata(table_temp[i]);
}
lcdwrcom(0x80+0x0C); //第1行0C位置
for(i=0;i<4;i++)
{
lcdwrdata(table_c[i]);
}
lcdwrcom(0x80+0x40); //第2行40位置
for(i=0;i<7;i++)
{
lcdwrdata(table_humi[i]);
}
lcdwrcom(0x80+0x4C); //第2行4C位置
for(i=0;i<4;i++)
{
lcdwrdata(table_p[i]);
}
//
while(1)
{
connectionreset();
error=0;
value1=measure1();
value2=measure2();
if(error==0)
{
led1=0;
delayms(200);
led1=1;
delayms(200);
dis_tempvalue=calc_temp(value1); //计算温度值
dis_humivalue=calc_humi(value2); //计算湿度值
display(dis_tempvalue*100,dis_humivalue*100); //LCD1602显示温湿度
}
else
{
continue;
}
}
}
举报
天使de距离
2016-8-27 12:37:31
二楼附程序
二楼附程序
举报
chenwei6991627
2016-8-28 07:07:47
提供报酬肯定有人给你解决
提供报酬肯定有人给你解决
举报
1159310896
2016-8-30 10:34:15
给个建议,试试在P0口和液晶之间串联一个小电阻。
给个建议,试试在P0口和液晶之间串联一个小电阻。
举报
更多回帖
rotate(-90deg);
回复
相关问答
测量
求助
,
做
51单片机
仿真
时
出错
,求哪位
大神
帮
看下
什么问题
2016-08-27
3355
proteus
仿真
和程序基于
at89c52
单片机sht11
温湿度
控制系统,lcd1602显示
2017-05-11
7610
基于
AT89C52
单片机的
温湿度
测量
显示系统
2014-01-01
6223
基于AT
89C
51的
温湿度
的
测量
(要SHT11)
做
,求
仿真
图..
2013-04-24
4486
在
温湿度
控制中
AT89C52
与ST
89C
51单片机有什么区别
2017-11-06
7170
基于单片机和GSM的
温湿度
远程监测装置设计
2019-09-24
960
基于LabVIEW的
温湿度
检测
2015-04-05
4799
如何利用STC
89C52
和LCD1602实现
温湿度
检测报警系统的设计?
2021-11-04
1840
求
大神
分享基于AT
89S52
的
温湿度
采集系统的设计哇~
2013-05-10
1485
基于SHT11
温湿度
传感器和单片机技术的智能
温湿度
测量
系统
2020-04-27
4471
发帖
登录/注册
20万+
工程师都在用,
免费
PCB检查工具
无需安装、支持浏览器和手机在线查看、实时共享
查看
点击登录
登录更多精彩功能!
英国威廉希尔公司网站
william hill官网 版块
小组
免费开发板试用
ebook
直播
搜索
登录
×
20
完善资料,
赚取积分