#include #include #define uchar unsigned char #define uint unsigned int sbit DS=P3^3; //定义DS18B20接口 sbit p30=P3^0; s bit p31=P3^1; sbit at=P3^4; //定义增温控制接口 sbit dt=P3^5; //定义减温控制接口 static int temp; uint cout=0; static int l_tmp; uchar flag1; uint i=0; Voiddisplay(void); code unsigned char table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40,0x80,0x00}; //共阴数码管 0-9空表 Unsigned char l_tmpdate[8]={0,0,0,0,0,0,0,0}; 1,2,3,4,5,6,7,8,就是本程序显示的八个数 int tmp(void); void tmpchange(void); oid tmpwritebyte(uchar dat); uchar tmpread(void); bit tmpreadbit(void); void dsreset(void); void delayb(uint count); void zhuti(l_tmp); //定义数组变量,并赋值 void delayc(unsigned int j); void add(void); void sub(void); void ISR_EX0() interrupt 0 { delayc(2000); cout++; } void main() //主函数 { at=1; dt=1; EA=1; //首先开启总中断 EX0=1; //开启外部中断 0 IT0=1; // 设置成下降沿触发方式 while(1) { tmpchange(); //温度转换 l_tmp=tmp(); zhuti(l_tmp); display(); while(cout%2!=0) { display(); while((cout%2!=0) && (p31==0)) {add();} while((cout%2!=0) && (p30==0)) {sub();} } } } void delayc(uint j) { while(--j>0); } void add(void) { delayc(20000); l_tmp=l_tmp+10; zhuti(l_tmp); } void sub(void) { delayc(20000); l_tmp=l_tmp-10; zhuti(l_tmp); } void zhuti(int l_tmp) { l_tmpdate[0]=l_tmp/100; l_tmp=l_tmp%100; l_tmpdate[1]=l_tmp/10; l_tmp=l_tmp%10; l_tmpdate[2]=11; l_tmpdate[3]=l_tmp; if(((l_tmpdate[0]>1)&&(l_tmpdate[1]>6))|((l_tmpdate[0]>2)&&(l_tmpdate[0]<6)))dt=0; else dt=1; if(((l_tmpdate[0]<2)&&(l_tmpdate[1]<8))|(l_tmpdate[0]<1))at=0; else at=1; } void display(void) //显示 { uchar i,temp; P2=0; P1=P1&0xf8; for(i=0;i<4; i++) { temp=l_tmpdate[i]; temp=table[temp]; P2=temp; delayc(100); if(i==7)break; P2=0; P1++; } } void delayb(uint count) { //delay uint i; while(count) { i=200; while(i>0) i--; count--; } } void dsreset(void) { uint i; DS=0; i=103; //DS18B20初始化 while(i>0)i--; DS=1; i=4; while(i>0)i--; } bit tmpreadbit(void) { uint i; bit dat; DS=0;i++; //小延时一下 DS=1; i++; i++; // 读一位 dat=DS; i=8; while(i>0)i--; return (dat); 31 } uchar tmpread(void) { uchar i,j,dat; dat=0; for(i=1 ;i<=8; i++) //读一个字节 { j=tmpreadbit(); dat=(j<<7)|(dat>>1); //读出的数据最低位在最前面,这样刚好//一个字节在DAT里 } return(dat); //将一个字节数据返回 } void tmpwritebyte(uchar dat) { //写一个字节到DS18B20里 uint i; uchar j; bit testb; for(j=1;j<=8; j++) { testb=dat&0x01; dat=dat>>1; if(testb) { DS=0; i++; i++; DS=1; i=8; while(i>0)i--; } // 写1部分 Else { DS=0; //写0部分 i=8; while(i>0)i--; DS=1; i++; i++; } } } void tmpchange(void) { //发送温度转换命令 dsreset(); //初始化DS18B20 delayb(1); //延时 tmpwritebyte(0xcc); // 跳过序列号命令 tmpwritebyte(0x44); //发送温度转换命令 } int tmp() //获得温度 { float tt; uchar a,b; dsreset(); delayb(1); tmpwritebyte(0xcc); tmpwritebyte(0xbe); //发送读取数据命令 a=tmpread(); //连续读两个字节数据 b=tmpread(); temp=b; temp<<=8; temp=temp|a; //两字节合成一个整型变量。 tt=temp*0.0625; //得到真实十进制温度值,因为DS18B20可以精确到0.0625 度,所以读回数据的最低位代表的是0.0625度。 temp=tt*10+0.5; //放大十倍,这样做的目的将小数点后第一位也转换为可显 示数字,同时进行一个四舍五入操作。 return temp; //返回温度值 } void add(void) { delayc(20000); l_tmp=l_tmp+10; zhuti(l_tmp); } void sub(void) { delayc(20000); l_tmp=l_tmp-10; zhuti(l_tmp); } void zhuti(int l_tmp) { l_tmpdate[0]=l_tmp/100; l_tmp=l_tmp%100; l_tmpdate[1]=l_tmp/10; l_tmp=l_tmp%10; l_tmpdate[2]=11; l_tmpdate[3]=l_tmp; if(((l_tmpdate[0]>1)&&(l_tmpdate[1]>6))|((l_tmpdate[0]>2)&&(l_tmpdate[0]<6)))dt=0; else dt=1; if(((l_tmpdate[0]<2)&&(l_tmpdate[1]<8))|(l_tmpdate[0]<1))at=0; else at=1; } void display(void) //显示 { uchar i,temp; P2=0; P1=P1&0xf8; for(i=0;i<4; i++) { temp=l_tmpdate[i]; temp=table[temp]; P2=temp; delayc(100); if(i==7)break; P2=0; P1++; } } void delayb(uint count) { uint i; while(count) { i=200; while(i>0) i--; count--; } //delay } void dsreset(void) //DS18B20初始化 { uint i; DS=0; i=103; while(i>0)i--; DS=1; i=4; while(i>0)i--; } bit tmpreadbit(void) { // 读一位 uint i; bit dat; DS=0;i++; //小延时一下 DS=1; i++; i++; dat=DS; i=8; while(i>0)i--; return (dat); 31 } uchar tmpread(void) //读一个字节 { uchar i,j,dat; dat=0; for(i=1 ;i<=8; i++) { j=tmpreadbit(); dat=(j<<7)|(dat>>1); //读出的数据最低位在最前面,这样刚好//一个字节在DAT里 } return(dat); //将一个字节数据返回 } void tmpwritebyte(uchar dat) { //写一个字节到DS18B20里 uint i; uchar j; bit testb; for(j=1;j<=8; j++) { testb=dat&0x01; dat=dat>>1; if(testb) { DS=0; // 写1部分 i++; i++; DS=1; i=8; while(i>0)i--; } Else { DS=0; i=8; while(i>0)i--; DS=1; i++; //写0部分 i++; } } } void tmpchange(void) //发送温度转换命令 { dsreset(); //初始化DS18B20 delayb(1); //延时 tmpwritebyte(0xcc); // 跳过序列号命令 tmpwritebyte(0x44); //发送温度转换命令 } int tmp() //获得温度 { float tt; uchar a,b; dsreset(); delayb(1); tmpwritebyte(0xcc); tmpwritebyte(0xbe); //发送读取数据命令 a=tmpread(); //连续读两个字节数据 b=tmpread(); temp=b; temp<<=8; temp=temp|a; //两字节合成一个整型变量。 tt=temp*0.0625; //得到真实十进制温度值,因为DS18B20可以精确到0.0625 度,所以读回数据的最低位代表的是0.0625度。 temp=tt*10+0.5; //放大十倍,这样做的目的将小数点后第一位也转换为可显 示数字,同时进行一个四舍五入操作。 return temp; //返回温度值 因篇幅问题不能全部显示,请点此查看更多更全内容