标题:
51单片机+DS18B20制作成温度控制显示系统,小数点如何显示?求帮助
[打印本页]
作者:
zjq_lwy
时间:
2019-6-26 09:01
标题:
51单片机+DS18B20制作成温度控制显示系统,小数点如何显示?求帮助
呀呀呀,大佬们可以在我的程序基础上让温度显示出小数点嘛!!!万分感谢,,代码边上的乱码是我原来的注释,仿真图已附上
单片机源程序如下:
#include<reg51.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
uchar code tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
uchar code tab1[]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10};
char displayData[4];
uint shi,fen=9,miao=9,T50ms;
uchar bai,sh,ge,a,b,t;
sbit a0=P2^0;
sbit a1=P2^1;
sbit a2=P2^2;
sbit a3=P2^3;
sbit DQ=P3^7;
void delay(uint n)
{
while(n--);
}
void init()
{
TMOD=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
ET0=1;
EA=1;
TR0=1;
EX0=1;
}
void scan()
{
displayData[0] = tab[miao%10];
displayData[1] = tab[(miao/10)%10];
displayData[2] = tab[fen%10]|0x80;
displayData[3] = tab[(fen/10)%10];
}
void display()
{
char i;
for(i=0;i<=3;i++)
{
switch(i)
{
case 0:a0=0;a1=0;a2=0;a3=1;break;
case 1:a0=0;a1=0;a2=1;a3=0;break;
case 2:a0=0;a1=1;a2=0;a3=0;break;
case 3:a0=1;a1=0;a2=0;a3=0;break;
}
if(i==2){
P0=(displayData[i]&0x7f);
}else
P0=displayData[i];
delay(200);
P0=0xff;
}
}
int_DS18b20()
{
uchar x=0;
DQ = 1;
delay(8);
DQ=0;
delay(80);
DQ=1;
delay(10);
x=DQ;
delay(20);
return x;
}
void write_byte(uchar dat)
{
uchar i=0;
for(i=8;i>0;i--){
DQ=0;
DQ=dat&0x01;
delay(5);
DQ=1;
dat>>=1;
}
delay(4);
}
read_byte()
{
uchar i=0;
uchar dat=0;
for(i=8;i>0;i--){
DQ=0;
dat>>=1;
DQ=1;
if(DQ)
dat|=0x80;
delay(4);
}
return (dat);
}
void int_()
{
while(int_DS18b20());
write_byte(0xcc);
write_byte(0x44);
}
void retemp()
{
uint count=0,j=0;
P2=0xff;
int_();
delay(220);
for(count=0;count<100;count++){
a0=1;
P0=tab[0];
delay(100);
a0=0;
a1=1;
P0=tab[0];
delay(100);
a1=0;
a2=1;
P0=tab[0];
delay(100);
a2=0;
a3=1;
P0=0xc6;
delay(100);
a3=0;
}
for(j=0;j<40;j++) {
delay(10);
while(int_DS18b20());
write_byte(0xcc);
write_byte(0xbe);
a=read_byte();
b=read_byte();
if(b>127){
a=~a;
b=~b;
a=a>>4;
t=b<<4;
t=t|a;
t+=1;
sh=t/10;
ge=t%10;
for(count=0;count<123;count++){
if(t>=10){
a0=1;
P0=0xbf;
delay(30);
a0=0;
a1=1;
P0=tab[sh];
delay(30);
a1=0;
a2=1;
P0=tab1[ge];
delay(30);
a2=0;
a3=1;
P0=0xc6;
delay(30);
a3=0;
}else{
a0=0;
a1=1;
P0=0xbf;
delay(30);
a1=0;
a2=1;
P0=tab1[ge];
delay(30);
a2=0;
a3=1;
P0=0xc6;
delay(30);
a3=0;
}
}
}else{
count=0;
a=a>>4;
t=b<<4;
t=t|a;
bai=t/100;
sh=t%100/10;
ge=t%10;
for(count=0;count<100;count++){
if(bai){
a0=1;
P0=tab[bai];
delay(20);
a0=0;
}else
a0=0;
if(sh){
a1=1;
P0=tab[sh];
delay(20);
a1=0;
}
a1=0;
a2=1;
P0=tab1[ge];
delay(20);
a2=0;
a3=1;
P0=0xc6;
delay(20);
a3=0;
}
}
int_();
}
}
void main()
{
init();
while(1){
scan();
display();
}
}
void timer0() interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
T50ms++;
if(T50ms==20)
{
T50ms=0;
miao++;
if(miao>=60)
{
miao=miao-60;
fen++;
if(fen>=60)
{
fen=fen-60;
shi++;
}
}
}
}
void timer1() interrupt 0
{
miao=miao+5;
retemp();
}
复制代码
所有资料51hei提供下载:
温度测控显示系统.rar
(18.4 KB, 下载次数: 7)
2019-6-26 08:59 上传
点击文件名下载附件
这是我的仿真图
下载积分: 黑币 -5
作者:
那小白说你呢
时间:
2019-6-26 11:04
不要怪没给你分,只能说这个例子太多了。如果你能整个STM32与18B20的温度计就会有分
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1