當前位置:首頁 » 編程語言 » c語言寫時鍾程序有按鍵調時間
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

c語言寫時鍾程序有按鍵調時間

發布時間: 2022-10-10 00:40:32

『壹』 c語言編寫由鍵盤輸入設定計算機時鍾當前時間的程序

我同意樓上說的 計算機時鍾和當前時間不是一個概念

但是我猜你應該是想修改當前時間,代碼如下

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#definetime_len20
intmain()
{
charset_time[time_len],cmd[100];
printf("請輸入想設置的時間(格式XX:xx):");
scanf("%s",&set_time);//輸入將時間修改為XX:XX,其實可以不設置分,直接XX,則默認XX:00
strcpy(cmd,"time");
strcat(cmd,set_time);
system(cmd);
}

『貳』 跪求C語言編寫的時鍾(能修改時鍾時間,且時鍾是指針式的 只編寫修改時間的部分也行)

////////////////////////////////////////////

//程序名稱:鍾表模擬程序(表針形式)

//編譯環境:VisualC++6.0,EasyX2011驚蟄版

//程序編寫:BestAns<[email protected]>

//最後更新:2010-10-30

//

#include

<graphics.h>

#include

<conio.h>

#include

<math.h>


#define

PI

3.1415926536


void

DrawHand
(
int
hour
,

int
minute
,

int
second
)

{


double
a_hour
,
a_min
,
a_sec
;





//時、分、秒針的弧度值


int
x_hour
,
y_hour
,
x_min
,
y_min
,
x_sec
,
y_sec
;

//時、分、秒針的末端位置




//計算時、分、秒針的弧度值


a_sec
=
second
*

2

*
PI
/

60
;


a_min
=
minute
*

2

*
PI
/

60

+
a_sec
/

60
;


a_hour
=
hour
*

2

*
PI
/

12

+
a_min
/

12
;




//計算時、分、秒針的末端位置


x_sec
=

int
(
120

*

sin
(
a_sec
));

y_sec
=

int
(
120

*

cos
(
a_sec
));


x_min
=

int
(
100

*

sin
(
a_min
));

y_min
=

int
(
100

*

cos
(
a_min
));


x_hour
=

int
(
70

*

sin
(
a_hour
));

y_hour
=

int
(
70

*

cos
(
a_hour
));




//畫時針


setlinestyle
(
PS_SOLID
,
NULL
,

10
);


setcolor
(
WHITE
);


line
(
320

+
x_hour
,

240

-
y_hour
,

320

-
x_hour
/

7
,

240

+
y_hour
/

7
);




//畫分針


setlinestyle
(
PS_SOLID
,
NULL
,

6
);


setcolor
(
LIGHTGRAY
);


line
(
320

+
x_min
,

240

-
y_min
,

320

-
x_min
/

5
,

240

+
y_min
/

5
);




//畫秒針


setlinestyle
(
PS_SOLID
,
NULL
,

2
);


setcolor
(
RED
);


line
(
320

+
x_sec
,

240

-
y_sec
,

320

-
x_sec
/

3
,

240

+
y_sec
/

3
);

}


void

DrawDial
()

{


//繪制一個簡單的表盤


circle
(
320
,

240
,

2
);


circle
(
320
,

240
,

60
);


circle
(
320
,

240
,

160
);


outtextxy
(
296
,

310
,

"BestAns"
);




//繪制刻度


int
x
,
y
;


for

(
int
i
=
0
;
i
<
60
;
i
++)


{



x
=

320

+

int
(
145

*

sin
(
PI
*

2

*
i
/

60
));



y
=

240

+

int
(
145

*

cos
(
PI
*

2

*
i
/

60
));






if

(
i
%

15

==

0
)




bar
(
x
-

5
,
y
-

5
,
x
+

5
,
y
+

5
);



else

if

(
i
%

5

==

0
)




circle
(
x
,
y
,

3
);



else




putpixel
(
x
,
y
,
WHITE
);


}

}


void

main
()

{


initgraph
(
640
,

480
);


//初始化640x480的繪圖窗口




DrawDial
();





//繪製表盤




setwritemode
(
R2_XORPEN
);

//設置XOR繪圖模式




//繪製表針


SYSTEMTIME

ti
;




//定義變數保存當前時間


while
(!
kbhit
())




//按任意鍵退出鍾表程序


{



GetLocalTime
(&
ti
);


//獲取當前時間



DrawHand
(
ti
.
wHour
,
ti
.
wMinute
,
ti
.
wSecond
);

//畫表針



Sleep
(
1000
);



//延時1秒



DrawHand
(
ti
.
wHour
,
ti
.
wMinute
,
ti
.
wSecond
);

//擦表針(擦表針和畫表針的過程是一樣的)


}




closegraph
();




//關閉繪圖窗口

}

其了就是用了easyx

『叄』 求一個51單片機定時鬧鍾程序。要C語言。能夠調時間

我來發一個C語言51單片機時鍾程序,希望能幫到你

/*程序功能:帶定時鬧鈴時鍾*/

/*---------------------------------------------------------------*/

#include<AT89X51.H>/*包含器件配置文件*/

#defineucharunsignedchar

#defineuintunsignedint

charDATA_7SEG[10]={0xC0,0xF9,0xA4,0xB0,0x99,

0x92,0x82,0xF8,0x80,0x90,};/*0~9的數碼管段碼*/

ucharhour=0,min=0,sec=0;/*時、分、秒單元清零*/

uchardeda=0;/*5mS計數單元清零*/

bitd_05s=0;/*0.5秒標志*/

ucharset=0;/*模式設定標志*/

ucharm=0;

ucharflag=0;/*RAM掉電標志*/

voiddelay(uintk);/*延時?函數*/

voidconv();/*走時單元轉換*/

voiddisp();/*走時時間顯示?函數*/

/*------------------------走時?函數部分----------------------*/

/*定時器T05mS初始化*/

voidinit_timer()

{

TMOD=0x01;

TH0=-(4800/256);

TL0=-(4800%256);

IE=0x82;

TR0=1;

}

/*---------------------------------*/

/*5mS定時中斷服務?函數*/

voidT0_srv(void)interrupt1

{

TH0=-(4800/256);

TL0=-(4800%256);

deda++;

}

/*----------------------------------*/

/*時、分、秒單元及走時單元轉換*/

voidconv()

{

if(deda<=100)d_05s=0;

elsed_05s=1;

if(deda>=200){sec++;deda=0;}

if(sec==60){min++;sec=0;}

if(min==60){hour++;min=0;}

if(hour==24){hour=0;}

}

/*------------------------顯示?函數部分----------------------*/

/*走時時間顯示?函數*/

voiddisp()

{

P0=DATA_7SEG[hour/10];P2=0xf7;delay(1);

P0=DATA_7SEG[hour%10];P2=0xfb;delay(1);

if(d_05s==1){if(P2_2==0)P0_7=0;elseP0_7=1;}

delay(1);

P0=DATA_7SEG[min/10];P2=0xfd;delay(1);

P0=DATA_7SEG[min%10];P2=0xfe;delay(1);

}

/*----------------------調整時間?函數部分-------------------*/

/*調整走時時間*/

voidset_time()

{ucharm;

if(P2_5==0)delay(1);

if(P2_5==0)hour++;

if(hour==24)hour=0;

for(m=0;m<30;m++)

{

disp();

if(P2_2==0)P0_7=0;

elseP0_7=1;

delay(1);

}

if(P2_6==0)delay(1);

if(P2_6==0)min++;

if(min==60)min=0;

for(m=0;m<30;m++)

{

disp();

if(P2_2==0)P0_7=0;

elseP0_7=1;

delay(1);

}

}

/*------------------按鍵掃描、延時等?函數部分-------------------*/

/*走時時間程序?函數*/

voidtime()

{

conv();/*走時單元轉換?函數*/

disp();/*走時時間顯示?函數*/

}

/*------------------------------------*/

/*掃描按鍵?函數*/

voidscan_key()

{

delay(1);

if(P2_4==0)set++;

if(set>=2)set=0;

if(set==1)flag=0x55;

F0:if(P2_4==0)gotoF0;/*按鍵未釋放,在此等候*/

}

/*------------------------------*/

/*延時?函數*/

voiddelay(uintk)

{

uinti,j;

for(i=0;i<k;i++){

for(j=0;j<121;j++)

{;}}

}

/*-----------------------主函數-------------------------*/

/*主函數*/

voidmain()

{

init_timer();/*定時器T0初始化*/

while(1)/*無限循環*/

{

if(P2_4==0)scan_key();/*有按鍵,調用按鍵掃描?函數*/

switch(set)/*根據set鍵值散轉*/

{

case0:time();break;/*走時時間程序*/

case1:set_time();break;/*走時時間調整*/

default:break;/*其它退出*/

}

if(flag!=0x55)/*判斷掉電標志*/

{

P0=0xc0;P2=0xc0;delay(100);

P2=0xff;delay(400);

}

}

}

『肆』 單片機用C語言設計跑表和時鍾,由按鍵控制

300我幫你搞定 沒這個數不想動腦筋

『伍』 求一個關於用C語言編寫的電子時鍾的程序,內容要有鬧鍾,可以調整時間

#include<reg52.h>
#include<absacc.h>
#include<intrins.h>
#define unit unsigned int
#define uchar unsigned char
//#define HZ 12
sbit key0=P0^0; // 分鍾調整
sbit key1=P0^1; // 小時調整

sbit P2_0=P2^7; //秒 指示燈
sbit MN_RXD=P3^6;
sbit MN_TXD=P3^7;

uchar data CLOCK[4]={0,0,0,12};//存放時鍾時間(百分秒,秒,分,和時位)

//數碼管顯示表0-f 滅
uchar code TABLE[]={0xBE,0x06,0xEA,0x6E,0x56,0x7C,0xFC,0x0E,0xFE,0x7E,0x00};
//**********************************
//模擬串口發送一個位元組數據 函數
//**********************************
void SendData(unsigned char senddata)
{
unsigned char i;
for(i=0;i<8;i++)
{
if((senddata&0x01)==0)
MN_RXD=0;
else
MN_RXD=1;
_nop_();
MN_TXD=0;
_nop_();
MN_TXD=1;
senddata=senddata>>1;
}
}

//**********************************
//顯示程序函數
//**********************************
void display(void)
{
// unsigned int n;
uchar temp;
temp=CLOCK[1]; temp=temp%10; SendData(TABLE[temp]);
temp=CLOCK[1]; temp=temp/10; SendData(TABLE[temp]);
temp=CLOCK[2]; temp=temp%10; SendData(TABLE[temp]);
temp=CLOCK[2]; temp=temp/10; SendData(TABLE[temp]);
temp=CLOCK[3]; temp=temp%10; SendData(TABLE[temp]);
temp=CLOCK[3]; temp=temp/10; SendData(TABLE[temp]);

/*
for(n=0;n<5000;n++);

for(n=0;n<6;n++)
{
SendData(TABLE[10]);
}
*/
}

//**********************************
//按鍵控制函數
//**********************************
void keycan()
{
unsigned int n;
EA=0;
if(key0==0) // 分鍾調整
{
for(n=0;n<10000;n++); //延時去抖動
while(key0==0);
CLOCK[2]=CLOCK[2]+1;
if(CLOCK[2]==60) //到一時
{
CLOCK[2]=0;
}
display();

}
if(key1==0) // 小時調整
{
for(n=0;n<10000;n++); //延時去抖動
while(key1==0);
CLOCK[3]=CLOCK[3]+1;
if(CLOCK[3]==24)
{
CLOCK[3]=0;
}
display();

}
EA=1;
}

//**********************************
//T0中斷服務函數
//**********************************
void time0() interrupt 1 //using 1
{
TH0=0xD8; TL0=0xF0; //重置初值
// TH0=0xB1; TL0=0xE0;
//時鍾處理
CLOCK[0]=CLOCK[0]+1;

}
//**********************************
//主函數
//**********************************
void main()
{
EA=1;
ET0=1;
TMOD=0x01; //T0方式1定時
TH0=0xD8; TL0=0xF0; //D8F0 定時10ms
// TH0=0xB1; TL0=0xE0; //定時 20ms
TR0=1;
for(;;)
{
if(CLOCK[0]==100) //到一秒 10ms*100
{
CLOCK[0]=0;
P2_0=~P2_0;
CLOCK[1]=CLOCK[1]+1;
if(CLOCK[1]==60) //到一分
{
CLOCK[1]=0;
CLOCK[2]=CLOCK[2]+1;
if(CLOCK[2]==60) //到一時
{
CLOCK[2]=0;
CLOCK[3]=CLOCK[3]+1;
if(CLOCK[3]==24)
{
CLOCK[3]=0;
}
}
}
display();
}

keycan();
}

}

『陸』 用單片機寫一個C語言程序關於電子時鍾,用鍵盤調制時分秒的加減 第一個鍵控制模式,第二個為加,第三個減

我給你一個保證好用的,KEY_COM調模式,按一下進入調時 ,在按一下調分,再按一下退出調時模式,這時加減按鍵都無效,在調時模式時會產生閃爍方式,這段程序是我自己想的辦法實現的,可能有點笨拙,但效果很好,我建議你用DS1302做時鍾,用單片機計數器由於晶振等原因會有很大的誤差,實際中沒有用直接用單片機做的,希望對你有幫助。
(段選和位選接的都是8位的D觸發器,如果你的開發板電路結構有區別,改一下顯示部分的程序就行了)
#include<reg51.h>
#define uchar unsigned char
sbit an=P0^0;
sbit wei=P0^1;
sbit KEY_ADD=P3^3;
sbit KEY_DEC=P3^4;
sbit KEY_COM=P3^5;
uchar code a[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40, 0x00 };
char hour=0,minute=0,second=0,i=0,flag=0;
unsigned char t=0,t1=0,t2=0,t3=0;
unsigned int count=0;
void delays()//10ms延時子程序
{unsigned char i,j;
for(i=20;i>0;i--)
for(j=248;j>0;j--);
}

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

void main()
{
start();
KEY_ADD=1;
KEY_DEC=1;
KEY_COM=1;
while(1){
if(!KEY_COM)
{
delays();
if(!KEY_COM)
{while(!KEY_COM);
flag++;if(flag==3)flag=0;
}
}

if(!KEY_ADD)
{
delays();
if(!KEY_ADD)
{

while(!KEY_ADD);
if(flag==1)
{hour++;if(hour==24)hour=0;}
if (flag==2)
{minute++;if(minute==60)minute=0;}
}
}

if(!KEY_DEC)
{
delays();
if(!KEY_DEC)
{while(!KEY_DEC);
if(flag==1)
{hour--;if(hour<0)hour=23;}
if(flag==2)
{minute--;if(minute<0)minute=59;}
}
}

}

}
void t0() interrupt 1
{
TH0=(65536-2000)/256;
TL0=(65536-2000)%256;
count++;

switch(i)
{case 0: {if(flag==1){t++;if(t==60)t=0; if(t<30) {P1=a[hour/10];an=1;an=0;P1=~0x01;wei=1;wei=0;}
else {P1=0x00;an=1;an=0;P1=~0x01;wei=1;wei=0;} } else {P1=a[hour/10];an=1;an=0;P1=~0x01;wei=1;wei=0;} } break;

case 1: {if(flag==1) {t1++;if(t1==60)t1=0; if(t1<30) {P1=a[hour%10];an=1;an=0;P1=~0x02;wei=1;wei=0;}
else {P1=0x00;an=1;an=0;P1=~0x01;wei=1;wei=0;} } else {P1=a[hour%10];an=1;an=0;P1=~0x02;wei=1;wei=0;} } break;

case 2:{P1=0x40;an=1;an=0;P1=~0x04;wei=1;wei=0;}break;

case 3: {if(flag==2) {t2++;if(t2==60)t2=0; if(t2<30) {P1=a[minute/10];an=1;an=0;P1=~0x08;wei=1;wei=0;}
else {P1=0x00;an=1;an=0;P1=~0x01;wei=1;wei=0;} } else {P1=a[minute/10];an=1;an=0;P1=~0x08;wei=1;wei=0;} } break;

case 4: {if(flag==2) {t3++;if(t3==60)t3=0; if(t3<30) {P1=a[minute%10];an=1;an=0;P1=~0x10;wei=1;wei=0;}
else {P1=0x00;an=1;an=0;P1=~0x01;wei=1;wei=0;} } else {P1=a[minute%10];an=1;an=0;P1=~0x10;wei=1;wei=0;} } break;

case 5:{P1=0x40;an=1;an=0;P1=~0x20;wei=1;wei=0;}break;
case 6:{P1=a[second/10];an=1;an=0;P1=~0x40;wei=1;wei=0;}break;
case 7:{P1=a[second%10];an=1;an=0;P1=~0x80;wei=1;wei=0;}break;
}
i++;
if(i==8)i=0;
if(count==500)
{count=0;
second++;
if(second==60)
{second=0;
minute++;
if(minute==60)
{minute=0;
hour++;
if(hour==24)
{
hour=0;
}
}
}
}
}

『柒』 急求一個用51單片機編的可按鍵調時的數字時鍾程序,數碼管顯示,C語言編寫,謝謝。

#include <reg51.h>
#include <intrins.h>
unsigned char code dis_week[]={"SUN,MON,TUE,WED,THU,FRI,SAT"};
unsigned char code para_month[13]={0,0,3,3,6,1,4,6,2,5,0,3,5};//星期月參變數
unsigned char data dis_buf1[16];//lcd上排顯示緩沖區
unsigned char data dis_buf2[16];//lcd下排顯示緩沖區
unsigned char data year,month,date,week;//年、月、日、星期
unsigned char data armhour,armmin,armsec;//鬧鍾時、分、秒
unsigned char data hour,min,sec,sec100;//時、分、秒、百分之一秒
unsigned char data flag,vkey,skey;//設置狀態計數標志、按鍵先前值、按鍵當前值
bitalarm;//標識是否啟用鬧鍾,1--啟用,0--關閉
sbit rs = P2^0;//LCD數據/命令選擇端(H/L)
sbit rw = P2^1;//LCD讀/寫選擇端(H/L)
sbit ep = P2^2;//LCD使能控制
sbitPRE = P3^3;//調整鍵(AN3)
sbitSET = P3^4;//調整鍵(AN4)
sbitSPK = P3^6;
void delayms(unsigned char ms);//延時程序
bit lcd_busy();//測試LCD忙碌狀態程序
void lcd_wcmd(char cmd);//寫入指令到LCD程序
void lcd_wdat(char dat);//寫入數據到LCD程序
void lcd_pos(char pos);//LCD數據指針位置程序
void lcd_init();//LCD初始化設定程序
void pro_timedate();//時間日期處理程序
void pro_display();//顯示處理程序
void pro_key();//按鍵處理程序
void time_alarm();//定時報警功能(鬧鍾)
unsigned char scan_key();//按鍵掃描程序
unsigned char week_proc();//星期自動計算與顯示函數
bit leap_year();//判斷是否為閏年
void lcd_sef_chr();//LCD自定義字元程序
void update_disbuf(unsigned char t1,unsigned char t2[],unsigned char dis_h,unsigned char dis_m,unsigned char dis_s);
//更新顯示緩沖區函數

// 延時程序
void delay(unsigned char ms)
{while(ms--)
{unsigned char i;
for(i = 0; i< 250; i++)
{
_nop_(); //執行一條_nop_()指令為一個機器周期
_nop_();
_nop_();
_nop_();
}
}
}
//測試LCD忙碌狀態
bit lcd_busy()
{
bit result;
rs = 0;
rw = 1;
ep = 1;
_nop_();
_nop_();
_nop_();
_nop_();
result =(bit)(P0&0x80);//LCD的D0--D7中,D7=1為忙碌,D7=0為空閑
ep = 0;
return result;
}
//寫入指令到LCD
void lcd_wcmd(char cmd)
{
while(lcd_busy());//當lcd_busy為1時,再次檢測LCD忙碌狀態,lcd-busy為0時,開始寫指令
rs = 0;
rw = 0;
ep = 0;
_nop_();
_nop_();
P0 = cmd;
_nop_();
_nop_();
_nop_();
_nop_();
ep = 1;
_nop_();
_nop_();
_nop_();
_nop_();
ep = 0;
}
//寫入數據到LCD
void lcd_wdat(char dat)
{
while(lcd_busy());//當lcd_busy為1時,再次檢測LCD忙碌狀態,lcd-busy為0時,開始寫數據
rs = 1;
rw = 0;
ep = 0;
P0 = dat;
_nop_();
_nop_();
_nop_();
_nop_();
ep = 1;
_nop_();
_nop_();
_nop_();
_nop_();
ep = 0;
}
//LCD數據指針位置程序
void lcd_pos(char pos)
{
lcd_wcmd(pos|0x80);//數據指針=80+地址碼(00H~27H,40H~67H)
}
//設定二個自定義字元,(注意:LCD1602中自定義字元的地址為0x00--0x07,即可定義8個字元)
//這里我們設定把一個自定義字元放在0x00位置(000),另一個放在0x01位子(001)
void lcd_sef_chr()
{//第一個自定義字元
lcd_wcmd(0x40);//"01 000 000" 第1行地址 (D7D6為地址設定命令形式D5D4D3為字元存放位置(0--7),D2D1D0為字元行地址(0--7))
lcd_wdat(0x1f);//"XXX 11111"第1行數據(D7D6D5為XXX,表示為任意數(一般用000),D4D3D2D1D0為字元行數據(1-點亮,0-熄滅)
lcd_wcmd(0x41);//"01 000 001" 第2行地址
lcd_wdat(0x11);//"XXX 10001"第2行數據
lcd_wcmd(0x42);//"01 000 010" 第3行地址
lcd_wdat(0x15);//"XXX 10101"第3行數據
lcd_wcmd(0x43);//"01 000 011" 第4行地址
lcd_wdat(0x11);//"XXX 10001"第4行數據
lcd_wcmd(0x44);//"01 000 100" 第5行地址
lcd_wdat(0x1f);//"XXX 11111"第5行數據
lcd_wcmd(0x45);//"01 000 101" 第6行地址
lcd_wdat(0x0a);//"XXX 01010"第6行數據
lcd_wcmd(0x46);//"01 000 110" 第7行地址
lcd_wdat(0x1f);//"XXX 11111"第7行數據
lcd_wcmd(0x47);//"01 000 111" 第8行地址
lcd_wdat(0x00);//"XXX 00000"第8行數據
//第二個自定義字元
lcd_wcmd(0x48);//"01 001 000" 第1行地址
lcd_wdat(0x01);//"XXX 00001"第1行數據
lcd_wcmd(0x49);//"01 001 001" 第2行地址
lcd_wdat(0x1b);//"XXX 11011"第2行數據
lcd_wcmd(0x4a);//"01 001 010" 第3行地址
lcd_wdat(0x1d);//"XXX 11101"第3行數據
lcd_wcmd(0x4b);//"01 001 011" 第4行地址
lcd_wdat(0x19);//"XXX 11001"第4行數據
lcd_wcmd(0x4c);//"01 001 100" 第5行地址
lcd_wdat(0x1d);//"XXX 11101"第5行數據
lcd_wcmd(0x4d);//"01 001 101" 第6行地址
lcd_wdat(0x1b);//"XXX 11011"第6行數據
lcd_wcmd(0x4e);//"01 001 110" 第7行地址
lcd_wdat(0x01);//"XXX 00001"第7行數據
lcd_wcmd(0x4f);//"01 001 111" 第8行地址
lcd_wdat(0x00);//"XXX 00000"第8行數據

}
//LCD初始化設定
void lcd_init()
{
lcd_wcmd(0x38);//設置LCD為16X2顯示,5X7點陣,八位數據借口
delay(1);
lcd_wcmd(0x0c);//LCD開顯示及游標設置(游標不閃爍,不顯示"-")
delay(1);
lcd_wcmd(0x06);//LCD顯示游標移動設置(游標地址指針加1,整屏顯示不移動)
delay(1);
lcd_wcmd(0x01);//清除LCD的顯示內容
delay(1);
}
//閏年的計算
bit leap_year()
{
bit leap;
if((year%4==0&&year%100!=0)||year%400==0)//閏年的條件
leap=1;
else
leap=0;
return leap;
}
//星期的自動運算和處理
unsigned char week_proc()
{unsigned char num_leap;
unsigned char c;
num_leap=year/4-year/100+year/400;//自00年起到year所經歷的閏年數
if( leap_year()&& month<=2 ) //既是閏年且是1月和2月
c=5;
else
c=6;
week=(year+para_month[month]+date+num_leap+c)%7;//計算對應的星期
return week;
}
//更新顯示緩沖區
void update_disbuf(unsigned char t1,unsigned char t2[],unsigned char dis_h,unsigned char dis_m,unsigned char dis_s)
{dis_buf1[0]=t1; //
dis_buf1[1]=0x20; //空格
dis_buf1[2]=50; //'2'
dis_buf1[3]=48; //'0'
dis_buf1[4]=year/10+48;
dis_buf1[5]=year%10+48;
dis_buf1[6]=0x2d;
dis_buf1[7]=month/10+48;
dis_buf1[8]=month%10+48;
dis_buf1[9]=0x2d; //'-'
dis_buf1[10]=date/10+48;
dis_buf1[11]=date%10+48;
dis_buf1[12]=0x20;
dis_buf1[13]=dis_week[4*week];
dis_buf1[14]=dis_week[4*week+1];
dis_buf1[15]=dis_week[4*week+2];
dis_buf2[0]=t2[0];
dis_buf2[1]=t2[1];
dis_buf2[2]=t2[2];
dis_buf2[3]=t2[3];
dis_buf2[4]=t2[4];
dis_buf2[5]=t2[5];
dis_buf2[6]=t2[6];//空格
if (alarm)
dis_buf2[7]=0x01;//alarm=1,顯示鬧鍾啟用標致(第二個自定義字元)
else
dis_buf2[7]=0x20;//alarm=0,不顯示鬧鍾啟用標致
dis_buf2[8]=dis_h/10+48;
dis_buf2[9]=dis_h%10+48;
dis_buf2[10]=0x3a;//':'
dis_buf2[11]=dis_m/10+48;
dis_buf2[12]=dis_m%10+48;
dis_buf2[13]=0x3a;
dis_buf2[14]=dis_s/10+48;
dis_buf2[15]=dis_s%10+48;
}
//時間和日期處理程序
void pro_timedate()
{
sec++;
if(sec > 59)
{sec = 0;
min++;
if(min>59)
{min=0;
hour++;
if(hour>23)
{hour=0;
date++;
if (month==1||month==3||month==5||month==7||month==8||month==10||month==12)
if (date>31) {date=1;month++;}//大月31天
if (month==4||month==6||month==9||month==11)
if (date>30) {date=1;month++;}//小月30天
if (month==2)
{if( leap_year())//閏年的條件
{if (date>29) {date=1;month++;}}//閏年2月為29天
else
{if (date>28) {date=1;month++;}}//平年2月為28天
}
if (month>12) {month=1;year++;}
if (year>99) year=0;
}
}
}
week_proc();
if (sec==armsec && min==armmin && hour==armhour)
{if (alarm)
TR1=1;//鬧鍾啟用時,報警時間到,啟動Timer1
}
}
//顯示處理程序
void pro_display()
{unsigned char i;
lcd_pos(0x00);
for (i=0;i<=15;i++)
{lcd_wdat(dis_buf1[i]);}
lcd_pos(0x40);
for (i=0;i<=15;i++)
{lcd_wdat(dis_buf2[i]);}
}
//Timer0中斷處理程序,秒的產生
void timer0() interrupt 1
{
TH0=0xD8;
TL0=0xF0;
sec100++;
if(sec100 >= 100)//1秒時間 (100*10ms=1000ms=1s)
{sec100 = 0;
pro_timedate();//調用時間和日期處理程序
}
if (sec&0x01)//"RICHMCU"閃一秒,停一秒
update_disbuf(0x00," ",hour,min,sec); //0x00表示顯示00位置的自定義字元
else
update_disbuf(0x00,"RICHMCU",hour,min,sec);
pro_display(); //調用顯示處理函數
}
//按鍵掃描程序
unsigned char scan_key()
{
skey=0x00;//給變數vkey置初值
skey|=PRE;//讀取PRE鍵的狀態
skey=skey<<1;//將PRE鍵的狀態存於skey的B1位
skey|=SET;//讀取SET鍵的狀態,並存於skey的B0位
return skey;//返回skey的鍵值(即PRE,SET的狀態)
}
//外部中斷INT0中斷處理程序
void int0() interrupt 0
{
TR0=0;//禁止Timer0
IE=0;//禁止中斷
lcd_wcmd(0x0e);//顯示游標"_",整個游標不閃爍
alarm=1;
update_disbuf(0x50,"alarm:",armhour,armmin,armsec);//更新顯示數據,0x50表示要顯示"P"
pro_display();//調用顯示處理程序
lcd_pos(0x47); //使游標位於第一個調整項下
flag=0;
vkey=0x03;
while(flag^0x0a)
{skey = scan_key();//掃描按鍵狀態
if (skey^vkey)//若skey與vkey相同,跳出循環,相異執行循環體
{delay(10);//去按鍵抖動
skey = scan_key();//轉回掃描按鍵狀態
if (skey^vkey)//若skey與vkey相同,跳出循環,相異執行循環體
{vkey=skey;//將skey的值付給vkey
if (skey==0x01)//PRE鍵按下
{ flag++;//調整標志位加1
switch (flag)//將游標置於相應調整位置
{

case 1: lcd_pos(0x49);break;//游標置小時報警設置位置
case 2:lcd_pos(0x4c);break;//游標置分鍾報警設置位置
case 3:lcd_pos(0x4f);break;//游標置秒時報警設置位置
case 4:update_disbuf(0x50,"time: ",hour,min,sec);
pro_display();
lcd_pos(0x05);break;//游標置年調整位置
case 5:lcd_pos(0x08);break;//游標置月調整位置
case 6:lcd_pos(0x0b);break;//游標置日調整位置
case 7: lcd_pos(0x49);break;//游標置時調整位置
case 8:lcd_pos(0x4c);break;//游標置分調整位置
case 9:lcd_pos(0x4f);break;//游標置秒調整位置
default:break;
}
}
if (skey==0x02) //SET鍵按下
{pro_key();//轉設置按鍵處理程序
}
}
}
}
lcd_wcmd(0x0c);//設置LCD開顯示及游標不閃爍,不顯示"-"
lcd_wcmd(0x01); //清除LCD的顯示內容
IE=0x8f; //CPU開中斷,INT0,INT1,開中斷
TR0=1;//Timer0啟動
}
//主程序,初始化及初值設定
void main()
{
lcd_init(); //初始化LCD
lcd_sef_chr();//寫入自定義字元號
hour=0;min=0;sec=0; //開機時的時,分,秒顯示
armhour=0;armmin=0;armsec=0;//開機時的時,分,秒報警初值
year= 5; month=1;date=1; //開機時的年,月,日,星期顯示
week_proc();
alarm=1;//初始開機,啟用鬧鍾
IE = 0x8f;//CPU開中斷,INT0,INT1,Timer0,Timer1開中斷
IP = 0x04;//設置INT0為中斷最高優先順序
IT0=0;IT1=0;//外部INT0,INT1設置為電平觸發方式(注意,觸發不要選邊沿方式,易誤動)
TMOD = 0x11;//Timer0,Timer1工作於模式1, 16位定時方式
TH0 = 0xdc;TL0 = 0x00;//Timer0置10ms定時初值
TH1 = 0xff;TL1 = 0x00;//Timer1置初值
TR0 = 1;//Timer0啟動
TR1 = 0;
while(1);
}
//設置按鍵處理程序
void pro_key()
{
switch (flag)
{
case 0:alarm=!alarm;//啟用或關閉鬧鍾(alarm=1:啟用,alarm=0:關閉)
update_disbuf(0x50,"alarm:",armhour,armmin,armsec); //更新顯示數據
pro_display();//調用顯示處理
lcd_pos(0x47);break;//游標回到原調整位置
case 1:armhour++;
if (armhour>23) armhour=0;
update_disbuf(0x50,"alarm:",armhour,armmin,armsec); //更新顯示數據
pro_display();//調用顯示處理
lcd_pos(0x49);break;//游標回到原調整位置
case 2:armmin++;
if (armmin>59) armmin=0;
update_disbuf(0x50,"alarm:",armhour,armmin,armsec);
pro_display();
lcd_pos(0x4c);break;
case 3:armsec++;
if (armsec>59) armsec=0;
update_disbuf(0x50,"alarm:",armhour,armmin,armsec);
pro_display();
lcd_pos(0x4f);break;
case 4:year++;
if(year> 99) year= 0;
week_proc(); //星期自動運算
update_disbuf(0x50,"time: ",hour,min,sec);
pro_display();
lcd_pos(0x05);break;
case 5:month++;
if (month>12) month=1;
week_proc();//星期自動運算
update_disbuf(0x50,"time: ",hour,min,sec);
pro_display();
lcd_pos(0x08);break;
case 6:date++;
if (month==1||month==3||month==5||month==7||month==8||month==10||month==12)
if (date>31) date=1;//大月31天
if (month==4||month==6||month==9||month==11)
if (date>30) date=1;//小月30天
if (month==2)
{if(leap_year())//閏年的條件
{if (date>29) date=1;}//閏年2月為29天
else
{if (date>28) date=1;}}//平年2月為28天
week_proc(); //星期自動運算
update_disbuf(0x50,"time: ",hour,min,sec);
pro_display();
lcd_pos(0x0b);break;
case 7:hour++;
if (hour>23) hour=0;
update_disbuf(0x50,"time: ",hour,min,sec);
pro_display();
lcd_pos(0x49);break;
case 8:min++;
if (min>59) min=0;
update_disbuf(0x50,"time: ",hour,min,sec);
pro_display();
lcd_pos(0x4c);break;
case 9:sec++;
if (sec>59) sec=0;
update_disbuf(0x50,"time: ",hour,min,sec);
pro_display();
lcd_pos(0x4f);break;
default: break ;
}
}
//Timer1中斷處理程序,產生報警的聲音
void timer1() interrupt 3
{
TH1=0xff;
TL1=0x00;
SPK=~SPK;

}
//外部中斷INT1中斷處理程序,停止報警聲音
void int1() interrupt 2
{
if(TR1)
TR1=0;
}

實驗說明:
按K1按鍵進入設定狀態
按K2,依次進入鬧鍾功能是否啟用,鬧鍾時,分秒,年,月,日及時間時,分,秒的設置,直到退出設置狀態
按K3,調整是否起用鬧鍾和調節鬧鍾時,分,秒,年,月,日,時間的時,分,秒的數字
LCD第二排中間顯示小喇叭,表示啟用鬧鍾功能,無則禁止鬧鍾功能(可在調整狀態進行設置)
正常狀態,LCD上排最前面顯示自定義字元,LCD下排最前面閃動"RICHMCU"
設置狀態,LCD上排最前面顯示"P",下排最前面在設置鬧鍾時間時顯示"alarm:",其它狀態顯示"time"
年代變化2000--2099,星期自動轉換

望採納,謝謝~~

『捌』 求用單片機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()
{

}

『玖』 怎麼用C語言寫可以調節的延時程序

發了三個程序包給你,都是基於單片機數字鍾設計的程序,可帶按鍵調整時鍾。9.7的那個程序,裡面是用匯編語言編寫的延遲程序,時間精度相對高。但是稍微,Frbqhd