導航:首頁 > 操作系統 > 電子手錶單片機驅動

電子手錶單片機驅動

發布時間:2022-05-11 04:44:44

① 電子手錶冷光燈亮幾秒後自動熄滅利用的是什麼原理

電子表內部為照明迴路設計了單穩態電路,觸發按鈕令電路開燈是一種暫態,延時幾秒之後進入滅燈的穩態狀態。

② 我想用單片機實現電子表功能,參考於宋彩利編的《單片機原理與C51編程》的程序,目前運行有問題,請多指教

以下就是該題的全部程序,請高手指點~~~~~~
#include <reg51.h>
#include <intrins.h>
#define uchar unsigned char //定義0~9共陰顯示
code uchar Table[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
sbit CLK1=P1^0;
sbit SDA1=P1^1;
sbit CLK2=P1^3;
sbit SDA2=P1^4;
sbit KEY=P1^2;
sbit SOUND=P1^7;
int h1,m1,s1;
int h2,m2,s2;
int count1,count2;
uchar dis[6];
void delay() //延時程序
{
unsigned int j;
for(j=0;j<100;j++)
{}
}
void send1(unsigned char a) //74HC164
{
unsigned char i;
for(i=0;i<8;i++)
{ if(_crol_(a,i)&0x80)
SDA1=1;
else
SDA1=0;
CLK1=0;
CLK1=1;
}
}
void send2(unsigned char a)
{
unsigned char i;
for(i=0;i<8;i++)
{
if(_crol_(a,i)&0x80)
SDA2=1;
else
SDA2=0;
CLK2=0;
CLK2=1;
}
}
void display(int h,int m,int s)
{
int i,x,com=0xfe;
dis[0]=h/10;dis[1]=h%10; //時
dis[2]=m/10;dis[3]=m%10; //分
dis[4]=s/10;dis[5]=s%10; //秒
for(i=0;i<6;i++) //顯示位數
{ x=send2(0xff);
Table[dis[i]]; //黑屏
send1(x); //發送段碼
send2(com); //發送位碼
delay(); //延時
com=_crol_(com,1); //改變位碼
}
}
void time_add(int h,int m,int s) //加時程序
{
s++;
if(s==60)
{ m++;
s=0;
if(m==60)
{ h++;
m=0;
if(h==24)
{ h=0;
}
}
}
}
void time_dec(int h,int m,int s) //減時程序
{
s--;
if(s<0)
{ m--;
s=59;
if(m<0)
{ h--;
m=59;
if(h<0)
{ h=23;
}
}
}
}
void time0_int(void) interrupt 1 //定時/計數器0
{ TH0=-0x3c;
TL0=0xb0;
count1++;
if(count1==20)
{ time_add(h1,m1,s1);
count1=0;
}
}
void time2(void) interrupt 3 //定時/計數器1
{
TH1=0xFD;
TH1=0x80;
SOUND=~SOUND; //揚盪發聲
if(count2==1000)
{
TR1=0;
count2=0;
}
}
void main(void) //主程序
{
int flag;
unsigned char jkey ,i;
TMOD=0x11;
IE=0x8A;
TR0=1;TR1=0; //啟動T0,停止T1
while(1)
{
jkey=0xfe;
flag=0;
for(i=0;i<6;i++)
{
send1(jkey);
if(!KEY)
{ flag=1;break;}
else
jkey=_crol_(jkey,1);
}
if(flag==1)
{
switch(i)
{
case 0:{TR0=1;display(h1,m1,s1);break;}
case 1:{TR0=0;display(h1,m1,s1);break;}
case 2:{time_add(h1,m1,s1);display(h1,m1,s1);break;}
case 3:{time_dec(h1,m1,s1);display(h1,m1,s1);break;}
case 4:{time_add(h2,m2,s2);display(h1,m1,s1);break;}
case 5:{time_dec(h2,m2,s2);display(h1,m1,s1);break;}
}
}
else //如果無按鍵按下,顯示當前
display(h1,m1,s1); //鬧鈴
if(h1==h2&&m1==m2&&s1==s2)
{TR1=1;}
}
}

③ 為什麼電子手錶沒有單片機卻可以顯示數碼管

電子手錶是用液晶屏顯示的。
其實,電子表電路就是數字電路的計數器,加上液晶顯示驅動晶元就夠了。
而且晶元通常是軟體封裝的,就是直接封裝在PCB板上了。

④ 單片機電子表程序

匯編如下:
S_SET BIT P3.4 ;秒增加1按鈕位
M_SET BIT P3.5 ;分增加1按鈕位
H_SET BIT P3.7 ;小時增加1按鈕位
SECOND EQU 30H ;秒計數值變數
MINUTE EQU 31H ;分計數值變數
HOUR EQU 32H ;小時計數值變數
TCNT EQU 34H ; 1秒定時計數器

ORG 00H ;起始地址
JMP START
ORG 0BH ;Timer0中斷向量地址
JMP INT_T0

START:
MOV DPTR,#TABLE ;裝七段數碼管段碼數據表TABLE
MOV HOUR,#0 ;計數值全部清0
MOV MINUTE,#0
MOV SECOND,#0
MOV TCNT,#0
MOV TMOD,#01H ;Timer 0作定時器,模式1
MOV TH0,#(65536-50000)/256 ;定時50毫秒
MOV TL0,#(65536-50000)MOD 256
MOV IE,#82H ;中斷使能
SETB TR0 ;啟動Timer 0

;以下是判斷秒、分、小時增加1按鈕是否被按下
A1:
CALL DISPLAY
JNB S_SET,S1 ;判斷秒按鈕
JNB M_SET,S2 ;判斷分按鈕
JNB H_SET,S3 ;判斷小時按鈕
JMP A1 ;循環檢測

S1:
CALL DELAY ;去抖動
JB S_SET,A1
INC SECOND ;秒位計數值加1
MOV A,SECOND ;A=SECOND
CJNE A,#60,J0 ;判斷是否到60秒
MOV SECOND,#0 ;如果到了就清0秒位計數值
JMP K1 ;跳到K1段

S2:
CALL DELAY
JB M_SET,A1

K1:
INC MINUTE ;分位計數值加1
MOV A,MINUTE ;A=MINUTE
CJNE A,#60,J1 ;判斷是否到60分
MOV MINUTE,#0 ;如果到了就清0分位計數值
JMP K2

S3:
CALL DELAY
JB H_SET,A1

K2:
INC HOUR ;小時計數值加1
MOV A,HOUR ;A=HOUR
CJNE A,#24,J2 ;判斷是否到24小時
MOV HOUR,#0 ;如果到了就清0秒、分、小時位計數值
MOV MINUTE,#0
MOV SECOND,#0
JMP A1

;以下程序等待秒、分、小時按鈕放開
J0:
JB S_SET,A1
CALL DISPLAY
JMP J0

J1:
JB M_SET,A1
CALL DISPLAY
JMP J1

J2:
JB H_SET,A1
CALL DISPLAY
JMP J2

;Timer0中斷服務子程序, 進行秒、分、小時的計時
INT_T0:
MOV TH0,#(65536-50000)/256 ;裝計數初始值
MOV TL0,#(65536-50000)MOD 256
INC TCNT ;1秒計數器增加1
MOV A,TCNT ;A=TCNT
CJNE A,#20,RETUNE ;計時1秒
INC SECOND ;秒計數器增加1
MOV TCNT,#0 ;清零TCNT
MOV A,SECOND ;A=SECOND
CJNE A,#60,RETUNE ;計時60秒
INC MINUTE ;分計數器增加1
MOV SECOND,#0 ;清零秒
MOV A,MINUTE ;A=MINUTE
CJNE A,#60,RETUNE ;計時60分
INC HOUR ;小時計數器增加1
MOV MINUTE,#0 ;清零分
MOV A,HOUR ;A=HOUR
CJNE A,#24,RETUNE ;計時24小時
MOV HOUR,#0 ;秒、分、小時計數值清0
MOV MINUTE,#0
MOV SECOND,#0
MOV TCNT,#0
RETUNE:
RETI ; 中斷服務子程序結束

;以下為七段數碼管顯示的子程序
DISPLAY:
MOV A,SECOND ;A=SECOND,顯示秒
MOV B,#10 ;B=10
DIV AB ;A除以B
MOV P2,#00100000B ;使能秒的十位
MOVC A,@A+DPTR ;七段數碼管段碼數據裝入A
MOV P0,A ;從P0口輸出
CALL DELAY
ORL P2,#0FFH ;熄滅七段數碼管

MOV A,B ;A=B
MOV P2,#00000000B ;使能秒的個位
MOVC A,@A+DPTR ;七段數碼管段碼數據裝入A
MOV P0,A ;從P0口輸出
CALL DELAY
ORL P2,#0FFH ;熄滅七段數碼管

MOV A,MINUTE ;A=MINUTE,顯示分
MOV B,#10 ;B=10
DIV AB ;A除以B
MOV P2,#01100000B ;使能分的十位
MOVC A,@A+DPTR ;七段數碼管段碼數據裝入A
MOV P0,A ;從P0口輸出
CALL DELAY
ORL P2,#0FFH ;熄滅七段數碼管

MOV A,B ;A=B
MOV P2,#01000000B ;使能分的個位
MOVC A,@A+DPTR ;七段數碼管段碼數據裝入A
MOV P0,A ;從P0口輸出
CALL DELAY
ORL P2,#0FFH ;熄滅七段數碼管

MOV A,HOUR ;A=HOUR,顯示小時
MOV B,#10 ;B=10
DIV AB ;A除以B
MOV P2,#10100000B ;使能小時的十位
MOVC A,@A+DPTR ;七段數碼管段碼數據裝入A
MOV P0,A ;從P0口輸出
CALL DELAY
ORL P2,#0FFH ;熄滅七段數碼管

MOV A,B ;A=B
MOV P2,#10000000B ;使能小時的個位
MOVC A,@A+DPTR ;七段數碼管段碼數據裝入A
MOV P0,A ;從P0口輸出
CALL DELAY
ORL P2,#0FFH ;熄滅七段數碼管
RET

TABLE: ;七段數碼管顯示碼表
DB 40H,79H,24H,30H,19H
DB 12H,02H,78H,00H,10H

DELAY: ;延時子程序
MOV R6,#2
D1:
MOV R7,#250
DJNZ R7,$
DJNZ R6,D1
RET

END

⑤ 目的: 仿電子手錶功能的單片機時鍾

#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit la=P2^6;
sbit wela=P2^7;
sbit rs=P3^5;
sbit lcden=P3^4;
sbit s1=P3^0;
sbit s2=P3^1;
sbit s3=P3^2;
sbit rd=P3^7;
uchar count,s1num;
char miao,shi,fen;
uchar code table[]=" 2009-12-20 MON";
uchar code table1[]=" 00:00:00";
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}

void write_com(uchar com)
{
rs=0;
lcden=0;
P0=com;
delay(5);
lcden=1;
delay(5);
lcden=0;
}

void write_date(uchar date)
{
rs=1;
lcden=0;
P0=date;
delay(5);
lcden=1;
delay(5);
lcden=0;
}

void init()
{
uchar num;
la=0;
wela=0;
lcden=0;
// fen=59;
// miao=53;
// shi=23;
write_com(0x38);
write_com(0x0c);
write_com(0x06);
write_com(0x01);
write_com(0x80);
for(num=0;num<15;num++)
{
write_date(table[num]);
delay(5);
}
write_com(0x80+0x40);
for(num=0;num<12;num++)
{
write_date(table1[num]);
delay(5);
}
TMOD=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=1;
ET0=1;
TR0=1;
}

void write_sfm(uchar add,uchar date)
{
uchar shi,ge;
shi=date/10;
ge=date%10;
write_com(0x80+0x40+add);
write_date(0x30+shi);
write_date(0x30+ge);
}

void keyscan()
{
rd=0;
if(s1==0)
{
delay(5);
if(s1==0)
{ s1num++;
while(!s1);
if(s1num==1)
{
TR0=0;
write_com(0x80+0x40+10);
write_com(0x0f);
}
}
if(s1num==2)
{
write_com(0x80+0x40+7);
}
if(s1num==3)
{
write_com(0x80+0x40+4);
}
if(s1num==4)
{
s1num=0;
write_com(0x0c);
TR0=1;
}

}
if(s1num!=0)
{
if(s2==0)
{
delay(5);
if(s2==0)
{
while(!s2);
if(s1num==1)
{
miao++;
if(miao==60)
miao=0;
write_sfm(10,miao);
write_com(0x80+0x40+10);

}
if(s1num==2)
{
fen++;
if(fen==60)
fen=0;
write_sfm(7,fen);
write_com(0x80+0x40+7);
}
if(s1num==3)
{
shi++;
if(shi==24)
shi=0;
write_sfm(4,shi);
write_com(0x80+0x40+4);
}
}
}
if(s3==0)
{
delay(5);
if(s3==0)
{
while(!s3);
if(s1num==1)
{
/* if(miao==0)
{
miao=59;
write_sfm(10,miao);
write_com(0x80+0x40+10);
}*/
miao--;
if(miao==-1)
miao=59;
write_sfm(10,miao);
write_com(0x80+0x40+10);
}
if(s1num==2)
{
fen--;
if(fen==-1)
fen=59;
write_sfm(7,fen);
write_com(0x80+0x40+7);
}
if(s1num==3)
{
shi--;
if(shi==-1)
shi=23;
write_sfm(4,shi);
write_com(0x80+0x40+4);
}
}
}
}
}
void main()
{
init();
while(1)
{
keyscan();

}
// while(1);
}

void timer0() interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
count++;
if(count==18)
{
count=0;
miao++;
if(miao==60)
{
miao=0;
fen++;
if(fen==60)
{
fen=0;
shi++;
if(shi==24)
{
shi=0;
}
write_sfm(4,shi);
}
write_sfm(7,fen);
}
write_sfm(10,miao);

}
}

⑥ 51單片機驅動八位數碼管電子鍾

#include<reg52.h>
#include<intrins.h>

#define uchar unsigned char
#define uint unsigned int
#define DP 0x80

uchar code wei[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//八位位選碼表
//0 1 2 3 4 5 6 7
uchar code an[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//段選碼表
// 0, 1,2, 3, 4 , 5,6,7 ,8,9
uchar flag=0; //
sbit K1=P3^4; //時鍾
sbit K2=P3^5; //秒錶
sbit start=P1^0; //秒錶開始
sbit stop=P1^1; //暫停
sbit clear=P1^2; //清零
sbit clock=P3^0; //時鍾開始
sbit t1=P3^1; //調時
sbit t2=P3^2; //調分
sbit t3=P3^3; //調秒
sbit P3_4 = P3^4;
sbit P3_5 = P3^5;

void delay(uint z);
void display1();
void display2();
void init();
void keyscan1();
void keyscan2();
void qiehuan();
void gongzuo();

uchar shi,fen,miao,nam;
uchar hour,minite,sec,dot;

void main()
{
init();
P0=0X3F;
P2=0X00; //八個數碼管顯示全為0
TR0=0;
TR1=0;
while(1)
{
gongzuo();
}
}

void delay(uint z) //延時程序
{
uint i,j;
for (i=z;i>0;i--)
for (j=110;j>0;j--);
}

void display1() //P2為位選,P0為段選,顯示格式為 23小時59分59.99秒
{
uchar s,g;
s=shi/10;g=shi%10;
P2=wei[0];P0=an[s]; delay(1);
P2=wei[1];P0=an[g]; delay(1);

s=fen/10;g=fen%10;
P2=wei[2];P0=an[s]; delay(1);
P2=wei[3];P0=an[g]; delay(1);

s=miao/10;g=miao%10;
P2=wei[4];P0=an[s]; delay(1);
P2=wei[5];P0=an[g]|DP; delay(1);

s=nam/10;g=nam%10;
P2=wei[6];P0=an[s]; delay(1);
P2=wei[7];P0=an[g]; delay(1);

}
void display2() //P2為位選,P0為段選,顯示格式為:00時-00分-00秒
{
uchar s,g;
s=hour/10;g=hour%10;
P2=wei[0];P0=an[s]; delay(1);
P2=wei[1];P0=an[g]; delay(1);
P2=wei[2];P0=0x40; delay(1);

s=minite/10;g=minite%10;
P2=wei[3];P0=an[s]; delay(1);
P2=wei[4];P0=an[g]; delay(1);
P2=wei[5];P0=0x40; delay(1);

s=sec/10;g=sec%10;
P2=wei[6];P0=an[s]; delay(1);
P2=wei[7];P0=an[g]; delay(1);

}

void init()
{
EA=1; //開總中斷
ET0=1; //開T0中斷
ET1=1; //開T1中斷
TMOD=0x11; //T0工作方式1,T1工作方式1,
TH0=0x3c;
TL0=0xb0; //T0定時50ms
TH1=0xd8;
TL1=0xf0; //T1定時10ms
TR0=1; // 啟動定時/計數器T0
TR1=1; // 啟動定時/計數器T1

}

void timer1(void) interrupt 1 using 1 //時鍾中斷計時T0 50ms
{

TH0 = 0x3c;
TL0 = 0xb0;
dot++;
if(dot == 20)
{
dot = 0;
sec++;
if (sec == 60)
{
sec = 0;
minite++;
if (minite == 60)
{
minite = 0;
hour++;
if (hour == 24) hour = 0;
}
}
}
}
void timer3 (void)interrupt 3 using 3 //秒錶中斷計時 T1 10ms
{
TH1=0xd8;
TL1=0xf0;
if(++nam==100)
{
nam=0;
if(++miao==60) //計時一分鍾
{
miao=0;
if(++fen==60)
{
fen=0; //返回0
if(++shi==24) shi=0; //24小時返回0
}
}
}
}

void keyscan1()
{
if(~start)
{
delay(5);
if(~start)
{
TR1=1;
display1();
}
}
if(~stop)
{
delay(5);
if(~stop)
{
TR1=0;
display1();
}
}
if(~clear&&TR1==0)
{
delay(5);
if(~clear&&TR1==0)
{
nam=0;miao=0;fen=0;shi=0;
display1();
}
}
}

void keyscan2()
{
if(~clock)
{
delay(5);
if(~clock)
{
TR0=1;
display2();
}
}
if (~t1)
{
delay(1);
if (~t1)
{
while(~t1);
hour=hour+1;
if (hour>=24) hour=0;
display2();
}
}
if (~t2)
{
delay(1);
if (~t2==0)
{
while(~t2);
minite=minite+1;
if (minite>=60) minite=0;
display2();
}
}
if (~t3)
{
delay(1);
if (~t3)
{
while(~t3);
sec=sec+1;
if (sec>=60) sec=0;
display2();
}
}
}

void qiehuan()
{
if(~K1)
{
delay(1);
if(~K1)
{
P3_4 = 0;
P3_5 = 1;
flag = 1;
}
}
if(~K2)
{
delay(1);
if(~K2)
{
P3_4 = 1;
P3_5 = 0;
flag = 2;
}
}
}

void gongzuo()
{
qiehuan();
if(1 == flag)
{
display2();
keyscan2();
}
if(2 == flag)
{
display1();
keyscan1();
}
}

⑦ 電子表用的單片機

這個叫掩膜集成電路。功能設計完成後讓晶元生產廠家直接把晶元做在PCB板上的。

⑧ 平時在店鋪里買的十幾塊錢電子表裡面的晶元是什麼

那個東東非常簡單,主要零件是一個集成電路和一個晶體振盪器,晶體振盪器會產生原始的時鍾頻率,通過集成電路將晶體振盪器信號放大後,通過液晶屏顯示出來;如是機械表就是利用晶體震盪器的信號,驅動步進電機帶動齒輪而讓表旋轉。

⑨ 指針鍾表裡面有單片機沒有,只有時間基本功能的那種

指針鍾表裡沒有單片機的,因為它是機械式的,用簡單的電路或純機械都能完成,不需要單片機。
石英錶就是利用石英的振盪來計數驅動的,機械表是利用發條和復雜機械來驅動,都不需要單片機。
單片機一般會出現在那些可以計算農歷的用數碼管顯示的台式時鍾上。

⑩ 單片機中斷定時器-電子表

#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
//sbit d=P3^7;
sbit swi=P3^2;//暫停-開始按鍵
bit state;
uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
uchar time[]={0,0,0,0,0,0};//待顯示的時分秒
void concrol();
uchar a,key;
void display();
void delay(uchar z)
{
uchar x,y;
for(x=z;x>0;x--)
for(y=113;y>0;y--);
}
void main()
{
key=0;
state=1;
TMOD=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=1;
ET0=1;
TR0=1;
while(1)
{
if(state==swi)//按鍵控制電子表的暫停
{
dispaly();
}
else()
{
concrol();
}
}
}
void time0() interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
a++;
if(a==20)
{
a=0;
time[0]++;
if(time[0]==10)
{
time[1]++;
time[0]=0;
if(time[1]==6)
{
time[1]=0;
time[2]++;
if(time[2]==10)
{
time[2]=0;
time[3]++;
if(time[3]==6)
{
time[3]=0;
time[4]++;
if(time[4]==10)
{
time[4]=0;
time[5]++;
if(time[5]==2)
if(time[4]==4)
if(time[3]==6)
if(time[2]==0)
if(time[1]==6)
if(time[0]==0)
{
time[0]=0;
time[1]=0;
time[2]=0;
time[3]=0;
time[4]=0;
time[5]=0;
}
}
}
}
}
}
}
}
void concrol()//執行按鍵的函數
{
if(swi==0)
{
delay(5);
if(swi==0)
{
while(!swi);
key++;
if(key==1)
{
TR0=0;
}
if(key==2)
{
key=0;
TR1=1;
}
}
}

void display()
{
P2=7;
d=0;
P0=table[time[0]];
d=1;
delay(5);
P0=0;

P2=6;
d=0;
P0=table[time[1]];
d=1;
delay(5);
P0=0;

P2=5;
d=0;
P0=0x40;
d=1;
delay(5);
P0=0;

P2=4;
d=0;
P0=table[time[2]];
d=1;
delay(5);
P0=0;

P2=3;
d=0;
P0=table[time[3]];
d=1;
delay(5);
P0=0;

P2=2;
d=0;
P0=0x40;
d=1;
delay(5);
P0=0;

P2=1;
d=0;
P0=table[time[4]];
d=1;
delay(5);
P0=0;

P2=0;
d=0;
P0=table[time[5]];
d=1;
delay(5);
P0=0;//以上為數碼管顯示的函數
}
我在出差,沒運行過,你使一下。

閱讀全文

與電子手錶單片機驅動相關的資料

熱點內容
命令輸入框 瀏覽:890
冰箱壓縮機發燙噪音 瀏覽:83
單片機棧溢出符號 瀏覽:328
命令與征服修改器怎麼用 瀏覽:483
什麼app比較費錢 瀏覽:830
為什麼同一個app的功能不一樣 瀏覽:232
小型工作室用什麼伺服器好 瀏覽:995
程序員的興趣 瀏覽:413
華為伺服器有什麼好 瀏覽:701
程序員和測試之間的關系 瀏覽:945
加密蚊帳什麼意思 瀏覽:151
javalistclear 瀏覽:607
哪個app上民宿多靠譜 瀏覽:827
重慶伺服器租用哪裡有雲伺服器 瀏覽:453
土星模擬器文件夾 瀏覽:902
文件夾文件袋文件盒 瀏覽:695
雲伺服器打開f8指令 瀏覽:243
盈透證券加密幣 瀏覽:72
阿里雲伺服器初始密碼怎麼修改 瀏覽:266
伺服器怎麼設定公用網路 瀏覽:99