📄 chengxu.txt
字号:
/***************************************
程序功能:温度显示
***************************************/
#include <pic.h>
void delay(unsigned char time)
{
unsigned char m,n;
for(n=0;n<time;n++);
for(m=0;m<2;m++);
}
void Delay(void) //延时,动态显示
{
unsigned int i;
for(i=4000;i>0;i--);
}
/***********************************************************
写一位数据子程序
************************************************************/
void write_bit(unsigned char bitval)
{
GPIO4=1; //拉低DQ以开始一个写时序
GPIO4=0;
if(bitval==1)
{
// _nop_();
GPIO4=1; //如要写1,则将总线置高
}
delay(6); //延时90us供DA18B20采样
GPIO4=1; //释放DQ总线
// _nop_();
// _nop_();
}
/***********************************************************
写一字节数据子程序
***********************************************************/
void write_byte(unsigned char val)
{
unsigned char i;
unsigned char temp;
for(i=0;i<8;i++) //写一字节数据,一次写一位
{
// _nop_();
temp=val>>i; //移位操作,将本次要写的位移到最低位
temp=temp&1;
write_bit(temp); //向总线写该位
}
delay(10); //延时120us后
}
/***********************************************************
读一位数据子程序
***********************************************************/
unsigned char read_bit(void)
{
unsigned char i,value_bit;
GPIO4=0; //拉低DQ,开始读时序
// _nop_();
GPIO4=1; //释放总线
value_bit=GPIO4;
return(value_bit);
}
/***********************************************************
读一字节数据子程序
***********************************************************/
unsigned char read_byte(void)
{
unsigned char i;
unsigned char value=0;
for(i=0;i<8;i++)
{
if(read_bit()) //读一字节数据,一个时序中读一次,并作移位处理
value|=0x01<<i;
delay(15); //延时80us以完成此次都时序,之后再读下一数据
}
return(value);
}
/***********************************************************
复位子程序
***********************************************************/
unsigned char reset(void)
{
unsigned char presence;
GPIO4=1;
delay(2);
GPIO4=0; //拉低DQ总线开始复位
delay(40); //保持低电平480us
GPIO4=1; //释放总线
delay(8); //等待芯片应答信号 75us
presence=GPIO4; //获取应答信号
delay(4); //延时以完成整个时序
return(presence); //返回应答信号,有芯片应答返回0,无芯片则返回1
}
void main(void)
{
unsigned char i,j,temper_low,temper_hi,temper,k=0,m=0;
double point=0,temper_=0;
TRISIO=0X00;
CMCON=0x07;
GPIO=0XFF;
GPIO1=0;
GPIO2=0;
// PSA=1;
// PS0=0;
// PS1=0;
// PS2=1;
while(1)
{
PSA=1;
PS0=0;
PS1=0;
PS2=1;
Delay();
Delay();
CMCON=0x07;
while(reset()!=0);
i=0xcc; //发送设备定位命令
write_byte(i);
CLRWDT();
i=0x44; //发送开始转换命令
write_byte(i);
delay(15); //延时
while(reset()!=0);//0为无反馈信号,再次复位
i=0xcc; //设备定位
write_byte(i);
i=0xbe; //读出缓冲区内容
write_byte(i);
CLRWDT();
temper_low=read_byte(); //先读出高位
temper_hi=read_byte(); //后读出低位
i=temper_hi<<4; //舍弃高四位的符号位
m=temper_low;
CLRWDT();
j=temper_low>>4; //舍弃低四位的小数值
m&=0x0f;
if(m>=0x08)
{ point=(m&0x07)*0.0625;
point+=0.5;}
else
point=(m&0x07)*0.0625;
temper=i|j; //组合为一个字节0~127
k+=1;
if(k>78)
{
temper_=temper+point;
if( temper_>42.1)
{
GPIO1=0;
GPIO2=1;
//Delay();
Delay();
GPIO1=1; //红灯闪
// Delay();
Delay();
}
else
{
GPIO1=0;
// GPIO0=0; //红灯亮
//GPIO1=0;
GPIO2=0;
}
CLRWDT();
k=78;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -