導航:首頁 > 操作系統 > 51單片機做秒錶

51單片機做秒錶

發布時間:2023-05-31 03:31:39

『壹』 基於51單片機的電子秒錶設計

這個是 數碼管顯示計數器程序。稍加更改 既滿足要求

要精確定時,必須使用自裝載方式。這里我們使用T2定時器,讓它工作在16bit自動裝載方式,這時,有另一個位置專門裝著16位預裝載值,T2溢出時,預裝載值立即被置入。這就保證了精確定時。
但是,即使是16位定時器,最長的溢出時間也就幾十毫秒,要定時一秒,就需要一個變數來保存溢出的次數,積累到了多少次之後,才執行一次操作。這樣就可以累加到1秒或者更長的時間才做一次操作了。
T2定時器有個特殊的地方,它進入中斷後,需要自己清除溢出標記,而51的其他定時器是自動清除的。請參考51單片機相關書籍。
如果使用T2定時器實現1秒精確定時
下面我們就來計算:
模擬器的晶振是22118400HZ,每秒鍾可以執行1843200個機器周期。而T2每次溢出最多65536個機器周期。我們盡量應該讓溢出中斷的次數最少,這樣對主程序的干擾也就最小。
選擇每秒中斷24次,每次溢出1843200/24=76800個機器周期,超出65536,無效。
選擇每秒中斷30次,每次溢出1843200/30=61440個機器周期
選擇每秒中斷32次,每次溢出1843200/32=57600個機器周期
選擇每秒中斷36次,每次溢出1843200/36=51200個機器周期
選擇每秒中斷40次,每次溢出1843200/40=46080個機器周期
從上面可以看到我們可以選擇方式有很多,但是最佳的是每秒中斷30次,每次溢出61440個機器周期。也就是賦定時器T2初值65536-61440=4096,換成十六進制就是0x1000。
從上面的計算也可以看出晶振2118400Hz的好處,它可以整除的倍數多,要准確定時非常方便。更常見的應用是在串口波特率上,使用22118400HZ可以輸出最多准確的標准波特率。

如果是其他頻率的晶振 按照上面的方法計算即可

******************************************************************/

#include <reg52.h> //包括一個52標准內核的頭文件
#include<intrins.h>
/****************************聲明函數*****************************/

void x8led(unsigned long ddd);
void delay882us(void);

/*****************************定義IO******************************/

sbit P20=P2^0;
sbit P21=P2^1;
sbit S16=P3^0;
sbit S15=P3^1;
sbit S14=P3^2;
sbit P10=P1^0;
sbit P11=P1^1;
sbit P12=P1^2;
sbit P13=P1^3;
sbit P14=P1^4;
sbit P15=P1^5;
sbit P16=P1^6;
sbit P17=P1^7;
bit f=0;//位變數

/***************************定時器2中斷**************************/

timer2() interrupt 5
{
static unsigned char t;
TF2=0;
t++;
if(t==30) //T2的預置值0x1000,溢出30次就是1秒鍾,晶振22118400HZ 這里晶振頻率不同則會有所不同
{
t=0;
f=1;//每次長時間的溢出,就置一個標記,以便主程序處理
}
}

/*****************************數碼管掃描**************************/

void x8led(unsigned long ddd)
{
unsigned char q,r=0;
unsigned char l[11]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x7f};
//0-9的欄位碼
unsigned char xx[8]={0,0,0,0,0,0,0,0};
unsigned char y[8]={0x80,0x40,0x20,0x10,0x8,0x4,0x2,0x1};
xx[0]=ddd%10;
xx[2]=ddd/10%10;
xx[1]=ddd/100%10;
xx[3]=ddd/1000%10;
xx[4]=ddd/10000%10;
xx[6]=ddd/100000%10;
xx[5]=ddd/1000000%10;
xx[7]=ddd/10000000; //求出八位數,分別放在八個變數中

for(q=0;q<8;) //循環掃描
{
q++;
r++;
if(r==8)r=0;
P1=y[r];
P21=1;
delay882us();
P21=0;

P20=1;
P1=l[xx[r]];
delay882us();
P1=0xff;
P20=0;
}

}

/*******************************延時882us*************************/

void delay882us(void)
{
unsigned char i;
for(i=0;i<255;i++)
{
_nop_();
}
}

/*****************************主程序******************************/

void main(void)
{

unsigned long a=0;
RCAP2H =0x10; //賦T2的預置值0x1000,溢出30次就是1秒鍾
RCAP2L =0x00;
TR2=1; //啟動定時器
ET2=1; //打開定時器2中斷
EA=1; //打開總中斷

while(1)
{

if(f)//發現標記進入處理
{
f=0;//清除標記
a++;
if(a>99999999)a=0;
}
x8led(a);//將a的值送到數碼管顯示
}

}

/*****************************************************************/

『貳』 51單片機的4位數碼管做簡易秒錶C語言程序

#include"dz110306140.h"這是什麼頭文件

『叄』 如何用51單片機用單數碼管做9s的簡易秒錶

假設P0接數碼管,程序如下:
#include<reg52.h>
#define uchar unsigned char

#define uint unsigned int
uchar a=0;

uchar b=9;

//共陰數碼管七段碼
uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d, 0x07,0x7f,0x6f,0x77};

void delay(uchar aa)//延時子程序
{
uchar bb,cc;
for(bb=aa;bb>0;bb--)
for(cc=200;cc>0;cc--);
}
void main(void )//主程序
{
TMOD=0x01;// 定時器0工作方式一
ET0=1;

EA=1;
TH0=(65536-50000)/256;//定時50ms
TL0=(65536-50000)%256;
TR0=1;//啟動
while(b>0)
{
P0= table[b];
delay(5);
}
P0=0;

TR0=0;
while(1);
}
//中斷子程序
void Timer0(void) interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
a++;
if(a==20) {a=0;b--;}
}

『肆』 51單片機 秒錶設計

// 51單片機 秒錶,顯示時間為0000—9999秒,啟動、停止,(停止後再次啟動復位)

#include<reg52.h>

#define uint unsigned int

#define uchar unsigned char

uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};

uchar ,shi;

uint a1,a2;

sbit D1=P3^0;

sbit D2=P3^1;

sbit D3=P3^2;

sbit D4=P3^3;

sbit key=P3^5;

sbit key1=P3^7;

bit j ;

uint y ;

void main()

{

TMOD=0x01;

TH0=(65536-10000)/256;

TL0=(65536-10000)%256;

EA=1;

ET0=1;

TR0=1;

=0;

shi=0;

while(1)

{

if(key==0)

{

j=0;

}

if(key1==0)

{

j=1; a2=0;

}

}

}

void timer0()interrupt 1

{

TH0=(65536-10000)/256;

TL0=(65536-10000)%256;

a1++;

y++;

if(a1==100)

{

a1=0;

if(j==1) a2++;

if(a2>=10000) a2=0;

}

D1 = 1; D2 = 1; D3 = 1; D4 = 1;

if(y==1)

{

P1=table[a2%10000/1000];

D4=0;

}

if(y==2)

{

P1=table[a2%1000/100];

D3=0;

}

if(y==3)

{

P1=table[a2%100/10];

D2=0;

}

if(y==4)

{

P1=table[a2%10];

D1=0;

y=0;

}

}

『伍』 用51單片機製作倒計時秒錶需要什麼元件,麻煩列個清單。新手剛剛開始學

至少需要:
1、單片機--1
2、30p電容--2
3、12M晶振--1
4、10u電容--1
5、8.2K電阻--1
6、按鈕開關--1
7、數碼管組--1(4個數碼管)
8、8電阻排--1
9、輔料(導線、焊錫等)

『陸』 51單片機設計一個秒錶,用兩個數碼管(任意相鄰的兩個)顯示。

ORG 0000H
JMP BEGIN
ORG 000BH
LJMP T0INT
ORG 001BH
LJMP T1INT
LEDD EQU 30H
LEDC EQU 36H
SECC EQU 37H
TCNT EQU 3AH
ORG 0030H
;---------------------------------------
TABLE: ; 共陰極數碼管顯示代碼表
DB 0FCH ;"0" 00H
DB 60H ;"1" 01H
DB 0DAH ;"2" 02H
DB 0F2H ;"3" 03H
DB 66H ;"4" 04H
DB 0B6H ;"5" 05H
DB 0BEH ;"6" 06H
DB 0E0H ;"7" 07H
DB 0FEH ;"8" 08H
DB 0F6H ;"9" 09H
DB 0EEH ;"A" 0AH
DB 3EH ;"B" 0BH
DB 9CH ;"C" 0CH
DB 7AH ;"D" 0DH
DB 9EH ;"E" 0EH
DB 8EH ;"F" 0FH
DB 00H ;" " 10H
; DB 3FH,06H,5BH,4FH,66H ;12345
; DB 6DH,7DH,07H,7FH, ;6789
;---------------------------------------
DELAY:
MOV R6,#25
DLY01:
MOV R7,#100
DJNZ R7,$
DJNZ R6,DLY01
RET
;---------------------------------------
BEGIN:
MOV SP,#5FH
MOV TMOD,#11H
MOV TH0,#3CH
MOV TL0,#0B0H
MOV TH1,#0F4H
MOV TL1,#48H
MOV LEDC,#0
MOV R0,#LEDD
CLR A
INIT:
MOV @R0,A
INC R0
DJNZ LEDC,INIT
SETB ET1
SETB TR1
MOV P2,#0
MOV TCNT,#0
MOV SECC,#0
SETB ET0
SETB EA
MOV SECC,#60
LCALL DISSEC
SETB TR0
SETB TR1
LOOP:
SJMP $
;---------------------------------------
T1INT:
PUSH ACC
CLR TR1
MOV TH1,#0F4H
MOV TL1,#48H
SETB TR1
MOV DPTR,#TABLE
MOV R0,#LEDD
MOV A,LEDC
T1INT0:
JNZ T1INT1
MOV P2,#01H
MOV A,@R0
MOVC A,@A+DPTR
CPL A
MOV P0,A
SJMP T1INTD
T1INT1:
MOV P2,#02H
INC R0
MOV A,@R0
MOVC A,@A+DPTR
CPL A
MOV P0,A
T1INTD:
INC LEDC
MOV A,LEDC
CJNE A,#2,T1INT6
T1INT6:
JC T1INTE
MOV LEDC,#0
T1INTE:
POP ACC
RETI
;---------------------------------------
HBCD:
MOV B,#10
DIV AB
SWAP A
ORL A,B
RET
;---------------------------------------
T0INT:
PUSH ACC
CLR TR0
MOV TH0,#3CH
MOV TL0,#0B0H
SETB TR0
INC TCNT
MOV A,TCNT
CJNE A,#20,T0INT1
T0INT1:
JC T0INTE
MOV TCNT,#0
INC SECC
MOV A,SECC
CJNE A,#60,T0INT2
JC T0INT2
MOV A,#60
MOV SECC,A
T0INT2:
LCALL DISSEC
T0INTE:
POP ACC
RETI
;---------------------------------------
DISSEC:
MOV A,SECC
LCALL HBCD
PUSH ACC
ANL A,#0FH
MOV 30H,A
POP ACC
SWAP A
ANL A,#0FH
MOV 31H,A
RET
;---------------------------------------
END

『柒』 51單片機製作一個秒錶

//功能:0~99秒的簡易秒錶設計,兩個靜態數碼管,定時器採用中斷方式
#include"reg51.h"
#define uchar unsigned char
#define uint unsigned int

uchar count=0;//對50ms定時時間進行計數
uchar miao=0; //秒計數器

//函數名:timer_1()
//函數功能:定時器T1的中斷函數,T1在工作方式1下每50秒產生中斷,執行該中斷函數
//形式參數:無
//返回值:無
void timer_1() interrupt 3 //T1的中斷類型號為3
{
TH1=(65536-50000)/256; //重新設置T1計數初值高8位
TL1=(65536-50000)%256; //重新設置T1計數初值低8位
count++; //50ms計數器加1
if(count==20) //1s時間到
{
count=0; //50ms計數器清0
miao++; //秒計數器加1
if(miao==100)miao=0; //miao計數到100,則從0開始計數
}
}

bit b=0;
void int_0() interrupt 0
{
if(b == 0){TR1 = 0;b = 1;}
else
{
b = 0;
TR1 = 1;
}
}

void int_1() interrupt 2
{
miao=0;
count = 0;
TH1=(65536-50000)/256;
TL1=(65536-50000)%256;
TR1=1;
}

//函數名:disp
//函數功能:將i的值顯示在兩個靜態連接的數碼管上
//形式參數:i,取值范圍0~99
//返回值:無
void disp(uchar i)
{
uchar led[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
//定義0~9顯示碼,共陽極數碼管
P1=led[i/10]; //顯示i高位
P2=led[i%10]; //顯示i地位
}
void main()
{
TMOD=0x10;//設置T1在工作方式1
TH1=(65536-50000)/256;//設置T1計數初值高8位,定時時間50ms
TL1=(65536-50000)%256;//設置T1計數初值低8位
ET1=1;//開放T1中斷允許
EX0 = 1;
IT0 = 1;
EX1 = 1;
IT1=1;
EA=1;//開放總中斷允許
TR1=1;//啟動T1開始計時
while(1)
{
disp(miao);//顯示秒計數器值
}
}

『捌』 用51單片機C語言版設計秒錶倒計時

K1 EQU P1.0
K2 EQU P1.1
K3 EQU P1.2
ORG 0000H
LJMP MAIN
ORG 000BH
LJMP T0ISR
ORG 0030H
MAIN:
MOV TMOD,#01H
MOV TH0,#HIGH(65536-10000)
MOV TL0,#LOW(65536-10000)
SETB ET0
SETB TR0
SETB EA
MOV R0,#9
MOV R1,#9
MOV R2,#0
MOV R3,#99
CLR 00H
CLR 01H
LOOP:
JB K1,LP01
JNB K1,$
CLR 01H
INC R3
CJNE R3,#100,LOOP0
MOV R3,#0
SJMP LOOP0
LP01:
JB K2,LP02
JNB K2,$
CLR 01H
CJNE R3,#0,LP011
MOV R3,#99
SJMP LOOP0
LP011:
DEC R3
SJMP LOOP0
LP02:
JB K3,LOOP
JNB K3,$
SETB 01H
SJMP LOOP
LOOP0:
MOV A,R3
MOV B,#10
DIV AB
MOV R0,B
MOV R1,A
SJMP LOOP
T0ISR:
CLR TR0
MOV TH0,#HIGH(65536-10000)
MOV TL0,#LOW(65536-10000)
SETB TR0
MOV DPTR,#TABLE
T0C:
CPL 00H
JB 00H,T001
MOV P3,#0FDH
MOV A,R1
MOVC A,@A+DPTR
MOV P2,A
SJMP T002
T001:
MOV P3,#0FEH
MOV A,R0
MOVC A,@A+DPTR
MOV P2,A
T002:
JNB 01H,T0E
INC R2
MOV A,R2
CJNE A,#100,T0E
MOV R2,#0
MOV A,R0
JZ T003
DEC R0
SJMP T0E
T003:
MOV A,R1
JZ T004
DEC R1
MOV R0,#9
T0E:
RETI
T004:
CLR 01H
MOV R4,#16
T005:
CPL P0.0
LCALL DELAY
DJNZ R4,T005
RETI
DELAY:
MOV R6,#200
DLY:
MOV R7,#250
DJNZ R7,$
DJNZ R6,DLY
RET
TABLE: ; 共陰極數碼管顯示代碼表
DB 3FH,06H,5BH,4FH,66H ;01234
DB 6DH,7DH,07H,7FH,6FH ;56789
END

閱讀全文

與51單片機做秒錶相關的資料

熱點內容
linux內存子系統 瀏覽:968
加密思維幣 瀏覽:688
魅族訪客文件夾 瀏覽:50
添加的文件夾怎麼找 瀏覽:615
程序員涉黃 瀏覽:698
maven編譯resources下的js 瀏覽:519
ubuntu文件移動命令 瀏覽:227
安卓i怎麼查找蘋果手機 瀏覽:949
雲伺服器宕機概率 瀏覽:231
在線買葯用什麼app知乎 瀏覽:813
ubuntu解壓xz文件 瀏覽:674
宏傑加密時電腦關機 瀏覽:388
自己寫單片機編譯器 瀏覽:599
單片機按鍵閃爍 瀏覽:381
為什麼icloud總是顯連接伺服器失敗 瀏覽:890
如何設置域控伺服器 瀏覽:740
想在上海租房子什麼app好 瀏覽:186
編譯程序各部分是必不可少的嗎 瀏覽:887
編程不超過十行 瀏覽:765
數電編譯器的作用 瀏覽:339