|
- #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};//時(shí)鐘0-5號(hào)SLED緩沖值
- uchar table1[]={0x00,0x00,0x00,0x00,0x00,0x00};//頻率計(jì)0-5號(hào)SLED緩沖值
- uchar data sled_data[]={0x00,0x00,0x00,0x00,0x00,0x00}; //溫度0-5號(hào)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復(fù)位
- delay(8); //稍做延時(shí)
- DQ = 0; //單片機(jī)將DQ拉低
- delay(80); //精確延時(shí) 大于 480us
- DQ = 1; //拉高總線
- delay(14);
- x=DQ; //稍做延時(shí)后 如果x=0則初始化成功 x=1則初始化失敗
- delay(20);
- }
- //讀一個(gè)字節(jié)
- ReadOneChar(void)
- {
- uchar i=0;
- uchar dat = 0;
- for (i=8;i>0;i--){
- DQ = 0; // 給脈沖信號(hào)
- dat>>=1;
- DQ = 1; // 給脈沖信號(hào)
- if(DQ) dat|=0x80;
- delay(4);
- }
- return(dat);
- }
- //寫(xiě)一個(gè)字節(jié)
- 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); // 跳過(guò)讀序號(hào)列號(hào)的操作
- WriteOneChar(0x44); // 啟動(dòng)溫度轉(zhuǎn)換
- Init_DS18B20();
- WriteOneChar(0xCC); //跳過(guò)讀序號(hào)列號(hào)的操作
- WriteOneChar(0xBE); //讀取溫度寄存器等(共可讀9個(gè)寄存器) 前兩個(gè)就是溫度
- a=ReadOneChar();
- b=ReadOneChar();
- t=b;
- t<<=8;
- t=t|a;
- tt=t*0.0625; //將溫度的高位與低位合并
- t= tt*10+0.5; //對(duì)結(jié)果進(jìn)行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};//時(shí)鐘0-5號(hào)SLED緩沖值
- uchar table1[]={0x00,0x00,0x00,0x00,0x00,0x00};//頻率計(jì)0-5號(hào)SLED緩沖值
- uchar data sled_data[]={0x00,0x00,0x00,0x00,0x00,0x00}; //溫度0-5號(hào)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復(fù)位
- delay(8); //稍做延時(shí)
- DQ = 0; //單片機(jī)將DQ拉低
- delay(80); //精確延時(shí) 大于 480us
- DQ = 1; //拉高總線
- delay(14);
- x=DQ; //稍做延時(shí)后 如果x=0則初始化成功 x=1則初始化失敗
- delay(20);
- }
- //讀一個(gè)字節(jié)
- ReadOneChar(void)
- {
- uchar i=0;
- uchar dat = 0;
- for (i=8;i>0;i--){
- DQ = 0; // 給脈沖信號(hào)
- dat>>=1;
- DQ = 1; // 給脈沖信號(hào)
- if(DQ) dat|=0x80;
- delay(4);
- }
- return(dat);
- }
- //寫(xiě)一個(gè)字節(jié)
- 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); // 跳過(guò)讀序號(hào)列號(hào)的操作
- WriteOneChar(0x44); // 啟動(dòng)溫度轉(zhuǎn)換
- Init_DS18B20();
- WriteOneChar(0xCC); //跳過(guò)讀序號(hào)列號(hào)的操作
- WriteOneChar(0xBE); //讀取溫度寄存器等(共可讀9個(gè)寄存器) 前兩個(gè)就是溫度
- a=ReadOneChar();
- b=ReadOneChar();
- t=b;
- t<<=8;
- t=t|a;
- tt=t*0.0625; //將溫度的高位與低位合并
- t= tt*10+0.5; //對(duì)結(jié)果進(jìn)行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;//復(fù)位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(); /*讀取當(dāng)前溫度*/
- 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]; /*輸出位碼數(shù)據(jù)到數(shù)碼管*/
- WELA=0;
- P0=0xff;
- DULA=1;
- P0 = sled_data[ i]; /*輸出段碼數(shù)據(jù)到數(shù)碼管*/
- if(i==1) P0 = P0|0x80; /*顯示小數(shù)點(diǎn)*/
- 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;//復(fù)位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(); /*讀取當(dāng)前溫度*/
- 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]; /*輸出位碼數(shù)據(jù)到數(shù)碼管*/
- WELA=0;
- P0=0xff;
- DULA=1;
- P0 = sled_data[ i]; /*輸出段碼數(shù)據(jù)到數(shù)碼管*/
- if(i==1) P0 = P0|0x80; /*顯示小數(shù)點(diǎn)*/
- 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;
- }
-
- }
- }
- }
-
-
復(fù)制代碼 |
|