導航:首頁 > 操作系統 > 單片機課程設計計時器

單片機課程設計計時器

發布時間:2023-01-12 17:21:34

單片機秒錶課程設計,急求!!!!

原理圖如下,

程序如下:

;=================================================

;寄存器分配定義

;=================================================

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


Ⅱ 利用51單片機,4個數碼管設計一個計時器,要求在數碼管上顯示的數據從0開始每1秒鍾加1。

共陽數碼管中斷程序:

#include<reg52.h>

#define uint unsigned int

#define uchar unsigned char

uchar code table[]=

{

0xc0,0xf9,0xa4,0xb0,

0x99,0x92,0x83,0xf8,

0x80,0x90,0x88,0x83,

0xc6,0xa1,0x86,0x8e};

uint num,a;

uchar ,shi,ge;

void init();

void delay(uint);

void display(uchar,ucharshi,ucharge);

uint fb();

uint fs();

uint fg();

void main()

{

init();

while(1)

{

display(fb(),fs(),fg());

}

}

void init()

{

num=0;

a=0;

TMOD=0x01;

TH0=(65536-50000)/256;

TL0=(65536-50000)%256;

EA=1;

ET0=1;

TR0=1;

}

void display(uchar,ucharshi,ucharge)

{

P1=0xfd;

P0=table[];

delay(1);

P1=0xfb;

P0=table[shi];

delay(1);

P1=0xf7;

P0=table[ge];

delay(1);

}

void timeoff() interrupt 1

{

TH0=(65536-50000)/256;

TL0=(65526-50000)%256;

a++;

if(a%20==0)

{

num++;

if(num==999)

{

num=0;

}

}

}
void delay(uint z)
{

uint x,y;

for(x=z;x>0;x--)

for(y=110;y>0;y--);

}

uint fb()

{

=num/100;

return ;

}

uint fs()

{

shi=num%100/10;

return shi;

}

uint fg()

{

ge =num%100%10;

return ge;

}

(2)單片機課程設計計時器擴展閱讀

2個可編程定時/計數器·5個中斷源,2個優先順序(52有6個)

一個全雙工串列通信口

外部數據存儲器定址空間為64kB

外部程序存儲器定址空間為64kB

邏輯操作位定址功能·雙列直插40PinDIP封裝

單一+5V電源供電

CPU:由運算和控制邏輯組成,同時還包括中斷系統和部分外部特殊功能寄存器;

RAM:用以存放可以讀寫的數據,如運算的中間結果、最終結果以及欲顯示的數據;

ROM:用以存放程序、一些原始數據和表格;

I/O口:四個8位並行I/O口,既可用作輸入,也可用作輸出

T/C:兩個定時/記數器,既可以工作在定時模式,也可以工作在記數模式;

五個中斷源的中斷控制系統;

一個全雙工UART(通用非同步接收發送器)的串列I/O口,用於實現單片機之間或單片機與微機之間的串列通信;

片內振盪器和時鍾產生電路,石英晶體和微調電容需要外接。最佳振盪頻率為6M—12M。

參考資料來源:網路-51單片機



Ⅲ 30秒倒計時器課程設計

【摘 要】籃球比賽30秒鍾規則規定:進攻球隊在場上控球時必須在30秒鍾內投籃出手(NBA比賽為24秒,全美大學體育聯合會比賽中為35秒),因此在比賽時裁判既要看比賽又要看秒錶計時,而本文介紹的30秒倒計時器可以解決此問題。

【關鍵詞】AT89C51單片機、30秒倒計時器、LED

30秒倒計時器的設計和製作有很多方法,本文介紹的30秒倒計時器以AT89C51單片機作為控制單元,採用兩個數碼管顯示時間,用三個按鍵分別控制計時器的計時開始、復位和暫停。倒計時器初始狀態顯示「30」,當裁判員按下計時鍵,30秒倒計時開始,當計時器時間減到0時,計時器發出聲光報警,提示裁判計時時間已到。

一、電路設計

30秒倒計時器的電路主要由電源電路、單片機最小系統、按鍵輸入、顯示驅動電路、報警電路組成,30秒倒計時器控制電路如圖1所示。

圖1 30秒倒計時器電路原理圖

1、按鍵輸入

「30秒倒計時器」採用了三個按鍵來完成計數器的啟動計數、復位、暫停/繼續計數等功能。

(1)K1鍵:啟動按鈕(P3.2)。

按下K1鍵,計數器倒計時開始,數碼管顯示數字從30開始每秒遞減計數,當遞減到到零時,報警電路發出聲、光報警信號。當計數器處於暫停狀態時按下K1鍵將回到計時狀態。

(2)K2鍵:復位按鈕(P3.3)。

按下K2鍵,不管計數器工作於什麼狀態,計數器立即復位到預置值 「30」 ,在報警狀態時按下K2鍵還可取消報警。

(3)K3鍵:暫停/計時切換按鈕(P3.4)。

當計數器處於計時狀態時按下該鍵計數器暫停計時,數碼管顯示數字保持不變;當計數器處於暫停狀態按下該鍵計數器將回到計時狀態;初始狀態時該鍵無效。

2、顯示驅動電路

「30秒倒計時器」用兩個共陽數碼管來顯示時間,數碼管顯示方式為動態顯示。顯示驅動電路中,數碼管的段碼引腳通過470歐的電阻接到單片機的P1口,兩個片選引腳各通過一個9012連接到正5V電源,由P3.0和P3.1控制。

4、報警電路

計時時間減到0,顯示數碼管顯示「00」時,發光二極體D1由P3.5控制發出光報警,同時蜂鳴器由P3.7控制發出聲報警。

二、軟體編程思路

1、全局變數

「30秒倒計時器」動作流程主要受三個全局變數控制。首先是bit變數「act」,當「act」為「1」時倒計時開始,為「0」時倒計時停止,「act」初值為「0」,可以由按鈕操作將其置「1」或清「0」。第二個全局變數是char變數「time」,存放倒計時的時間,當倒計時時間為0時,發出聲光報警。變數「time」的初值為30,定時中斷服務程序在「act」為1時,每1s對其進行減1操作,減到0時保持為0,按下「復位鍵」可將「time」復位為30。第三個全局變數是int變數「t」,記錄響應定時中斷0的次數。根據初始化定義,定時器0以方式1工作,每1ms發出一次中斷請求。控製程序只開放了定時器0中斷,因此不會有比定時器0中斷更高級的中斷被允許,所以每次請求都會立刻被響應。響應後在中斷服務程序中將全局變數「t」加1記錄響應中斷次數,每響應1000次即為1秒鍾。變數「t」初值為0,在中斷服務程序中加1,當「t」為2000時由中斷服務程序清0。在按鍵驅動程序中,按下啟動鍵、復位鍵、暫停/啟動鍵時將「t」清0,目的是從0ms開始計時。

2、控制流程

主程序主要用來檢測全局變數「time」當「time」為0時發出「聲光報警」。按鍵驅動、顯示驅動和「time」操作都在定時器0中斷服務程序中進行。其控制流程如圖2所示。

圖2 控制流程圖

三、軟體程序設計

1、數碼管驅動程序

到計時器的兩個數碼管以動態顯示的方式顯示計時時間「time」(全局變數),LED1顯示「time」的十位,LED2顯示「time」的個位。

(1)定義段碼數據口和片選信號

根據實際電路,在C51中定義段碼的數據口為P1,兩個片選信號為P3.0和P3.1。定義如下:

#define an P1

sbit wei1=P3^0;

sbit wei2=P3^1;

(2)定義字形碼

LED顯示數字0~9以及全滅的字形碼表格放在數組zixing[]中。字形碼是固定的表格,定義時加上關鍵字「code」 表示該表格存放在程序存儲器中。

unsigned char code zixing[]=

{

0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff

};

(3)定義數碼管LED1和LED2的顯示變數

為了增加驅動程序的可移植性,筆者為數碼管LED1和LED2定義了顯示變數。顯示變數就是本驅動程序的對外介面,外部程序只要改變顯示變數的值就可改變數碼管顯示的數值。定義方式如下:

unsigned char led_str[2]={10,10};

led_str[0]直接對應數碼管LED1, led_str[1]直接對應數碼管LED2。本項目中由專門的子程序將全局變數time計算拆分成led_str[0]和led_str[1]。

void js()

{

led_str[1]=time/10%10;

led_str[0]=time%10;

}

(4)數碼管驅動程序

數碼管驅動程序「void chushi(char i)」在定時中斷服務程序中被調用執行。根據初始化程序的定義,定時中斷服務程序每1ms被執行一次。定時中斷服務程序中運用全局變數「t」記錄進入該服務程序的次數,「t」計滿2000由定時中斷服務程序清零。

數碼管驅動程序的參數「char i」是用來確定當前點亮的是LED1還是LED2,當參數為「0」時點亮LED1,參數為「1」時點亮LED2。如果我們希望偶數次進入定時中斷服務程序時點亮LED1,奇數次進入定時中斷服務程序時點亮LED2,我們可以用程序調用語句「chushi(t%2);」輕松實現。

進入數碼管驅動程序後首先調用子函數js(),計算當前的led_str[0]和led_str[1]。接下來將兩個數碼管全部熄滅以防止余暉的出現。最後點亮需要點亮的數碼管並送出字型碼。驅動程序代碼如下:

void chushi(char i)

{

js(); //計算顯示變數

an=0xff; //去余暉

wei1=i; wei2=!i; //確定片選

an=zixing[led_str[i]]; //送字型碼

}

2、按鍵驅動程序

按鍵驅動程序分為按鍵識別和按鍵功能執行兩部分。按鍵功能執行可在按鍵按下時或按鍵抬起後執行,文中將其設計在按鍵抬起後執行。

(1)定義按鍵I/O地址

根據實際電路,三個按鍵(啟動鍵、復位鍵、暫停/啟動鍵)分別接在P3口的P3.2,P3.3和P3.4三個引腳上。為了取鍵值方便還將P3口定義為「iokey」,程序中可作定義如下:

#define iokey P3

sbit key1=P3^2;

sbit key2=P3^3;

sbit key3=P3^4;

(2)按鍵驅動流程

按鍵識別的通用流程為:I/O口寫「1」→判斷有無鍵按下→延時去抖→確定鍵值→等待按鍵抬起→執行按鍵功能。按鍵驅動程序中定義了兩個靜態變數「ts」 和「kv」,分別用來延時去抖和存放鍵值。

(3)延時去抖

靜態變數「ts」用來延時去抖。按鍵驅動程序在定時中斷服務程序中每1ms被執行一遍,每檢測到有鍵按下「ts」加1,檢測到無鍵按下「ts」清0。按鍵連續按下20ms,則連續20次執行按鍵驅動程序時都檢測到有鍵按下,此時靜態變數「ts」累加到20,可確認按鍵按下有效。

為防止按鍵一直按著不放而使「ts」累加到溢出,確認有鍵按下後可使「ts」的值保持為20,或大於20的某一個值如21。

(4)取鍵值

確認有鍵按下後即可通過讀取按鍵的I/O口狀態來得到鍵值。為讀取P3.2、P3.3和P3.4引腳狀態,屏蔽P3口其他引腳的影響,可將讀取後的數值按位或上11100011B(0xE3)再送給靜態變數「kv」。

靜態變數「kv」存放按鍵的鍵值,無鍵按下或按鍵抬起後kv的值為0。按下啟動鍵key1時kv=11111011B(0xFB),按下復位鍵key2時kv=11110111B(0xF7),按下暫停/啟動鍵key3時kv=11101111B(0xEF)。

(5)執行按鍵功能

按鍵抬起後第一次執行按鍵驅動程序時,靜態變數「kv」任保持著按鍵按下時最後得到的鍵值,以該鍵值作為參數調用按鍵執行程序「actkey(kv);」即可執行按鍵功能。調用後kv值立刻清0,確保按一次鍵執行一次按鍵功能。驅動程序代碼如下:

void key()

{

static unsigned char kv=0;

static unsigned char ts=0;

key1=1;key2=1;key3=1;

if(!(key1&key2&key3))

{

ts++;

if(ts>=20)ts=20; //有鍵按下

if(ts==20)

kv=iokey|0xe3; //取鍵值

}

else

{ //無鍵按下或按鍵已抬起

actkey(kv);

ts=0;

kv=0;

}

}

函數actkey(kv)用來根據鍵值「kv」執行相應操作。當「kv」等於0xFB時代表啟動鍵key1按下,函數actkey(kv)將全局變數act賦值為「1」。當「kv」等於0xF7時代表復位鍵key2按下,函數actkey(kv)將全局變數「time」復位為「30」。當「kv」等於0xEF時代表暫停/啟動鍵按下,函數actkey(kv)將全局變數act取反。每按一個按鈕都有將全局變數「t」清0的操作,目的是每當復位、或啟動計時時,進入定時中斷的次數都從0開始計算,否則會出現第1秒計時不準確的現象。程序代碼如下:

void actkey(unsigned char k)

{

switch(k)

{

case 0xfb:act=1;t=0;break;

case 0xf7:time=30;t=0; break;

case 0xef:act=~act;t=0; break;

}

}

四、結束語

本文在編程過程中以面向對象的編程思路封裝了兩個LED數碼管和三個獨立按鍵。當其驅動程序在定時中斷服務程序中被調用,編程者只要操作其介面:數組「led_str[2]」和函數「actkey(unsigned char k)」,無需直接對硬體進行編程即可改變功能,增強了軟體的通用性和可移植性。

Ⅳ 我在做單片機設計,需要一個特殊的計時器,請高手指點!

常用的是DS1302時鍾晶元,電腦和手機用的就是它,但是沒有「當達到設定的時間時向單片機發送信號」這個功能,估計市場上還沒有。

Ⅳ 利用單片機設計59秒計時器

共陽共陰只是你在選COM端時給其高低電平的問題無關大雅
我給一段PIC單片機的程序讓你參考一下,如果你看懂的話應該能做出來了
#include <pic.h>
#include <math.h>
//此程序實現計時秒錶功能,時鍾顯示範圍00.00~99.99秒,分辨度:0.01秒
unsigned char s0,s1,s2,s3;
//定義0.01 秒、0.1 秒、1秒、10秒計時器
unsigned char s[4];
unsigned char k ,data ,sreg;
unsigned int i;
const table[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0XD8,0x80,0x90};
//不帶小數點的顯示段碼表
const table0[10]={0X40,0X79,0X24,0X30,0X19,0X12,0X02,0X78,0X00,0X10};
//帶小數點的顯示段碼表
//TMR0初始化子程序
void tmint()
{
T0CS=0; //TMR0工作於定時器方式
PSA=1; //TMR0不用分頻
T0IF=0; //清除TMR0的中斷標志
T0IE=1; //TMR0中斷允許
}
//spi顯示初始化子程序
void SPIINIT()
{
PIR1=0;
SSPCON=0x30;
SSPSTAT=0xC0;
//設置SPI的控制方式,允許SSP方式,並且時鍾下降沿發送。與"74HC595,當其
//SCLK從低到高跳變時,串列輸入寄存器"的特點相對應
TRISC=0xD7; //SDO引腳為輸出,SCK引腳為輸出
TRISA5=0; //RA5引腳置為輸出,輸出顯示鎖存信號
}
//系統其它部分初始化子程序
void initial()
{
TRISB1=0;
TRISB2=0;
TRISB4=1;
TRISB5=1; //設置與鍵盤有關的各口的輸入輸出方式
RB1=0;
RB2=0; //建立鍵盤掃描的初始條件
}
//SPI傳輸數據子程序
void SPILED(data)
{
SSPBUF=data; //啟動發送
do {

}while(SSPIF==0);
SSPIF=0;
}
//顯示子程序,顯示4位數
void dispaly()
{
RA5=0; //准備鎖存
for(k=4;k>0;k--)
{
data=s[k-1];
if(k==3) data=table0[data];//第二位需要顯示小數點
else data=table[data];
SPILED(data); //發送顯示段碼
}
for(k=0;k<4;k++)
{
data=0xFF;
SPILED(data); //連續發送4個DARK,使顯示好看一些
}
RA5=1; //最後給鎖存信號,代表顯示任務完成
}
//軟體延時子程序
void DELAY()
{
for(i = 3553; --i ;) continue;
}
//鍵掃描子程序
void KEYSCAN()
{
while(1){
while(1)
{
dispaly(); //調用一次顯示子程序
if ((RB5==0)||(RB4==0)) break;
}
DELAY(); //若有鍵按下,則軟體延時
if ((RB5==0)||(RB4==0)) break;//若還有鍵按下,則終止循環掃描,返回
}
}
//等鍵松開子程序
void keyrelax()
{
while(1){
dispaly(); //調用一次顯示子程序
if ((RB5==1)&&(RB4==1)) break;
} //為防止按鍵過於靈敏,每次等鍵松開才返回
}
//系統賦值初始化子程序
void ini()
{
s0=0x00;
s[0]=s0;
s1=0x00;
s[1]=s1;
s2=0x00;
s[2]=s2;
s3=0x00;
s[3]=s3; //s0=s1=s2=s3=0,並放入顯示緩沖數組中
sreg=0x00; //tmr0中斷次數寄存器清0
}
//中斷服務程序
void interrupt clkint(void)
{
TMR0=0X13; //對TMR0寫入一個調整值。因為寫入TMR0後接著的
//兩個周期不能增量,中斷需要3個周期的響應時間,
//以及C語言自動進行現場保護要消耗周期
T0IF=0; //清除中斷標志
CLRWDT();
sreg=sreg+1; //中斷計數器加1
if(sreg==40) //中斷次數為40後,才對S0,S1,S2,S3 操作
{
sreg=0;
s0=s0+1;
if(s0==10){
s0=0 ;
s1=s1+1;
if(s1==10){
s1=0 ;
s2=s2+1;
if(s2==10){
s2=0;
s3=s3+1;
if(s3==10) s3=0 ;
}
}
}
}
s[0]=s0;
s[1]=s1;
s[2]=s2;
s[3]=s3;
}
//主程序
main()
{
OPTION=0XFF;
tmint(); //TMR0初始化
SPIINIT(); //spi顯示初始化
initial(); //系統其它部分初始化
di(); //總中斷禁止
while(1) {
ini(); //系統賦值初始化
KEYSCAN(); //鍵掃描,直到開始鍵按下
keyrelax(); //等鍵松開
ei(); //總中斷允許
TMR0=0X08;
KEYSCAN(); //鍵掃描直到停止鍵按下,在鍵掃描時有顯示
keyrelax() ; //等鍵松開
di(); //總中斷禁止
KEYSCAN(); //鍵掃描到清0鍵按下,在鍵掃描時有顯示
keyrelax() ; //等鍵松開
}
}

Ⅵ 單片機計時器

//1:用AT89C51單片機的定時/計數器T0產生一秒的
//定時時間,作為秒計數時間,當一秒產生時,秒
//計數加1,秒計數到60時,自動從0開始。單片機
//晶振頻率為12MHZ
//由於是剛剛注冊,積分沒有多少,請大家幫個忙,謝謝!
#include<reg52.h>
#define
uchar
unsigned
char
#define
uint
unsigned
int
uchar
code
table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,
0x6f};
void
display(uchar
fen,uchar
miao);
uchar
a,fen,miao,shu;
void
delay(uint
z);
void
init();
void
main()
{
init();
while(1)
{
display(fen,miao);
}
}
void
timer0()
interrupt
1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
a++;
if(a==20)
{
a=0;
shu++;
fen=shu/10;
miao=shu%10;
if(shu==60)
shu=0;
}
}
void
init()
{
TMOD=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=1;
ET0=1;
TR0=1;
}
void
display(uchar
fen,uchar
miao)
{
P1=0xFe;
P2=table[fen];
delay(5);//延時5毫秒
P1=0xFf;
P2=table[miao];
delay(5);//延時5毫秒
}
void
delay(uint
z)
{
uint
x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
//P2口接數碼管,然後數碼管位選通過74HC138來控制
//我可是剛學,弄了好久才弄出來的哦
//要圖的話加980100952
//這個軟體是調通過了的,也載入到我的實驗扳上試過的

Ⅶ 如何用單片機做一個簡單的倒計時器

51單片機實現數碼管99秒倒計時,其實很簡單,就是使用定時器中斷來實現。目的就是學習怎樣用單片機實現倒計時,從而實現一些延時控制類的東西,99秒只是一個例子,你完全可以做出任意倒計時如10秒倒計時程序。定時器定時時間計算公式:初值X=M(最大計時)-計數值。
初值,換算成十六進制,高位給TH0,低位給TL0,如果用定時器0的話。
M(最大計時)如果是16位的,就是2的16次方,最大定時,65535 微秒,實現1秒定時,可以通過定時10毫秒,然後100次改變一次秒值即可。10*100毫秒=1S
計數值:你要定時多長時間,如果定時1毫秒,就是1000微秒,(單位為微秒),如果定時10毫秒,就是10000(微秒),當然,最大定時被定時器本身位數限制了,最大2的16次方(16位定時計數器),只能定時65.535毫秒。定時1S當然不可能1S定時器中斷。
下面為實現99秒倒計時C語言源程序
/*了解定時器,這樣的話,就可以做一些基本的實驗了,如定時炸彈~~,10秒後打開關閉繼電器*/
/*數碼管,12M晶振*/
#include <reg52.h>
#define uchar unsigned char
sbit p11=P1^1; //連的是繼電器。。
code unsigned char tab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
uchar shiwei;
uchar gewei;
void delay(unsigned int cnt)
{
while(--cnt);
}
void main()
{
TMOD|=0x01; /*定時器0 16位定時器 X=65535-10000(10毫秒)=55535=D8F0(十六進制)定時10ms
*/
TH0=0xd8;
TL0=0xf0;
IE=0x82; //這里是中斷優先順序控制EA=1(開總中斷),ET0=1(定時器0允許中斷),這里用定時器0來定時
TR0=1; //開定時器0
while(1)
{
P0=shiwei; //99的十位
P2=0; //99的個位,
delay(300); //動態掃描數碼管延時
P0=gewei;
P2=1;
delay(300);
}
}
void tim(void) interrupt 1 using 1 //定時器0中斷
{
static uchar second=99,count; //99隻是一個數,可以任意改,因為這里只學習怎樣實現倒計時
TH0=0xd8; //定時10毫秒
TL0=0xf0;
count++;
if(count==100) //10毫秒定時,10*100=1000(毫秒)=1秒
{
count=0;
second--;
if(second==0)
{
p11=0; //這里讓繼電器動作,當然動作之後,要復位才能等下次倒定時再動作。
second=99; //回到99再循環來,當然,可以做其他的控制,
}
shiwei=tab[second/10]; //數碼管10位
gewei=tab[second%10]; //數碼管個位
}

Ⅷ 單片機計時器

#include<reg51.h>
#defineucharunsignedchar
ucharledtab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0xff};
uchartime=0,led0=0,led1=0;
voidt0isr()interrupt1
{
TH0=(65536-50000)/256;//重賦初值
TL0=(65536-50000)%256;
time++;//中斷次數加1
if(time>=20)//如果20次中斷到
{
time=0;
led1++;//秒個位加1
if(led1>=10)//如果秒個位大於等於10
{
led1=0;
led0++;//秒十位加1
if(led0>5)led0=0;
}
P0=ledtab[led0];//顯示十位
P1=ledtab[led1];//顯示個位
}
}
voidext0()interrupt0
{
led0=0;外部中斷0,清零
led1=0;
}
main()
{
TMOD=0x01;//定時器0方式1
TH0=(65536-50000)/256;//50毫秒中斷一次
TL0=(65536-50000)%256;
TR0=1;
ET0=1;
EX0=1;
IT0=1;
EA=1;
P0=ledtab[led0];
P1=ledtab[led1];
while(1);
}

閱讀全文

與單片機課程設計計時器相關的資料

熱點內容
加密晶元的計算方法 瀏覽:187
手機存儲為什麼找不到微信文件夾 瀏覽:695
msf埠遷移命令 瀏覽:880
工商app積分怎麼查詢 瀏覽:143
鐵路app怎麼買火車票 瀏覽:309
移魅族除的app怎麼添加 瀏覽:240
兔籠子大號加密 瀏覽:171
單片機程序燒錄操作成功 瀏覽:878
指標高拋低吸點位源碼 瀏覽:205
25匹壓縮機銅管 瀏覽:570
單片機單燈左移05 瀏覽:150
買伺服器練手什麼配置 瀏覽:783
伺服器被毀該怎麼辦 瀏覽:939
python私有庫 瀏覽:514
Python有中文嗎 瀏覽:736
麥塊的伺服器為什麼都進不去 瀏覽:474
新買的伺服器如何打開 瀏覽:35
安卓軟體游戲怎麼開發 瀏覽:319
用撲克擺愛心解壓神器怎麼擺 瀏覽:70
松下製冷壓縮機 瀏覽:275