温度传感器两个好奇妙的问题 谢谢大神啦
时间:10-02
整理:3721RD
点击:
#include<reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit ds=P2^2;
sbit lcden=P3^4;
sbit lcdrs=P3^5;
sbit dula=P2^6;
sbit wela=P2^7;
uchar flag,num;
uint temp;
uchar code table[]={"Temp= C"};
uchar code table1[]={"0123456789"}; //不带小数点数字编码
void delay_us(uint x) //延时x微秒
{
while(x--);
}
void delay(uint i) //延时i 毫秒
{
uint x,y;
for(x=i;x>0;x--)
for(y=110;y>0;y--);
}
void write_com(uchar com) //液晶写命令函数
{
lcdrs=0;
P0=com;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
void write_data(uchar date) //液晶写数据
{
lcdrs=1;
P0=date;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
void init_yejing() //液晶初始化
{
dula=0;
wela=0;
lcden=0;
write_com(0x38);
write_com(0x0c);
write_com(0x06);
write_com(0x01);
write_com(0x80);
for(num=0;num<12;num++)
{
write_data(table[num]);
delay(5);
}
write_com(0x80+10);
write_data(0xdf);
}
/*void ds_reset() //DS18B20初始化
{
ds=1;
delay_us(1);
ds=0;
// delay_us(600);
// delay_us(40);
delay_us(81);
ds=1;
delay_us(44);
if(ds==0)
flag=1; //检测28b20成功
else
flag=0; //检测28b20失败
delay_us(140);
ds=1;
} */
void ds_reset() //DS18B20初始化
{
uint i;
ds=0;
i=103;
while(i>0) i--;
ds=1;
i=4;
while(i>0) i--;
}
/*bit ds_read_bit() //温度传感器读一位
{
bit dat;
// ds=1;
// delay_us(2);
ds=0;
// delay_us(6);
delay_us(1);
ds=1;
delay_us(2);
dat=ds;
delay_us(20);
return(dat);
} */
bit ds_read_bit() //温度传感器读一位
{
uint i;
bit dat;
ds=0;
i++;
ds=1;
i++;i++;
dat=ds;
i=8;
while(i>0) i--;
return dat;
}
uchar ds_read_byte() //温度传感器读一字节
{
uchar value,i,j;
value=0;
for(i=0;i<8;i++)
{
j=ds_read_bit();
value=(j<<7)|(value>>1);
}
return value;
}
void ds_write_byte(uchar dat) //温度传感写一个字节
{
uchar j;
uint i;
bit onebit;
for(j=0;j<8;j++)
{
onebit=dat&0x01;
dat=dat>>1;
if(onebit) //写1
{
ds=0;
i++;i++;
ds=1;
i=8;while(i>0)i--;
}
else //写0
{
ds=0;
i=8;
while(i>0)
i--;
ds=1;
i++;i++;
}
}
}
void tem_change() //发送温度转换命令
{
ds_reset();
delay(2);
ds_write_byte(0xcc);
ds_write_byte(0x44);
}
uint get_temp()
{
float wendu;
uchar H,L;
ds_reset();
delay(2);
ds_write_byte(0xcc);
ds_write_byte(0xbe);
L=ds_read_byte();
H=ds_read_byte();
temp=H;
temp=temp<<8;
temp=temp|L;
wendu=temp*0.0625;
temp=wendu*100+0.05;
return temp;
}
void display(uint wendu) //液晶屏显示温度
{
uchar qian,bai,shi,ge,wenduH,wenduL;
wenduH=wendu/100;
wenduL=wendu%100;
qian=wenduH/10; //测得的温度的首位
bai=wenduH%10; //测得的温度的第二位
shi=wenduL/10; //测得的温度的第三位
ge=wenduL%10; //测得的温度的第四位
write_com(0x80+5);
delay(5);
write_data(table1[qian]);
delay(5);
write_data(table1[bai]);
delay(5);
write_data('.');
delay(5);
write_data(table1[shi]);
delay(5);
write_data(table1[ge]);
delay(5);
}
/*void init_com()
{
TMOD=0x20; //设置定时器1为模式2
TH1=0xfd; //装初值设定波特率
TL1=0xfd;
TR1=1; //启动定时器
SM0=0; //串口通信模式设置
SM1=1;
// REN=1; //串口允许接收数据
PCON=0; //波特率不倍频
// SMOD=0; //波特率不倍频
// EA=1; //开总中断
//ES=1; //开串行中断
} */
void main()
{
uint e;
init_yejing();
while(1)
{
tem_change();
for(e=10;e>0;e--)
{
display(get_temp());
}
}
}
温度传感器写一个字节的那个子函数,为啥这个地方一定要分别把j定义为uchar 把i定义为uint,不能定义反也不能都定义成uint或uchar 否则就无法出数据呢 还有温度传感器读一位的子函数,为啥用我自己写的上面的标为注释的那一段程序就不对呢 求大神解答 谢谢啦
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit ds=P2^2;
sbit lcden=P3^4;
sbit lcdrs=P3^5;
sbit dula=P2^6;
sbit wela=P2^7;
uchar flag,num;
uint temp;
uchar code table[]={"Temp= C"};
uchar code table1[]={"0123456789"}; //不带小数点数字编码
void delay_us(uint x) //延时x微秒
{
while(x--);
}
void delay(uint i) //延时i 毫秒
{
uint x,y;
for(x=i;x>0;x--)
for(y=110;y>0;y--);
}
void write_com(uchar com) //液晶写命令函数
{
lcdrs=0;
P0=com;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
void write_data(uchar date) //液晶写数据
{
lcdrs=1;
P0=date;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
void init_yejing() //液晶初始化
{
dula=0;
wela=0;
lcden=0;
write_com(0x38);
write_com(0x0c);
write_com(0x06);
write_com(0x01);
write_com(0x80);
for(num=0;num<12;num++)
{
write_data(table[num]);
delay(5);
}
write_com(0x80+10);
write_data(0xdf);
}
/*void ds_reset() //DS18B20初始化
{
ds=1;
delay_us(1);
ds=0;
// delay_us(600);
// delay_us(40);
delay_us(81);
ds=1;
delay_us(44);
if(ds==0)
flag=1; //检测28b20成功
else
flag=0; //检测28b20失败
delay_us(140);
ds=1;
} */
void ds_reset() //DS18B20初始化
{
uint i;
ds=0;
i=103;
while(i>0) i--;
ds=1;
i=4;
while(i>0) i--;
}
/*bit ds_read_bit() //温度传感器读一位
{
bit dat;
// ds=1;
// delay_us(2);
ds=0;
// delay_us(6);
delay_us(1);
ds=1;
delay_us(2);
dat=ds;
delay_us(20);
return(dat);
} */
bit ds_read_bit() //温度传感器读一位
{
uint i;
bit dat;
ds=0;
i++;
ds=1;
i++;i++;
dat=ds;
i=8;
while(i>0) i--;
return dat;
}
uchar ds_read_byte() //温度传感器读一字节
{
uchar value,i,j;
value=0;
for(i=0;i<8;i++)
{
j=ds_read_bit();
value=(j<<7)|(value>>1);
}
return value;
}
void ds_write_byte(uchar dat) //温度传感写一个字节
{
uchar j;
uint i;
bit onebit;
for(j=0;j<8;j++)
{
onebit=dat&0x01;
dat=dat>>1;
if(onebit) //写1
{
ds=0;
i++;i++;
ds=1;
i=8;while(i>0)i--;
}
else //写0
{
ds=0;
i=8;
while(i>0)
i--;
ds=1;
i++;i++;
}
}
}
void tem_change() //发送温度转换命令
{
ds_reset();
delay(2);
ds_write_byte(0xcc);
ds_write_byte(0x44);
}
uint get_temp()
{
float wendu;
uchar H,L;
ds_reset();
delay(2);
ds_write_byte(0xcc);
ds_write_byte(0xbe);
L=ds_read_byte();
H=ds_read_byte();
temp=H;
temp=temp<<8;
temp=temp|L;
wendu=temp*0.0625;
temp=wendu*100+0.05;
return temp;
}
void display(uint wendu) //液晶屏显示温度
{
uchar qian,bai,shi,ge,wenduH,wenduL;
wenduH=wendu/100;
wenduL=wendu%100;
qian=wenduH/10; //测得的温度的首位
bai=wenduH%10; //测得的温度的第二位
shi=wenduL/10; //测得的温度的第三位
ge=wenduL%10; //测得的温度的第四位
write_com(0x80+5);
delay(5);
write_data(table1[qian]);
delay(5);
write_data(table1[bai]);
delay(5);
write_data('.');
delay(5);
write_data(table1[shi]);
delay(5);
write_data(table1[ge]);
delay(5);
}
/*void init_com()
{
TMOD=0x20; //设置定时器1为模式2
TH1=0xfd; //装初值设定波特率
TL1=0xfd;
TR1=1; //启动定时器
SM0=0; //串口通信模式设置
SM1=1;
// REN=1; //串口允许接收数据
PCON=0; //波特率不倍频
// SMOD=0; //波特率不倍频
// EA=1; //开总中断
//ES=1; //开串行中断
} */
void main()
{
uint e;
init_yejing();
while(1)
{
tem_change();
for(e=10;e>0;e--)
{
display(get_temp());
}
}
}
温度传感器写一个字节的那个子函数,为啥这个地方一定要分别把j定义为uchar 把i定义为uint,不能定义反也不能都定义成uint或uchar 否则就无法出数据呢 还有温度传感器读一位的子函数,为啥用我自己写的上面的标为注释的那一段程序就不对呢 求大神解答 谢谢啦
看程序应该没这问题呀,估计是哪里设置不对了
但是如果改了的话 确实在液晶屏上出现乱码啊 啊啊
那你把温度采集程序先不弄了,就光弄液晶试试呢
特不幸的是 正常显示
正常显示好啊,那在一点一点试温度这块吧,逐步排除错误的程序