⑴ 單片機秒錶復位程序如何寫
秒錶就是一個計時的工具,為了保證精確度,一般顯示秒後面兩位,就是10ms位,在單片機定時器中,賦初值1ms,變數不停的累加上去, 累加到10的時候,秒錶加1,就是10ms了,
復位就是對秒錶的數據進行清零重置,這時就需要一個按鍵來進行人機交互功能了,這時候就要考慮有幾個按鍵了,一般的秒錶設計的時候有兩個按鍵,一個進行啟動停止,一個進行清零;
1.啟動和停止,啟動停止的按鍵,就是按一下讓標志位取反一次,
bit flag =0;
if(Key ==0)
{
delay(); //延時10ms;這個程序比較常見,就不寫出來了
if(key == 0)
{
flag = !flag; //消抖後檢測到按鍵還是按下狀態,就把標志位取反;
while(!Key); //等待鬆手
}
}
同時在定時器中斷里, 根據標志位對 及時變數進行累加
if(flag)
{
t++;
if(t >= 10)
{
t = 0;
ms++;
}
}
就這樣 標志位就表示的秒錶啟動停止的,
2 。 復位,復位顧名思義就是 返回到初始狀態,就是0 ; 一般復位是在秒錶停止的狀態對秒錶進行清零;
先在主程序里檢測按鍵
bit clc = 0;
if(key1 == 0)
{
delay(); // 延時10ms
if(Key1 == 0)
{
clc = 1;
while(!Key1); //等待鬆手
}
}
然後在定時器中斷里進行對變數的數值進行清零
if(!flag ) //在停止狀態
{
if(clc)
{
ms = 0;
clc = 0;
}
}
到此 秒錶的啟動停止 和復位就完成了 ,
⑵ 單片機秒錶課程設計,急求!!!!
原理圖如下,
程序如下:
;=================================================
;寄存器分配定義
;=================================================
LED_BUF EQU 50H ;顯示數據首址
COUNTER_INT EQU 3BH ;中斷計數器
SECOND EQU 3DH ;秒單元
;=================================================
;常數定義
;=================================================
CN_COUNT_INT EQU 100 ;10ms * 100 = 1S
SET_MODEL EQU 0FFH ;完全解碼模式
SET_BRIGHT EQU 04H ;占空比為15/32;顯示亮度;
SET_LIMIT EQU 01H ;2位顯示方式;
SET_NORMAL EQU 01H ;測試模式
SET_START EQU 01H ;進入啟動工作方式?
;=================================================
;管腳分配定義
;=================================================
m7219_DIN BIT P3.0
m7219_LOAD BIT P3.1
m7219_CLK BIT P3.2
KEYSTART BIT P1.0
KEYRESET BIT P1.1
;============================================
;模擬主程序
;===========================================
org 0000h
ajmp main
ORG 000BH
LJMP Timer0Interrupt
org 0030h
main:
mov sp,#70h
lcall Init_M7219
lcall InitTimer0
; MOV SECOND,#95H ;TEST
Loop:
CALL disp
key_reset:
SETB KEYRESET
JB KEYRESET,key_start
; DELAY
NOP
NOP
NOP
JB KEYRESET,key_start
JNB KEYRESET,$
CLR TR0
MOV A,#0
MOV SECOND,A
MOV led_buf,A
MOV LED_BUF+1,A
JMP key_SCAN_END
key_start:
SETB KEYSTART
JB KEYSTART,key_SCAN_END
; DELAY
NOP
NOP
NOP
JB KEYSTART,key_SCAN_END
JNB KEYSTART,$
SETB TR0
key_SCAN_END:
JMP loop
;===========================================
InitTimer0:;10ms一次中斷
MOV TMOD,#01H
MOV TH0,#0D8H
MOV TL0,#0F0H
SETB EA
SETB ET0
RET
;===========================================
Timer0Interrupt:
PUSH DPH
PUSH DPL
PUSH ACC
MOV TH0,#0D8H
MOV TL0,#0F0H
;========================
INC COUNTER_INT
MOV A,COUNTER_INT ;10ms 計數值加1
CJNE A,#CN_COUNT_INT,Timer0Interrupt_EXIT
MOV COUNTER_INT,#0
MOV A,SECOND
CJNE A,#99H,Timer0Int_sec
CLR TR0;關閉計時
JMP Timer0Interrupt_EXIT
Timer0Int_sec:
ADD A,#01 ;秒加1
DA A
MOV SECOND,A
SWAP A
ANL A,#0fH
MOV led_buf,A
MOV A,SECOND
ANL A,#0FH
MOV LED_BUF+1,A
;========================
Timer0Interrupt_EXIT:
POP ACC
POP DPL
POP DPH
RETI
;====================================================
; function:Init_M7219 ;初始化max719
; input: ------------
; output: ----------
; usage: a,b
;====================================================
Init_M7219: ;初始化Max7219
MOV a,#0bh ;設置掃描界限
MOV b,#set_limit ;設置位數
lcall w_7219
MOV a,#09h ;設置解碼模式
MOV b,#set_model ;00h非解碼模式;ffh為BCD解碼模式
lcall w_7219
MOV a,#0ah ;設置亮度
MOV b,#set_bright ;15/32亮度
lcall w_7219
MOV a,#0fh ;設置工作方式
MOV b,#set_normal ;正常工作方式
lcall w_7219
MOV a,#0ch ;進入啟動工作方式
MOV b,#set_start
lcall w_7219
RET
;===================================================
; function:disp ;顯示子程序
; input: r0
; output: -----------
; usage: r0,r3,r4,a,b
;===================================================
disp:
MOV r0,#led_buf
MOV r4,#01h
MOV r3,#set_limit
INC r3
disp1:
MOV a,@r0
MOV b,a
MOV a,r4
lcall w_7219
INC r0
INC r4
djnz r3,disp1
RET
;===================================================
; function:w_7219 ;顯示驅動程序;
; input: a ;傳送7219的地址
; b ;傳送7219的數據
; output:-------------
; usage: a,r2
;====================================================
w_7219:
CLR M7219_clk
CLR M7219_din
CLR M7219_load ;置load=0
lcall sd_7219 ;傳送7219的地址
MOV a,b
lcall sd_7219 ;傳送數據
setb M7219_load ;數據裝載
CLR M7219_din
RET
;=================================================
; function:sd_7219 ;向7219傳送數據或地址子程序
; input: a
; output: max7219
; usage: a, r2
;==================================================
sd_7219: ;向7219送地址或數據
MOV r2,#08h
c_sd:
CLR C
CLR M7219_clk
RLC a
MOV M7219_din,c ;准備數據
NOP
setb M7219_clk ;上升沿將數據傳入
NOP
NOP
CLR M7219_clk
djnz r2,c_sd
RET
⑶ 單片機設計製作9S倒計時器~
1.顯示。2.啟動/停止。3.重置30秒
中的第一個和第三個功能有的,至於第2個,程序里是一直倒計時,結束了
就再重置30,繼續倒計時。
如果你需要鍵盤按鍵的話,只需要按鍵將中斷關了或者開了,就可以。
#include <reg52.h>
code unsigned char tab[]=
{0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
//共陽數碼管 0-9
unsigned char Dis_Shiwei;//定義十位
unsigned char Dis_Gewei; //定義個位
void delay(unsigned int cnt)
{
while(--cnt);
}
main()
{
TMOD |=0x01;//定時器設置 10ms in 12M crystal
TH0=0xd8; // 初值55536,計數10000次,每次1us,總計10ms
TL0=0xf0;
IE= 0x82; //打開中斷
TR0=1; //啟動計數器TR0
while(1)
{
P0=Dis_Shiwei;//顯示十位
P2=0xFD; // P2=1111 1101
delay(300);//短暫延時
P0=Dis_Gewei; //顯示個位
P2=0xFE; // P2=1111 1110
delay(300);
}
}
/********************************/
/* 定時中斷 */
/********************************/
void tim(void) interrupt 1 using 1 //前1為定時中斷TR0
{
static unsigned char second=30,count; //初值30
TH0=0xd8;//重新賦值
TL0=0xf0;
count++;
if (count==100)
{
count=0;
second--;//秒減1
if(second==0)
{ //這里添加定時到0的代碼 ,可以是燈電路,繼電器吸合等,或者執行一個程序
second=30; //減到0是重新賦值99
}
Dis_Shiwei=tab[second/10];//十位顯示值處理
Dis_Gewei=tab[second%10]; //個位顯示處理
}
}
⑷ 單片機計時器原理
單片機用一個振盪器(比如晶體振盪器)作為時間基準,和石英手錶裡面的振盪器差不多,振盪器每震盪一次的時間間隔是一樣的,可以通過振盪器的參數算出來的,每次振盪會產生一個脈沖信號給單片機,單片機只要數數字就能計算時間了。
⑸ 單片機秒錶功能實現的原理
利用單 片機內定時器,一次定時50ms,定義4 個變數,分別是時、 分、秒和中斷次數,每中斷一次中斷次數變數加1,累積20次,即是1S,然後秒加1,夠60秒後秒清0,分加1,60 分後,分清0,時加1,24小時後 ,小時清0,這些都在中斷程序中完成,主程序中不斷地顯示時間,這就是一個時鍾。在此基礎上,增加按鍵控制,可以調整時間,設定鬧鍾,使功能更加完善。