當前位置:首頁 » 編程語言 » 51單片機c語言電子時鍾
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

51單片機c語言電子時鍾

發布時間: 2022-01-13 13:39:37

❶ 51單片機 c語言寫的電子時鍾程序 請幫忙指正!

單片機程序是基於硬體基礎上開發的,你至少添加註釋和硬體環境說明,不然大家都不知道怎麼幫你。
你直接給出代碼,也不清楚需要指正什麼,這里也沒有設置時間/鬧鍾的代碼,發文前應該清楚表達要問的內容。

1)假設你的晶振是12MHz,那一個機器周期是1MHz,定時器的最長定時周期是(65535/10^6)你想要1/6秒觸發一次中斷就必須結合軟體計時,為了盡量精確:硬體計時40000次,軟體計時25次那麼定時器的設這應該是TH1=(65535-40000)%256;TL1=(65535-40000)%256,(注意計數器大部分是加法計數)
2)按鍵監聽沒有給出思路,也沒有處理按鍵抖動,我只能分析程序:
有一個外部中斷觸發時間設置,P34設置小時、P35設置分鍾,但是調整時間後沒有進行顯示,你至少要讓數碼管顯示結果才能知道怎麼調整。

❷ 誰能告訴我51單片機簡單的led數碼管時鍾程序 24小時制的(c語言版的)

#include "reg52.h"
#define uint unsigned int
#define uchar unsigned char
uchar code tab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
uchar shi,fen,miao;
uchar time;
void delay(uint x)
{
uint y;
for(;x>0;x--)
{
for(y=0;y<124;y++);
}
}
void display(uchar shi,uchar fen,uchar miao)
{
P2=0; //位碼
P0=(tab[shi/10]); //段碼
delay(2);
P2=1;
P0=(tab[shi%10]);
delay(2);
P2=2; //位碼
P0=0x40; //段碼
delay(2);
P2=3; //位碼
P0=(tab[fen/10]); //段碼
delay(2);
P2=4;
P0=(tab[fen%10]);
delay(2);
P2=5; //位碼
P0=0x40; //段碼
delay(2);
P2=6; //位碼
P0=(tab[miao/10]); //段碼
delay(2);
P2=7;
P0=(tab[miao%10]);
delay(2);

}
void main()
{
TMOD=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=1;
ET0=1;
TR0=1;
while(1)
{

if(time==20)
{
time=0;
miao++;
if(miao==60)
{
miao=0;
fen++;
if(fen==60)
{
fen=0;
shi++;
if(shi==24)
shi=0;
}

}

}
display(shi,fen,miao);
}
}
void timer0() interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
time++;
}

/*還有什麼不明白繼續追加*/

❸ 求51單片機電子鍾c語言程序

三個介面分別接8個LED燈,分別表示時分秒

不知道是要怎麼樣的效果啊~是閃一下一秒還是一個一個累加上去的閃啊~又或者是一個以個地亮?
LZ說成這樣實在很難辦啊~都不知道要怎麼寫~12864的偶又寫過~用LEDd的畫要簡單很多~不過LZ要求寫的不清楚啊~不知道這么下手了~

❹ 如何用c語言編程實現用89c51單片機控制8個led燈像電子時鍾那樣顯示

假設你單片機的p1口連了led燈:
#include

sbit
led
=
p1^0;//這是點第一位燈
int
main(void)
{
while(1)
{
led
=
0;//假設led燈為共陽極的
}
return
0;
}
點亮led燈的形式有很多,這里給出一種僅供參考

❺ 用AT89C51單片機設計一電子鬧鍾,C語言程序和模擬

可以用單片機內部定時器來完成,
#include <reg52.h>
#include <string.h>
#define uchar unsigned char
#define uint unsigned int
/* 函數申明 -----------------------------------------------*/
void TransferData(char data1,bit DI);
void display(void);
void display_grapic(void);
void delayms(uint n);
void DisplayLine(uchar line1,uchar line2);
void DisplayGraphic(uchar code *adder);
void delay(uint m);
void lcd_mesg(uchar code *adder1);
unsigned char Convert(unsigned char In_Date);
void initinal(void);
void initina2(void) ;
void lcd_m(uchar adder1,uchar adder2,uchar a);
/* 變數定義 -----------------------------------------------*/
uchar scnt = 0 ;
uchar last_scnt = 0 ;
uchar updat_vision = 0 ;
sbit key1 = P3^5 ;
sbit key2 = P3^7 ;
sbit key3 = P3^6 ;
sbit gnd = P3^0 ;
sbit spk = P1^0 ;
uchar timer_miao = 0 ;
uchar timer_fen = 0 ;
uchar timer_shi = 0 ;
uchar cnt = 0 ;
uchar sw = 0 ;
uchar spk_on = 0 ;
uchar noise_shi = 0 ;
uchar noise_fen = 0 ;
uint count = 0 ;
uint count1 = 0 ;
uint count2 = 0 ;
uchar time_rch = 0 ;
sbit datacs=P2^6;
sbit chipcs=P2^7;
uchar code table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x07,
0x39,0x5e,0x79,0x71
};
/*
********************************************************************************
** 函數名稱 : Init_Timer0(void)
** 函數功能 : 定時器初始化子程序
********************************************************************************
*/
void Init_Timer0(void) //定時器初始化子程序
{
TMOD |= 0x11; //使用模式1,16位定時器,使用"|"符號可以在使用多個定時器時不受影響
TH0=0x3c; //給定初值,這里使用定時器最大值從0開始計數一直到65535溢出
TL0=0xaf;
TH1=0x03; //給定初值,這里使用定時器最大值從0開始計數一直到65535溢出
TL1=0xe8;
EA=1; //總中斷打開
ET0=1; //定時器中斷打開
TR0=1; //定時器開關打開
ET1=1;
TR0=1;
}
/*
********************************************************************************
** 函數名稱 : Timer0_isr(void) interrupt 1 using 1
** 函數功能 : 定時器中斷程序
********************************************************************************
*/
void Timer0_isr(void) interrupt 1 using 1
{
TH0=0x3c; //重新賦值,方式1是16位計數器,不能硬體重裝初始值
TL0=0xaf;

if(cnt<20)
{
cnt ++ ;
}else
{
cnt = 0 ;
if(sw==0)
{
if(timer_miao<59)
{
timer_miao++;
}else
{
timer_miao = 0 ;
if(timer_fen<59)
{
timer_fen++;
}else
{
timer_fen = 0 ;
if(timer_shi<23)
{
timer_shi++;
}else
{
timer_shi = 0 ;
}
}
}
}
}
}
void Timer1_isr(void) interrupt 3
{
TH1=0x03; //給定初值,這里使用定時器最大值從0開始計數一直到65535溢出
TL1=0xe8;
if(scnt<7)
{
scnt ++ ;
}else
{
scnt = 0 ;
}
switch(scnt)
{
case 0 : P0 = 0xfe ;chipcs = 1 ; chipcs = 0 ; P0=table[timer_miao%10] ;datacs=1;datacs=0; break ;
case 1 : P0 = 0xfd ;chipcs = 1 ; chipcs = 0 ; P0=table[timer_miao/10] ;datacs=1;datacs=0; break ;
case 2 : P0 = 0xfb ;chipcs = 1 ; chipcs = 0 ; P0= 0x40 ;datacs=1;datacs=0; break ;
case 3 : P0 = 0xf7 ;chipcs = 1 ; chipcs = 0 ; P0=table[timer_fen%10] ;datacs=1;datacs=0;break ;
case 4 : P0 = 0xef ;chipcs = 1 ; chipcs = 0 ; P0=table[timer_fen/10] ;datacs=1;datacs=0;break ;
case 5 : P0 = 0xdf ;chipcs = 1 ; chipcs = 0 ; P0= 0x40 ;datacs=1;datacs=0; break ;
case 6 : P0 = 0xbf ;chipcs = 1 ; chipcs = 0 ; P0=table[timer_shi%10] ;datacs=1;datacs=0;break ;
case 7 : P0 = 0x7f ;chipcs = 1 ; chipcs = 0 ; P0=table[timer_shi/10] ;datacs=1;datacs=0;break ;
}
}
void key(void)
{
if(key1==0)
{
if(count<8000)
count ++ ;
}else
{
if(count>5000)
{
if(sw<3)
sw++;
else
sw=0;
}
count = 0 ;
}
if(key2==0)
{
if(count1<8000)
count1 ++ ;
}else
{
if(count1>5000)
{
switch(sw)
{
case 0 : spk_on = 1 ; time_rch=0;break ;
case 1 : if(timer_shi<23)timer_shi++;else timer_shi = 0 ; break ;
case 2 : if(timer_fen<59)timer_fen++;else timer_fen = 0 ; break ;
case 3 : if(timer_miao<59)timer_miao++;else timer_miao = 0 ; break ;
}
}
count1 = 0 ;
}
if(key3==0)
{
if(count2<8000)
count2 ++ ;
}else
{
if(count2>5000)
{
switch(sw)
{
case 0 : spk_on = 0 ; time_rch=0; break ;
case 1 : if(timer_shi>0)timer_shi--;else timer_shi = 23 ; break ;
case 2 : if(timer_fen>0)timer_fen--;else timer_fen = 59 ; break ;
case 3 : if(timer_miao>0)timer_miao--;else timer_miao = 59 ; break ;
}
}
count2 = 0 ;
}
}
/********************************************************************
* 名稱 : Main()
* 功能 : 主函數
* 輸入 : 無
* 輸出 : 無
***********************************************************************/
void main(void)
{
sw=0;
noise_shi = 0 ;
noise_fen = 2 ;
Init_Timer0();
while(1)
{
key();
}
}

❻ 單片機C語言編程簡易數字電子時鍾

#include <AT89X52.h>
unsigned char X=10,sec,flag;
unsigned char key[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};// 數碼管顯示數字表
unsigned char key2[]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10};
unsigned char key1[]={0,0,0,0};//key1[0]=9 key1[1]=1 key1[2]=2 key1[3]=3
void delay02s(void);
void dislplay(void);
void dislplay1(void);
void tim1(void);
void main()
{

tim1();
while(1)
{
if(flag==0) dislplay();
else dislplay1();
}
}

void time1(void) interrupt 3
{
TR1=0;
X=X-1;
if(X==0)
{
flag=flag+1;
if(flag==2)
{
flag=0;
sec=sec+1;

if(sec==60)
{
sec=0;
key1[3]=key1[3]+1;
if(key1[3]==10);
{
key1[3]=0;
key1[2]=key1[2]+1;
if(key1[2]==6)
{
key1[2]=0;
key1[1]=key1[1]+1;
if(key[0]!=2)
{
if(key1[1]==10)
{
key1[1]=0;
key1[0]=key1[0]+1;
}
}
if(key[0]==2)
{
if(key[1]==4)
{
key1[1]=0;
key1[0]=0;
}
}
}
}
}
}
X=10;
}

TL1=0xb0;
TH1=0x3c;
TF1=0;
TR1=1;
}

void tim1(void)
{
TMOD =0X10;
TL1=0xb0;
TH1=0x3c;
EA=1;
ET1=1;
TR1=1;
}

void dislplay(void)
{
P2=0xfe;
P0=key[key1[0]];
delay02s();
P2=0xfd;
P0=key[key1[1]];
delay02s();
P2=0xfb;
P0=key[key1[2]];
delay02s();
P2=0xf7;
P0=key[key1[3]];
delay02s();
}
void dislplay1(void)
{
P2=0xfe;
P0=key[key1[0]];
delay02s();
P2=0xfd;
P0=key2[key1[1]];
delay02s();
P2=0xfb;
P0=key[key1[2]];
delay02s();
P2=0xf7;
P0=key[key1[3]];
delay02s();
}
void delay02s(void)
{
unsigned char i,j,k;
for(i=2;i>0;i--)
{
for(j=15;j>0;j--) //198
{
for(k=25;k>0;k--)//248
{
;
}
}

}
}
我空間還有其他的 http://user.qzone.qq.com/615543707/infocenter?ptlang=2052&ADUIN=615543707&ADSESSION=1276219802&ADTAG=CLIENT.QQ.2653_Mysrv.0

❼ 求51單片機電子鍾的C程序代碼

自己寫吧,寫完會有很多感悟的

❽ 大家有基於51單片機來實現電子鍾的C語言程序嗎用LED顯示作為顯示,最好具有鬧鈴功能..謝謝!

#include <at89x52.h>
#include <DS1302.h>
//定義共陽極字型碼0123456789-
unsigned char code dispcode[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf};
unsigned char time[]={0,0,0,0};//用來儲存時間
unsigned char date[]={0,0,0,0};//用來儲存日期
unsigned char year[]={0,0,0,0};//用來儲存年份
unsigned char week[]={0};//用來儲存星期

SYSTEMTIME time1; //在ds1302.h文件中已經定義了一個名字為SYSTEMTIME的結構體,在這里我們定義一個變數名
//為time的SYSTEMTIME結構體
void delay(unsigned char i) //延時子程序
{
unsigned char j;
while((i--)!=0)
{
for(j=123;j>0;j--);
}
}
unsigned char button_time(n,x,y) //時鍾調整子程序
unsigned char n,x,y;
{
if(P1_7==0)
{
delay(50);
if(P1_7==0)
{
n++;
if(n==x)
n=0;
while(P1_7==0); //等待按鍵釋放
}
}

if(P1_5==0)
{
delay(50);
if(P1_5==0)
{
if(n==0)
n=y;
else
n--;
while(P1_5==0);
}
}
return n;
}

unsigned char button_date(n,x,y) //日期調整子程序
unsigned char n,x,y;
{
if(P1_7==0)
{
delay(50);
if(P1_7==0)
{
n++;
if(n==x)
n=1;
while(P1_7==0);
}
}

if(P1_5==0)
{
delay(50);
if(P1_5==0)
{
if(n==1)
n=y;
else
n--;
while(P1_5==0);
}
}
return n;
}
unsigned char button_year(n,x,y) //年份調整子程序
unsigned char n,x,y;
{
if(P1_7==0)
{
delay(50);
if(P1_7==0)
{
n++;
if(n==x)
n=2;
while(P1_7==0);
}
}

if(P1_5==0)
{
delay(50);
if(P1_5==0)
{
if(n==2)
n=y;
else
n--;
while(P1_5==0);
}
}
return n;
}
void display(minute10,minute1,hour10,hour1) //顯示子程序
unsigned char minute10,minute1,hour10,hour1;
{

P2=0xfe;
P0=dispcode[minute10];//顯示分的十位
delay(1);

P2=0xfd;
P0=dispcode[minute1]; //顯示分的個位
delay(1);

P2=0xfb;
P0=dispcode[hour10]; //顯示時的十位
delay(1);

P2=0xf7;
P0=dispcode[hour1]; //顯示時的個位
delay(1);
}
void display1(week1)
unsigned char week1;
{

P2=0xef;
P0=dispcode[week1];
delay(1);
}

void main()
{
unsigned char flag,aa=2,bb=0;
Initial_DS1302(); //初始化DS1302這個時鍾晶元,
while(1)
{
DS1302_GetTime(&time1); //讀取時間參數

time[3]=(time1.Minute)%10; //把分的個位數據存入time[3]
time[2]=(time1.Minute)/10; //把分的十位數據存入time[2]
time[1]=(time1.Hour)%10; //把時的個位數據存入time[1]
time[0]=(time1.Hour)/10; //把時的十位數據存入time[0]
date[3]=(time1.Day)%10;
date[2]=(time1.Day)/10;
date[1]=(time1.Month)%10;
date[0]=(time1.Month)/10;
year[1]=(time1.Year)%10;
year[0]=(time1.Year)/10;
week[0]=(time1.Week);

display1(week[0]); //顯示星期

if(P1_4==0) //如果按下Time Start鍵一下,時鍾開始正常顯示時間,再按一下,顯示日期,再按一下,顯示年份
{
delay(50);
if(P1_4==0)
{
flag++;
if(flag>2)
{
flag=0;
}
}
while(P1_4==0);
}
if(P1_6==0) //如果按下Time Set鍵一下,開始顯示日期,再按一下開始顯示年份,再按一下,進入年份,日期,星期和時間的調節模式
{
delay(50);
if(P1_6==0)
{
flag++;
if(flag>8)
{
flag=0;
}
}
while(P1_6==0);
}

switch(flag)
{
case 0:display(time[0],time[1],time[2],time[3]); //調用子函數display,把存入數組time的數據給顯示出來
break;

case 1:display(date[0],date[1],date[2],date[3]); //調用子函數display,把存入數組date的數據給顯示出來
break;
case 2:display(aa,bb,year[0],year[1]); //調用子函數display,把存入數組year的數據給顯示出來
break;

case 3:time1.Year=button_year(time1.Year,2099,2098); //調整年
DS1302_SetTime(0x8c,time1.Year);
display(aa,bb,year[0],year[1]);
break;

case 4:time1.Month=button_date(time1.Month,13,12); //調整月
DS1302_SetTime(0x88,time1.Month);
display(date[0],date[1],10,10);
break;

case 5:time1.Day=button_date(time1.Day,32,31); //調整日
DS1302_SetTime(0x86,time1.Day);
display(10,10,date[2],date[3]);
break;
case 6:time1.Week=button_date(time1.Week,8,7); //調整星期
DS1302_SetTime(0x8a,time1.Week);
display1(week[0]);
break;

case 7:time1.Hour=button_time(time1.Hour,24,23); //調整時
DS1302_SetTime(0x84,time1.Hour);
display(time[0],time[1],10,10);
break;

case 8:time1.Minute=button_time(time1.Minute,60,59); //調整分
DS1302_SetTime(0x82,time1.Minute);
display(10,10,time[2],time[3]);
break;

}

}

}

❾ 求c51單片機電子鍾程序(c語言)

#include <reg51.h>
#define uchar unsigned char //定義unsigned int為uint
#define uint unsigned int //定義unsigned uchar為uchar

sbit LCD_RS = P2^0 ;
sbit LCD_RW = P2^1 ;
sbit LCD_EN = P2^2 ;
sbit D_SDA = P2^6; //定義74HC164數據線為P2.6埠
sbit D_SCL = P2^7; //定義74HC164數據線為P2.7埠
sbit CLK = P1^3; /*實時時鍾時鍾線引腳 */
sbit IO = P1^4; /*實時時鍾數據線引腳 */
sbit RST = P1^5; /*實時時鍾復位線引腳 */

sbit ACC0 = ACC^0;
sbit ACC7 = ACC^7;

uchar time[8] = {0x50,0x30,0x19,0x30,0x12,0x06,0x06};

//========= 延時函數 ============
//延時時間以1ms為單位
//s決定延時時間長短
void delay_ms(uint s)
{
uint x;
for(s;s>0;s--)
{
x = 200;
while(x--);
}
}

//========= 送出一個位元組給74HC164(實現串並轉換) ==========
void send_out(unsigned char out)//傳送一個位元組8位
{
uchar i;
D_SCL = 0;
for (i=8;i>=1;i--)
{
D_SDA = out&0x80; //送數據到數據口
D_SCL = 1; //時鍾線置1
D_SCL = 0; //送一時鍾
out<<=1; //左移
}
}

//========= 寫命令函數 ==========
void lcd_wcmd(uchar cmd)
{
LCD_RS = 0;
LCD_RW = 0;
LCD_EN = 0;
send_out(cmd);
LCD_EN = 1;
LCD_EN = 0 ;
}

//========= 寫數據函數 ==========
void lcd_wdat(uchar dat)
{
LCD_RS = 1;
LCD_RW = 0;
LCD_EN = 0;
send_out(dat);
LCD_EN = 1;
LCD_EN = 0;
}

//========= LCD初始化函數 ==========
void lcd_init()
{
lcd_wcmd(0x38);
delay_ms(1);
lcd_wcmd(0x0c); //顯示開,關游標
delay_ms(1);
lcd_wcmd(0x06); //向右移動游標
delay_ms(1);
lcd_wcmd(0x01); //清除LCD顯示屏
delay_ms(1);
}

//========== 往DS1302寫入1Byte數據 (內部函數) =============
void w_byte(uchar dat)
{
uchar i;
for(i=8; i>0; i--)
{
IO = dat & 0x01;
CLK = 1;
CLK = 0;
dat = dat >> 1;
}
}

//======== 從DS1302讀取1Byte數據 (內部函數) ===================
uchar r_byte(void)
{
uchar i;
for(i=8; i>0; i--)
{

ACC = ACC >> 1;
ACC7 = IO;
CLK = 1;
CLK = 0;

}
return(ACC);
}

//========== 指定地址往DS1302寫入1Byte數據 (內部函數) =============
void write_byte(uchar addr, uchar dat)
{
RST = 0;
CLK = 0;
RST = 1;
w_byte(addr);
w_byte(dat);
CLK = 1;
RST = 0;
}

//========== 指定地址往DS1302讀1Byte數據 (內部函數) =============
uchar read_byte(uchar addr)
{
uchar ucData;
RST = 0;
CLK = 0;
RST = 1;
w_byte(addr);
ucData = r_byte();
CLK = 1;
RST = 0;
return(ucData);
}

//============ 設置ds1302日期和時間 =============
void write_ds1302(uchar *p)
{
uchar i;
uchar addr = 0x80;
write_byte(0x8e,0x00); // 控制命令,WP=0,寫操作
for(i =7; i>0; i--)
{
write_byte(addr,*p); // 秒 分 時 日 月 星期 年
p++;
addr +=2;
}
write_byte(0x8e,0x80); // 控制命令,WP=1,防寫
}

//============ 讀ds1302當前日期和時間 =============
void read_ds1302(uchar *p)
{
uchar i;
uchar addr = 0x81;
for (i=0; i<7; i++)
{
*p = read_byte(addr); //格式為: 秒 分 時 日 月 星期 年
addr += 2;
p++;
}
}

//============ 顯示函數 ===================
void lcd_disp()
{
uchar addr = 4;
lcd_wcmd(0x80 + addr);
lcd_wdat(((time[2]>>4)&0x0f)+0x30); //顯示小時
addr++;
lcd_wcmd(0x80 + addr);
lcd_wdat((time[2]&0x0f)+0x30);
addr++;

lcd_wcmd(0x80 + addr);
lcd_wdat(':'); //顯示":"
addr++;

lcd_wcmd(0x80 + addr);
lcd_wdat(((time[1]>>4)&0x0f)+0x30); //顯示分
addr++;
lcd_wcmd(0x80 + addr);
lcd_wdat((time[1]&0x0f)+0x30);
addr++;

lcd_wcmd(0x80 + addr);
lcd_wdat(':'); //顯示":"
addr++;

lcd_wcmd(0x80 + addr);
lcd_wdat(((time[0]>>4)&0x0f)+0x30); //顯示秒
addr++;
lcd_wcmd(0x80 + addr);
lcd_wdat((time[0]&0x0f)+0x30);

addr = 2;
lcd_wcmd(0xc0 + addr); //在第二行顯示年月日和星期
lcd_wdat('2'); //顯示2
addr++;
lcd_wcmd(0xc0 + addr);
lcd_wdat('0'); //顯示0
addr++;

lcd_wdat(((time[6]>>4)&0x0f)+0x30); //年
addr++;
lcd_wcmd(0xc0 + addr);
lcd_wdat((time[6]&0x0f)+0x30);
addr++;

lcd_wcmd(0xc0 + addr);
lcd_wdat(' ');
addr++;

lcd_wcmd(0xc0 + addr);
lcd_wdat(((time[4]>>4)&0x0f)+0x30); //顯示月
addr++;
lcd_wcmd(0xc0 + addr);
lcd_wdat((time[4]&0x0f)+0x30);
addr++;

lcd_wcmd(0xc0 + addr);
lcd_wdat(' ');
addr++;

lcd_wcmd(0xc0 + addr);
lcd_wdat(((time[3]>>4)&0x0f)+0x30); //顯示日
addr++;
lcd_wcmd(0xc0 + addr);
lcd_wdat((time[3]&0x0f)+0x30);
addr++;

lcd_wcmd(0xc0 + addr);
lcd_wdat(' ');
addr++;

lcd_wcmd(0xc0 + addr);
lcd_wdat((time[5]&0x0f)+0x30); //顯示星期
}

//=========== 主函數 ===============
void main()
{
lcd_init(); // 初始化LCD
write_ds1302(time);
while(1)
{
read_ds1302(time); //讀DS1302數據
lcd_disp(); //LCD顯示
delay_ms(500); //延時0.5秒
}
}

這是一個電子時鍾,在LCD1602上顯示,時鍾晶元是DS1302

❿ 求用單片機c語言做一個電子時鍾,實現調時、顯示、整點報時等功能。

(1)用數字邏輯集成塊實現;
(2)時間以24小時為一個周期,顯示時、分、秒;
(3)計時過程具有報時功能,當時間到達整點前5秒進行蜂鳴報時;
(4)為了保證計時的穩定及准確須由晶體振盪器提供表針時間基準信號。

c51單片機 晶振為11.0592MHz

#include<reg52.h>
#define HOUR1 1
#define HOUR0 0
#define MIN1 2
#define MIN0 8
#define SEC1 2
#define SEC0 0
#define uint unsigned int
#define ulint unsigned long int
#define uchar unsigned char
sbit la=P2^6;
sbit wela=P2^7;
sbit beep=P2^3;
int i;
ulint
sharp,second,count=0,sec0=SEC0,sec1=SEC1,min0=MIN0,min1=MIN1,hour0=HOUR0,hour1=HOUR1;//秒計數全局變數
uchar code segment[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf};
uchar code time[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f};
void delay(uint);//程序毫秒延時
void beeper(uchar);//開蜂鳴器毫秒
void init();//初始化函數
void display();//從數碼管上顯示
void counter();//計算進行過程中的時、分、秒值
void scan();//掃描鍵盤
void main()
{
init();
while(1)
{
scan();//掃描鍵盤看是否有鍵按下
for(i=6;i>0;i--)//動態掃描6位數碼管
{
display();//顯示時、分、秒
}
}
}

void init()
{
second=hour1*36000+hour0*3600+min1*600+min0*60+sec1*10+sec0;
TMOD=0x01;
TH0=(65536-46080)/256;
TL0=(65536-46080)%256;
EA=1;
ET0=1;
TR0=1;
}

void delay(uint z)//程序毫秒延時
{
uint x=0,y=0;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}

void timer0() interrupt 1
{
TH0=(65536-46080)/256;
TL0=(65536-46080)%256;
count++;
if(count==20)//判斷是否到1秒
{
counter();//計算進行過程中的時、分、秒值
if(sharp!=hour0) beeper(1000);//判斷小時的值是否改變,變則啟動蜂鳴器
}
}

void beeper(uchar tt)
{
uchar t=tt;
count=0;
beep=0;//開蜂鳴器
delay(t);
beep=1;//關蜂鳴器
}

void display()
{
P0=0xff;//位消影(低電平選擇位)

//送位選信號
wela=1;
P0=segment[i-1];
wela=0;

P0=0x00;//段消影(高電平選擇段)

//送段選信號
la=1;
switch(i)
{
case 6 : P0=time[sec0]; break;
case 5 : P0=time[sec1]; break;
case 4 : P0=time[min0]; break;
case 3 : P0=time[min1]; break;
case 2 : P0=time[hour0]; break;
case 1 : P0=time[hour1]; break;
}
delay(1);
P0=0x00; //配合上面用於消隱
la=0;
}

void counter()
{
second++;
if(second==86400) second=0;
count=0;
sharp=hour0;//設置報時檢測KEY
sec0=second%10;
sec1=(second%60-sec0)/10;
min0=((second%3600-sec1*10-sec0)/60)%10;
min1=((second%3600-sec1*10-sec0)/60-min0)/10;
hour0=(second%36000-min1*600-min0*60-sec1*10-sec0)/3600;
hour1=second/36000;
}

void scan()
{

}