0
自己写了一段程序 是一个温度报警器 但是当设定温度时显示不正常 哪位能给调试一下include#define uchar unsigned char
#define uint unsigned int
***it led1=P0^0; /*****百位数码管*****/
***it led2=P0^1; /*****十位数码管*****/
***it led3=P0^2; /*****个位数码管*****/
***it DQ=P0^6; // 单总线
***it clk=P2^5; //74ls164时钟端
***it da_ta=P2^4;//74ls164数据端
***it k1=P1^2; // 键盘1
***it k2=P1^3; // 键盘2
***it speak=P2^0;
uchar num,i,bai,shi,ge;
/*共阳数码管段码*/
uchar code disp[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
/***********子函数声明**************/
void delay(char w); /**************延迟子函数************/
void delay_18B20(uint M);/*********18b20的延迟子函数********/
void move(uchar z);
void display(ge,shi,bai);
void Init_DS18B20(void);
read_temp(void);
uint SegBuf[3];
uchar ReadOneChar(void);
void WriteOneChar(unsigned char dat);
void Init_timer0();
/**********子函数声明结束*************/
void main()
{
uint TempData,ge,shi,bai,I=20;
speak=0;
while(1)
{
Init_DS18B20();
TempData=read_temp();
if((k1&k2)==0)
{
delay(50);
if((k1&k2)==0)
{
if(k2==0)
{
I--;
}
if(k1==0)
{
I++;
}
TempData=I;
ge =disp[TempData%10];
shi =disp[TempData/10%10]&0x7f;
bai =disp[TempData/100%10];
display(ge,shi,bai);
delay(5);
}
}
delay(5000);
TempData=read_temp();
/*******以下将读18b20的数据送到LED数码管显示*************/
//把实际温度送到TempData变量中
if(TempData>=I)
{ speak=1;
delay(50000);
speak=0;
}
ge =disp[TempData%10];
shi =disp[TempData/10%10]&0x7f;
bai =disp[TempData/100%10];
display(ge,shi,bai);
delay(5);
}
}
/*************显示子函数************/
void display(ge,shi,bai)
{
{move(ge);
led3=1;
delay(6);
led3=0;
}
{
move(shi);
led2=1;
delay(6);
led2=0;
}
{move(bai);
led1=1;
delay(6);
led1=0;
}
}
/********74ls164移位寄存指令**********/
void move(uchar z)
{
uint i;
for(i=0;i<8;i++)
{ clk=0;
z<<=1;
da_ta=CY;
clk=1;
}
}
/*********18b20的延迟子函数********/
void delay_18B20(uint s)
{
while(s--);
}
/**************延迟子函数************/
void delay(char w)
{ char X,Y;
for(X=w;X>0;X--)
for(Y=120;Y>0;Y--);
}
/**********ds18b20初始化函数**********************/
void Init_DS18B20(void)
{
unsigned char x=0;
DQ = 1; //DQ复位
delay_18B20(2); //稍做延时
DQ = 0; //单片机将DQ拉低
delay_18B20(60); //精确延时 大于 480us
DQ = 1; //拉高总线
delay_18B20(2);
x=DQ; //稍做延时后 如果x=0则初始化成功 x=1则初始化失败
delay_18B20(15);
}
/***********ds18b20读一个字节**************/
uchar ReadOneChar(void)
{
uchar i=0;
uchar dat=0;
for (i=8;i>0;i--)
{
DQ = 0; // 给脉冲信号
dat>>=1;
DQ = 1; // 给脉冲信号
if(DQ)
dat |=0x80;
delay_18B20(4);
}
return(dat);
}
/*************ds18b20写一个字节****************/
void WriteOneChar(unsigned char dat)
{
unsigned char i=0;
for (i=8; i>0; i--)
{
DQ = 0;
DQ = dat&0x01;
delay_18B20(2);
DQ = 1;
dat>>=1;
}
}
/*********获取温度***********/
read_temp()
{
uint temp;
float f_temp;
uint a,b;
Init_DS18B20();
WriteOneChar(0xcc);
WriteOneChar(0x44); //启动温度测量
delay(300); //有一定时间去测量温度
//并把数值存储在高速暂存器的温度寄存器中
Init_DS18B20();
WriteOneChar(0xcc);
WriteOneChar(0xbe); //开始读数据命令
a=ReadOneChar(); //读出温度的低位LSB
b=ReadOneChar(); //读出温度的高位MSB
temp=b;
temp<<=8;
temp=temp|a; //两字节合成一个整型变量。
if(temp<0x0fff) //12位转化后得到的12位数据,存储在18B20的两个高低字节的两个8位的RAM中;
//二进制中的前面五位是符号位。如果测得温度大于0,这5位为0,只要将测得的数值乘以0.0625即可得到实际温度
//如果温度小于0,这五位为1,测得的数值要取反加1再乘以0.0625才能得到实际温度
{ uint tflag;
tflag=0;//测得的温度为正值
}
else
{ uint tflag;
temp=~temp+1;
tflag=1; //测得的温度为负值
}
f_temp=temp*0.0625;// 温度在寄存器中为12位,分辨率为0.0625
temp=f_temp*10+0.5; //乘以10表示小数点后面只取1位,加0.5时四舍五入
return temp; //返回温度值
}
|
|