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();
}
}
|