2010年11月2日
花了幾個(gè)小時(shí),完成“時(shí)鐘溫度計(jì)” 的程序,在此感謝“康哥”的支持!
功能:時(shí)鐘顯示,溫度顯示,可調(diào)時(shí)間,按鍵發(fā)聲。
說(shuō)明:
1 功能選擇鍵:按下功能選擇鍵,時(shí)間停止,秒鐘指示燈長(zhǎng)滅,選擇千位,百位,十位,個(gè)位,相對(duì)應(yīng)的每位數(shù)碼管的小數(shù)點(diǎn)亮。
2 “加”:按一下“加”按鍵,對(duì)應(yīng)的數(shù)字會(huì)加一。
3 “減”:按一下“減”按鍵,對(duì)應(yīng)的數(shù)字會(huì)減一。
4 繼續(xù)按功能選擇鍵到第五次,退出時(shí)間設(shè)置,秒鐘指示燈閃爍,時(shí)鐘繼續(xù)運(yùn)行。
5 初始化時(shí)間為早上6點(diǎn)30分,時(shí)間為24小時(shí)制。
6 其他功能:添加指示燈。正常運(yùn)行時(shí),綠色指示燈亮,當(dāng)進(jìn)入調(diào)整時(shí)間時(shí),紅色指示燈亮。
限于篇幅以下是部分源代碼,完整版本請(qǐng)到http://www.zg4o1577.cn/f/shiz5.rar 去下載
#include"reg51.h" #define uchar unsigned char #define uint unsigned int /****溫度 端口定義******/ sbit wx5=P2^5; sbit wx6=P2^6; sbit wx7=P2^7; sbit DQ=P2^0; uint temp, temp1,temp2, xs; uchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99, 0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6}; /******延時(shí)程序*******/ void delay1(unsigned int m) { unsigned int i,j; for(i=m;i>0;i--) for(j=110;j>0;j--); } void delay(unsigned int m) { while(m--); } void Init_DS18B20() { unsigned char x=0; DQ = 1; //DQ復(fù)位 ds18b20通信端口 delay(8); //稍做延時(shí) DQ = 0; //單片機(jī)將DQ拉低 delay(80); //精確延時(shí) 大于 480us DQ = 1; //拉高總線 delay(4); x=DQ; //稍做延時(shí)后 如果x=0則初始化成功 x=1則初始化失敗 delay(20); } /***********ds18b20讀一個(gè)字節(jié)**************/ uchar ReadOneChar() { unsigned char i=0; unsigned char dat = 0; for (i=8;i>0;i--) { DQ = 0; // 高電平拉成低電平時(shí)讀周期開(kāi)始 dat>>=1; DQ = 1; // 給脈沖信號(hào) if(DQ) dat|=0x80; // delay(4); } return(dat); } /*************ds18b20寫(xiě)一個(gè)字節(jié)****************/ void WriteOneChar(unsigned char dat) { unsigned char i=0; for (i=8; i>0; i--) { DQ = 0; //從高電平拉至低電平時(shí),寫(xiě)周期的開(kāi)始 DQ = dat&0x01; //數(shù)據(jù)的最低位先寫(xiě)入 delay(5); //60us到120us延時(shí) DQ = 1; dat>>=1; //從最低位到最高位傳入 } } /**************讀取ds18b20當(dāng)前溫度************/ void ReadTemperature() { unsigned char a=0; unsigned b=0; unsigned t=0; Init_DS18B20(); WriteOneChar(0xCC); // 跳過(guò)讀序號(hào)列號(hào)的操作 WriteOneChar(0x44); // 啟動(dòng)溫度轉(zhuǎn)換 delay(10); // this message is wery important Init_DS18B20(); WriteOneChar(0xCC); //跳過(guò)讀序號(hào)列號(hào)的操作 WriteOneChar(0xBE); //讀取溫度寄存器等(共可讀9個(gè)寄存器) 前兩個(gè)就是溫度 delay(10); a=ReadOneChar(); //讀取溫度值低位 b=ReadOneChar(); //讀取溫度值高位 temp1=b<<4; //高8位中后三位數(shù)的值 temp1+=(a&0xf0)>>4; //低8位中的高4位值加上高8位中后三位數(shù)的值 temp1室溫整數(shù)值 temp2=a&0x0f; //小數(shù)的值 temp=((b*256+a)>>4); //當(dāng)前采集溫度值除16得 實(shí)際溫度值 zhenshu xs=temp2*0.0625*10; //小數(shù)位,若為0.5則算為5來(lái)顯示 xs小數(shù) xiaoshu } ////////////////////////////////////////////////////////////////////////////// /***********溫度顯示********************/ void wenduxianshi() //溫度顯示 { wx5=1; P0=table[temp/10]; delay1(3); wx5=0; wx6=1; P0=table[temp%10]; delay1(3); wx6=0; wx7=1; P0=table[12]; delay1(3); wx7=0; } //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////// /****時(shí)鐘 端口定義******/ sbit wx1=P2^1; sbit wx2=P2^2; sbit wx3=P2^3; sbit wx4=P2^4; uchar qian,bai,shi,ge,miao1,miao2,count; sbit LED1=P3^3; //////////////////////////////////////////// /***************按鍵調(diào)時(shí)程序***************/ sbit K1=P3^0; sbit K2=P3^1; sbit K3=P3^2; sbit LVSE =P3^4; //綠色運(yùn)行燈 sbit HONGSE =P3^5; //紅色停止燈 sbit HUANGSE=P3^6; //黃色調(diào)鬧鐘燈 sbit BEEP=P3^7; //// 定義蜂鳴器口 uchar K1num,K2num; ////////////////////////////////////////// /**********報(bào)警聲音**************/ bi(uint t) { int c,n; for(c=0;c<t;c++) { for(n=0;n<50;n++); BEEP=~BEEP; //按位取反BEEP } return(t); } /////////////////////////////////////////////// /********定時(shí)器初始化*************/ void init() { TMOD=0x01; //定義定時(shí)器0,工作方式1 TH0=(65536-50000)/256; //高8位 TL0=(65536-50000)%256; //低8位 EA=1; //開(kāi)全局中斷 ET0=1; TR0=1; //打開(kāi)定時(shí)器 } /////////////////////////////////////////////// /***********定時(shí)器中斷函數(shù)************/ void timer0() interrupt 1 { TH0=50; TL0=50; count++; if( count==20 ) { count=0; LED1=~LED1; miao1++; if( miao1==10 ) { miao1=0; miao2++; } if( miao2== 6 ) { miao2=0; ge++; } if( ge==10 ) { ge=0; shi++; } if( shi== 6 ) { shi=0; bai++; } if( bai==10 ) { bai=0; qian++; } if( qian== 3 ) { qian=0; } if(qian==2&&bai==4){qian=0;bai=0; } } } ////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////// /**********時(shí)間顯示***************/ void shijianxianshi() //時(shí)間顯示 { if( K1num==0 ) //復(fù)位 { TR0=1;LVSE=0; HONGSE=1;HUANGSE=1; wx1=1; P0=table[qian]; delay1(3); wx1=0; wx2=1; P0=table[bai]; delay1(3); wx2=0; wx3=1; P0=table[shi]; delay1(3); wx3=0; wx4=1; P0=table[ge]; delay1(3); wx4=0; } /**************************************/ if( K1num==1 ) //選擇千位 { TR0=0;LED1=1;LVSE=1; HONGSE=0; HUANGSE=1; wx1=1; P0=table[qian]+0x80; delay1(3); wx1=0; wx2=1; P0=table[bai]; delay1(3); wx2=0; wx3=1; P0=table[shi]; delay1(3); wx3=0; wx4=1; P0=table[ge]; delay1(3); wx4=0; } /**************************************/ if( K1num==2 ) //選擇百位 { wx1=1; P0=table[qian]; delay1(3); wx1=0; wx2=1; P0=table[bai]+0x80; delay1(3); wx2=0; wx3=1; P0=table[shi]; delay1(3); wx3=0; wx4=1; P0=table[ge]; delay1(3); wx4=0; } /**************************************/ if( K1num==3 ) //選擇十位 { wx1=1; P0=table[qian]; delay1(3); wx1=0; wx2=1; P0=table[bai]; delay1(3); wx2=0; wx3=1; P0=table[shi]+0x80; delay1(3); wx3=0; wx4=1; P0=table[ge]; delay1(3); wx4=0; } /**************************************/ if( K1num==4 ) //選擇個(gè)位 { wx1=1; P0=table[qian]; delay1(3); wx1=0; wx2=1; P0=table[bai]; delay1(3); wx2=0; wx3=1; P0=table[shi]; delay1(3); wx3=0; wx4=1; P0=table[ge]+0x80; delay1(3); wx4=0; } } //////////////////////////////////////////////////////////////////////////////////// ///////////////////按鍵功能設(shè)置///////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////// void keycan() { ///////////////////時(shí)鐘功能設(shè)置//////////////////////// /**********調(diào)時(shí)間功能選擇**********/ if( K1==0 ) { K1num++; delay(5); if( K1==0 ) { while(!K1); bi(200); if(K1num==5 ) { K1num=0;TR0=1;} } } /////////////////////////////////////////////////// /*********功能加*********/ if( K1num!=0 ) { if( K2==0 ) { delay(5); if( K2==0 ) { while(!K2);bi(200); if( K1num==1 ) { qian++; if(qian==3 ) qian=0; } if( K1num==2 ) { bai++; if( bai==10) bai=0; } if( K1num==3 ) { shi++; if( shi==6 ) shi=0; } if( K1num==4 ) { ge++; if( ge==10) ge=0; } } } } ////////////////////////////////////////////////////////// /**********功能減************/ if( K1num!=0 ) { if( K3==0 ) { delay(5); if( K3==0 ) { while(!K3);bi(200); if( K1num==1 ) { qian--; if(qian==-1) qian=2; } if( K1num==2 ) { bai--; if( bai==-1) bai=9; } if( K1num==3 ) { shi--; if( shi==-1) shi=5; } if( K1num==4 ) { ge--; if( ge==-1) ge=9; } } } } } ///////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////// /***********主函數(shù)********************/ //////////////////////////////////////////////////////////// void main() { init(); qian=0;bai=6;shi=3;ge=0;miao2=0;miao1=0; while(1) { ReadTemperature(); wenduxianshi(); keycan(); shijianxianshi(); } }