① 基於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的值送到數碼管顯示
}
}
/*****************************************************************/
② 自己做的基於單片機的秒錶設計C語言程序但是第62行報錯不知道怎麼辦,求大神幫忙
意思就是傳進來參數fenshi、fenge,你在這個函數里卻沒有使用。
如果display使用不到這兩個參數,就直接去掉就可以了。
這只是一個警告,沒有什麼影響。
或者這樣修改一下:
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
sbit kaishi=P1^0;
sbit zanting=P1^1;
sbit dp=P0^0;
sbit w1=P2^6;
sbit w2=P2^7;
uchar temp1,temp2,temp3,aa,miaoshi,miaoge,fenshi,fenge,shishi,shige;
uchar code table[]={0x03,0x9f,0x25,0x0d,0x99,0x49,0x41,0x1f,0x01,0x09,0xfd};
void display(uchar fenshi,uchar fenge,uchar miaoshi,uchar miaoge);
void delay(uint z);
void init();
void main()
{
init();
while(1)
{
if(aa==16)
{
aa=0;
temp1++;
if(temp1==59)
{
temp1=0;
temp2++;
}
if(temp2==59)
{
temp2=0;
temp3++;
}
if(zanting==0)
{
while(zanting==0)
{
TR0=0;
display(fenshi,fenge,miaoshi,miaoge);
}
}
if(zanting!=0)
{
TR0=1;
}
miaoshi=temp1/10;
miaoge=temp1%10;
fenshi=temp2/10;
fenge=temp2%10;
}
display(fenshi,fenge,miaoshi,miaoge);
}
}
void delay(uint z)
{
uchar x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void display(uchar fenshi,uchar fenge,uchar miaoshi,uchar miaoge)
{
fenshi=fenshi;
fenge=fenge;
w1=0;
P0=table[miaoshi];
delay(2);
w1=1;
w2=0;
P0=table[miaoge];
delay(2);
w2=1;
}
void init()
{
temp1=00;
temp2=00;
TMOD=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=1;
ET0=1;
TR0=1;
}
void timer0()interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
aa++;
}
③ c語言設計51單片機設計簡易秒錶
1. 兩位數碼管,計時60秒可以么
2. 有空可以你幫寫和模擬,但是不知道具體時間,用定時器,12M晶振,AT89單片機
④ 以下是基於單片機的電子秒錶的C語言程序 球高手詳細翻譯 謝謝 越快越好 //
//12M晶振。4位共陰數碼管,P0 段碼,P2.1~P2.3 位控
//顯示 00.00~99.99
//2011 07 07 E:\DPJ_C\00.00\00.00.c
//感覺你的程序不合適
#include <reg51.h>
#define uchar unsigned char
sbit P20=P2^0;
sbit P21=P2^1;
sbit P22=P2^2;
//sbit P23=P2^3;
sbit P07=P0^7;
sbit KS=P1^0; //開始
sbit KR=P1^1; //復位
uchar time,xs,ge,shi,,qian;
uchar code tab[ ]= {
0x3F,/*0*/
0x06,/*1*/
0x5B,/*2*/
0x4F,/*3*/
0x66,/*4*/
0x6D,/*5*/
0x7D,/*6*/
0x07,/*7*/
0x7F,/*8*/
0x6F,/*9*/
};
void delay_ms(unsigned int ms) //1ms延時
{
uchar a;
while(ms--)
for(a=123;a>0;a--);
}
void display(); //函數聲明
void T0intinit( ) //定時器T0初始化
{
TMOD=0x01; //定時器0,設置定時器1採用16位定時方式
TH0=(65536-10000)/256; //10ms定時
TL0=(65536-10000)%256; //
EA=1; //打開總中斷
ET0=1; //定時器0允許中斷響應
}
void main()
{
T0intinit( );
while(1) //程序一直在while循環
{
display( ); //顯示函數
while(!KS) //開始鍵按下
{
display( );//顯示函數
if(KS) //
TR0=1;//定時器0啟動
}
while(!KR) //清零鍵
{
display( );
if(KR)
TR0=0;//關定時器0
qian=0;//清零
=0;//清零
shi=0;//清零
ge=0;//清零
}
if(==10)//如果等於10
{
=0;//清零
qian++;//千位加加
}
if(qian==10)//如果qian等於10
{
qian=0;//清零
TR0=0;
}
}
}
void display( )//顯示函數
{
//P23=0;
//P0=tab[ge];
//delay_ms(1);
//P23=1;
P22=0; //打開shi位選
P0=tab[shi];//將shi送入單片機
delay_ms(1);//延時
P22=1; //關閉位選
P21=0;打開位選
P0=tab[];將送入單片機
P07=1;//關閉位選
delay_ms(1);
P21=1;//關閉位選
P20=0;打開qian位選
P0=tab[qian];將qian送入單片機
delay_ms(1);
P20=1;//關閉位選
}
void T0int( ) interrupt 1 //定時器T0中斷 方式1
{
TH0=(65536-10000)/256; //重裝10ms定時常數
TL0=(65536-10000)%256;
ge++; //個位加加
if(ge==10) //如果ge等於10
{
ge=0;//清零
shi++;//十位加加
}
if(shi==10)//如果shi等於10
{
shi=0;//清零
++;//百位加加
}
}
⑤ 單片機課程設計電子秒錶
<p>電路原理圖已畫好</p>
<p>實現你描述的全部功能</p>
<p>Keil
uVision3編譯通過,C語言編寫,有詳細注釋</p>
<p>實機調試通過</p>
<p>留個郵箱發給你...
</p>
<p>----------------------------</p>
<p>郵件已發......</p>
<p></p>
⑥ 求一個C語言設計的單片機程序,電子秒錶,功能是LCD顯示分 秒 毫秒,一個按鍵開始,另一個按鍵停止並清零
我有一個 自己寫的 可以調時 暫停 並加AT24c02的 要嗎?
⑦ 51單片機的秒錶計時器設計,求大神幫忙設計電路圖和C語言程序!!
這個程序可以實現秒的計時,按鍵控制開始、暫停、清零功能,更多功能自己在看清程序的基礎上進行改進。
#include <reg51.H>
sbit P3_5 =P3^5;
unsigned char code dispcode[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,
0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E,0x00};
unsigned char second;
unsigned char keycnt;
unsigned int tcnt;
void main(void)
{
unsigned char i,j;
TMOD=0x02;
ET0=1;
EA=1;
second=0;
P1=dispcode[second/10];
P2=dispcode[second%10];
while(1)
{
if(P3_5==0)
{
for(i=20;i>0;i--)
for(j=248;j>0;j--);
if(P3_5==0)
{
keycnt++;
switch(keycnt)
{
case 1:
TH0=0x06;
TL0=0x06;
TR0=1;
break;
case 2:
TR0=0;
break;
case 3:
keycnt=0;
second=0;
P1=dispcode[second/10];
P2=dispcode[second%10];
break;
}
while(P3_5==0);
}
}
}
}
void t0(void) interrupt 1 using 0
{
tcnt++;
if(tcnt==4000)
{
tcnt=0;
second++;
if(second==100)
{
second=0;
}
P1=dispcode[second/10];
P2=dispcode[second%10];
}
}