单独调试
18B20程序部分,能看到高低电平的变化,单独调试数码管显示程序,也可以正确显示,但是一起运行时就没有变化了,18B20变化高低电平,数码管也不随着温度变化改变示数(可能是显示程序进入死循环了也可能不是我不知道怎么改)。帮忙看看我下面的程序要怎么改?(因为我的电路数码管各个引脚跟单片机连接的不是在同一个P口,所以我数码管的程序没用中断)应该怎么修改,自己弄了好久没弄出来
//加上数码管显示就不好使
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
bit flag;
sbit DQ=P1^1;
uint temp;
sbit a=P2^4;
sbit b=P2^0;
sbit c=P0^7;
sbit d=P0^5;
sbit e=P0^4;
sbit f=P2^3;
sbit g=P2^7;
sbit h=P0^6;
sbit m1=P2^5;
sbit m2=P2^2;
sbit m3=P2^1;
sbit m4=P2^6;
//数码管延时函数
void delay2(uint z)
{
uchar x,y;
for(x=1000;x>0;x--)
{
for(y=z;y>0;y--);
}
}
//扫描数码管
void scanduan(uchar duan)
{
delay2(100);
switch(duan)
{
case 0: a=1;
b=1;
c=1;
d=1;
e=1;
f=1;
g=0;
h=0;
break;
case 1: a=0;
b=1;
c=1;
d=0;
e=0;
f=0;
g=0;
h=0;
break;
case 2: a=1;
b=1;
c=0;
d=1;
e=1;
f=0;
g=1;
h=0;
break;
case 3: a=1;
b=1;
c=1;
d=1;
e=0;
f=0;
g=1;
h=0;
break;
case 4: a=0;
b=1;
c=1;
d=0;
e=0;
f=1;
g=1;
h=0;
break;
case 5: a=1;
b=0;
c=1;
d=1;
e=0;
f=1;
g=1;
h=0;
break;
case 6: a=1;
b=0;
c=1;
d=1;
e=1;
f=1;
g=1;
h=0;
break;
case 7: a=1;
b=1;
c=1;
d=0;
e=0;
f=0;
g=0;
h=0;
break;
case 8: a=1;
b=1;
c=1;
d=1;
e=1;
f=1;
g=1;
h=0;
break;
case 9: a=1;
b=1;
c=1;
d=1;
e=0;
f=1;
g=1;
h=0;
break;
}
}
void scanwei(uchar wei)
{
switch(wei)
{
case 1: m1=0;m2=1;m3=1;m4=1;break;
case 2: m1=1;m2=0;m3=1;m4=1;break;
case 3: m1=1;m2=1;m3=0;m4=1;break;
case 4: m1=1;m2=1;m3=1;m4=0;break;
}
}
/延时
void delayus(uint t) //0.00002713 也就是27us
{
while(t--);
}
//复位
void ds_reset()
{
DQ=1;
delayus(5); //延时几十微妙 66us 0.00006619
DQ=0;
delayus(80); //700us多 0.00079861
DQ=1;
delayus(14); // 154us左右 0.00015408
if(DQ=0) //判断是否存在(1在0不在)
flag=1;
else
flag=0;
delayus(20); //大约200us多 0.00021267
}
//读时序
//读取一个位
bit ds_read_bit()
{
bit dat;
DQ=0;
_nop_();
_nop_();
DQ=1; //释放总线
_nop_();//让数字稳定一下
dat=DQ; //用dat把这个数字读出来
delayus(10); //100us左右
return dat;
}
//读一个字节
uchar ds_read_byte()
{
uchar i,j,k;
for(i=0;i<8;i++)
{
j=ds_read_bit();
k=(j<<7)|(k>>1);
}
return k;
}
//写一个字节
void ds_write_byte(uchar dat)
{
uchar i;
for(i=0;i<8;i++)
{
DQ=0;
_nop_();
DQ=dat&0x01; //保留dat的最低位
delayus(6); // 是70us
DQ=1; //释放总线
dat=dat>>1; //准备下一次位的写1
}
delayus(6); //随便延时一下 ,因为每一个函数之间都有一个时间间隔的停顿
}
//读取温度
uint read_temperature()
{
uchar a,b;
ds_reset();
ds_write_byte(0xcc);
ds_write_byte(0xbe);
a=ds_read_byte();
b=ds_read_byte();
temp=b;
temp=temp<<8;
temp=temp|a;
//就只显示三位数,两位整数一位小数。假设都是正温度
temp=temp*0.0625*10+0.5;
return temp;
}
void main()
{
while(1)
{
uint tem;
uchar ge,shi,bai;
ds_reset();
ds_write_byte(0xcc);
ds_write_byte(0x44);
delayus(5);
tem=read_temperature();
//转换数据的个十百位
ge=tem%10;
shi=tem%100/10;
bai=tem/100;
/*执行上面的语句时,18B20都有电平的高低变化,
但是执行到下面这条语句时,18B20就不变化高低电平了*/
//显示
scanduan(ge);
scanwei(4);
delay2(50);
scanduan(shi);
scanwei(3);
delay2(50);
scanduan(bai);
scanwei(2);
delay2(10);
}
}
此帖出自
小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
一周热门 更多>