① 基於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的值送到數碼管顯示
}
}
/*****************************************************************/
② 怎麼用單片機實現數字秒錶的功能。
做這個做了一個月。你先網路下「秒錶」,很多程序都是微軟的中斷定時的,不用我們另外設置什麼。其他的年月日時分秒的計算代碼一模一樣。當你電腦上做完,任務也基本完成。你只要定義你單片機的介面,及單片機的中斷代碼,差不多就OK了。
其實我完全可以復制黏貼代碼給你,不過沒有必要。過程或許更加有意義。
③ 利用51單片機設計一個秒錶 (一定要按要求做到0.01秒)
最低位,是0.01s 變化一次,一秒鍾,變化 100 次。
這么快,人的眼睛,分辨不出來。
只能看到一個 8。
停止時,才能看到穩定的數字。
程序如下:
#include<reg52.h>
sbit P3_5 =P3^5;
unsigned char counet, m[4] = {0,0,0,0};
void display()
{
unsigned char code Tab[] = {
0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
unsigned char code Bit[] = {8, 4, 2, 1};
unsigned char i, j;
for (i = 0; i < 4; i++) {
P0 = Tab[m[i]]; if (i == 2) P0 &= 127;
P2 = Bit[i]; for(; j > 0; j++); P2 = 0;
}
}
void wait_key()
{
while( P3_5) display();
while(!P3_5) display();
}
main()
{
TMOD = 0x02;
IE = 0x82;
while(1) {
wait_key(); TR0 = 1; TH0 = TL0 = 6;
wait_key(); TR0 = 0;
wait_key(); m[0] = m[1] = m[2] = m[3] = 0;
}
}
void time0() interrupt 1
{
counet++;
counet %= 40;
if(!counet) {
m[0]++; m[0] %= 10;
if(!m[0]) {
m[1]++; m[1] %= 10;
if(!m[1]) {
m[2]++; m[2] %= 10;
if(!m[2]) {
m[3]++; m[3] %= 10;
}}}}
}
④ 單片機 秒錶
下面是我寫的時鍾程序,你看看,再修改修改就可以了,希望對你有所幫助!
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit key1=P3^4;
sbit key2=P3^5;
sbit key3=P3^6;
sbit key4=P3^7;
sbit la=P2^6;
sbit wela=P2^7;
uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
uchar num,num1,num2,num3,bq,bb,qian,,shi,ge;
void delayms(uint xms)
{
uint i,j;
for(i=xms;i>0;i--)
for(j=110;j>0;j--);
}
void display() //顯示六個數碼管,每兩個分別表示時,分,秒。
{
bq=num3/10;
bb=num3%10;
qian=num2/10;
=num2%10;
shi=num1/10;
ge=num1%10;
la=1;
P0=table[bq];
la=0;
P0=0xff;
wela=1;
P0=0xfe;
wela=0;
delayms(1);
la=1;
P0=table[bb];
la=0;
P0=0xff;
wela=1;
P0=0xfd;
wela=0;
delayms(1);
la=1;
P0=0x80;
la=0;
P0=0xff;
wela=1;
P0=0xfd;
wela=0;
delayms(1);
la=1;
P0=table[qian];
la=0;
P0=0xff;
wela=1;
P0=0xfb;
wela=0;
delayms(1);
la=1;
P0=table[];
la=0;
P0=0xff;
wela=1;
P0=0xf7;
wela=0;
delayms(1);
la=1;
P0=0x80;
la=0;
P0=0xff;
wela=1;
P0=0xf7;
wela=0;
delayms(1);
la=1;
P0=table[shi];
la=0;
P0=0xff;
wela=1;
P0=0xef;
wela=0;
delayms(1);
la=1;
P0=table[ge];
la=0;
P0=0xff;
wela=1;
P0=0xdf;
wela=0;
delayms(1);
}
void keyscan() //四個獨立建盤控制調時
{
if(key1==0)
{
delayms(10);
num3++;
if(num3==24)
num3=0;
while(!key1) ;
}
if(key2==0)
{
delayms(10);
num2++;
if(num2==60)
num2=0;
while(!key2);
}
if(key3==0)
{
delayms(10);
if(num2==0)
num2=60;
num2--;
while(!key3);
}
if(key4==0)
{
delayms(10);
num1=0;num2=0;num3=0;
while(!key4);
}
}
void main()
{
TMOD=0X01;
EA=1;
ET0=1;
TR0=1;
TH0=(65536-45872)/256;
TL0=(65536-45872)%256;
while(1)
{ keyscan();
display();
}
}
void T0_time() interrupt 1
{
TH0=(65536-45872)/256;
TL0=(65536-45872)%256;
num++;
if(num==20)
{
num=0;
num1++;
if(num1==60)
{
num1=0;
num2++;
if(num2==60)
{
num2=0;
num3++;
if(num3==24)
num3=0;
}
}
}
}
⑤ 關於51單片機實現數字秒錶程序演算法的問題
確實錯了,數據換算正確的是:
buf[0]=IntegerPart%10;
buf[1]=IntegerPart%100/10;
buf[2]=IntegerPart%1000/100;
buf[3]=IntegerPart%10000/1000;
⑥ 設計基於單片機的電子秒錶設計,具體要求如下: (1)利用定時器中斷進行計時; (2)秒錶范圍:0-
VC編程?
⑦ 基於單片機的秒錶設計需要什麼模塊
主要包括三個模塊:
第一:需要一個控制模塊,即單片機最小系統,包括單片機的復位和外接晶振電路(也可以用內部晶振,但精度要差很多,);單片機內部需要集成有RAM和FLASH,否則的話需要外擴。
第二:輸出顯示模塊,是用數碼管顯示,還是用液晶屏顯示,或者其它。
第三:輸入模塊,是用獨立鍵盤還是用矩陣鍵盤,這個由秒錶的功能的復雜程度決定。一般是三個獨立按鍵,啟動/停止,暫停和復位。
⑧ 關於51單片機 的秒錶/時鍾計時器設計摘要
本設計以AT89S51單片機為核心晶元,與型號為1602的液晶顯示器構成數字電子時鍾電路。AT89S51是一個低功耗,高性能CMOS 8位單片機,片內含4K Bytes ISP(In-system programmable)的可反復擦寫1000次的Flash只讀程序存儲器,器件採用ATMEL公司的高密度、非易失性存儲技術製造,兼容標准MCS-51指令系統及AT89C51引腳結構,晶元內集成了通用8位中央處理器和ISP Flash存儲單元,功能強大的微型計算機的AT89S51可為許多嵌入式控制應用系統提供高性價比的解決方案.液晶顯示器以其微功耗、體積小、顯示內容豐富、超薄輕巧的諸多優點,在袖珍式儀表和低功耗應用系統中得到越來越廣泛的應用。
⑨ 51單片機數字秒錶設計用4位數碼管分別顯示十秒,秒,百毫秒,十毫秒計時范圍為10ms到99s
/***************************************************************************/
#include <reg51.h>
sbit Axs=P1^3; sbit Bxs=P1^2; sbit Cxs=P1^1; sbit Dxs=P1^0;//數碼管位選埠
char table[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//數碼管顯示編碼
void YS(char hs); void XS(int xm,int xs); void Time1(void);int n,i,m,s;
/***************************************************************************/
void main(void){Time1();while(1){XS(m,s);}}//主函數
/***************************************************************************/
void int1() interrupt 1 //定時器中斷
{
TH0=(65536-1000)/256; TL0=(65536-1000)%256; n++;
if(n>1000){n=0;s++; if(s>59){s=0;m++;if(m>59){m=0;}}}
}
/***************************************************************************/
void Time1(void)//定時器初始化
{
TH0=(65536-921)/256; TL0=(65536-921)%256;
TMOD=0x01; EA=1; ET0=1; TR0=1;
}
/***************************************************************************/
void XS(int xm,int xs) //數碼管顯示
{
char d1,d2,d3,d4;
d1=(xs/1)%10; d2=(xs/10)%10; d3=(xm/1)%10; d4=(xm/10)%10;
P0=table[d1]; Axs=0; YS(10); Axs=1;//個位顯示
P0=table[d2]; Bxs=0; YS(10); Bxs=1;//十位顯示
P0=table[d3]; Cxs=0; YS(10); Cxs=1;//百位顯示
P0=table[d4]; Dxs=0; YS(10); Dxs=1;//千位顯示
}
/***************************************************************************/
void YS(char hs){char hk;for(;hs>0;hs--){for(hk=200;hk>0;hk--);}}//延時函數
/***************************************************************************/
數碼管的埠用的可能不一樣,自己改下
⑩ 基於51單片機設置一個體育用的數字秒錶!程序已有,有些想法沒辦法實現,求幫助!
可以用1個按鈕來記錄當前時間,同時應定義一個數組來保存這組數據