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

8155時鍾電路代碼c語言

發布時間: 2023-04-19 08:17:14

c語言時鍾源代碼

#include<graphics.h>櫻啟 /* 引入graphic.h */
#include<math.h> /* 引入math.h */
#include<dos.h> /* 引入dos.h */
#define pi 3.1415926 /*定義pi=3.14159*/
#define X(a,b,c) x=a*cos(b*c*pi/180-pi/2)+300;
#define Y(a,b,c) y=a*sin(b*c*pi/180-pi/2)+240;
#define d(a,b,c) X(a,b,c);Y(a,b,c);line(300,240,x,y) /*定義……*/
void init() /*初始化程序*/
{int i,l,x1,x2,y1,y2; /*定義……*/
setbkcolor(1); /*設置顏色*/
circle(300,240,200); /*作園脊銀如*/
circle(300,240,205);
circle(300,240,5);
for(i=0;i<60;i++) /*循環(算時間)*/
{if(i%5==0) l=15;
else l=5;
x1=200*cos(i*6*pi/180)+300;
y1=200*sin(i*6*pi/180)+240;
x2=(200-l)*cos(i*6*pi/180)+300;
y2=(200-l)*sin(i*6*pi/180)+240;
line(x1,y1,x2,y2);
}
}
main()
{
int x,y;
int gd=VGA,gm=2;
unsigned char h,m,s; /*定義*/
struct time t[1];
initgraph(&gd,&gm,"d:\\tc");
init();
setwritemode(1);
gettime(t);
h=t[0].ti_hour;
m=t[0].ti_min;
s=t[0].ti_sec; /*定義時分秒*/
setcolor(7); /搏禪*設置顏色*/
d(150,h,30);
setcolor(14);
d(170,m,6);
setcolor(4);
d(190,s,6);
while(!kbhit()) /*獲取鍵盤相應*/
{while(t[0].ti_sec==s)
gettime(t); /*C語言中得到時間的函數*/
sound(400); /*計算時間……*/
delay(70);
sound(200);
delay(30);
nosound();
setcolor(4);
d(190,s,6);
s=t[0].ti_sec;
d(190,s,6);
if (t[0].ti_min!=m)
{
setcolor(14);
d(170,m,6);
m=t[0].ti_min;
d(170,m,6);
}
if (t[0].ti_hour!=h)
{ setcolor(7);
d(150,h,30);
h=t[0].ti_hour;
d(150,h,30);
sound(1000);
delay(240);
nosound();
delay(140);
sound(2000);
delay(240);
nosound();
}
}
getch(); /*設置空格後退出*/
closegraph();
}
http://..com/question/121241211.html

❷ 51單片機做數字電子鍾

源程序如下: ORG 0000H ;程序開始入口

LJMP START

ORG 0003H ;外中斷叢行0中斷程序入口

RETI

ORG 000BH ;定時器T0中斷程序入口

LJMP INTT0 ;跳至INTTO執行

ORG 0013H ;外中斷1中斷程序入口

RETI

ORG 001BH ;定時器T1中斷程序入口

LJMP INTT1

ORG 0023H ;串列中斷程序入口地址

RETI

;---------------主程序----------------------;

START:MOV R0,#70H ;70給R0,清滲姿嘩70-7FH顯示內存

MOV R7,#0FH

CLEARDISP:MOV @R0,#00H ;0給R0中的數為地址的內存中存放(70H)

INC R0

DJNZ R7,CLEARDISP

MOV 78H,#2 ;默認時間為12:00,鬧冊巧鍾5:00

MOV 79H,#1

MOV 74H,#2 ;防止上電時數碼管顯示00小時

MOV 75H,#1

MOV 66H,#1 ;中斷退出時66H為1時,分、時計時單元數據移入顯存標志

MOV 68H,#1 ;上電默認鬧鍾開狀態

MOV 7DH,#6 ;鬧鍾時十位

MOV 7CH,#3

MOV 69H,#0

MOV 7AH,#0AH ;放入"熄滅符"數據

MOV TMOD,#11H ;設T0、T1為16位定時器

MOV TL0,#0B0H ;50MS定時初值(T0計時用)

MOV TH0,#3CH

SETB EA ;總中斷開放

SETB ET0 ;允許T0中斷

SETB TR0 ;T0定時器開始計時

MOV R4,#14H ;1秒定時用初值(50MS×20)

START1:LCALL DISPLAY ;顯示子程序

LCALL BEEP ;鬧鍾查詢

JNB P1.7,SETTIME ;P1.7口為0時轉時間調整程序

JMP START1 ;P1.7口為1時跳回START1

;-----------------------時間鬧鍾調整系統--------------------------;

NFLAG:MOV A,68H ;設置鬧鍾開關狀態

CJNE A,#1,BEE68

MOV 68H,#0

JMP E6

BEE68:MOV 68H,#1

E6:MOV 66H,#8 ;中斷退出66H不為1時分、時計時單元數據移入顯存標志

MOV 72H,7BH

MOV 73H,7CH

MOV 74H,7DH

MOV 75H,7EH

LCALL DDL

LCALL DDL

MOV 72H,68H

MOV 73H,69H

MOV 74H,7AH

MOV 75H,7AH

LCALL DDL

LCALL DDL

MOV 66H,#1

LJMP START1

SETTIME:LCALL DDL

JB P1.7,NFLAG ;鍵按下時間小於1秒,設置鬧鍾開關狀態並查看鬧鍾時間,不關走時,確保准確,大於1秒調時

MOV TL1,#0B0H ;T1閃爍定時初值

MOV TH1,#3CH

MOV R2,#06H ;進入調時狀態,賦閃爍定時初值

MOV 66H,#8 ;調鬧鍾時保持走時,關閉時鍾顯示數據

SETB ET1 ;允許T1中斷

SETB TR1 ;開啟定時器T1

SET1:LCALL DISPLAY ;調用顯示,防止鍵按下無顯示

JNB P1.7,SET1 ;P1.7口為0等待鍵釋放

MOV R5,#00H ;清設置類型閃爍標志

SETN1:INC R5 ;鬧鍾分調整

SET5:LCALL DISPLAY

JB P1.7,SET5

SEETN1:LCALL DDL ;有鍵按下大於1秒分時間連續加(0.5秒加1),小於1秒轉調時狀態

JB P1.7,SET6 ;鍵釋放查詢,鍵釋放自動轉調時

MOV R0,#7CH

LCALL ADD1

MOV A,R3

CLR C

CJNE A,#60H,HHN1

HHN1:JC SEETN1

LCALL CLR0

JMP SEETN1

SET6:INC R5 ;鬧鍾時調整

SEET6:LCALL DISPLAY

JB P1.7,SEET6

SEETNH1:LCALL DDL

JB P1.7,SETF

MOV R0,#7EH

LCALL ADD1

MOV A,R3

CLR C

CJNE A,#24H,HOUU1

HOUU1:JC SEETNH1

LCALL CLR0

JMP SEETNH1

SETF:LCALL DISPLAY

JB P1.7,SETF

LCALL DDL

JNB P1.7,SETOUT ;短按調時,長按退出

CLR ET0

CLR TR0

MOV 70H,#00H ;設定後的時間從00秒開始走時

MOV 71H,#00H

INC R5

SET3:LCALL DISPLAY

JB P1.7,SET3

SETMM:LCALL DDL

JB P1.7,SET4

MOV R0,#77H

LCALL ADD1

MOV A,R3

CLR C

CJNE A,#60H,MMH

MMH:JC SETMM

LCALL CLR0

AJMP SETMM

SET4:INC R5

SEET4:LCALL DISPLAY

JB P1.7,SEET4

SETHH:LCALL DDL

JB P1.7,SETOUT1

MOV R0,#79H

LCALL ADD1

MOV A,R3

CLR C

CJNE A,#24H,HOUU

HOUU:JC SETHH

LCALL CLR0

AJMP SETHH

SETOUT1:SETB ET0

SETB TR0 ;計時開始

SETOUT:MOV R5,#00H ;清設置類型閃爍標志

CLR TR1 ;關閉T1

CLR ET1 ;關T1中斷

MOV 66H,#1

SETOUT2:LCALL DISPLAY

JNB P1.7,SETOUT2

LJMP START1

;--------------------------延時1秒鍾-----------------------;

DDL:MOV 18H,#36

DDL0:MOV 17H,#239

DDL1:LCALL DISPLAY

DJNZ 17H,DDL1

DJNZ 18H,DDL0

RET

;----------------------------T0中斷程序------------------------;

INTT0: PUSH ACC ;打包

PUSH PSW

CLR ET0

CLR TR0

MOV A,#0B7H

ADD A,TL0

MOV TL0,A

MOV A,#3CH

ADDC A,TH0

MOV TH0,A

SETB TR0

DJNZ R4, OUTT0 ;20次中斷未到中斷退出

ADDSS: MOV R4,#14H ;20次中斷到(1秒)重賦初值

MOV R0,#71H ;指向秒計時單元(70-71H)

ACALL ADD1 ;調用加1程序(加1秒操作)

MOV A,R3 ;秒數據放入A(R3為2位十進制數組合)

CLR C ;清進位標志

CJNE A,#60H,ADDMM

ADDMM: JC OUTT01 ;小於60秒退出

ACALL CLR0 ;等於或大於60秒清0

MOV R0,#77H ;指向分計時單元(76H-77H)

ACALL ADD1

MOV A,R3

CLR C

CJNE A,#60H,ADDHH

ADDHH: JC OUTT0

ACALL CLR0

MOV R0,#79H ;指向小時計時單元(78H-79H)

ACALL ADD1

MOV A,R3

CLR C

CJNE A,#24H,HOUR

HOUR: JC OUTT0

ACALL CLR0

OUTT0: MOV A,66H ;查詢標志

CJNE A,#1,OUTT01

MOV 72H,76H ;中斷退出時將分、時計時單元數據移入對應顯示單元

MOV 73H,77H

MOV 74H,78H

MOV 75H,79H

OUTT01:POP PSW ;出棧

POP ACC

SETB ET0 ;開放T0

RETI ;中斷返回

;---------------------------加1程序--------------------------;

ADD1: MOV A,@R0 ;取當前計時單元數據到A

DEC R0 ;指向前一地址

SWAP A ;A中數據高四位與低四位交換

ORL A,@R0 ;前一地址中數據放入A中低四位

ADD A,#01H ;A加1操作

DA A ;十進制調整

MOV R3,A ;移入R3寄存器

ANL A,#0FH ;高四位變0

MOV @R0,A ;放回前一地址單元

MOV A,R3 ;取回R3中暫存數據

INC R0 ;指向當前地址單元

SWAP A ;A中數據高四位與低四位交換

ANL A,#0FH ;高四位變0

MOV @R0,A ;數據放入當削地址單元中

RET

CLR0: CLR C

CLR A ;清累加器

MOV @R0,A ;清當前地址單元

DEC R0 ;指向前一地址

MOV @R0,A ;前一地址單元清0

RET ;子程序返回

;-------------------------調時閃爍程序----------------------;

INTT1: PUSH ACC

PUSH PSW

MOV TL1,#0B0H

MOV TH1,#3CH

DJNZ R2,INTT1OUT ;0.3秒未到退出中斷(50MS中斷6次)

MOV R2,#06H ;重裝0.3秒定時用初值

CPL 02H ;0.3秒定時到對閃爍標志取反

JB 02H,FLASH1 ;02H位為1時顯示單元"熄滅"

MOV A,R5

CJNE A,#01H,NL

JMP NNN1

NL:CJNE A,#02H,NL1

LJMP NNN1

NL1:CJNE A,#03H,NL2

LJMP NLL

NL2:CJNE A,#04H,INTT1OUT

LJMP NLL

NLL:MOV 72H,76H

MOV 73H,77H

MOV 74H,78H

MOV 75H,79H

AJMP INTT1OUT

NNN1:MOV 72H,7BH

MOV 73H,7CH

MOV 74H,7DH

MOV 75H,7EH

INTT1OUT:POP PSW ;恢復現場

POP ACC

RETI ;中斷退出

FLASH1:MOV A,R5

CJNE A,#01H,ML

LJMP MNN1

ML:CJNE A,#02H,ML1

LJMP MNN2

ML1:CJNE A,#03H,MN

LJMP MLL

MN:CJNE A,#04H,INTT1OUT

LJMP MHL

MLL:MOV 72H,7AH

MOV 73H,7AH ;顯示單元(72-73H),將不顯示分數據

MOV 74H,78H

MOV 75H,79H

AJMP INTT1OUT

MHL:MOV 72H,76H

MOV 73H,77H

MOV 74H,7AH ;顯示單元(74-75H),小時數據將不顯示

MOV 75H,7AH

AJMP INTT1OUT

MNN1:MOV 72H,7AH

MOV 73H,7AH ;顯示單元(72-73H),將不顯示鬧鍾分數據

MOV 74H,7DH

MOV 75H,7EH

AJMP INTT1OUT

MNN2:MOV 72H,7BH

MOV 73H,7CH

MOV 74H,7AH

MOV 75H,7AH ;顯示單元(74-75H),鬧鍾小時數據將不顯示

AJMP INTT1OUT

;-------------------------顯示-------------------------------;

DISPLAY:MOV DPTR,#DISDATA

MOV A,70H

MOVC A,@A+DPTR

MOV P3,A

CLR P1.0

NOP

NOP

NOP

SETB P1.0

MOV A,71H

MOVC A,@A+DPTR

MOV P3,A

CLR P1.1

NOP

NOP

NOP

SETB P1.1

MOV A,72H

MOVC A,@A+DPTR

MOV P3,A

CLR P1.2

NOP

NOP

NOP

SETB P1.2

MOV A,73H

MOVC A,@A+DPTR

MOV P3,A

CLR P1.3

NOP

NOP

NOP

SETB P1.3

MOV A,74H

MOVC A,@A+DPTR

MOV P3,A

CLR P1.4

NOP

NOP

NOP

SETB P1.4

MOV A,75H

MOVC A,@A+DPTR

MOV P3,A

CLR P1.5

NOP

NOP

NOP

SETB P1.5

RET

BEEP:MOV A,68H ;查詢標志

CJNE A,#1,BEERE

MOV A,78H ;查詢鬧鍾時個位

CJNE A,7DH,BEERE

MOV A,79H ;查詢鬧鍾時十位

CJNE A,7EH,BEERE

MOV A,76H ;查詢鬧鍾分個位

CJNE A,7BH,BEERE

MOV A,77H ;查詢鬧鍾分十位

CJNE A,7CH,BEERE

BB:CLR P1.6

LCALL DDL

SETB P1.6

LCALL DDL

JNB P1.7,BEERR

BEERE:RET

BEERR:SETB P1.6

MOV 68H,#0

LCALL DISPLAY

JNB P1.7,BEERR

JMP BEERE

DISDATA:DB 0C0H,0F9H,64H,70H,59H,52H,42H,0F8H,40H,50H,0FFH ;0123456789空白

END

❸ 求一個關於用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語言)怎麼寫

具體代碼如下:
#include<graphics.h>
#include<math.h>
#include<dos.h>
#define PI 3.1415926

//屏幕中心的坐標(640X480模式下)
#define mid_x 320
#define mid_y 240

int main()
{ int graphdriver=DETECT,graphmode;
int end_x,end_y;
struct time curtime;
float th_hour,th_min,th_sec;

initgraph(&graphdriver,&graphmode,"C:\\TC2"); //初始化VGA屏幕模式
setbkcolor(BLACK); //使用黑色的背景色
while(!kbhit(0)) //若有鍵盤輸入,則跳出,即是結束程序
{ setcolor(GREEN); //把畫筆設為綠色
circle(mid_x,mid_y,180); //鍾的外圓
circle(mid_x,mid_y,150); //鍾的內圓
circle(mid_x,mid_y,1); //畫出鍾的圓心
gettime(&curtime); //取得系統當前時間
th_sec=(float)curtime.ti_sec*0.1047197551; //把秒針的角度化為弧度,為以後繪制時方便,下同
th_min=(float)curtime.ti_min*0.1047197551+th_sec/60.0; //分針的弧度
th_hour=(float)curtime.ti_hour*0.5235987755+th_min/12.0; //時度的弧度,注意整時是12等分的,所時乘的是3.14/180*5
//計算出時針的尾的坐標(時針長70)
end_x=mid_x+70*sin(th_hour);
end_y=mid_y-70*cos(th_hour);
setcolor(RED);
line(mid_x,mid_y,end_x,end_y); //用紅色線畫出時針
//計算出分針坐標(分針長110)
end_x=mid_x+110*sin(th_min);
end_y=mid_y-110*cos(th_min);
setcolor(RED);
line(mid_x,mid_y,end_x,end_y); //用紅色畫出分針
end_x=mid_x+140*sin(th_sec);
end_y=mid_y-140*cos(th_sec);
setcolor(RED);
line(mid_x,mid_y,end_x,end_y); //同上,畫出秒針,長為140
//畫出鍾盤上的刻度,刻度長20
line(140,240,160,240); //9點對應的大刻度
line(320,60,320,80); //12點對應的大刻度
line(500,240,480,240); //3點的刻度
line(320,420,320,400); //6點的刻度
line(410,395.7,400,378.4); //5點
line(475.7,330,458.4,320); //4點
line(475.7,150,458.4,160); //2點
line(410,84.3,400,101.6); //1點
line(230,84.3,240,101.6); //11點
line(164.3,150,181.6,160); //10點
line(164.3,330,181.6,320); //8點
line(230,395.7,240,378.4); //7點
sleep(BLUE); //這里應該是打錯,停止一秒,應為sleep(1000)
cleardevice(); //清除屏幕上的顯示
}
closegraph(); //關閉VGA屏幕,即返迴文本方式
return 0;
}

❺ c語言怎麼樣編寫一個時鍾程序

c語言行敬並時鍾程序代碼如下:

#include<windows.h>

#include<math.h>

#define ID_TIMER 1//計時器ID

#define TWOPI (2*3.14159)

LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);

int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR szCmdLine,int iCmdShow)

{

static TCHAR szAppName[]=TEXT("Clock"檔跡稿孫);

HWND hwnd;

MSG msg;

WNDCLASS wndclass;

wndclass.cbClsExtra=0;

wndclass.cbWndExtra=0;

wndclass.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);

wndclass.hCursor=LoadCursor(NULL,IDC_ARROW);

wndclass.hIcon=LoadIcon(NULL,IDI_APPLICATION);

wndclass.hInstance=hInstance;

wndclass.lpfnWndProc=WndProc;

wndclass.lpszClassName=szAppName;

wndclass.lpszMenuName=NULL;

wndclass.style=CS_HREDRAW|CS_VREDRAW;

if(!RegisterClass(&wndclass))

{

MessageBox(NULL,TEXT("This program requires Windows

T"),szAppName,MB_ICONERROR);

return 0;

}

hwnd=CreateWindow(szAppName,TEXT("Analog Clock"),WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,NULL,NULL,hInstance,NULL);

ShowWindow(hwnd,iCmdShow);

UpdateWindow(hwnd);

while(GetMessage(&msg,NULL,0,0))

{

TranslateMessage(&msg);

DispatchMessage(&msg);

}

return msg.wParam;

}

void Setsotropic(HDC hdc,int cxClient,int cyClient)

{

SetMapMode(hdc,MM_ISOTROPIC);

SetWindowExtEx(hdc,1000,1000,NULL);

SetViewportExtEx(hdc,cxClient/2,-cyClient/2,NULL);

SetViewportOrgEx(hdc,cxClient/2,cyClient/2,NULL);

}

void RotatePoint(POINT pt[],int iNum,int iAngle)

{

int i;

POINT ptTemp;

for(i=0;i<iNum;i++)

{

ptTemp.x=(int)(pt[i].x*cos(TWOPI*iAngle/360)+pt[i].y*sin(TWOPI*iAngle/360));

ptTemp.y=(int)(pt[i].y*cos(TWOPI*iAngle/360)+pt[i].x*sin(TWOPI*iAngle/360));

pt[i]=ptTemp;

}

}

void DrawClock(HDC hdc)

{

int iAngle;

POINT pt[3];

for(iAngle=0;iAngle<360;iAngle+=6)

{

pt[0].x=0;

pt[0].y=900;

RotatePoint(pt,1,iAngle);

pt[2].x=pt[2].y=iAngle%5?33:100;

pt[0].x-=pt[2].x/2;

pt[0].y-=pt[2].y/2;

pt[1].x=pt[0].x+pt[2].x;

pt[1].y=pt[0].y+pt[2].y;

SelectObject(hdc,GetStockObject(BLACK_BRUSH));

Ellipse(hdc,pt[0].x,pt[0].y,pt[1].x,pt[1].y );

}

}

void DrawHands(HDC hdc,SYSTEMTIME *pst,BOOL fChange)

{

static POINT pt[3][5]={0,-150,100,0,0,600,-100,0,0,-150, 0,-200,50,0,0,800,-50,0,0,-200, 0,0,0,0,0,0,0,0,0,800 };

int i,iAngle[3];

POINT ptTemp[3][5];

iAngle[0]=(pst->wHour*30)%360+pst->wMinute/2;

iAngle[1]=pst->wMinute*6;

iAngle[2]=pst->wSecond*6;

memcpy(ptTemp,pt,sizeof(pt));

for(i=fChange?0:2;i<3;i++)

{

RotatePoint(ptTemp[i],5,iAngle[i]);

Polyline(hdc,ptTemp[i],5);

}

}

LRESULT CALLBACK WndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)

{

static int cxClient,cyClient;

static SYSTEMTIME stPrevious;

BOOL fChange;

HDC hdc;

PAINTSTRUCT ps;

SYSTEMTIME st;

switch(message)

{

case WM_CREATE:

SetTimer(hwnd,ID_TIMER,1000,NULL);

GetLocalTime(&st);

stPrevious=st;

return 0;

case WM_SIZE:

cxClient=LOWORD(lParam);

cyClient=HIWORD(lParam);

return 0;

case WM_TIMER:

GetLocalTime(&st);

fChange=st.wHour!=stPrevious.wHour||st.wMinute!=stPrevious.wMinute;

hdc=GetDC(hwnd);

Setsotropic(hdc,cxClient,cyClient);

SelectObject(hdc,GetStockObject(WHITE_PEN));

DrawHands(hdc,&stPrevious,fChange);

SelectObject(hdc,GetStockObject(BLACK_PEN));

DrawHands(hdc,&st,TRUE);

stPrevious=st;

return 0;

case WM_PAINT:

hdc=BeginPaint(hwnd,&ps);

Setsotropic(hdc,cxClient,cyClient);

DrawClock(hdc);

DrawHands(hdc,&stPrevious,TRUE);

EndPaint(hwnd,&ps);

return 0;

case WM_DESTROY:

KillTimer(hwnd,ID_TIMER);

PostQuitMessage(0);

return 0;

}

return DefWindowProc(hwnd,message,wParam,lParam);

}

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

}