定時/計數器的使用方法: 1、根據要求選擇方式,確定方式控制字,寫入方式控制寄存器TMOD。 2、根據要求計算定時/計數器的計數值,再由計數值求得初值,寫入初值寄存器TH0/TH1和TL0/TL1。 3、根據需要開放定時/計數器中斷(后面需要編寫中斷服務程序)。 4、設置定時/計數器控制寄存器TCON的值,啟動定時/計數器開始工作。 5、等待定時/計數器時間到,到則執行中斷服務程序;如用查詢處理則編寫查詢程序判斷溢出標志,溢出標志等于1,則進行相應處理。
/******************************************************************************************/
/* */
/* 采用定時/計數器設計的60分鐘倒計時程序,實現60分鐘倒計時。利用4位數碼管顯示分、秒。*/
/* 數碼管每秒更新一次,秒表由59倒計時到00,則分鐘減1。 */
/* */
/******************************************************************************************/
#include <REG51.h>
#define uint unsigned int
#define uchar unsigned char
#define LED P2 // 數碼管段選
// 數碼管位選
sbit WE1 = P0^0;
sbit WE2 = P0^1;
sbit WE3 = P0^2;
sbit WE4 = P0^3;
uint min = 59;
uint sec = 59;
uint i;
uchar num_table[10] = {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90}; // 0~9十六進制代碼。
void display(); // 數碼管顯示程序
void delay(uint x); // 延時程序
void main() {
TMOD = 0x01;// 使用方式1
TH0 = 0xD8;// 初值寄存器高8位
TL0 = 0xF0;// 初值寄存器低8位
EA = 1;// 允許中斷請求總控制
ET0 = 1;// 定時/計數器T0溢出中斷允許
TR0 = 1;// 定時/計數器T0的啟動位
i = 0;
while (1)
{
display();
}
}
void time0_int(void) interrupt 1 {// 中斷服務程序
TH0 = 0xD8;
TL0 = 0xF0;
i++;
if (i == 100) {
sec--;
i = 0;
if (sec == 0) {
sec = 59;
min--;
if (min == 0) min = 59;
}
}
}
void display() {
uint min_s = min/10;
uint min_g = min%10;
uint sec_s = sec/10;
uint sec_g = sec%10;
WE1 = 1;
LED = num_table[min_s];
delay(1);
WE1 = 0;
WE2 = 1;
LED = ~(~num_table[min_g]|0x80); // 顯示時后添加一個小數點
delay(1);
WE2 = 0;
WE3 = 1;
LED = num_table[sec_s];
delay(1);
WE3 = 0;
WE4 = 1;
LED = num_table[sec_g];
delay(1);
WE4 = 0;
}
void delay(uint x) {
uint i;
while (x-- != 0)
{
for (i = 0; i < 300; i++);
}
}
|