可自定義小時、分鐘的1602鬧鐘程序
功能:時間,時分鬧鐘設(shè)置,上下限溫度設(shè)置,溫度顯示。
鬧鐘可設(shè)置到分鐘,響鈴時間還是10秒鐘。
可擴展功能:音樂響鈴,一個星期中的任何一天鬧鐘設(shè)定,需要添加或者修改一下程序即可,程序只是簡單的整理了一下,很多地方很亂,需要程序的朋友最好有較好的編程能力,否者很難理解程序的寫作思維。
仿真圖
完整的源代碼下載: http://www.51hei.com/ziliao/file/1602_naoz.rar
#include"reg51.h"#define uchar unsigned char #define uint unsigned int sbit BEEP=P3^7; //// 定義蜂鳴器口unsigned char L,H,Z,Y; //// 定義高低溫度變量//////////////////////////////////////////////////////**********報警聲音**************/bi(uint t){int c,n;for(c=0;ct;c++){for(n=0;n50;n++);BEEP=~BEEP; //按位取反BEEP}return(t);}//////////////////////////////////////////////**********18b20溫度程序**********/ sbit DQ=P3^6; //定義溫度數(shù)據(jù)口int xs; //定義小數(shù) unsigned int temp,temp1,temp2; //定義溫度轉(zhuǎn)換變量 ///////////////////////////////////////////////////*********18B20延時程序************/void delay_18B20(unsigned int i){while(i--);}//////////////////////////////////////////////////////*********ds18b20初始化函數(shù)*********/void Init_DS18B20(void) {unsigned char x=0;DQ = 1; //DQ復位 ds18b20通信端口 delay_18B20(8); //稍做延時DQ = 0; //單片機將DQ拉低 delay_18B20(80); //精確延時 大于 480usDQ = 1; //拉高總線delay_18B20(4);x=DQ; //稍做延時后 如果x=0則初始化成功 x=1則初始化失敗delay_18B20(20);}/////////////////////////////////////////////////////////********ds18b20讀一個字節(jié)**********/unsigned char ReadOneChar(void){unsigned char i=0,dat = 0;for (i=8;i>0;i--){DQ = 0; //高電平拉成低電平時讀周期開始dat>>=1;DQ = 1; //給脈沖信號if(DQ)dat|=0x80; delay_18B20(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_18B20(5); //60us到120us延時DQ = 1; dat>>=1; //從最低位到最高位傳入}}////////////////////////////////////////////////////////////**************讀取ds18b20當前溫度************/void ReadTemperature(void){unsigned char a=0,b=0,t=0;Init_DS18B20 ( );WriteOneChar ( 0xCC ); // 跳過讀序號列號的操作WriteOneChar ( 0x44 ); // 啟動溫度轉(zhuǎn)換delay_18B20 ( 100 ); // this message is wery importantInit_DS18B20 ( );WriteOneChar ( 0xCC ); //跳過讀序號列號的操作WriteOneChar ( 0xBE ); //讀取溫度寄存器等(共可讀9個寄存器) 前兩個就是溫度delay_18B20 ( 100 );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 ); //當前采集溫度值除16得 實際溫度值 zhenshu xs=temp2*0.0625*10; //小數(shù)位,若為0.5則算為5來顯示 xs小數(shù) xiaoshu }/////////////////////////////////////////////////////////////////////*********************1602液晶程序********************//******定義液晶控制口*******/ sbit lcdrs=P2^5; //定義液晶三個控制口sbit lcdrw=P2^6;sbit lcden=P2^7;sbit K1=P3^0; //定義三個開關(guān)sbit K2=P3^1;sbit K3=P3^2;////////////////////////////////////////////////////////////******定義變量*******/uchar count,shi,fen,miao,xq,K1num; //定義時間程序里所需要的變量///////////////////////////////////////////////////////////////////******定義數(shù)組*******/// uchar code table [ ]= "H:38 L:25 00 Q:7"; //液晶界面顯示的內(nèi)容// uchar code table1[ ]= "23:59:55 . C";uchar code table [ ]= "01:00:55 01-01"; //液晶界面顯示的內(nèi)容uchar code table1[ ]= "H:38 L:25 . C";//////////////////////////////////////////////////////////////******延時程序*******/ void delay(uint m) //液晶延時程序{uint i,j;for(i=m;i>0;i--)for(j=110;j>0;j--);}////////////////////////////////////////////////////////////////////////////////////////////// /**********寫指令*************/ void write_com(uchar com){lcdrs=0;lcdrw=0;lcden=0;P0=com;delay(5);lcden=1;delay(5);lcden=0;}////////////////////////////////////////////////////////************寫數(shù)據(jù)*************/ void write_data(uchar date){lcdrs=1;lcdrw=0;lcden=0;P0=date;delay(5);lcden=1;delay(5);lcden=0;}//////////////////////////////////////////////////////////////////////////////////////////////////////////////////***************液晶顯示程序***************/ /*********時分秒數(shù)的分離**********/ void write_sfm(uchar add,uchar date){ uchar shi,ge; //分離數(shù)字,如35,分成3和5 shi=date/10; ge=date%10; write_com ( 0x80+add ); write_data ( 0x30+shi ); write_data ( 0x30+ge ); }///////////////////////////////////////////////////////////////////**********星期***********/ void write_xq(uchar add1,uchar date1){uchar ge; //星期只需要一個數(shù)字顯示 ge=date1%10; write_com ( 0x80+add1 ); write_data ( 0x30+ge ); }/////////////////////////////////////////////////////////////////************高溫低溫數(shù)的分離************/void write_HL(uchar add2,uchar date2){uchar shi,ge; shi=date2/10; ge=date2%10; write_com(0x80+0x40+add2); write_data( 0x30+shi ); write_data( 0x30+ge ); }/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////***************按鍵調(diào)時程序***************/ void keycan(){/**********功能選擇**********/ if( K1==0 ) { K1num++; delay(1); if( K1==0 ) { while(!K1);bi(200);if( K1num==1 ) { TR0=0; write_com ( 0x80+1 ); write_com(0x0f); } //時if( K1num==2 ) { write_com ( 0x80+4 ); } //分if( K1num==3 ) { write_com ( 0x80+7 ); } //秒//if( K1num==4 ) { write_com ( 0x80+11 ); } //星期if( K1num==4 ) { write_com ( 0x80+12 ); } //鬧鐘if( K1num==5 ) { write_com ( 0x80+15 ); }if( K1num==6 ) { write_com ( 0x80+0x40+3 ); } //上限if( K1num==7 ) { write_com ( 0x80+0x40+8 ); } //下限if( K1num==8 ) { K1num=0; write_com(0x0c); TR0=1; } //退出設(shè)置} }///////////////////////////////////////////////////////////////////////*********功能加*********/ if( K1num!=0 ) {if( K2==0 ) { delay(1);if( K2==0 ) { while(!K2);bi(200);if( K1num==1 ) { shi++; if( shi==24 ) shi=0; write_sfm ( 0,shi ); write_com ( 0x80+1 ); } if( K1num==2 ) { fen++; if( fen==60 ) fen=0; write_sfm ( 3,fen ); write_com ( 0x80+4 ); }if( K1num==3 ) { miao++; if( miao==60 ) miao=0; write_sfm ( 6,miao); write_com ( 0x80+7 ); }//if( K1num==4 ) { xq++; if( xq==8 ) xq=1; write_xq (11,xq ); write_com ( 0x80+11); }if( K1num==4 ) { Z++; if( Z==24 ) Z=0; write_sfm (11,Z ); write_com ( 0x80+12); }if( K1num==5 ) { Y++; if( Y==60 ) Y=0; write_sfm (14,Y ); write_com ( 0x80+15); }if( K1num==6 ) { H++; if( H==100) H=0; write_HL ( 2,H ); write_com ( 0x80+0x40+3);}if( K1num==7 ) { L++; if( L==100) L=0; write_HL ( 7,L ); write_com ( 0x80+0x40+8);}}}} ////////////////////////////////////////////////**********功能減************/ if(K1num!=0) {if(K3==0 ) { delay(1);if(K3==0 ) { while(!K3); bi(200);if( K1num==1 ) { shi--; if( shi==-1 ) shi=23; write_sfm ( 0,shi ); write_com ( 0x80+1 ); } if( K1num==2 ) { fen--; if( fen==-1 ) fen=59; write_sfm ( 3,fen ); write_com ( 0x80+4 ); }if( K1num==3 ) {miao--; if( miao==-1 ) miao=59; write_sfm ( 6,miao); write_com ( 0x80+7 ); }// if( K1num==4 ) { xq--; if( xq==0 ) xq=7; write_xq (11,xq ); write_com ( 0x80+11); }if( K1num==4 ) { Z--; if( Z==-1 ) Z=23; write_sfm (11,Z ); write_com ( 0x80+12); }if( K1num==5 ) { Y--; if( Y==-1 ) Y=59; write_sfm (14,Y ); write_com ( 0x80+15); }if( K1num==6 ) { H--; if( H==-1 ) H=99; write_HL ( 2,H ); write_com ( 0x80+0x40+3);}if( K1num==7 ) { L--; if( L==-1 ) L=99; write_HL ( 7,L ); write_com ( 0x80+0x40+8);}}}}}////////////////////////////////////////////////////////////*************初始化**************/void init(){uchar num; //定義一個變量num,用于下面數(shù)組的初始化// lcden=0;write_com ( 0x38 );write_com ( 0x0c ); //不顯示光標 write_com ( 0x06 ); //光標向右邊自動移位 write_com ( 0x01 ); //清屏 shi=1; fen=00; miao=55; //xq=7; H=38; L=25; Z=1; Y=1;write_com ( 0x80 ); for( num=0; num16; num++ ){ write_data( table[num] ); delay(5); }write_com ( 0x80+0x40 ); for( num=0; num16; num++ ){ write_data( table1[num] ); delay(5); }////////////////////////////////////////////////////////////********定時器初始化*************/ 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=(65536-50000)/256;TL0=(65536-50000)%256;count++;if( count==20 ) { count=0; miao++;if( miao==60 ) { miao=0; fen++; } if( fen==60 ) { fen=0; shi++; } if( shi==24 ) { shi=0; //xq++;//if( xq==8 ) { xq=1; } } }}//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////*****************************************/uchar code mytab[8]={0x0C,0x12,0x12,0x0C,0x00,0x00,0x00,0x00};/* 設(shè)定顯示位置 /**************************************/void lcd_pos(uchar pos){ write_com(pos | 0x80) ; //數(shù)據(jù)指針=80+地址變量}//////////////////////////////////////////////*自定義字符寫入CGRAM /*********************************/void writetab() { unsigned char i ;write_com(0x40) ; //寫CGRAMfor (i = 0 ; i 8 ; i++) write_data(mytab[ i ]) ; }/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////void wendu() /////溫度顯示程序///// {writetab( ) ; //自定義字符寫入CGRAMdelay ( 5 ) ;lcd_pos ( 0x4e ) ; //顯示圈圈write_data( 0x00 ) ; //顯示自定義字符 write_com ( 0x0c );ReadTemperature(); write_com ( 0x80+0x40+10 ); write_data ( 0x30+temp/10 );write_com ( 0x80+0x40+11 );write_data ( 0x30+temp%10 );write_com ( 0x80+0x40+13 );write_data ( 0x30+xs%10 );/////時間顯示地址///// write_sfm( 0,shi ); write_sfm( 3,fen );write_sfm( 6,miao );// write_xq (11,xq ); } ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////溫度報警程序//////void baojing(){ if(H==temp){bi(500);}if(L==temp){bi(500);}if((Z==shi)(Y==fen)(miao10)) //設(shè)定報警,響10秒鐘結(jié)束。{ { bi(500);}}}///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////***************主函數(shù)***************/ void main(){init();while(1) {keycan();wendu(); baojing();}}
51單片機相關(guān)文章:51單片機教程
c++相關(guān)文章:c++教程
蜂鳴器相關(guān)文章:蜂鳴器原理
評論