全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:2581
推到 Plurk!
推到 Facebook!

請教以89S51製作鬧鐘的問題

尚未結案
112232002
一般會員


發表:1
回覆:0
積分:0
註冊:2010-04-11

發送簡訊給我
#1 引用回覆 回覆 發表時間:2010-04-11 15:10:35 IP:123.193.xxx.xxx 訂閱
理想的成品是一個手搖控制的鬧鐘
當設定時間到 鬧鐘響
停止則需以手搖控制鬧鐘內部的搖動開關
以觸發接點使聲響關閉(這部分開關已完成)
目前完成功能為
能以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;ifor(j=0;j<120;j );
}
//===========主程式=============================
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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2010-05-09 22:30:02 IP:114.37.xxx.xxx 訂閱
下面的書有你要的範例程式

單晶片8051實作入門
:專題製作篇. 作者:陳明熒/著; 出版社:文魁; 出版日期: 2003年03月18日;


書的外藐如下面網址http://www.books.com.tw/exep/prod/booksfile.php?item=0010218799
penguin5
資深會員


發表:116
回覆:317
積分:431
註冊:2004-05-09

發送簡訊給我
#3 引用回覆 回覆 發表時間:2010-05-09 22:33:49 IP:114.37.xxx.xxx 訂閱
上面是ASM語言,下面這本是C語言

8051單晶片C語言設計實務--使用Keil C(附範例程式)
楊明豐
書號: AEH000300出版日: 2003/02/13





編輯記錄
penguin5 重新編輯於 2010-05-09 22:38:14, 註解 無‧
系統時間:2024-03-29 22:07:17
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!