源**工作模式下,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...