導航:首頁 > 操作系統 > 單片機lcd定時和秒錶功能

單片機lcd定時和秒錶功能

發布時間:2024-01-20 17:10:41

Ⅰ 基於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單片機的LCD1602上一個秒錶的開始與暫停。求大致思路即可。。

依靠一個按鍵控制51單片機的LCD1602上一個秒錶的開始與暫停很容易的,你控制的不要考慮液晶1602,控制計時的開始和暫停就可以了。
如何控制,要看你用什麼計時。如果是定時器計時,那麼很簡單,將計時定時器的TRn清零就可以暫停,置1就可以開始。
如果是DS1302時鍾晶元,那麼你就要啟動或停止這個晶元的工作,達到開始和暫停的目的。

Ⅲ 單片機秒錶功能實現的原理

利用單 片機內定時器,一次定時50ms,定義4 個變數,分別是時、 分、秒和中斷次數,每中斷一次中斷次數變數加1,累積20次,即是1S,然後秒加1,夠60秒後秒清0,分加1,60 分後,分清0,時加1,24小時後 ,小時清0,這些都在中斷程序中完成,主程序中不斷地顯示時間,這就是一個時鍾。在此基礎上,增加按鍵控制,可以調整時間,設定鬧鍾,使功能更加完善。

閱讀全文

與單片機lcd定時和秒錶功能相關的資料

熱點內容
安卓游戲充錢充錯帳號怎麼辦 瀏覽:203
有什麼是綁定手機號的app 瀏覽:496
phpredis事務 瀏覽:935
陰陽師pad怎麼登錄安卓賬號 瀏覽:734
bitlocker加密後讀取不了 瀏覽:176
演算法設計是指流程圖嗎 瀏覽:168
javaboot如何防止反編譯 瀏覽:118
python復合數據結構視頻 瀏覽:146
培訓學校需要用什麼雲伺服器 瀏覽:721
衛星鍋加密卡那裡收購 瀏覽:58
小米工具文件夾選項在哪裡 瀏覽:55
md5磁碟加密 瀏覽:642
單片機x地址 瀏覽:208
回車鍵失靈運行命令如何使用 瀏覽:984
電腦一鍵解壓縮的軟體 瀏覽:171
怎麼關閉手機通訊錄對外app 瀏覽:370
我的世界如何強行進入一個滿人的伺服器 瀏覽:653
什麼app可以查詢會考成績 瀏覽:389
程序員能創造的價值 瀏覽:261
伺服器上的redis是什麼意思 瀏覽:381