一、系統(tǒng)方案 1、本設計采用51單片機作為主控器。 2、DS1302采集年月日時分秒送到液晶12864顯示。 3、按鍵年月日時分秒,兩路鬧鐘。
二、硬件設計 原理圖如下: 三、單片機軟件設計 1、首先是系統(tǒng)初始化 uchar clock_time[6] = {0X00,0X59,0X23,0X09,0X04,0X11}; //定義時間變量 秒 分 時 日 月 年 uchar alarm_time[2] = { 10, 6}; //鬧鐘設置 alarm_time[0]: 分鐘 alarm_time[1] :小時 uchar alarm_time2[2] = { 15, 7}; Lcd_Initial(); //LCD初始化 Clock_Fresh( clock_time ); //我把時間刷新放在這里,proteus會調(diào)用當前系統(tǒng)時間, Clock_Initial( clock_time ); //時鐘初試化
/***********************中斷初始化***************************/ EA = 1; //開總中斷 ET0 = 1; //Timer0 開中斷 TMOD = 0x01; //Timer0 工作方式 1 TH0 = 0x3c; TL0 = 0XB0; //延時 50 ms 2、液晶顯示程序
void showXY(uchar row,uchar col,uchar x,uchar y,uchar *tab){ uchar i,j; bit right; if(col<64){right=0;} else {col-=64;right=1;} for(i=0;i<y;i++){ if(right)cs1=1,cs2=0; else cs1=0,cs2=1; Lcd_Write_Command(addX0+row+i); Lcd_Write_Command(addY0+col); for(j=0;j<x;j++){ if(col+j<64)Lcd_Write_Byte(tab[i*x+j]); else if(right==0) { cs1=1,cs2=0; Lcd_Write_Command(addX0+row+i); Lcd_Write_Command(addY0+(col+j-64)); Lcd_Write_Byte(tab[i*x+j]); } } } } /* 返回一個8*16字符索引位置 */ uchar enN(uchar *s){ uchar i; for(i=0;zm8x16_index[ i]!=0;i++) [ i] if(zm8x16_index[ i]==s[0])break; return i; } /* 返回一個16*16字符索引位置 */ uchar cnN(uchar *s){ uchar i; for(i=0;zm16x16_index[ i]!=0;i+=2) if(zm16x16_index[ i]==*s&&zm16x16_index[i+1]==*(s+1))break ; return i/2; } /* 顯示中英文字符串 */ void showStr(uchar row,uchar col,uchar *s) { uchar i; for(i=0;s[ i]!=0;i++){ if(s[ i]<0x80){
showXY(row,col,8,2,zm8x16_Table[enN(&s[ i])]); col+=8; }else{ showXY(row,col,16,2,zm16x16_Table[cnN(&s[ i])]);
col+=16;i+=1; } if(col>120) { col=0; row+=2; } } } 3、按鍵程序 /******************************************************************************************** * 函數(shù)名稱:Key_Idle() * 功 能:鍵盤松開 * 入口參數(shù):無 * 出口參數(shù):無 *********************************************************************************************/ void Key_Idle() { while( ( P1 & 0x0f ) != 0x0f ); }
/******************************************************************************************** * 函數(shù)名稱:Key_Scan() * 功 能:鍵盤掃描 * 入口參數(shù):無 * 出口參數(shù):鍵值 *********************************************************************************************/ uchar Key_Scan() { if( ( P1 & 0x0f ) != 0x0f ) //判斷按鍵 { Delay(10); //消除抖動 // Lcd_Initial(); if( ( P1 & 0x0f ) != 0x0f ) { switch ( P1 & 0x0f ) //將按鍵碼轉(zhuǎn)換成鍵值 { case 0x0e: return up_array; case 0x0d: return down_array; case 0x0b: return clear_array; case 0x07: return function_array; default : return null; } } } return null; } 4、核心算法程序 void main( void ) { uchar clock_time[6] = {0X00,0X59,0X23,0X09,0X04,0X11}; //定義時間變量 秒 分 時 日 月 年 uchar alarm_time[2] = { 10, 6}; //鬧鐘設置 alarm_time[0]: 分鐘 alarm_time[1] :小時 uchar alarm_time2[2] = { 15, 7}; Lcd_Initial(); //LCD初始化 Clock_Fresh( clock_time ); //我把時間刷新放在這里,proteus會調(diào)用當前系統(tǒng)時間, Clock_Initial( clock_time ); //時鐘初試化
/***********************中斷初始化***************************/ EA = 1; //開總中斷 ET0 = 1; //Timer0 開中斷 TMOD = 0x01; //Timer0 工作方式 1 TH0 = 0x3c; TL0 = 0XB0; //延時 50 ms
while( 1 ) {
{ Clock_Fresh( clock_time ); //時間刷新 Lcd_Clock( clock_time ); //時間顯示
Calendar_Convert( 0 , clock_time ); Week_Convert( 0, clock_time );
//鬧鐘1報警 if( * alarm_time == HexNum_Convert(* ( clock_time + 1 ) )) //分鐘相吻合 if( * ( alarm_time + 1 ) == HexNum_Convert(*( clock_time + 2 )) ) //小時相吻合 { if(HexNum_Convert(*( clock_time )) == 2) TR0 = 1; //啟動Timer0 } //鬧鐘2報警 if( * alarm_time2 == HexNum_Convert(* ( clock_time + 1 ) )) //分鐘相吻合 if( * ( alarm_time2 + 1 ) == HexNum_Convert(*( clock_time + 2 )) ) //小時相吻合 { if(HexNum_Convert(*( clock_time )) == 2) TR0 = 1; //啟動Timer0 } } switch( Key_Scan() ) { case up_array: { //Lcd_Initial(); Key_Idle(); } break; case down_array: { // Lcd_Initial(); Key_Idle(); } break; case clear_array: { // Lcd_Initial(); Key_Idle(); } break; case function_array: { //Lcd_Initial(); Key_Function( clock_time, alarm_time ,alarm_time2); } break; case null:
break; } } } 四、 proteus仿真設計 Proteus軟件是一款應用比較廣泛的工具,它可以在沒有硬件平臺的基礎上通過自身的軟件仿真出硬件平臺的運行情況,這樣就可以通過軟件仿真來驗證我們設計的方案有沒有問題,如果有問題,可以重新選擇器件,連接器件,直到達到我們設定的目的,避免我們搭建實物的時候,如果當初選擇的方案有問題,我們器件都已經(jīng)焊接好了,再去卸載下去,再去焊接新的方案的器件,測試,這樣會浪費人力和物力,也給開發(fā)者帶來一定困惑,Proteus仿真軟件就很好的解決這個問題,我們在設計之初,就使用該軟件進行模擬仿真,測試,選擇滿足我們設計的最優(yōu)方案。最后根據(jù)測試沒問題的仿真圖紙,焊接實物,調(diào)試,最終完成本設計的作品。
|