- #include <reg51.h>
- #include <intrins.h>
- #define uchar unsigned char
- #define uint unsigned int
- #define ulong unsigned long
- #define _Nop() _nop_()
- sbit DQ =P2^2; //定义DS18B20通信端口
- sbit DULA=P2^6;
- sbit WELA=P2^7;
- sbit K1=P3^0;
- sbit K2=P3^1;
- sbit K3=P3^2;
- sbit K4=P3^4;
- sbit K5=P3^5;
- sbit K6=P3^6;
- bit settime=0;
- float tt=0;
- uchar ms,h=0,m=0,s=0,change=0,num=0;
- ulong count=0;
- uchar code S_Data[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
- uchar table[6]={0x3F,0x3F,0x3F,0x3F,0x3F,0x3F};//时钟0-5号SLED缓冲值
- uchar table1[]={0x00,0x00,0x00,0x00,0x00,0x00};//频率计0-5号SLED缓冲值
- uchar data sled_data[]={0x00,0x00,0x00,0x00,0x00,0x00}; //温度0-5号SLED缓冲值
- uchar code Line_Value[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf};
- uchar code Line_Value1[]={0xdf,0xef,0xf7,0xfb,0xfd,0xfe};
- void delay(uint i)
- {
- while(i--);
- }
- void delayms(uint x)
- {
- uchar i;
- while(x--) for(i=0;i<120;i++);
- }
- void display(uchar h,m,s)
- { uchar i;
- table[5]= S_Data[h/10];
- table[4]= S_Data[h%10];
- table[3]= S_Data[m/10];
- table[2]= S_Data[m%10];
- table[1]= S_Data[s/10];
- table[0]= S_Data[s%10];
- for (i=0;i<6;i++)
- {
- P0=0xff;
- WELA=1;
- P0=Line_Value1[ i];
- WELA=0;
- DULA=1;
- P0=table[ i];
- DULA=0;
- delayms(1);
- }
- }
- void Change_Time()
- {
- settime=0;
- if(K1==0||K2==0||K3==0)
- {
- TR0=0;
- settime=1;
- }
- while(settime)
- {
- if(K1==0)
- {
- while(K1==0);
- change=(change+1)%3;
- }
- else if(K2==0)
- {
- while(K2==0);
- if(change==0)
- {if(++h==24) h=0;}
- if(change==1)
- {if(++m==60) m=0;}
- if(change==2)
- {if(++s==60) s=0;}
- }
- else if(K3==0)
- {
- while(K3==0);
- if(change==0)
- {if(--h==0xff) h=23;}
- if(change==1)
- {if(--m==0xff) m=59;}
- if(change==2)
- {if(--s==0xff) s=59;}
- }
- else if(K4==0)
- {
- while(K4==0);
- settime=0;
- TR0=1;
- }
- display(h,m,s);
- }
- }
- Init_DS18B20(void)
- {
- uchar x=0;
- DQ = 1; //DQ复位
- delay(8); //稍做延时
- DQ = 0; //单片机将DQ拉低
- delay(80); //精确延时 大于 480us
- DQ = 1; //拉高总线
- delay(14);
- x=DQ; //稍做延时后 如果x=0则初始化成功 x=1则初始化失败
- delay(20);
- }
- //读一个字节
- 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(4);
- }
- return(dat);
- }
- //写一个字节
- WriteOneChar(uchar dat)
- {
- uchar i=0;
- for (i=8; i>0; i--){
- DQ = 0;
- DQ = dat&0x01;
- delay(5);
- DQ = 1;
- dat>>=1;
- }
- }
- //读取温度
- ReadTemperature(void)
- {
- uchar a=0;
- uchar b=0;
- uint t=0;
-
- Init_DS18B20();
- WriteOneChar(0xCC); // 跳过读序号列号的操作
- WriteOneChar(0x44); // 启动温度转换
- Init_DS18B20();
- WriteOneChar(0xCC); //跳过读序号列号的操作
- WriteOneChar(0xBE); //读取温度寄存器等(共可读9个寄存器) 前两个就是温度
- a=ReadOneChar();
- b=ReadOneChar();
- t=b;
- t<<=8;
- t=t|a;
- tt=t*0.0625; //将温度的高位与低位合并
- t= tt*10+0.5; //对结果进行4舍5入
- return(t);
- }
- void Time0() interrupt 1
- {
- TH0=(65536-50000)/256;
- TL0=(65536-50000)%256;
- if(++ms==20)
- {
- ms=0;
- if(++s==60)
- {
- s=0;
- if(++m==60)
- {
- m=0;
- if(++h==24)
- {
- h=0;m=0;s=0;
- }
- }
- }
- }
- }
- void INT_T1() interrupt 3
- {
-
- TH1=(65536-50000)/256;
- TL1=(65536-50000)%256;
- if(++num==20)
- {
- TR1=0;
- EX0=0;
- table1[0]=S_Data[count%10];
- table1[1]=S_Data[count%100/10];
- table1[2]=S_Data[count/100%10];
- table1[3]=S_Data[count/1000%10];
- table1[4]=S_Data[count/10000%10];
- table1[5]=S_Data[count/10000/10];
- count=0;
- num=0;
-
- }
- }
- void EX_INT0() interrupt 2
- {
- count++;
-
-
- }
- void main()
- {
- uint temp_buff;
- uchar i,j;#include <reg51.h>
- #include <intrins.h>
- #define uchar unsigned char
- #define uint unsigned int
- #define ulong unsigned long
- #define _Nop() _nop_()
- sbit DQ =P2^2; //定义DS18B20通信端口
- sbit DULA=P2^6;
- sbit WELA=P2^7;
- sbit K1=P3^0;
- sbit K2=P3^1;
- sbit K3=P3^2;
- sbit K4=P3^4;
- sbit K5=P3^5;
- sbit K6=P3^6;
- bit settime=0;
- float tt=0;
- uchar ms,h=0,m=0,s=0,change=0,num=0;
- ulong count=0;
- uchar code S_Data[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
- uchar table[6]={0x3F,0x3F,0x3F,0x3F,0x3F,0x3F};//时钟0-5号SLED缓冲值
- uchar table1[]={0x00,0x00,0x00,0x00,0x00,0x00};//频率计0-5号SLED缓冲值
- uchar data sled_data[]={0x00,0x00,0x00,0x00,0x00,0x00}; //温度0-5号SLED缓冲值
- uchar code Line_Value[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf};
- uchar code Line_Value1[]={0xdf,0xef,0xf7,0xfb,0xfd,0xfe};
- void delay(uint i)
- {
- while(i--);
- }
- void delayms(uint x)
- {
- uchar i;
- while(x--) for(i=0;i<120;i++);
- }
- void display(uchar h,m,s)
- { uchar i;
- table[5]= S_Data[h/10];
- table[4]= S_Data[h%10];
- table[3]= S_Data[m/10];
- table[2]= S_Data[m%10];
- table[1]= S_Data[s/10];
- table[0]= S_Data[s%10];
- for (i=0;i<6;i++)
- {
- P0=0xff;
- WELA=1;
- P0=Line_Value1[ i];
- WELA=0;
- DULA=1;
- P0=table[ i];
- DULA=0;
- delayms(1);
- }
- }
- void Change_Time()
- {
- settime=0;
- if(K1==0||K2==0||K3==0)
- {
- TR0=0;
- settime=1;
- }
- while(settime)
- {
- if(K1==0)
- {
- while(K1==0);
- change=(change+1)%3;
- }
- else if(K2==0)
- {
- while(K2==0);
- if(change==0)
- {if(++h==24) h=0;}
- if(change==1)
- {if(++m==60) m=0;}
- if(change==2)
- {if(++s==60) s=0;}
- }
- else if(K3==0)
- {
- while(K3==0);
- if(change==0)
- {if(--h==0xff) h=23;}
- if(change==1)
- {if(--m==0xff) m=59;}
- if(change==2)
- {if(--s==0xff) s=59;}
- }
- else if(K4==0)
- {
- while(K4==0);
- settime=0;
- TR0=1;
- }
- display(h,m,s);
- }
- }
- Init_DS18B20(void)
- {
- uchar x=0;
- DQ = 1; //DQ复位
- delay(8); //稍做延时
- DQ = 0; //单片机将DQ拉低
- delay(80); //精确延时 大于 480us
- DQ = 1; //拉高总线
- delay(14);
- x=DQ; //稍做延时后 如果x=0则初始化成功 x=1则初始化失败
- delay(20);
- }
- //读一个字节
- 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(4);
- }
- return(dat);
- }
- //写一个字节
- WriteOneChar(uchar dat)
- {
- uchar i=0;
- for (i=8; i>0; i--){
- DQ = 0;
- DQ = dat&0x01;
- delay(5);
- DQ = 1;
- dat>>=1;
- }
- }
- //读取温度
- ReadTemperature(void)
- {
- uchar a=0;
- uchar b=0;
- uint t=0;
-
- Init_DS18B20();
- WriteOneChar(0xCC); // 跳过读序号列号的操作
- WriteOneChar(0x44); // 启动温度转换
- Init_DS18B20();
- WriteOneChar(0xCC); //跳过读序号列号的操作
- WriteOneChar(0xBE); //读取温度寄存器等(共可读9个寄存器) 前两个就是温度
- a=ReadOneChar();
- b=ReadOneChar();
- t=b;
- t<<=8;
- t=t|a;
- tt=t*0.0625; //将温度的高位与低位合并
- t= tt*10+0.5; //对结果进行4舍5入
- return(t);
- }
- void Time0() interrupt 1
- {
- TH0=(65536-50000)/256;
- TL0=(65536-50000)%256;
- if(++ms==20)
- {
- ms=0;
- if(++s==60)
- {
- s=0;
- if(++m==60)
- {
- m=0;
- if(++h==24)
- {
- h=0;m=0;s=0;
- }
- }
- }
- }
- }
- void INT_T1() interrupt 3
- {
-
- TH1=(65536-50000)/256;
- TL1=(65536-50000)%256;
- if(++num==20)
- {
- TR1=0;
- EX0=0;
- table1[0]=S_Data[count%10];
- table1[1]=S_Data[count%100/10];
- table1[2]=S_Data[count/100%10];
- table1[3]=S_Data[count/1000%10];
- table1[4]=S_Data[count/10000%10];
- table1[5]=S_Data[count/10000/10];
- count=0;
- num=0;
-
- }
- }
- void EX_INT0() interrupt 2
- {
- count++;
-
-
- }
- void main()
- {
- uint temp_buff;
- uchar i,j,k;
- char *p;
- SCON=0x80; //串口模式2
- PCON=0x00; //波特率不倍增
- TMOD=0x11;
- TH0=(65536-50000)/256;
- TL0=(65536-50000)%256;
- TH1=(65536-50000)/256;
- TL1=(65536-50000)%256;
- EA=1;
- ET0=1;
- ET1=1;
- TR0=1;
- IT1=1;
- EX1=1;
- TR1=1;
- P1=0xff;//复位K1-K7键位
- P3=0x7f;
- while(1)
- {
- display(h,m,s);
- delayms(1);
- Change_Time();
- if(K5==0)
- {
- while(1)
- { while(K5==0);
- temp_buff=ReadTemperature(); /*读取当前温度*/
- sled_data[2] = S_Data[temp_buff/100];
- sled_data[1] = S_Data[temp_buff%100/10];
- sled_data[0] = S_Data[temp_buff%10];
- for(j=0;j<30;j++)
- {
- for(i=0;i<6;i++)
- {
-
- _Nop();
- _Nop();
- _Nop();
- P0=0xff;
- WELA=1;
- P0 = Line_Value1[ i]; /*输出位码数据到数码管*/
- WELA=0;
- P0=0xff;
- DULA=1;
- P0 = sled_data[ i]; /*输出段码数据到数码管*/
- if(i==1) P0 = P0|0x80; /*显示小数点*/
- DULA=0;
- delayms(1);
- }
- }
- k++;
- if(k==5)
- {
- k=0;
- p=sled_data;
- for(i=0;i<3;i++)
- {
- SBUF=*p;
- p++;
- while(TI==0);
- TI=0;
- }
- }
- if(K4==0) break;
- }
- }
- if(K6==0)
- { while(K6==0);
- while(1)
- { EX1=1;
- TR1=1;
-
-
- for(j=0;j<30;j++)
- {
- for(i=0;i<6;i++)
- {
- P0=0xff;
- WELA=1;
- P0= Line_Value1[ i];
- WELA=0;
- DULA=1;
- P0= table1[ i];
- DULA=0;
- delayms(1);
- }
- }
- if(K4==0) break;
- }
-
- }
- }
- }
-
-
- TMOD=0x11;
- TH0=(65536-50000)/256;
- TL0=(65536-50000)%256;
- TH1=(65536-50000)/256;
- TL1=(65536-50000)%256;
- EA=1;
- ET0=1;
- ET1=1;
- TR0=1;
- IT1=1;
- EX1=1;
- TR1=1;
- P1=0xff;//复位K1-K7键位
- P3=0x7f;
- while(1)
- {
- display(h,m,s);
- delayms(1);
- Change_Time();
- if(K5==0)
- {
- while(1)
- { while(K5==0);
- temp_buff=ReadTemperature(); /*读取当前温度*/
- sled_data[2] = S_Data[temp_buff/100];
- sled_data[1] = S_Data[temp_buff%100/10];
- sled_data[0] = S_Data[temp_buff%10];
- for(j=0;j<30;j++)
- {
- for(i=0;i<6;i++)
- {
-
- _Nop();
- _Nop();
- _Nop();
- P0=0xff;
- WELA=1;
- P0 = Line_Value1[ i]; /*输出位码数据到数码管*/
- WELA=0;
- P0=0xff;
- DULA=1;
- P0 = sled_data[ i]; /*输出段码数据到数码管*/
- if(i==1) P0 = P0|0x80; /*显示小数点*/
- DULA=0;
- delayms(1);
- }
- }
- if(K4==0) break;
- }
- }
- if(K6==0)
- { while(K6==0);
- while(1)
- { EX1=1;
- TR1=1;
-
-
- for(j=0;j<30;j++)
- {
- for(i=0;i<6;i++)
- {
- P0=0xff;
- WELA=1;
- P0= Line_Value1[ i];
- WELA=0;
- DULA=1;
- P0= table1[ i];
- DULA=0;
- delayms(1);
- }
- }
- if(K4==0) break;
- }
-
- }
- }
- }
-
-
复制代码 |