時鐘+溫度計(jì)的數(shù)碼管顯示
功能:時鐘顯示,溫度顯示,可調(diào)時間,按鍵發(fā)聲。
說明:
1 功能選擇鍵:按下功能選擇鍵,時間停止,秒鐘指示燈長滅,選擇千位,百位,十位,個位,相對應(yīng)的每位數(shù)碼管的小數(shù)點(diǎn)亮。
2 “加”:按一下“加”按鍵,對應(yīng)的數(shù)字會加一。
3 “減”:按一下“減”按鍵,對應(yīng)的數(shù)字會減一。
4 繼續(xù)按功能選擇鍵到第五次,退出時間設(shè)置,秒鐘指示燈閃爍,時鐘繼續(xù)運(yùn)行。
5 初始化時間為早上6點(diǎn)30分,時間為24小時制。
6 其他功能:添加指示燈。正常運(yùn)行時,綠色指示燈亮,當(dāng)進(jìn)入調(diào)整時間時,紅色指示燈亮。
限于篇幅以下是部分源代碼,完整版本請到http://www.51hei.com/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};/******延時程序*******/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); //稍做延時DQ = 0; //單片機(jī)將DQ拉低delay(80); //精確延時 大于 480usDQ = 1; //拉高總線 delay(4);x=DQ; //稍做延時后 如果x=0則初始化成功 x=1則初始化失敗delay(20);}/***********ds18b20讀一個字節(jié)**************/uchar ReadOneChar(){unsigned char i=0;unsigned char dat = 0;for (i=8;i>0;i--){DQ = 0; // 高電平拉成低電平時讀周期開始dat>>=1;DQ = 1; // 給脈沖信號if(DQ)dat|=0x80; //delay(4);}return(dat);}/*************ds18b20寫一個字節(jié)****************/void WriteOneChar(unsigned char dat){unsigned char i=0;for (i=8; i>0; i--){DQ = 0; //從高電平拉至低電平時,寫周期的開始DQ = dat0x01; //數(shù)據(jù)的最低位先寫入delay(5); //60us到120us延時DQ = 1; dat>>=1; //從最低位到最高位傳入}}/**************讀取ds18b20當(dāng)前溫度************/void ReadTemperature(){unsigned char a=0;unsigned b=0;unsigned t=0;Init_DS18B20();WriteOneChar(0xCC); // 跳過讀序號列號的操作WriteOneChar(0x44); // 啟動溫度轉(zhuǎn)換delay(10); // this message is wery importantInit_DS18B20();WriteOneChar(0xCC); //跳過讀序號列號的操作WriteOneChar(0xBE); //讀取溫度寄存器等(共可讀9個寄存器) 前兩個就是溫度delay(10);a=ReadOneChar(); //讀取溫度值低位 b=ReadOneChar(); //讀取溫度值高位 temp1=b4; //高8位中后三位數(shù)的值temp1+=(a0xf0)>>4; //低8位中的高4位值加上高8位中后三位數(shù)的值 temp1室溫整數(shù)值temp2=a0x0f; //小數(shù)的值temp=((b*256+a)>>4); //當(dāng)前采集溫度值除16得 實(shí)際溫度值 zhenshu xs=temp2*0.0625*10; //小數(shù)位,若為0.5則算為5來顯示 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;}////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////****時鐘 端口定義******/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)時程序***************/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;///////////////////////////////////////////**********報警聲音**************/bi(uint t){int c,n;for(c=0;ct;c++){for(n=0;n50;n++);BEEP=~BEEP; //按位取反BEEP}return(t);}////////////////////////////////////////////////********定時器初始化*************/void init(){TMOD=0x01; //定義定時器0,工作方式1 TH0=(65536-50000)/256; //高8位 TL0=(65536-50000)%256; //低8位 EA=1; //開全局中斷 ET0=1; TR0=1; //打開定時器 }/////////////////////////////////////////////// /***********定時器中斷函數(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==2bai==4){qian=0;bai=0; }} } /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////**********時間顯示***************/ void shijianxianshi() //時間顯示{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 ) //選擇個位{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è)置/////////////////////////**********調(diào)時間功能選擇**********/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();}}
c++相關(guān)文章:c++教程
蜂鳴器相關(guān)文章:蜂鳴器原理
評論