做的很细,ds18B20的网上很多,DS1621的没有,花了一点时间做出来了,现在整理到一块,有缘者取
单片机源程序如下:
- #include "reg51.h"
- #include "intrins.h"
- #define uchar unsigned char
- #define uint unsigned int
- #define DiSdata P0 //七段码数据输出口
- #define discan P2 //扫描数据输出口
- sbit DIN=P0^7; //小数点控制
- sbit Scl=P3^0; //串行时钟
- sbit Sda=P3^1; //串行数据
- sbit alarm=P1^7;
- sbit alarm2=P1^6;
- uint i;
- uint h;
- uint temp;
- uchar dath[2]; //温度输入口
- uchar ff2,ff1=0,t3=0;
- uchar code
- dis_7[12]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff}; //共阴LED段码表 "0" "1" "2" "3" "4" "5" "6" "7" "8" "9" "灭" "-"
- uchar code scan_con[5]={0xfd,0xfb,0xf7,0xef,0xdf}; //LED显示控制,对应0的LED有效
- uchar data display[5]={0x00,0x00,0x00,0x00,0x002}; //显示单元数据,共6个数据和一个运算暂用
- uchar data display1[5]={0x01,0x02,0x03,0x04,0x052};
- uchar data DD[4]={0x90,0x92,0x94};
- //
- void
- delay_us(uint t) //延时函数
- {
- for (;t>0;t--); }
- //
- scan() //LED扫描函数
- {
- uchar k;
- for(k=0;k<5;k++)
- {
- discan=scan_con[k]; //控制位送P2口
- DiSdata=dis_7[display[k]]; //数据位送P0口
- if (k==3){DIN=1;}
- else
- DIN=0; //小数点显示
- delay_us(150);
- }
- }
- //
- void delay(void) //延时函数
- {
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- }
- //
- void i_start(void)
- {
- Sda=1;
- Scl=1;
- delay();
- Sda=0;
- delay();
- Scl=0;
- }
-
- //
- void i_stop(void)
- {
- Sda=0;
- Scl=1;
- delay();
- Sda=1;
- delay();
- Scl=0;
- Sda=0;
- }
- //
- bit i_clock(void) //应答信号
- { bit sample;
- Scl=1;
- delay();
- sample=Sda;
- _nop_();
- _nop_();
- Scl=0;
- delay();
- return(sample);
- }
- //
- void i_ack(void)
- {
- Sda=0;
- i_clock();
- Sda=1; }
- //
- bit i_send(uchar i_data)
- {
-
- uchar i; for(i=0;i<8;i++)
- {
- Sda=(bit)(i_data & 0x80);
- i_data=i_data<<1;
- i_clock();
- }
- Sda=1;
- return(~i_clock()); }
- //
- uchar i_receive(void)
- {
- uchar i_data=0;
- uchar i;
- for(i=0;i<8;i++)
- {
- i_data<<=1;
- Scl=0;delay();
- Scl=1;delay() ;
- i_data|=Sda; }
- Scl=0; delay();
- return(i_data); }
- //
- bit start_temperature_T(unsigned char d) //开始转换命令
- {
- uchar t1;
- t1=DD[d];
- i_start();
- if(i_send(t1))
- {
- if(i_send(0xee))
- {
- i_stop();
- delay();
- return(1);
- }
- else
- {
- i_stop();
- delay();
- return(0);
- }
- }
- else
- {
- i_stop();
- delay();
- return(0);
- }
- }
- //
- bit read_temperature_T(unsigned char *p,unsigned char d)
- {
- unsigned char t1,t2;
- t1=DD[d];
- t2=DD[d]+0x01;
- i_start();
- if(i_send(t1))
- {
- if(i_send(0xaa))
- {
- i_start();
- if(i_send(t2))
- {
- *(p+1)=i_receive();
- i_ack();
- *p=i_receive();
- i_stop();
- delay();
- i_send(t1);
- i_send(0x22);
- delay();
- return(1);
- }
- else
- {
- i_stop();
- delay();
- return(0);
- }
- }
- else
- {
- i_stop();
- delay();
- return(0);
- }
- }
- else
- {
- i_stop();
- delay();
- return(0);
- }
- }
- bit ds1621(unsigned char d)
- {
- unsigned char t1;
- t1=DD[d];
-
-
- i_start();
- if(i_send(t1))
- {
- if(i_send(0xac))
- {
- i_start();
- if(i_send(0x0a))
- {
- i_stop();
- delay();
- return(1);
- }
- else
- {
- i_stop();
- delay();
- return(0);
- }
- }
- else
- {
- i_stop();
- delay();
- return(0);
- }
- }
- else
- {
- i_stop();
- delay();
- return(0);
- }
- }
- //
-
- void chuli_temp(unsigned char d)
- {
- unsigned char datah,f=1,datal,t;
- while(f)
- {
- t=start_temperature_T(d);
- if(t)
- {
- read_temperature_T(dath,d);
- f=0;
- }
- delay_us(20);
- }
- datah=dath[1];
- datal=dath[0];
- if(datal<20)
- alarm2=1;
- else
- alarm2=0;
- if(datah>80)
- alarm2=1;
- else
- alarm2=0;
- display[0]=d;
- f=0;
- if((datah&0x80)!=0)
- {f=1;
- display[1]=10;
- datah=datah+1;
- datah=~datah;
- datah=datah+1;
- display[2]=((datah/10)%10);
- display[3]=datah%10;
- if((datal&0x80)==0x80)
- display[4]=5;
- else
- display[4]=0;
- }
- else
-
- {
- display[1]=datah/100;
- display[2]=((datah/10)%10);
- display[3]=datah%10;
- if((datal&0x80)==0x80)
- display[4]=5;
- else
- display[4]=0;
- }
- if(!display[1]) //符号位显示判断
- {
- display[1]=0x0a; //最高位为0时不显示
- if(!display[2])
- {
- display[2]=0x0a;
- if(f) {display[2]=0x0b;f=2;} //次高位为0时不显示
- }
- }
- if(f==1)display[1]=0x0b; //负温度时最高位显示"-"
- }
- void ex_int0() interrupt 0
- {
- ff2=1;
- ff1=0;
- }
- //
- void ex_int1() interrupt 2
- {
- EA=0;
- ff1=1;
- ff2=0;
- EA=1;
- }
- //
- main() //主函数
- {
- uchar d=0,t4=1;
- DiSdata=0xff; //初始化端口
- discan=0xff;
- alarm=0;
- EA=1;
- EX0=1;
- EX1=1;
- IT0=1;
- IT1=1;
- for(h=0;h<5;h++) //开机显示"0000"
- {
- display[h]=0;
- }
- scan();
- delay_us(3);
- for(d=0;d<3;d++)
- {
- ds1621(d);}
- d=0;
- while(1)
- {
- if(ff1)
- {
- chuli_temp(d);
- for(h=0;h<100;h++)
- scan();
- d++;
- if(d==3)
- d=0; }
- if(ff2)
- {
- t3=t3+ff2;
- if(t3==3)
- t3=0;
- chuli_temp(t3);
- ff2=0;
- }
- scan();
- }
- }
复制代码
所有资料51hei提供下载:
多点测温.zip
(935.42 KB, 下载次数: 73)
|