① 基於51單片機的數字電子表的設計
Second EQU R0
Minute EQU R1
Hour EQU R2
Times EQU R3
KeyVal EQU 21H ;儲存鍵值
Key_Res BIT KeyVal.0
Key_Sta BIT KeyVal.1
Key_Add BIT KeyVal.2
Key_Sub BIT KeyVal.3
Key_Sto BIT KeyVal.4
Key_Shift BIT KeyVal.5
;——————————————————————————————————————
ORG 0000H ;主函數入口
SJMP MAIN ;跳轉到主函數
ORG 000BH ;定時器0中斷入口
LJMP INT_Timer50 ;斷定時50ms服務程序;///////////主函數部分//////////;—————初始化部分————
MAIN:
MOV DPTR,#Table ;共陰字型碼表首地址
MOV Second,#0 ;秒單元值零{Second,Minute,Hour
MOV Minute,#0 ;分單元值零{定義為秒
MOV Hour,#0 ;時單元值零{分,時變數
MOV IE,#082H ;打開定時器0中斷
MOV TMOD,#01H ;讓定時器0工作在1方式 Start:
MOV KeyVal,#0FFH ;初始化鍵值為ffh
MOV Times,#0 ;記錄調用中斷的次數,20次為1s
MOV TH0,#3CH
MOV TL0,#0B0H ;時間常數50ms
;——————初始化完成————
LOOP:
LCALL DisplayTime ;顯示當時的時間
MOV A,P0
CJNE A,#0FFH,Read_Key ;按下鍵時讀鍵
LCALL Deal_Key ;抬起鍵時處理按鍵消息
SJMP LOOP
Read_Key :
MOV KeyVal,A ;記下按鍵值
SJMP LOOP ;//////////////主程序結束///////////;/////////按鍵處理子程序///////////
Deal_Key:
JB Key_Shift,KEY00 ;沒按shift轉向復位鍵
INC R4 ;當按加減時首先調整小時,按下shift後
MOV A,R4 ;調整分,再按shift後調整秒,再按shift後
MOV B,#3 ;回到調整小時
DIV AB ;實現按鍵循環控制
MOV R4,B
SJMP EXIT
KEY00:
JB Key_Res,KEY01
SJMP MAIN
KEY01:
JB Key_Sta,SetHour
SETB TR0
SJMP Start
SetHour:
CJNE R4,#0,SetMinute
LCALL DealHour
SJMP EXIT
SetMinute:
CJNE R4,#1,SetScond
LCALL DealMinute
SJMP EXIT
SetScond:
CJNE R4,#2,EXIT
LCALL DealSecond
EXIT:
MOV KeyVal ,#0FFH ;退出時復位鍵值,不然影響下次判斷
RET
;//////////////////////////////////////
DealHour:
JB Key_Add,KEY04
CLR TR0
INC Hour
KEY04:
JB Key_Sub,KEY05
CLR TR0
DEC Hour
KEY05:
JB Key_Sto,EXIT
CLR TR0
RET
;/////////////////////////////////////
DealMinute:
JB Key_Add,KEY004
CLR TR0
INC Minute
KEY004:
JB Key_Sub,KEY005
CLR TR0
DEC Minute
KEY005:
JB Key_Sto,EXIT
CLR TR0
RET
;////////////////////////////////////
DealSecond:
JB Key_Add,KEY040
CLR TR0
INC Second
KEY040:
JB Key_Sub,KEY050
CLR TR0
DEC Second
KEY050:
JB Key_Sto,EXIT
CLR TR0
RET
;//////////////計時子程序//////////
DisplayTime: ;//實現對時間的進位處理
CJNE Second,#60,Min
MOV Second,#0 ;六十秒到後秒單元清零
INC Minute ;且分單元加一
Min:CJNE Minute,#60,HOU
MOV Minute,#0 ;六十分鍾到後分單元清零
INC Hour ;且時單元加一
HOU:CJNE Hour,#24,DIS
MOV Hour,#0 ;24小時到後時單元清零
DIS:MOV A,Second
LCALL Display ;動態顯示時間
RET;////////顯示子程序////////////
;顯示秒的部分
Display:
MOV A,Second ;秒送累加器
MOV B,#10
DIV AB ;除10,A=十位,B=個位
MOV P1,#0EFH ; 打開秒的十位數碼管
MOVC A,@A+DPTR
MOV P2,A
MOV 20H,#1 ;傳遞給延時函數的參數
LCALL delay ;調用延時函數
MOV P1,#0DFH ;打開秒的個位數碼管
MOV A,B
MOVC A,@A+DPTR
MOV P2,A
MOV 20H,#2
LCALL delay
;顯示分的部分
MOV A,Minute
MOV B,#10
DIV AB
MOV P1,#0FBH; P1控制顯示哪個數碼管
MOVC A,@A+DPTR
MOV P2,A
MOV 20H,#1
LCALL delay
MOV P1,#0F7H;
MOV A,B
MOVC A,@A+DPTR
MOV P2,A
MOV 20H,#2
LCALL delay
;顯示小時的部分
MOV A,Hour
MOV B,#10
DIV AB
MOV P1,#0FEH; P1控制顯示哪個數碼管
MOVC A,@A+DPTR
MOV P2,A
MOV 20H,#1
LCALL delay
MOV P1,#0FDH;
MOV A,B
MOVC A,@A+DPTR
MOV P2,A
MOV 20H,#2
LCALL delayRET
;///////////延時子程序//////////
delay:
MOV R7,#15 ;1T
DEL1:MOV R6,20H ;1T
DEL2:NOP ;1T
NOP ;1T
DJNZ R6,DEL2 ;2T
DJNZ R7,DEL1 ;2T
RET ;2T
;//////////中斷服務子程序/////////
INT_Timer50:
MOV TH0,#3CH
MOV TL0,#0B0H ;重置時間常數
INC Times ;次數加一
CJNE Times,#20,ExitS ;不等20直接返回
INC Second ;一秒到,秒加{大家在處理秒時盡量放到中斷函數
MOV Times,#0 ;次數清零 {,這樣處理更准卻,不信你可以放外面試試
ExitS: RETI
;////////////////////////////////////////// Table:
DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH
END
② 51單片機做數字電子鍾
這么復雜的東西給這么少分 暈死了 你也太小氣了吧,分多的話還可能幫你動動腦
③ 關於51單片機 的秒錶/時鍾計時器設計摘要
本設計以AT89S51單片機為核心晶元,與型號為1602的液晶顯示器構成數字電子時鍾電路。AT89S51是一個低功耗,高性能CMOS 8位單片機,片內含4K Bytes ISP(In-system programmable)的可反復擦寫1000次的Flash只讀程序存儲器,器件採用ATMEL公司的高密度、非易失性存儲技術製造,兼容標准MCS-51指令系統及AT89C51引腳結構,晶元內集成了通用8位中央處理器和ISP Flash存儲單元,功能強大的微型計算機的AT89S51可為許多嵌入式控制應用系統提供高性價比的解決方案.液晶顯示器以其微功耗、體積小、顯示內容豐富、超薄輕巧的諸多優點,在袖珍式儀表和低功耗應用系統中得到越來越廣泛的應用。
④ 基於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單片機做一個電子時鍾的問題
程序中好像還沒有自動加時的部分,並且按鍵處理還沒有消抖措施
不多說了,上程序,俺剛剛為你編寫的,測試的時候使用的埠和你的不一樣
在我的開發板上測試成功後,按照你的板子埠做了修改
如果你直接復制到你的程序中不能使用,檢查及更改一下埠即可
如果滿意記得採納哦,若有疑問可以隨時向我提問
/***************************************************************************/
//#include<stdio.h>
#include<reg51.h>
sbit p20=P2^0; sbit p21=P2^1; sbit led=P2^7;
char dis_2[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//數碼管顯示編碼
unsigned int h,m,s,t,n;
/***************************************************************************/
void delay(char hs)//延時函數
{char hk;for(;hs>0;hs--){for(hk=100;hk>0;hk--);}}
/***************************************************************************/
void XS(unsigned int xh,unsigned int xs) //顯示子函數
{
char d1,d2,d3,d4;
d1=(xs/1)%10; d2=(xs/10)%10;
d3=(xh/1)%10; d4=(xh/10)%10;
P0=dis_2[d1]; P1=0x08; delay(10); P1=0x00;//秒個位
P0=dis_2[d2]; P1=0x04; delay(10); P1=0x00;//秒十位
P0=0x7f; P1=0x04; delay(10); P1=0x00;//小數點
P0=dis_2[d3]; P1=0x02; delay(10); P1=0x00;//時個位
P0=dis_2[d4]; P1=0x01; delay(10); P1=0x00;//時十位
}
/***************************************************************************/
void main(void)
{
TH0=(65536-1000)/256; TL0=(65536-1000)%256;
TMOD=0x01; EA=1; ET0=1; TR0=1;//定時器初始化
while(1)//主循環
{
if(p20==0){delay(10);if(p20==0){h++;if(h>23){h=0;}}while(!p20){XS(h,m);}}
if(p21==0){delay(10);if(p21==0){m++;if(m>59){m=0;}}while(!p21){XS(h,m);}}
XS(h,m);//調用數碼管顯示函數
}
}
/***************************************************************************/
void int1() interrupt 1 //定時器中斷
{
TH0=(65536-1000)/256; TL0=(65536-1000)%256; n++;t++;
if(t>500){t=0;led=~led;}//LED閃爍
if(n>1000){n=0;s++;}//如果達到一秒,秒加一
if(s>59){s=0;m++;}//如果達到一分,分加一
if(m>59){m=0;h++;}//如果達到一小時,小時加一
if(h>23){h=0;}//如果達到24小時,小時清零
}
/***************************************************************************/
⑥ 用匯編語言編寫一個51單片機程序,實現電子秒錶功能
;================================================================
;功能:本程序實現P0口的對數碼管動態顯示秒錶的分、秒、1/100秒;
; 計時程序由中斷服務程序實現,採用定時計數器T0工作方式1;
; P2口實現對數碼管的片選功能
;================================================================
;==========================初始化================================
SHUCHU EQU P2 ;定義P0口為輸出口
PIANXUAN EQU P1 ;定義P2口為片選口
MIAO EQU 30H
FEN EQU 31H
MIAO0 EQU 32H
SHUZI EQU 33H
C_0 BIT 20H.0
;======================系統程序開始==============================
ORG 00H
LJMP START
ORG 03H
LJMP ON_OFF
ORG 0BH
LJMP T0_1
ORG 13H
LJMP RESET
ORG 30H
START:
CALL INIT
SETB C_0
MOV MIAO,#00
MOV MIAO0,#00
MOV FEN,#00
MOV DPTR,#TAB
MOV R2,#5
MAIN:
JNB C_0,$
CLR C_0
LL: CALL DISPLAY
CALL SHIJIAN
JMP MAIN
;========================時間子程序=============================
;輸入:"30H、31H、32H"
;輸出:無
;實現的功能:分、秒、百分之秒的計算。
;===============================================================
SHIJIAN:
DJNZ R2,TIAOCHU
MOV R2,#5
INC MIAO0
MOV R3,MIAO0
CJNE R3,#100,TIAOCHU
MOV MIAO0,#00
INC MIAO
MOV R3,MIAO
CJNE R3,#60,TIAOCHU
MOV MIAO,#00
INC FEN
MOV R3,FEN
CJNE R3,#60,TIAOCHU
MOV FEN,#00
TIAOCHU:RET
;========================顯示子程序=============================
;輸入:"A"
;輸出:"P2口"
;實現的功能:顯示秒、分、百分之妙
;===============================================================
DISPLAY:MOV SHUZI,MIAO0
CALL JISUAN
MOVC A,@A+DPTR
MOV SHUCHU,A ;顯示十位
MOV PIANXUAN,#10H ;片選
CALL DELAY
MOV PIANXUAN,#00H
MOV A,B
MOVC A,@A+DPTR
MOV SHUCHU,A ;顯示個位
MOV PIANXUAN,#20H ;片選
CALL DELAY ;延時
MOV PIANXUAN,#00H
MOV SHUZI,MIAO
CALL JISUAN
MOVC A,@A+DPTR
MOV SHUCHU,A ;顯示十位
MOV PIANXUAN,#04H ;片選
CALL DELAY
MOV PIANXUAN,#00H
MOV A,B
MOVC A,@A+DPTR
MOV SHUCHU,A ;顯示個位
MOV PIANXUAN,#08H ;片選
CALL DELAY ;延時
MOV PIANXUAN,#00H
MOV SHUZI,FEN
CALL JISUAN
MOVC A,@A+DPTR
MOV SHUCHU,A ;顯示十位
MOV PIANXUAN,#01H ;片選
CALL DELAY
MOV PIANXUAN,#00H
MOV A,B
MOVC A,@A+DPTR
MOV SHUCHU,A ;顯示個位
MOV PIANXUAN,#02H ;片選
CALL DELAY ;延時
MOV PIANXUAN,#00H
RET
;========================計運算元程序=============================
;輸入:30H
;輸出:"A和B"
;實現的功能:把33H中的數據十位和個位分離出來
;===============================================================
JISUAN:MOV A,SHUZI ;數據放在A中
MOV B,#10 ;除數放在B中
DIV AB ;商放在A中,余數放在B中
RET
;====================復位中斷服務程序============================
;輸入;無
;輸出: 無
;實現的功能:把30H、31H、32H中的數據清零。
;================================================================
RESET:PUSH ACC
MOV 30H,#00H
MOV 3H,#00H
MOV 32H,#00H
CALL DELAY
POP ACC
RETI
;====================啟停中斷服務程序============================
;輸入;無
;輸出: 無
;實現的功能:關閉定時器
;================================================================
ON_OFF:CPL TR0
CALL DELAY
RETI
;====================定時中斷0服務子程序========================
;輸入:無
;輸出:無
;實現的功能:實現定時20MS,影響標中斷志位C_0
;===============================================================
T0_1:MOV TL0,50H ;設置定時初值
MOV TH0,51H
SETB C_0 ;定時標志位清0
RETI
;========================中斷設置子程序=========================
;輸入:無
;輸出:無
;實現的功能:初始化設置定時器,設置初值,開中斷0、中斷1,定時器0.
;===============================================================
INIT:MOV TMOD,#01H ;定時器0工作方式1
MOV DPTR,#65536-20000
MOV 50H,DPL
MOV 51H,DPH
MOV TL0,50H ;設置定時初值
MOV TH0,51H
MOV IE,#87H ;開定時器中斷0
MOV TCON,#15H
RET
;======================延時程序==================================
;輸入;無
;輸出: 無
;實現的功能:延時一段時間
;================================================================
DELAY:MOV R6,#80
L7:MOV R5,#60
L8:DJNZ R5,$
DJNZ R6,L7
RET
;======================共陽查表數據==============================
TAB:DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H
;===========================結束=================================
END