DS18B20温度显示程序,使用74hc595控制数码管位选【2个4位数码管】,数码管闪烁频率很高,闪烁是显示的也能看得见,不知是那一个环节出现了问题更改了好久无法解决,闪烁时就好像在不间断扫描一样???麻烦各位大佬指出。
由于拍摄无法看出数码管闪烁所以没有上传照片
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit SER = P1^2; //数据输入
sbit SCK = P1^0; //串行移位时钟
sbit RCK = P1^1; //锁存器时钟
sbit DQ = P2^2; //18B20数据输入
uint tvalue;
uchar tflag;
uchar code tab[16]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E};
uchar data buf[5]={0,0,0,0,0xC6};//显示缓存
void hc595(uchar Data)//74HC595的数据串入并出子程序
{
uchar i;
for(i=0;i<8;i++) //由高位到低位发送一个字节
{
Data<<=1; //左移一位,最高位溢出到位寄存器CY
SER=CY; //从位寄存器的进位标志位CY读取
SCK = 0; //串行移位
_nop_();
_nop_();
SCK = 1;
_nop_();
_nop_();
SCK = 0;
}
RCK = 0; //锁存
_nop_();
_nop_();
RCK = 1;
_nop_();
_nop_();
RCK = 0;
}
void delay(unsigned int n)
{
unsigned int i,j;
for(j=n;j>0;j--)
for(i=112;i>0;i--);
}
void delay_18B20(uchar i)
{
while(i--);
}
void ds1820() //初始化
{
uchar x=0;
DQ = 1;
delay_18B20(4);
DQ = 0;
delay_18B20(100);;
DQ = 1;
delay_18B20(40);;
}
uchar ds1820rd() //读数据
{
uchar i=0;
uchar dat=0;
for(i=8;i>0;i--)
{
DQ=0;
dat>>=1;
DQ=1;
if(DQ)
dat|=0x80;
delay_18B20(10);;
}
return(dat);
}
void ds1820wr(uchar wdata) //写数据
{
uchar i=0;
for(i=8;i>0;i--)
{
DQ=0;
DQ=wdata&0x01;
delay_18B20(10);;
DQ=1;
wdata>>=1;
}
}
uint read_temp()
{
uchar a,b;
ds1820();
ds1820wr(0xcc); //跳过读序列号
ds1820wr(0x44); //启动温度转化
ds1820();
ds1820wr(0xcc); //跳过读序列号
ds1820wr(0xbe); //启动温度转化
a=ds1820rd();
b=ds1820rd();
tvalue=b;
tvalue<<=8;
tvalue=tvalue|a;
if(tvalue<0x0fff)
tflag=0;
else
{
tvalue=~tvalue+1;
tflag=1;
}
tvalue=tvalue*(0.625); //温值扩大10倍精确到1位小数
return(tvalue);
}
void ds1820disp()
{
static uchar k=0;
buf[0]=tab[tvalue/1000]; //百位数
buf[1]=tab[tvalue%1000/100]; //十位数
buf[2]=tab[tvalue%100/10]&0x7f; //个位数
buf[3]=tab[tvalue%10]; //小数
P0=0xFF;
hc595(0x01<<k);
P0=buf[k];
k++;
k%=5;
}
void main()
{
ds1820();
while(1)
{
ds1820disp();
read_temp();
}
}
|