51微控制器實戰之電子時鐘

2021-10-09 08:05:54 字數 2223 閱讀 9251

源**

工作模式下,51微控制器從ds1302中獲取資料,再把資料傳遞到lcd來顯示時間和日期;設定模式下,通過k2和k3來改變資料;計時模式下,通過k2來開啟或關閉定時器1,來實現開始/暫停計時,通過k3來計時初始化;鬧鐘響時,開啟定時器1,通過天空之城樂譜來控制蜂鳴器的音調。

十進位制數

8421碼

00000

10001

20010

30011

40100

50101

60110

70111

81000

91001

/*bcd8421編碼,十進位制資料轉換成bcd碼 */

unsigned char encode_bcd(unsigned char dat)

/*bcd8421解碼,bcd碼轉換成十進位制資料 */

unsigned char decode_bcd(unsigned char dat)

讀寫操作

/*寫入資料到ds1302*/

void write_ds1302_dat(unsigned char addr,unsigned char dat)

for(i=0;i<8;i++) //寫入資料

trst = 0; //資料傳輸結束

_nop_();

}/*從ds1302讀取資料*/

unsigned char read_ds1302_dat(unsigned char addr)

for(i=0;i<8;i++) //讀取8位資料

trst = 0;

_nop_(); //以下為ds1302復位的穩定時間,必須的。

tsclk = 1;

_nop_();

tio = 0;

_nop_();

tio = 1;

_nop_();

return dat;

}

輸入

輸出輸出

讀狀態rs=0,rw=h,en為高變低脈衝

d0~d7個狀態值

讀資料rs=1,rw=1,en為高變低脈衝

無寫指令

rs=0,rw=0,d0–d7=資料,en由高脈衝變為低脈衝

d0–d7狀態值

寫資料rs=1, rw=0, d0–d7=資料,en由高脈衝變為低脈衝

d0–d7狀態值

//判斷液晶是否忙,如果忙就等待

void read_busy()

while(busy & 0x80); //判斷狀態碼最高位,sta7讀寫使能,1:禁止,0:允許

}//寫1位元組指令

void write_cmd(unsigned char cmd) //rs=l,rw=l,e=下降沿脈衝

//寫1位元組資料

void write_dat(unsigned char dat) //rs=h,rw=l,e=下降沿脈衝

核心**:

void delay_us(unsigned int t)		 //us延時 12mhz下

void play_tone(unsigned int tone) //播音調函式,就是方波發生器

void delay_ms(unsigned int t)		 //毫秒延時12mhz下

void time_init( void )

void timer1_interrupt(unsigned char *song) //定時器1 中斷

}

歌曲譜子陣列:

unsigned int tones=   			 //c調音調

;unsigned char code sky=;

sbit buzzer=p1^5; //定義buzzer引腳

unsigned char music_s=0, t_tone=0; //music_s用作定時器計時, t_tone儲存音調時長

unsigned int tone=0; //tone儲存音調,

51微控制器電子時鐘

include include define uint unsigned int define uchar unsigned char define key menu 0x01 define key up 0x02 define key down 0x03 define key clk 0x04 d...

關於51微控制器電子時鐘精度的問題

前幾天用stc89c52微控制器製作了乙個電子時鐘,經過一段時間的實驗,發現時間精度存在誤差,一分鐘慢4秒左右。這可了不得,十分鐘就要慢40秒,一天下來不得慢半96分鐘!這個微控制器晶振頻率為11.0592mhz,和大部分時鐘的晶振頻率相同,應該沒有問題。後天考慮到源 在定時器中斷函式裡 void ...

藍橋杯微控制器第8屆 電子時鐘

2毫秒 11.0592mhz void distime uchar i,int time dis else void display else p2 0xc0 p0 semg bit i p2 0x00 p0 0xff i time dis if i 8 i 0 if time dis 500 ti...