本帖最后由 hehung 于 2018-4-4 11:07 编辑
今天心情好,所以后写了一个数码管显示温度的实验。有兴趣的小伙伴可以参考参考。
首先还是查看原理图:
从原理图中可以看到,DS18B20的引脚是
P3.7
数码管接法:
J12 --- P0
A --- P1.0
B --- P1.1 C --- P1.2
其中A,B,C是数码管的位选端口,在上一篇帖子里我已经说明了。
好了,连线知道了,现在可以开始进行程序的编写了。
本来向这种函数比较多的程序一般都是要写在不同的文件里面的,但是我了简单,我就写在了一个文件里。;P
我的代码还是写的比较规范的,注释也清楚,有需要的小伙伴直接拿去改下端口就可以用。:lol
#include
#define uchar unsigned char
#define uint unsigned int
#define SMG P0 //定义数码管的段选端口
//下述的A,B,C的信号进过译码器解码后可以控制8个数码管的显示
sbit LA=P1^0;
sbit LB=P1^1;
sbit LC=P1^2;
sbit dq=P3^7; //DS18B20的引脚
//下面的数组可以显示0-F
uchar code number={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
//函数声明
void delay(int ms); //延时函数
void change(int what); //位选函数
void ds18b20_init(); //DS18B20初始化函数
void ds18b20_write_data(uchar dat); //DS18B20写命令函数
uchar ds18b20_read_data(); //DS18B20读数据函数
void ds18b20_read_temp(int *temp,int *xiao); //DS18B20读温度函数
void display(int temp, int xiao); //数码管显示函数
//主函数
void main()
{
int temp,xiao; //定义温度的整数和小数变量
ds18b20_init(); //初始化
while(1)
{
ds18b20_read_temp(&temp, &xiao);
display(temp, xiao);
}
}
//延时函数(短延时)
void delay(int ms)
{
while(ms--);
}
//该函数可以选择某一个数码管显示
void change(int what)
{
switch(what)
{
case 1:LC=0;LB=0;LA=0;break;
case 2:LC=0;LB=0;LA=1;break;
case 3:LC=0;LB=1;LA=0;break;
case 4:LC=0;LB=1;LA=1;break;
case 5:LC=1;LB=0;LA=0;break;
case 6:LC=1;LB=0;LA=1;break;
case 7:LC=1;LB=1;LA=0;break;
case 8:LC=1;LB=1;LA=1;break;
}
}
//初始化函数
void ds18b20_init()
{
dq=1;
delay(5);
dq=0;
delay(400);
dq=1;
delay(300);
}
void ds18b20_write_data(uchar dat)
{
uchar i;
for(i=0;i<8;i++)
{
dq=0;
dq=dat&0x01;
delay(2);
dq=1;
dat>>=1;
}
delay(4);
}
uchar ds18b20_read_data()
{
uchar i,v;
for(i=0;i<8;i++)
{
dq=0;
v>>=1;
dq=1;
if(dq)
v|=0x80;
delay(4);
}
return v;
}
void ds18b20_read_temp(int *temp,int *xiao)
{
uchar a,b;
ds18b20_init();
ds18b20_write_data(0xcc);
ds18b20_write_data(0x44);
delay(200);
ds18b20_init();
ds18b20_write_data(0xcc);
ds18b20_write_data(0xbe); //读温度
a=ds18b20_read_data(); //读出温度低位
b=ds18b20_read_data(); //读出温度高位
b<<=4;
b+=(a&0xf0)>>4;
*temp=b; //温度整数部分
*xiao=a&0x0f;
*xiao=*xiao/1.6; //温度小数部分
}
void display(int temp, int xiao)
{
change(1);
SMG=number;
delay(100);
SMG = 0;
delay(30); //消除暗影
change(2);
SMG=number;
delay(100);
SMG = 0;
delay(30); //消除暗影
change(3);
SMG=~0x7f;
delay(100);
SMG = 0;
delay(30); //消除暗影
change(4);
SMG=number;
delay(100);
SMG = 0;
delay(30); //消除暗影
}
现在说说DS18B20的位置:
如图,在这个地方,很小的一个,有点像三极管。
这是数码管
最后放两张动图,再次声明一遍,手机像素差,拍的阴影比较严重,
其实直接用肉眼看是完全看不到阴影的,我的消隐做的还是不错的。:lol
PS:我是直接用手捏着DS18B20的,变化的很快,精度也挺高的。
ok,DS18B20温度的读取+数码管的显示试验就在这里,期望大家支持。:)
本帖最后由 hehung 于 2018-4-4 11:07 编辑
今天心情好,所以后写了一个数码管显示温度的实验。有兴趣的小伙伴可以参考参考。
首先还是查看原理图:
从原理图中可以看到,DS18B20的引脚是
P3.7
数码管接法:
J12 --- P0
A --- P1.0
B --- P1.1 C --- P1.2
其中A,B,C是数码管的位选端口,在上一篇帖子里我已经说明了。
好了,连线知道了,现在可以开始进行程序的编写了。
本来向这种函数比较多的程序一般都是要写在不同的文件里面的,但是我了简单,我就写在了一个文件里。;P
我的代码还是写的比较规范的,注释也清楚,有需要的小伙伴直接拿去改下端口就可以用。:lol
#include
#define uchar unsigned char
#define uint unsigned int
#define SMG P0 //定义数码管的段选端口
//下述的A,B,C的信号进过译码器解码后可以控制8个数码管的显示
sbit LA=P1^0;
sbit LB=P1^1;
sbit LC=P1^2;
sbit dq=P3^7; //DS18B20的引脚
//下面的数组可以显示0-F
uchar code number={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
//函数声明
void delay(int ms); //延时函数
void change(int what); //位选函数
void ds18b20_init(); //DS18B20初始化函数
void ds18b20_write_data(uchar dat); //DS18B20写命令函数
uchar ds18b20_read_data(); //DS18B20读数据函数
void ds18b20_read_temp(int *temp,int *xiao); //DS18B20读温度函数
void display(int temp, int xiao); //数码管显示函数
//主函数
void main()
{
int temp,xiao; //定义温度的整数和小数变量
ds18b20_init(); //初始化
while(1)
{
ds18b20_read_temp(&temp, &xiao);
display(temp, xiao);
}
}
//延时函数(短延时)
void delay(int ms)
{
while(ms--);
}
//该函数可以选择某一个数码管显示
void change(int what)
{
switch(what)
{
case 1:LC=0;LB=0;LA=0;break;
case 2:LC=0;LB=0;LA=1;break;
case 3:LC=0;LB=1;LA=0;break;
case 4:LC=0;LB=1;LA=1;break;
case 5:LC=1;LB=0;LA=0;break;
case 6:LC=1;LB=0;LA=1;break;
case 7:LC=1;LB=1;LA=0;break;
case 8:LC=1;LB=1;LA=1;break;
}
}
//初始化函数
void ds18b20_init()
{
dq=1;
delay(5);
dq=0;
delay(400);
dq=1;
delay(300);
}
void ds18b20_write_data(uchar dat)
{
uchar i;
for(i=0;i<8;i++)
{
dq=0;
dq=dat&0x01;
delay(2);
dq=1;
dat>>=1;
}
delay(4);
}
uchar ds18b20_read_data()
{
uchar i,v;
for(i=0;i<8;i++)
{
dq=0;
v>>=1;
dq=1;
if(dq)
v|=0x80;
delay(4);
}
return v;
}
void ds18b20_read_temp(int *temp,int *xiao)
{
uchar a,b;
ds18b20_init();
ds18b20_write_data(0xcc);
ds18b20_write_data(0x44);
delay(200);
ds18b20_init();
ds18b20_write_data(0xcc);
ds18b20_write_data(0xbe); //读温度
a=ds18b20_read_data(); //读出温度低位
b=ds18b20_read_data(); //读出温度高位
b<<=4;
b+=(a&0xf0)>>4;
*temp=b; //温度整数部分
*xiao=a&0x0f;
*xiao=*xiao/1.6; //温度小数部分
}
void display(int temp, int xiao)
{
change(1);
SMG=number;
delay(100);
SMG = 0;
delay(30); //消除暗影
change(2);
SMG=number;
delay(100);
SMG = 0;
delay(30); //消除暗影
change(3);
SMG=~0x7f;
delay(100);
SMG = 0;
delay(30); //消除暗影
change(4);
SMG=number;
delay(100);
SMG = 0;
delay(30); //消除暗影
}
现在说说DS18B20的位置:
如图,在这个地方,很小的一个,有点像三极管。
这是数码管
最后放两张动图,再次声明一遍,手机像素差,拍的阴影比较严重,
其实直接用肉眼看是完全看不到阴影的,我的消隐做的还是不错的。:lol
PS:我是直接用手捏着DS18B20的,变化的很快,精度也挺高的。
ok,DS18B20温度的读取+数码管的显示试验就在这里,期望大家支持。:)