標(biāo)題:
單片機(jī)秒表程序,怎么在不改動的情況下加個按鍵控制秒表的暫停和計時?
[打印本頁]
作者:
luoyua
時間:
2019-1-11 21:38
標(biāo)題:
單片機(jī)秒表程序,怎么在不改動的情況下加個按鍵控制秒表的暫停和計時?
這是個秒表 怎么在不改動的情況下加個按鍵控制秒表的暫停和計時?
#include<reg51.h>
#define uchar unsigned char
#define ab P0
uchar int_time;
uchar a,b;
sbit LSA = P2^2;
sbit LSB = P2^3;
sbit LSC = P2^4;
unsigned char code table[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x79,0x71};
uchar displaydata[8];
void digdisplay();
void clock(a,b)
{
displaydata[0] = table[b/10];
displaydata[1] = table[b%10];
displaydata[2] = 0x40;
displaydata[3] = table[a/10];
displaydata[4] = table[a%10];
digdisplay();
}
/***********************************
* Ö÷oˉêy
***********************************/
void main()
{
TMOD = 0X01;
TH0 = (65536-46083)/256;
TL0 = (65536-46083)/256;
EA = 1;
ET0 = 1;
TR0 = 1;
int_time = 0;
a =0;b = 0;
while(1)
{
clock(a,b);
}
}
void digdisplay()
{
uchar i,j;
for(i=0;i<5;i++)
{
switch(i)
{
case 0:
LSA = 0;LSB = 0;LSC = 0;break;
case 1:
LSA = 1;LSB = 0;LSC = 0;break;
case 2:
LSA = 0;LSB = 1;LSC = 0;break;
case 3:
LSA = 1;LSB = 1;LSC = 0;break;
case 4:
LSA = 0;LSB = 0;LSC = 1;break;
}
ab = displaydata[i];
j = 50;
while(j--);
ab = 0x00;
}
}
void TO_time() interrupt 1
{
TH0 = (65536-50000)/256;
TL0 = (65536-50000)%256;
int_time++;
if(int_time == 2)
{
int_time = 0;
a++;
}
if(a == 10)
{
b++;
a=0;
}
if(b == 60)
{
b = 0;
}
}
復(fù)制代碼
作者:
時光盜初心
時間:
2019-1-12 02:34
可以考慮掉電模式
作者:
wulin
時間:
2019-1-12 10:55
不改動怎么加按鍵功能?給你改成單鍵60分鐘百分秒表。1ms數(shù)碼管動態(tài)顯示。
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
#define ab P0
//uchar int_time;
uchar b,c;
uint a;
sbit LSA = P2^2;
sbit LSB = P2^3;
sbit LSC = P2^4;
sbit key1 = P3^0;
unsigned char code table[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x79,0x71};
uchar displaydata[8];
bit d;
void digdisplay();
void keyscan();
void clock(a,b)
{
displaydata[0] = table[c/10];
displaydata[1] = table[c%10];
displaydata[3] = table[b/10];
displaydata[4] = table[b%10];
displaydata[6] = table[a/100%10];
displaydata[7] = table[a/10%10];
}
/***********************************
* ?÷oˉêy
***********************************/
void main()
{
TMOD= 0x01; //設(shè)置定時器模式
TL0 = 0x66; //設(shè)置定時初值1ms
TH0 = 0xFC; //設(shè)置定時初值
EA = 1;
ET0 = 1;
TR0 = 1;
displaydata[2] = 0x40;
displaydata[5] = 0x40;
a =0;b = 0;
while(1)
{
keyscan();
clock(a,b);
}
}
void digdisplay()
{
static uchar i=0;
ab = 0x00;
switch(i)
{
case 0:
LSA = 0;LSB = 0;LSC = 0;ab = displaydata[i];i++;break;
case 1:
LSA = 1;LSB = 0;LSC = 0;ab = displaydata[i];i++;break;
case 2:
LSA = 0;LSB = 1;LSC = 0;ab = displaydata[i];i++;break;
case 3:
LSA = 1;LSB = 1;LSC = 0;ab = displaydata[i];i++;break;
case 4:
LSA = 0;LSB = 0;LSC = 1;ab = displaydata[i];i++;break;
case 5:
LSA = 1;LSB = 0;LSC = 1;ab = displaydata[i];i++;break;
case 6:
LSA = 0;LSB = 1;LSC = 1;ab = displaydata[i];i++;break;
case 7:
LSA = 1;LSB = 1;LSC = 1;ab = displaydata[i];i=0;break;
}
}
void keyscan()
{
static uchar count1=0,count2=0; //計數(shù)變量
static bit key_sign=0; //按鍵狀態(tài)標(biāo)志
if(key1==0) //檢測輸入如果為0
{
if((++count1>=100)&&(key_sign==0))
{
key_sign=1; //按鍵自鎖標(biāo)志置1,防止重復(fù)響應(yīng)
count2++;
if(count2>=3)
count2=0;
switch(count2)
{
case 0: a=0;
b=0;
c=0; break;//清0
case 1: d=1; break;//計時
case 2: d=0; break;//暫停
}
}
}
else
{
count1=0; //計數(shù)變量清0
key_sign=0; //按鍵狀態(tài)標(biāo)志清0
}
}
void TO_time() interrupt 1
{
TL0 = 0x66; //設(shè)置定時初值1ms
TH0 = 0xFC; //設(shè)置定時初值
if(d)
{
a++;
if(a == 1000)
{
b++;
a=0;
}
if(b == 60)
{
b = 0;
c++;
}
if(c == 60)
c = 0;
}
digdisplay();
}
作者:
ssz666
時間:
2019-1-12 11:52
//秒表
#include<reg52.h>
typedef unsigned char u8;
typedef unsigned int u16;
unsigned char DisplayData[4];
unsigned char MMMM=0,MM=0,TTTT=0,TT=0,i=0;
bit A=0;//bit只有0和1兩種值
sbit LSA=P1^0;
sbit LSB=P1^1;
sbit LSC=P1^2;
sbit LSD=P1^3;
u8 code smgduan[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
void waibuzhongduan()
{
EA=1;
EX0=1;
IT0=1;
EX1=1;
IT1=1;
}
void dingshiqizhongduan()
{
TMOD=0X01;
TH0=0xD8;
TL0=0xF0;
EA=1;
TR0=0;
ET0=1;
PT0=1;//為1時,定時器0中斷為高級優(yōu)先級,為0時,為低級優(yōu)先級。
}
void delay10ms(unsigned int c)
{
unsigned char a,b;
for(c=1;c>0;c--)
for(b=38;b>0;b--)
for(a=130;a>0;a--);
}
void Display()
{
unsigned char i,j;
for(i=0;i<4;i++)
{
switch(i)
{
case (0):LSA=0;LSB=1;LSC=1;LSD=1;break;
case (1):LSA=1;LSB=0;LSC=1;LSD=1;break;
case (2):LSA=1;LSB=1;LSC=0;LSD=1;break;
case (3):LSA=1;LSB=1;LSC=1;LSD=0;break;
}
P2=DisplayData[i];
j=10;
while(j--);
P2=0XFF;
}
}
void XS()
{
if(A==0)
{
DisplayData[0]=smgduan[TT/10];
DisplayData[1]=smgduan[TT%10]+0x80;
DisplayData[2]=smgduan[MM/10];
DisplayData[3]=smgduan[MM%10];
}
else
{
DisplayData[0]=smgduan[TTTT/10];
DisplayData[1]=smgduan[TTTT%10]+0x80;
DisplayData[2]=smgduan[MMMM/10];
DisplayData[3]=smgduan[MMMM%10];
}
}
void main()
{
waibuzhongduan();
dingshiqizhongduan();
while(1)
{
XS();
Display();
}
}
void Int0() interrupt 0
{
delay10ms(100);
A=0;
switch(i)
{
case 0:TR0=1;break;
case 1:TR0=0;break;
case 2:TT=0,MM=0;break;
}
i++;
if(i>2)
{
i=0;
}
delay10ms(10);
IE0=0;//外部發(fā)生中斷時其值為1
}
void Time0() interrupt 1
{
TH0=0xD8;
TL0=0xF0;
MM++;
if(MM==100)
{
MM=0;
TT++;
if (TT==100)
{
TT=0;
}
}
TF0=0;//為1時表示定時器T0計數(shù)溢出
}
void Int1() interrupt 2
{
delay10ms(100);
TTTT=TT;
MMMM=MM;
A=~A;
delay10ms(10);
TF1=0;//外部發(fā)生中斷時其值為1
}
作者:
ssz666
時間:
2019-1-12 11:53
你可以參考下我這個,我的就是按鍵控制啟動和暫停以及清零,你可以稍微改一改
作者:
luoyua
時間:
2019-1-12 11:58
時光盜初心 發(fā)表于 2019-1-12 02:34
可以考慮掉電模式
不可以實(shí)現(xiàn)呀。。∮昧说綦娔J 5秒就斷電 就只能重新開始了
作者:
yzwzfyz
時間:
2019-1-12 14:35
樓主構(gòu)思奇妙。
方法很簡單,讀通現(xiàn)有的程序。就知道如果加了。
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1