版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
.黃石理工學(xué)院畢業(yè)設(shè)計(jì)[論文]題目:基于MCS-51的萬(wàn)年歷設(shè)計(jì)院系:電氣與電子信息工程學(xué)院專業(yè):工業(yè)電氣及其自動(dòng)化姓名: 指導(dǎo)老師:黃石理工學(xué)院畢業(yè)設(shè)計(jì)論文附錄一系統(tǒng)原理圖附錄一系統(tǒng)原理圖附錄二系統(tǒng)的PCB圖和元件安裝圖系統(tǒng)的PCB圖系統(tǒng)的PCB圖系統(tǒng)的元件安裝圖系統(tǒng)的元件安裝圖附錄三程序清單LCD1602.h包含文件:/******************************************************************************************************************************************************************************************************液晶模塊LCD1602的操作與控制程序********************************文件名稱:LCD1602.h功能:對(duì)液晶模塊進(jìn)行操作與控制。主要包括對(duì)1602的初始化函數(shù)、寫命令函數(shù)和寫數(shù)據(jù)函數(shù)設(shè)計(jì)者:黃開坤**********************************************************************************/#ifndefLCD1620//條件編譯#include<intrins.h>/***端口定義***********************************************************************/sbitLCD_Rs=P2^5;//命令/數(shù)據(jù)控制線sbitLCD_Rw=P2^6;//讀/寫控制線sbitLCD_En=P2^7;//使能控制線sfrDBport=0x80;//數(shù)據(jù)端口,P0=0x80,P1=0x90,P2=0xA0,P3=0xB0/***測(cè)試LCD忙函數(shù)*****************************************************************/voidLCD_Busy(void){LCD_Rs=0;LCD_Rw=1; _nop_();LCD_En=1;_nop_();while(DBport&0x80);//如果DBport的第七位為1,則LCD忙,繼續(xù)等待LCD_En=0;}/***向LCD寫入命令或數(shù)據(jù)函數(shù)*******************************************************/#defineLCD_COM0//命令#defineLCD_DATA1//數(shù)據(jù)#defineLCD_CLEAR0x01//清屏#defineLCD_HOME0x02//光標(biāo)返回voidLCD_Write(bitstyle,unsignedcharinput)//寫命令或數(shù)據(jù)函數(shù){LCD_En=0;LCD_Rs=style;//style=1為讀寫數(shù)據(jù);style=0為寫命令LCD_Rw=0;//置寫狀態(tài)_nop_();DBport=input;//寫數(shù)據(jù)LCD_En=1;_nop_();LCD_En=0;_nop_();LCD_Busy();}/***置顯示模式*********************************************************************/#defineLCD_SHOW0x04//顯示開#defineLCD_HIDE0x00//顯示關(guān)#defineLCD_CORSOR0x02//顯示光標(biāo)#defineLCD_NO_CORSOR0x00//關(guān)閉光標(biāo)#defineLCD_FLASH0x01//光標(biāo)閃爍#defineLCD_NO_FLASH0x00//光標(biāo)不閃爍voidLCD_ShowMode(unsignedcharShowMode)//設(shè)置顯示模式函數(shù){LCD_Write(LCD_COM,0x08|ShowMode);}/***置輸入模式*********************************************************************/#defineLCD_AC_UP0x02//地址計(jì)數(shù)器AC自增#defineLCD_AC_DOWN0x00//地址計(jì)數(shù)器AC自減voidLCD_InPutMode(unsignedcharInPut)//設(shè)置輸入模式函數(shù){LCD_Write(LCD_COM,0x04|InPut);}/***初使化LCD*********************************************************************/voidLCD_Initial(void){LCD_Write(LCD_COM,0x38);//設(shè)計(jì)8位數(shù)據(jù)接口,2行顯示,5*7點(diǎn)陣字LCD_Write(LCD_COM,0x38);LCD_ShowMode(LCD_SHOW|LCD_NO_CORSOR);//開顯示,無(wú)光標(biāo)LCD_Write(LCD_COM,LCD_CLEAR);//清屏LCD_InPutMode(LCD_AC_UP);//地址計(jì)數(shù)器自增,}/***顯示定位***********************************************************************/voidLCD_GoToXY(unsignedcharx,unsignedchary)//用于指定顯示內(nèi)容在LCD屏上的位置{if(y==1)LCD_Write(LCD_COM,0x80|x); //第一行,第X個(gè)字符 if(y==2) LCD_Write(LCD_COM,0xC0|x); //第二行,第X個(gè)字符}/***顯示數(shù)據(jù)***********************************************************************/voidLCD_Print(unsignedchar*str)//用于將待顯示內(nèi)容送入LCD顯示{while(*str!='\0') {LCD_Write(LCD_DATA,*str); str++; }}/***結(jié)束***************************************************************************/endifDS18B20.h包含文件/*******************************************************************************************************************************************************************************************************溫度傳感器DS18B20的操作與控制程序*********************************文件名稱:DS18B20.h功能:溫度傳感器DS18B20進(jìn)行操作與控制。主要包括對(duì)DS18B20的初始化函數(shù)、寫命令函數(shù)和讀數(shù)據(jù)函數(shù)設(shè)計(jì)者:黃開坤**********************************************************************************/#ifndefDS18B20//條件編譯/***端口定義及變量聲明*************************************************************/;sbitDQ=P2^4;//數(shù)據(jù)傳輸線接單片機(jī)的相應(yīng)的引腳unsignedchartempL=0;//暫存從DS18B20讀出的溫度高位unsignedchartempH=0;//暫存從DS18B20讀出的溫度低位floattemperature;//存放計(jì)算后得出的實(shí)際溫度值unsignedchartemperature_symbol;//溫度的符號(hào)位,為1表示負(fù)溫,為0表示正溫unsignedchartemp[8];//用于存放溫度的ASCII碼/***延時(shí)程序***********************************************************************/voidDS18B20_delay(unsignedcharx)//延時(shí)時(shí)間=機(jī)周*2*X+3;X=0至255{while(--x);}/***初使化*************************************************************************/unsignedcharDS18B20_Initial(void)//對(duì)DS18B20進(jìn)行初使化函數(shù){unsignedcharx=0; DQ=1;//DQ先置高DS18B20_delay(1);//稍延時(shí)DQ=0;//發(fā)送復(fù)位脈沖DS18B20_delay(250);//延時(shí)>480msDQ=1;//拉高數(shù)據(jù)線DS18B20_delay(15);//等待15~60ms x=DQ;//若x=0,則DS18B20存在,否則不存在DS18B20_delay(250);DQ=1;return(x);//返回值用于測(cè)試DS18B20是否存在,為0則存在}/***讀取數(shù)據(jù)***********************************************************************/unsignedcharDS18B20_Read(void)//從DS18B20中讀取數(shù)據(jù){unsignedchari=0;unsignedchardat=0;//暫存讀取的數(shù)據(jù)for(i=0;i<8;i++){dat>>=1;//先讀取低位,逐位讀取DQ=0;//_nop_();//DQ=1;//必須寫1,否則讀出來(lái)的將是不預(yù)期的數(shù)據(jù)DS18B20_delay(1);//稍延時(shí)_nop_();if(DQ)//讀取數(shù)據(jù)dat|=0x80;DS18B20_delay(30);//讀取一位的周期>60usDQ=1;//釋放總線 _nop_();}returndat;//返回讀取的值}/***寫命令或數(shù)據(jù)*******************************************************************/voidDS18B20_Write(unsignedchardat){unsignedchari;for(i=0;i<8;i++){if(dat&0x01)//低位在前{DQ=0;//結(jié)束RecoverytimeDS18B20_delay(1);DQ=1;}//發(fā)送“1”elseDQ=0;//發(fā)送“0”DS18B20_delay(30);//等待DS18B20采樣DQ=1;//_nop_();//dat>>=1;//準(zhǔn)備發(fā)送下一位}}/***讀取溫度值**********************************************************************高位放到tempH里,低位放到tempL里,計(jì)算后的實(shí)際溫度存放到temperature里***********************************************************************************/floatReadTemperature(void){DS18B20_Initial();//初始化DS18B20_Write(0xcc);//跳過(guò)讀序列號(hào)的*作DS18B20_Write(0xbe);//讀溫度寄存器tempL=DS18B20_Read();//讀出溫度的低8位tempH=DS18B20_Read();//讀出溫度的高8位if(tempH&0x80){temperature_symbol=1; //負(fù)溫度值 tempH=~tempH;tempL=~tempL; temperature=(tempH*256+tempL+1)*0.0625;//計(jì)算實(shí)際溫度 }else{temperature_symbol=0;//正溫度值 temperature=(tempH*256+tempL)*0.0625; //計(jì)算實(shí)際溫度 }DQ=1;DS18B20_Initial();//初始化DS18B20_Write(0xcc);//跳過(guò)讀序列號(hào)的*作DS18B20_Write(0x44);//啟動(dòng)溫度轉(zhuǎn)換,為下一次讀取溫作準(zhǔn)備return(temperature);}/***數(shù)值變換(把浮點(diǎn)數(shù)轉(zhuǎn)換成相應(yīng)的字符串)*******************************************/voidIntToStr(floatt){ temp[0]=(unsignedchar)(t/100)%10+'0';//百位 temp[1]=(unsignedchar)(t/10)%10+'0';//十位 temp[2]=(unsignedchar)t%10+'0';//個(gè)位 temp[3]='.';//小數(shù)點(diǎn) temp[4]=(unsignedchar)(t/0.1)%10+'0';//小數(shù) temp[5]=''; temp[6]='C';//溫度單位 temp[7]='\0'; if(temperature_symbol) //判斷正負(fù), {temp[0]='-';//負(fù)號(hào) if(temp[1]=='0') temp[1]='';//消去無(wú)效位 } else {if(temp[0]=='0'||temp[0]=='-') temp[0]='';//消去無(wú)效位 if(temp[1]=='0') temp[1]='';//消去無(wú)效位 } }/***結(jié)束***************************************************************************/#endif主程序DataAndTime.c文件/*******************************************************************************************************************************************************************************************************基于MSC-51單片機(jī)的萬(wàn)年歷程序********************************文件名稱:DataAndTime.c設(shè)計(jì)者:黃開坤**********************************************************************************/#include<reg51.h>#include<LCD1602.h>#include<DS18B20.h>sbitled=P3^7;//LCD屏背光燈控制線sbitPlay=P3^0;//啟到發(fā)音/***全局變量***********************************************************************/unsignedcharyear=7;//年變量,初始值為2007年unsignedcharmonth=4;//月孌量,初始值為4月unsignedcharday=20;//日變量,初始值為20日unsignedcharweek=5;//周,初始值為周5unsignedcharhour=12;//時(shí),初始值為12unsignedcharminute=0;//分,初始值為0unsignedcharsecond=0;//秒,初始值為0unsignedcharTimer_hour=12;//定時(shí)器的時(shí)變量unsignedcharTimer_minute=0;//定時(shí)器的分變量unsignedchardays=30;//用于存放每月的天數(shù),初使值為30天unsignedcharTimer_Ring=1;//定時(shí)器提示音編號(hào)unsignedcharled_on=15;//LCD顯示屏背光燈亮的時(shí)間unsignedcharNumber=0;//用于指定報(bào)第幾個(gè)音bitTemperature_sin=1;//溫度轉(zhuǎn)換標(biāo)志,為1,則啟動(dòng)溫度轉(zhuǎn)換并刷新bitLeapYear_sin=0;//潤(rùn)年標(biāo)志,1為潤(rùn)年,0為非潤(rùn)年bitTimer_sin=0;//定時(shí)器響應(yīng)標(biāo)志,為1表示定時(shí)已到,正在響應(yīng)bitTimer_ON_OFF;//定時(shí)器開/關(guān)標(biāo)志。1開;0為關(guān)bitTimer_Show_sin;//定時(shí)器顯示標(biāo)志,為1表示正處于定時(shí)器顯示狀態(tài)bitSpeak_sin;//報(bào)時(shí)標(biāo)志,為1表示正在報(bào)時(shí)unsignedcharDATA[3];//存放兩位十進(jìn)制數(shù)的ASCII碼unsignedcharWeek_Str[4];//用于存放3個(gè)字符,表示星期,如Mon表示星期一unsignedcharVoice[4];//存放兩位十進(jìn)數(shù)的語(yǔ)音地址unsignedcharSpeak[11];//存放將要報(bào)出的語(yǔ)音/***0-10語(yǔ)音地址表****************************************************************/unsignedcharcodeVoiceTab[]={0x00,0x04,0x08,0x0c,0x10,0x14,0x18,0x1c,0x20,0x24};/***2000--2099年中的潤(rùn)年表********************************************************/unsignedcharcodeLeap_YearTAB[]={4,8,12,16,20,24,28,32,36,40,44,48,52,56,60,64,68,72,76,80,84,88,92,96};/***計(jì)算潤(rùn)年***********************************************************************/voidLeap_Year(unsignedcharYears){ unsignedchari; for(i=0;i<24;i++) { if(Years==Leap_YearTAB[i])//用查表的方法確定是否為潤(rùn)年 {LeapYear_sin=1;break;}else LeapYear_sin=0; }}/***計(jì)算每月的天數(shù)*****************************************************************/unsignedcharMomth_Days(unsignedcharMonths){switch(Months) {case2:{if(LeapYear_sin==1)//二月份天數(shù),潤(rùn)年為29天,非潤(rùn)年為28天 days=29; else days=28; };break; case4: //四、六、九、十一月份為30天 case6: case9: case11:days=30;break; default:days=31;//其余月份為31天 } days=days+1 ; return(days);//返回值=某月的實(shí)際天數(shù)+1。} /***星期轉(zhuǎn)換**********************************************************************/voidWeekToStr(charn){switch(n){case1:{Week_Str[0]='M';//星期一,Mon Week_Str[1]='o'; Week_Str[2]='n'; Week_Str[3]='\0'; };break; case2:{Week_Str[0]='T';//星期二,Tue Week_Str[1]='u'; Week_Str[2]='e'; Week_Str[3]='\0'; };break; case3:{Week_Str[0]='W';//星期三,Wen Week_Str[1]='e'; Week_Str[2]='n'; Week_Str[3]='\0'; };break; case4:{Week_Str[0]='T';//星期四,Thu Week_Str[1]='h'; Week_Str[2]='u'; Week_Str[3]='\0'; };break; case5:{Week_Str[0]='F';//星期五,F(xiàn)ri Week_Str[1]='r'; Week_Str[2]='i'; Week_Str[3]='\0'; };break; case6:{Week_Str[0]='S';//星期六,Sat Week_Str[1]='a'; Week_Str[2]='t'; Week_Str[3]='\0'; };break; case7:{Week_Str[0]='S';//星期日,Sun Week_Str[1]='u'; Week_Str[2]='n'; Week_Str[3]='\0'; };break; }}/***類型轉(zhuǎn)換(將字符型數(shù)據(jù)轉(zhuǎn)換成相應(yīng)的ASCII碼**************************************/voidCharToStr(unsignedchart){ DATA[0]=(t/10)%10+'0';//取十位,并轉(zhuǎn)換成相應(yīng)的ASCII碼 DATA[1]=t%10+'0';//取個(gè)位,并轉(zhuǎn)換成相應(yīng)的ASCII碼 DATA[2]='\0';//字符串結(jié)束符}/***延時(shí)程序***********************************************************************/voidDelay1ms(unsignedcharn)//延時(shí)時(shí)間≈(4*n+996*n)us=nms{unsignedchark=166; while(--n) {while(--k) ; }}/***鍵盤掃描程序*******************************************************************/unsignedcharKey_Scan(void){ if((P2&0x0f)!=0x0f)//判斷P.4--P2.7是否有鍵按下 {Delay1ms(10);//延時(shí)10ms,消抖動(dòng) if((P2&0x0f)!=0x0f) {led_on=15;//LCD屏的背光燈亮的時(shí)間重新賦值 led=1; //只要有鍵按下,LCD背光燈就亮 Timer_sin=0;//只要有鍵按下,鬧鈴?fù)V? switch(P2&0x0f) {case0x0e:{while((P2&0x0f)!=0x0f)//等待按鍵釋放 ; return1; //P2.4上的鍵按下,1號(hào)鍵 };break; case0x0d:{while((P2&0x0f)!=0x0f)//等待按鍵釋放 ; return2; //P2.5上的鍵按下,2號(hào)鍵 };break; case0x0b:{while((P2&0x0f)!=0x0f)//等待按鍵釋放 ; return3; //P2.6上的鍵按下,3號(hào)鍵 };break; case0x07:{while((P2&0x0f)!=0x0f)//等待按鍵釋放 ; return4; //P2.7上的鍵按下,4號(hào)鍵 };break; default:return0; } } } else return0;}/***數(shù)字——語(yǔ)音變換***************************************************************/voidNumberToVoice(unsignedcharnumber)//將數(shù)字轉(zhuǎn)換成相應(yīng)的讀音。(0≤number<60){unsignedchara,b; a=(number/10)%10;//取十位值 b=number%10;//取個(gè)位值 if(a==0)//0≤number<10時(shí)的讀音,(一個(gè)音) {Voice[0]=VoiceTab[b];// Voice[1]=0xff;// } if(a!=0&&b==0)//number的個(gè)位為0,十位不為0時(shí)的讀音 {if(a==1)//10的讀音 {Voice[0]=0x28;// Voice[1]=0xff;// } Voice[0]=VoiceTab[a];//個(gè)位為0,十位不為0和1時(shí)的讀音 Voice[1]=0x28;// Voice[2]=0xff;// } if(a==1&&b!=0)//10<number<20時(shí)的讀音,(兩個(gè)音) {Voice[0]=0x28;// Voice[1]=VoiceTab[b];// Voice[2]=0xff;// } if((a!=0&&a!=1)&&b!=0)//number的個(gè)位不為0,十位不為0和1時(shí)的讀音 {Voice[0]=VoiceTab[a];// Voice[1]=0x28;// Voice[2]=VoiceTab[b];// Voice[3]=0xff;// }}/***語(yǔ)音報(bào)時(shí)***********************************************************************/voidSpeakTime(void)//語(yǔ)音報(bào)時(shí)函數(shù){unsignedcharj,i=0; Speak[i]=0x3c;//報(bào)時(shí)前湊音 i++; Speak[i]=0x2c;//“現(xiàn)在時(shí)刻” NumberToVoice(hour);//“小時(shí)” for(j=0;j<5;j++) {i++ ; if(Voice[j]==0xff) {Speak[i]=0x34;//“點(diǎn)” break; } Speak[i]=Voice[j]; } NumberToVoice(minute);//“分鐘” for(j=0;j<5;j++) {i++; if(Voice[j]==0xff) {Speak[i]=0x38; //“分” break; } Speak[i]=Voice[j]; } i++; Speak[i]=0xff;//報(bào)時(shí)結(jié)束標(biāo)志 EX0=1;//INT0開中 IE0=1;//啟動(dòng)報(bào)時(shí) Speak_sin=1;//報(bào)時(shí)標(biāo)志置1}/***鬧鈴***************************************************************************/voidRing(void){ if(Timer_Ring==1) //鈴聲1 P1=0x44; if(Timer_Ring==2) //鈴聲2 P1=0x58; if(Timer_Ring==3) //鈴聲3 P1=0x70; Timer_sin=1;//表示進(jìn)入鬧鈴狀態(tài) EX0=1; //INT0開中 IE0=1; //啟動(dòng)鬧鈴}/***日歷和時(shí)間調(diào)整*****************************************************************/voidSet_TimeAndDate(void){ unsignedcharkey; EX1=0; //關(guān)閉INT1中斷,停止計(jì)時(shí)LCD_ShowMode(LCD_SHOW|LCD_CORSOR|LCD_FLASH); //開光標(biāo),光標(biāo)閃爍Year_set:LCD_GoToXY(2,1);//年校正 key=Key_Scan();//鍵盤掃描 if(key==1)gotoMonth_set; //如果按下的是功能鍵(1號(hào)鍵),轉(zhuǎn)月校正 if(key==2)year++; //如果按下的是加1鍵(2號(hào)鍵),年加1 if(year==100)//年上限循環(huán) year=0; if(key==3)year--;//如果按下的是減1鍵(3號(hào)鍵),年減1 if(year==-1) //年下限循環(huán) year=99; Leap_Year(year) ;//判斷潤(rùn)年 LCD_GoToXY(2,1); CharToStr(year);//將校正后的年數(shù)據(jù)轉(zhuǎn)換成相對(duì)應(yīng)的ASCII碼 Delay1ms(50);//延時(shí)100ms LCD_Print(DATA);//年顯示刷新 gotoYear_set; //年校正循環(huán)Month_set:LCD_GoToXY(5,1); //月校正 key=Key_Scan();//鍵盤掃描 if(key==1)gotoDay_set;//如果按下的是功能鍵(1號(hào)鍵),轉(zhuǎn)日校正 if(key==2)month++; //如果按下的是加1鍵(2號(hào)鍵),月加1 if(month==13)//月上限循環(huán) month=1; if(key==3)month--;//如果按下的是減1鍵(3號(hào)鍵),月減1 if(month==0) //月下限循環(huán) month=12; CharToStr(month); //將校正后的月數(shù)據(jù)轉(zhuǎn)換成相對(duì)應(yīng)的ASCII碼 Delay1ms(50); //延時(shí)100ms LCD_Print(DATA);//月顯示刷新 Momth_Days(month); //確定校正后,月的天數(shù) gotoMonth_set;//月校正循環(huán)Day_set:LCD_GoToXY(8,1) ;//日校正 key=Key_Scan();//鍵盤掃描 if(key==1)gotoWeek_set; //如果按下的是功能鍵(1號(hào)鍵),轉(zhuǎn)時(shí)校正 if(key==2)day++;//如果按下的是加1鍵(2號(hào)鍵),日加1 if(day==days)//日上限循環(huán) day=1; if(key==3)day--;//如果按下的是減1鍵(3號(hào)鍵),日減1 if(day==0) //日下限循環(huán) day=days-1; CharToStr(day); //將校正后的日數(shù)據(jù)轉(zhuǎn)換成相對(duì)應(yīng)的ASCII碼 Delay1ms(50);//延時(shí)100ms LCD_Print(DATA); //日顯示刷新 gotoDay_set;//日校正循環(huán)Week_set:LCD_GoToXY(12,1) ;//星期調(diào)整 key=Key_Scan();//鍵盤掃描 if(key==1)gotoHour_set; //如果按下的是功能鍵(1號(hào)鍵),轉(zhuǎn)時(shí)校正 if(key==2)week++;//如果按下的是加1鍵(2號(hào)鍵),星期加1 if(week==8)//星期上限循環(huán) week=1; if(key==3)week--;//如果按下的是減1鍵(3號(hào)鍵),星期減1 if(week==0) //星期下限循環(huán) week=7; WeekToStr(week);//將校正后的星期數(shù)據(jù)轉(zhuǎn)換成相對(duì)應(yīng)的ASCII碼 Delay1ms(50);//延時(shí)100ms LCD_GoToXY(12,1); //定位到星期在LCD屏上的顯示位置 LCD_Print(Week_Str); //星期顯示刷新 gotoWeek_set;//日和星期校正循環(huán)Hour_set:LCD_GoToXY(0,2); //時(shí)校正key=Key_Scan();//鍵盤掃描 if(key==1)gotoMinute_set; //如果按下的是功能鍵(1號(hào)鍵),轉(zhuǎn)分校正 if(key==2)hour++; //如果按下的是加1鍵(2號(hào)鍵),時(shí)加1 if(hour==24) //時(shí)上限循環(huán) hour=0; if(key==3)hour--;//如果按下的是減1鍵(3號(hào)鍵),時(shí)減1 if(hour==-1) //時(shí)下限循環(huán) hour=23; CharToStr(hour);//將校正后的時(shí)數(shù)據(jù)轉(zhuǎn)換成相對(duì)應(yīng)的ASCII碼 Delay1ms(50);//延時(shí)100ms LCD_Print(DATA);//時(shí)顯示刷新 gotoHour_set; //時(shí)校正循環(huán)Minute_set:LCD_GoToXY(3,2); //分校正key=Key_Scan();//鍵盤掃描 if(key==1)gotoRET; //如果按下的是功能鍵(1號(hào)鍵),退出校正狀態(tài) if(key==2)minute++; //如果按下的是加1鍵(2號(hào)鍵),分加1 if(minute==60)//分上限循環(huán) minute=0; if(key==3)minute--;//如果按下的是減1鍵(3號(hào)鍵),分減1 if(minute==-1) //分下限循環(huán) minute=59; CharToStr(minute);//將校正后的分?jǐn)?shù)據(jù)轉(zhuǎn)換成相對(duì)應(yīng)的ASCII碼 Delay1ms(50);//延時(shí)100ms LCD_Print(DATA);//分顯示刷新 gotoMinute_set; //分校正循環(huán) RET:EX1=1;//開INT1中斷,開始計(jì)時(shí)LCD_ShowMode(LCD_SHOW|LCD_NO_CORSOR|LCD_NO_FLASH);//關(guān)光標(biāo),光標(biāo)不閃爍}/***定時(shí)器顯示或設(shè)定***************************************************************/voidTimer_Show_Set(void){unsignedcharkey; unsignedcharw=10;bitTimer_set_sin=0;//定時(shí)器設(shè)定標(biāo)志,為1表示處于定時(shí)器設(shè)定狀態(tài) Timer_Show_sin=1;//表示現(xiàn)在已處于定時(shí)器顯示狀態(tài) LCD_Write(LCD_COM,LCD_CLEAR);//清屏 Delay1ms(50); LCD_Print("Timer");//在顯示屏的第一行中間顯示“Timer" CharToStr(Timer_hour) ; LCD_GoToXY(3,2);//定位到顯示屏的第二行第四個(gè)字符 LCD_Print(DATA);//顯示定時(shí)器的時(shí)鐘 LCD_Print(":");//在定時(shí)器的時(shí)鐘后顯示“:” CharToStr(Timer_minute); LCD_Print(DATA);//顯示定時(shí)器的分鐘 LCD_Print("");//在定時(shí)器的分鐘后空一格 if(Timer_ON_OFF==1)LCD_Print("1");//如果Timer_ON_OFF=1,則顯示1,表示定時(shí)開 else LCD_Print("0");//如果Timer_ON_OFF!=1,則顯示0,表示定時(shí)關(guān) LCD_Print("");//空一格 CharToStr(Timer_Ring);//將歌曲編號(hào)轉(zhuǎn)換成相對(duì)應(yīng)的ASCII碼 LCD_Print(DATA);//顯示歌曲編號(hào) while(--w)//在定時(shí)器顯示狀態(tài)下,大約在2s內(nèi)沒(méi)有按下 {//功能鍵,就返回正常顯示狀態(tài) Delay1ms(100); key=Key_Scan(); if(key==1) {Timer_set_sin=1;break;} }if(Timer_set_sin)//Timer_set_sim為1,則進(jìn)入定時(shí)器設(shè)定狀態(tài) {LCD_ShowMode(LCD_SHOW|LCD_CORSOR|LCD_FLASH); //開光標(biāo),光標(biāo)閃爍T_hour_set:LCD_GoToXY(3,2);//定時(shí)器時(shí)設(shè)定 key=Key_Scan();//鍵盤掃描 if(key==1)gotoT_minute_set;//如果按下的是功能鍵(1號(hào)鍵),轉(zhuǎn)定時(shí)器分設(shè)定 if(key==2)Timer_hour++; //如果按下的是加1鍵(2號(hào)鍵),定時(shí)器時(shí)加1 if(Timer_hour==24)//時(shí)上限循環(huán) Timer_hour=0; if(key==3)Timer_hour--;//如果按下的是減1鍵(3號(hào)鍵),定時(shí)器時(shí)減1 if(Timer_hour==-1) //時(shí)下限循環(huán) Timer_hour=23; LCD_GoToXY(3,2); CharToStr(Timer_hour);//將校正后的定時(shí)器時(shí)數(shù)據(jù)轉(zhuǎn)換成對(duì)應(yīng)的ASCII碼 Delay1ms(50);//延時(shí)100ms LCD_Print(DATA);//定時(shí)器時(shí)顯示刷新 gotoT_hour_set; //定時(shí)器時(shí)設(shè)定循環(huán) T_minute_set:LCD_GoToXY(6,2);//定時(shí)器分設(shè)定 key=Key_Scan();//鍵盤掃描 if(key==1)gotoT_ON_OFF; //如果按下的是功能鍵(1號(hào)鍵),退出校正狀態(tài) if(key==2)Timer_minute++; //如果按下的是加1鍵(2號(hào)鍵),分加1 if(Timer_minute==60)//分上限循環(huán) Timer_minute=0; if(key==3)Timer_minute--;//如果按下的是減1鍵(3號(hào)鍵),分減1 if(Timer_minute==-1) //分下限循環(huán) Timer_minute=59; CharToStr(Timer_minute);//將校正后的分?jǐn)?shù)據(jù)轉(zhuǎn)換成相對(duì)應(yīng)的ASCII碼 Delay1ms(50);//延時(shí)100ms LCD_Print(DATA);//分顯示刷新 gotoT_minute_set; //分校正循環(huán)T_ON_OFF:LCD_GoToXY(9,2);//定時(shí)器開/關(guān)設(shè)定key=Key_Scan();//鍵盤掃描 if(key==1)gotoT_song_set;//如果按下的是功能鍵(1號(hào)鍵),轉(zhuǎn)定時(shí)器分校正 if(key==2||key==3) Timer_ON_OFF=!Timer_ON_OFF;//按下加1鍵或減1鍵,定時(shí)器開關(guān)標(biāo)志 //(Timer_ON_OFF)取反,因?yàn)樗挥虚_(1)和關(guān)(0)兩種狀態(tài) Delay1ms(50);//延時(shí)100ms if(Timer_ON_OFF==1)LCD_Print("1");//Timer_ON_OFF=1,則顯示1,表示定時(shí)開 elseLCD_Print("0");//如果Timer_ON_OFF=0,則顯示0,表示定時(shí)關(guān) gotoT_ON_OFF; //定時(shí)器開/關(guān)設(shè)定循環(huán)T_song_set:LCD_GoToXY(11,2);//定時(shí)器提示鈴聲設(shè)定key=Key_Scan();//鍵盤掃描 if(key==1)gotoT_RET; //如果按下功能鍵(1號(hào)鍵),退出定時(shí)器設(shè)定狀態(tài) if(key==2)Timer_Ring++; //如果按下的是加1鍵(2號(hào)鍵),鈴聲編號(hào)加1 if(Timer_Ring==4) Timer_Ring=1; if(key==3)Timer_Ring--;//如果按下的是減1鍵(3號(hào)鍵),鈴聲編號(hào)減1 if(Timer_Ring==0) Timer_Ring=3; CharToStr(Timer_Ring);//將鈴聲編號(hào)轉(zhuǎn)換成相對(duì)應(yīng)的ASCII碼 Delay1ms(50);//延時(shí)100ms LCD_Print(DATA) ;//鈴聲編號(hào)顯示刷新 Ring(); gotoT_song_set;//定時(shí)器提示鈴聲設(shè)定循環(huán)T_RET:Timer_set_sin=0;//退出定時(shí)器設(shè)定狀態(tài) LCD_ShowMode(LCD_SHOW|LCD_NO_CORSOR|LCD_NO_FLASH);//關(guān)光標(biāo),光標(biāo)不閃爍 } Timer_Show_sin=0;//退出定時(shí)器顯示狀態(tài) }/***主程序*************************************************************************/voidmain(void){floati=0;unsignedcharkeys;Delay1ms(250);LCD_Initial();//LCD1602初始化Delay1ms(100);LCD_Print("Welcome");//開機(jī)畫面Delay1ms(50);LCD_GoToXY(0,2);LCD_Print("HangKaiKun");Delay1ms(250); //延時(shí)250msDelay1ms(250);//延時(shí)250msDelay1ms(250); //延時(shí)250msDelay1ms(250); //延時(shí)250msDelay1ms(250); //延時(shí)250msLCD_Write(LCD_COM,LCD_CLEAR);//清屏IT1=1;//置INT1為邊沿觸發(fā)模式IT0=1;//置INT0為邊沿觸發(fā)模式PX1=1;//置INT1為高優(yōu)先級(jí)IE=0x84; //INT1開中while(1){keys=Key_Scan();//鍵盤掃描if(keys==1) //若為功能鍵,轉(zhuǎn)校時(shí)程序Set_TimeAndDate(); if(keys==2) //若為加1鍵,轉(zhuǎn)定是顯示程序 Timer_Show_Set(); if(keys==4&&!Speak_sin) //若為報(bào)時(shí)鍵,轉(zhuǎn)語(yǔ)音報(bào)時(shí)程序 SpeakTime(); if(Timer_sin) //判斷是否響鈴 Ring(); //是,則轉(zhuǎn)響鈴程序while(Temperature_sin){floati;i=ReadTemperature();//讀取溫度值IntToStr(i);//將溫度值轉(zhuǎn)換成相對(duì)應(yīng)的ASCII碼LCD_GoToXY(9,2); //定位到溫度顯示區(qū)LCD_Print(temp); //顯示溫度Temperature_sin=0; //表示溫度處理完畢} }}/***中斷1服務(wù)程序(用于完成計(jì)時(shí)和日歷轉(zhuǎn)變和刷新,以及判斷定時(shí)是否已到)**************/voidint1(void)interrupt2using1{ second++;//秒加1 led_on--;//LCD背光時(shí)間值減1 if((second%2==0)&&!Timer_sin) //如果不在定時(shí)器顯示或設(shè)計(jì)狀態(tài),則每隔 Temperature_sin=1
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年房產(chǎn)交易居間條款
- 2024年家用空調(diào)銷售合同
- 前臺(tái)年終工作總結(jié)(28篇)
- 供房如何退稅申請(qǐng)書范本(15篇)
- 客服的個(gè)人工作計(jì)劃(6篇)
- 2024護(hù)理年度考核總結(jié)(6篇)
- 專題03古詩(shī)文閱讀之《次北固山下》(預(yù)習(xí)積累通關(guān)訓(xùn)練)-2023年小初銜接語(yǔ)文通關(guān)寶典
- 2024年技術(shù)授權(quán)保密協(xié)議
- DB4106T 19-2020 居家養(yǎng)老助潔機(jī)構(gòu)服務(wù)規(guī)范
- 2024年家具企業(yè)品牌形象推廣合同
- 江蘇省南通市2024-2025學(xué)年七年級(jí)上學(xué)期期中英語(yǔ)試卷(含答案解析)
- 中國(guó)人民解放軍空成立紀(jì)念日課件模板
- 2024秋期國(guó)家開放大學(xué)《公共政策概論》一平臺(tái)在線形考(形考任務(wù)1至4)試題及答案
- 2025年考研政治政治理論時(shí)政熱點(diǎn)知識(shí)測(cè)試題庫(kù)及答案(共三套)
- 大學(xué)生生涯發(fā)展展示 (修改)
- 電氣工程師生涯人物訪談報(bào)告
- 康復(fù)評(píng)定技術(shù)說(shuō)課課程匯報(bào)
- 矩陣論同步學(xué)習(xí)輔導(dǎo) 張凱院 西北工業(yè)大學(xué)出版社
- ALT+數(shù)字輸入特殊字符大全版
- 設(shè)備租賃管理制度
- 心內(nèi)科出科考試試題(有答案)
評(píng)論
0/150
提交評(píng)論