請教以89S51製作鬧鐘的問題 |
尚未結案
|
112232002
一般會員 發表:1 回覆:0 積分:0 註冊:2010-04-11 發送簡訊給我 |
理想的成品是一個手搖控制的鬧鐘
當設定時間到 鬧鐘響 停止則需以手搖控制鬧鐘內部的搖動開關 以觸發接點使聲響關閉(這部分開關已完成) 目前完成功能為 能以LCM顯示時間 貼上的這個是改過的 不知道能否進入至更改時間 進而顯示出來於LCM 麻煩幫忙鑑定 另外還有一些問題 1.以下的程式 目前程式的理想功能為 當S2 按下 進入分鐘設定 再按下S2 進入小時設定 再按下S2 回復到正常顯示 請問目前我有做到這些功能嗎? 2.(如果以下功能沒錯誤的話) 因為要區分設定時間與設定鬧鈴時間 所以我該如何調整案鈕按下的時間 進入設定時間&鬧鐘時間 語法該如何做調整? 麻煩提點 3.設定鬧鐘時間的部分 需要用到暫存器嗎(是我想太多了嗎 還是只需要設定變數 if(時間)=變數 鬧鐘就響 是這樣子嗎 是在main迴圈執行 還是在void clock(void)interrupt 迴圈做執行 我被這兩個迴圈搞得很亂 以下是我目前完成的部分 #include #define LCDP P2 sbit RS = P3^7; sbit RW = P3^6; sbit E = P3^5; sbit BF = P2^7; sbitS1=P1^2; sbitS2=P1^3; sbitS3=P1^4; charcount=20; chartime[10]; char code am[32] = { 0x00, 0x00, 0x01, 0x80, 0x03, 0xC0, 0x07, 0xE0, 0x0F, 0xF0, 0x1F, 0xF8, 0x3F, 0xFC, 0x7F, 0xFE, 0x00, 0x00, 0x18, 0x44, 0x24, 0x6C, 0x24, 0x6C, 0x3C, 0x54, 0x24, 0x54, 0x24, 0x44, 0x00, 0x00}; char code pm[32] = { 0x00, 0x00, 0x7F, 0xFE, 0x3F, 0xFC, 0x1F, 0xF8, 0x0F, 0xF0, 0x07, 0xE0, 0x03, 0xC0, 0x01, 0x80, 0x00, 0x00, 0x38, 0x44, 0x24, 0x6C, 0x24, 0x6C, 0x38, 0x54, 0x20, 0x54, 0x20, 0x44, 0x00, 0x00}; bit ampm=0; char hour=0; char minute=0; char second=0; void transfer(void); void write_inst(char); void write_char(char); void write_pat(void); void check_BF(void); void init_LCM(void); voiddelay1ms(int); voidstate(void); voidset_hour(void); voidset_minute(void); voiddisplay(void); //=======設定set_hour voidset_hour(void) {if(S1==0) {delay1ms(20); hour ; if (hour == 13) hour=1; } } //=======設定set_minute voidset_minute(void) {if(S1==0) {delay1ms(20); minute ; if (minute>=60) minute=0; } } //====設定delay voiddelay1ms(int x) {int i,j; for(i=0;i } //===========主程式============================= main() {char i ,X; init_LCM(); write_pat(); IE=0X82; TMOD=0x01; TH0=(56636-50000) / 256; TL0=(56636-50000) % 256; TR0=1; while(1) {if(S2==1) {delay1ms(20); X ;} // 當設定案下 x 1 if(X==1)set_minute(); //x=1進入設定分鐘 if(X==2)set_hour(); //x=2進入設定小時 if(X==3)X=0; //使x回到顯示時間 transfer(); write_inst(0x80); for (i=0;i<10;i ) write_char(time[i]); } } //====轉換函數=================== void transfer(void) {time[0]= hour/10 0x30; time[1]= hour 0x30; time[2]= ':'; time[3]= minute/10 0x30; time[4]= minute 0x30; time[5]= ':'; time[6]= second/10 0x30; time[7]= second 0x30; time[8]=0x00; if (ampm==0) time[9]=0x00; else time[9]=0x02; } //====寫入自建字型函數=================== void write_pat(void) {char i; write_inst(0x40); for (i=0;i<32;i ) write_char(am[i]); for (i=0;i<32;i ) write_char(pm[i]); } //===== Timer 0中斷副程式 ======================= void clock(void)interrupt 1 {TH0=(56636-50000)/256; TL0=(56636-50000)%6; if ( count==20) {count=0; second ; if (second>=60) {second=0; minute ; if (minute>=60) {minute=0; hour ; if (hour == 13) hour=1; if (hour == 12) ampm=~ampm; set_minute(); set_hour(); transfer(); }}}} //====初始設定函數(8位元傳輸模式)=================== void init_LCM(void) {write_inst(0x30); write_inst(0x30); write_inst(0x30); write_inst(0x38); write_inst(0x08); write_inst(0x01); write_inst(0x06); write_inst(0x0c); } //==== 寫入指令函數 ================================ void write_inst(char inst) {check_BF(); LCDP = inst; RS = 0; RW = 0; E = 1; check_BF(); } //==== 寫入字元資料函數 ============================ void write_char(char chardata) {check_BF(); LCDP = chardata; RS = 1; RW = 0 ;E = 1; check_BF(); } //====檢查忙碌函數================================ void check_BF(void) {E=0; do { BF=1; RS = 0; RW = 1;E = 1; }while(BF == 1); } 謝謝您細心看完這一長串的文章 感謝 接觸89S51 也半學期了 進入了專題製作 這也是我的點子 因為剛好當天早上起不來 所以就響到這個IDEA 其時89S51很好玩 但是都不懂語法 讓我好無力與無助 就好像 給我槍 卻沒子彈 因為我自己其實對於 電腦設定的東西 很感興趣 可以便利自己的生活 可能剛接觸都會這樣吧 努力在適應8951的我 |
penguin5
資深會員 發表:116 回覆:317 積分:431 註冊:2004-05-09 發送簡訊給我 |
下面的書有你要的範例程式
單晶片8051實作入門:專題製作篇. 作者:陳明熒/著; 出版社:文魁; 出版日期: 2003年03月18日; 書的外藐如下面網址http://www.books.com.tw/exep/prod/booksfile.php?item=0010218799 |
penguin5
資深會員 發表:116 回覆:317 積分:431 註冊:2004-05-09 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |