//_nop_();sbit DQ=P3^3; //sbit P07=P0^7; //LED// sbit P20=P2^0;sbit SPEA=P3^7;
sbit P17=P1^7;
unsigned int h,n=0;
unsigned int temp;
void delay(unsigned int t);
void delay882us(void);
延时函数用温度输入口
小数点控制
ow_reset(void);
void write_byte(unsigned char val);
unsigned char read_byte(void);
unsigned int read_temp();
void delayms(unsigned int ms);
void runled(void); void light(void);
void x8led(unsigned long ddd);
/**********************温度小数部分用查表法************************/
unsigned char data temp_data[2]={0x00,0x00}; //读出温度暂放
unsigned char data display[5]={0x00,0x00,0x00,0x00,0x00}; //显示单元数据,共4个数据和一个运算暂用
/*************************11us延时函数*****************************/ //
void delay(unsigned int t) {
for (;t>0;t--); } //
/*****************************延时882us****************************/
void delay882us(void) { unsigned char i;
for(i=0;i<255;i++);
{
_nop_();
}
} //
/***************************DS18B20************************/ ow_reset(void) {
char presence=1; while(presence) {
while(presence) {
DQ=1;_nop_();_nop_();//从高拉倒低
DQ=0; delay(50); //550 us
DQ=1; delay(6); //66 us
复位函数
presence=DQ; //presence=0 复位成功,继续下一步 }
delay(45); //延时500 us presence=~DQ; }
DQ=1; //拉高电平 } // //
/**************************DS18B20写命令函数************************/ //向1-WIRE 总线上写1个字节
void write_byte(unsigned char val) {
unsigned char i; for(i=8;i>0;i--) {
DQ=1;_nop_();_nop_(); //从高拉倒
低 DQ=0;_nop_();_nop_();_nop_();_nop_(); //5 us
DQ=val&0x01; //出 delay(6); //66 us
最低位移
val=val/2; //右移1位 }
DQ=1;
delay(1); }
/************************DS18B20读1字节函数*************************/ //从总
线上取1个字节
unsigned char read_byte(void) {
unsigned char i;
unsigned char value=0; for(i=8;i>0;i--) {
DQ=1;_nop_();_nop_(); value>>=1;
DQ=0;_nop_();_nop_();_nop_();_nop_(); //4 us DQ=1;_nop_();_nop_();_nop_();_nop_(); //4 us if(DQ)value|=0x80;
delay(6); //66 us }
DQ=1;
return(value); }
/*****************************读出温度函数**************************/
unsigned int read_temp() {
ow_reset(); //总线复位 delay(200);
write_byte(0xcc); //发命令
write_byte(0x44); //发转换命令 ow_reset(); delay(1);
write_byte(0xcc); //发命令 write_byte(0xbe);
temp_data[0]=read_byte(); //读温度值的第字
节 temp_data[1]=read_byte(); //读温度值的高字节 temp=temp_data[1];
temp<<=8; temp=temp|temp_data[0]; // 两字节合成一个整型变量。 if(temp>6348) {
temp=65536-temp; n=1; }
display[4]=temp&0x0f; // 取小数部分的值 temp=temp>>4; // 取中间八位,即整数部分的值 temp=temp*10+display[4];
return temp; //返回温度值 }
void delayms(unsigned int ms)
{ unsigned int i,j; for(i=20;i>0;i--) { x8led(temp); for(j=ms;j>0;j--) { _nop_(); }; } }
void runled(void) { unsigned int i,a=0x01; for(i=0;i<8;i++) { P1=~a; a<<=1; delayms(50); } }
void light(void) { P1=0; delayms(10); P1=0XFF; delayms(10); }
/*****************************数码管扫描****************************/
void x8led(unsigned long ddd) {
unsigned char q,r=0; unsigned char
l[13]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x7f,0xbf,0xff};
//0-9的字段码
unsigned char xx[4]={0,0,0,0};
unsigned char y[4]={0x8,0x4,0x2,0x1}; xx[3]=ddd%10; xx[2]=ddd/10%10; xx[1]=ddd/100%10; if(n==1) {
// n=0; xx[0]=11; //显示“-”号 }
else xx[0]=12; //无任何显示
for(q=0;q<4;) //循环扫描 {
q++; r++; if(r==4)r=0; P2=y[r];
P0=l[xx[r]]; if(r==2)P07=0; delay(100); P0=0xff;
} }
/*************************************************************/ void main() {
主函数
P0=0xff; //初始化端口 P2=0xff;
for(h=0;h<4;h++) //开机显示\"000\" {display[h]=0;}
ow_reset(); //开机先转换一
次 write_byte(0xcc); //Skip ROM write_byte(0x44); //发转换命令 for(h=0;h<200;h++) //开机显示\"000\" {x8led(0);} while(1) {
temp=read_temp(); //处理温度数据 x8led(temp); //显示温度值
if(temp>400) { light(); SPEA=0; } else {runled();SPEA=1; } n=0; } }
/*******************************************************************/