单片机秒表计时器c语言程序图 需要图和程序

Python015

单片机秒表计时器c语言程序图 需要图和程序,第1张

#include<reg51.h>  // 时钟秒表

#define uchar unsigned char

#define uint unsigned int

sbit qingling=P1^0   //清零

sbit tiaofen=P1^1   //调分

sbit tiaoshi=P1^2   //调时

sbit sounder=P1^7   //naozhong

uint a,b

uchar hour,minu,sec,     //时钟

hour0,minu0,sec0,  //秒表

hour1,minu1,sec1

h1,h2,m1,m2,s1,s2, //显示位

k,s    //状态转换标志

uchar code select[]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe}

uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}

/*****************函数声明***********************/

void keyscan()

void init()

void delay(uchar z)

void display(uchar,uchar,uchar)

void sounde()

/*****************主函数*************************/

void main()

{

init()

while(1)

{        

while(TR1)

{

keyscan() // 扫描函数

while(s==1) // s是状态标志,当s=0时,闹钟取消。s=1时,设定闹钟时间

//(也是通过调时,调分函数);

{         //s=2时,闹钟工作,时间与设定时刻一致时,闹钟响

// (一分钟后自动关闭,可手动关闭)。再次切换,s=0.

keyscan()//s状态切换(0-》1-》2-》0)通过外部中断1实现。

display(hour1,minu1,sec1)//闹钟时刻显示

}

display(hour0,minu0,sec0)//时钟表显示    

while(k)  /*k是秒表状态(0-》1-》2-》0)通过外部中断0实现。

0秒表关;1秒表从零计时;2秒表停,显示计时时间*/

{

display(hour,minu,sec) //秒表显示    

}

}

}

}

/*****************初始化函数***********************/

void init()

{

a=0

b=0

k=0

s=0

hour0=0

minu0=0

sec0=0

hour=0

minu=0

sec=0

hour1=0

minu1=0

sec1=0

TMOD=0x11         //定时器0,1工作于方式1;赋初值

TH0=(65536-5000)/256

TL0=(65536-5000)%256

TH1=(65536-50000)/256

TL1=(65536-50000)%256

EA=1

EX0=1    //秒表中断

EX1=1    //闹钟设定中断

ET0=1

ET1=1

IT0=1     //边沿触发方式

IT1=1

PX0=1

PX1=1

TR0=0       //初始,秒表不工作

TR1=1     //时钟一开始工作

}

/*****************定时器0中断*************/

void timer0_int() interrupt 1  //秒表

{

TH0=(65536-5000)/256

TL0=(65536-5000)%256

a++

if(a==2)

{

a=0

sec++

if(sec==100)

{

sec=0   //毫秒级

minu++

if(minu==60)

{

minu=0     //秒

hour++

if(hour==60)    //分

{

hour=0

}

}

}

}

}

/*************外部中断0中断函数************/

void ex0_int() interrupt 0

{  

k++

if(k==3)

k=0

if(k==1)

{

TR0=~TR0

if(TR0==1)

{      

hour=0

minu=0

sec=0 

}

}

if(k==2)

{

TR0=~TR0

}  

}

/*************外部中断1中断函数************/

void ex1_int() interrupt 2

{

s++

if(s==3)

s=0

}

/*************定时器1中断****************/

void timer1_int() interrupt 3     //控制时钟工作

{

TH1=(65536-50000)/256

TL1=(65536-50000)%256

if(s==2)

{

if(hour1==hour0 &&minu0==minu1)

sounde()

}

b++

if(b==20)

{

b=0

sec0++

if(sec0==60)

{

sec0=0

minu0++

if(minu0==60)

{

minu0=0

hour0++

if(hour0==24)

hour0=0

}

}

}

}

/*************键盘扫描****************/

void keyscan()

{

if(s==1)

{

if(qingling==0)

{

delay(10)

if(qingling==0)

{

sec1=0

minu1=0

hour1=0

}

}

if(tiaofen==0)

{

delay(10)

if(tiaofen==0)

{

minu1++

if(minu1==60)

{

minu1=0

}

while(!tiaofen)

}

}

if(tiaoshi==0)

{

hour1++

if(hour1==24)

{

hour1=0

}

while(!tiaoshi)

}

}

else   //调整时钟时间

{

if(qingling==0)

{

delay(10)

if(qingling==0)

{

sec0=0

minu0=0

hour0=0

}

}

if(tiaofen==0)

{

delay(10)

if(tiaofen==0)

{

minu0++

if(minu0==60)

{

minu0=0

}

while(!tiaofen)

}

}

if(tiaoshi==0)

{

hour0++

if(hour0==24)

{

hour0=0

}

while(!tiaoshi)

}

}

}

/*************显示函数****************/

void display(uchar hour,uchar minu,uchar sec)

{

h1=hour/10

h2=hour%10

m1=minu/10

m2=minu%10

s1=sec/10

s2=sec%10

P0=0xff

P2=table[h1]

P0=select[7]

delay(5)

P0=0xff

P2=table[h2]

P0=select[6]

delay(5)

P0=0xff

P2=0x40

P0=select[5]

delay(5)

P0=0xff

P2=table[m1]

P0=select[4]

delay(5)

P0=0xff

P2=table[m2]

P0=select[3]

delay(5)

P0=0xff

P2=0x40

P0=select[2]

delay(5)

P0=0xff

P2=table[s1]

P0=select[1]

delay(5)

P0=0xff

P2=table[s2]

P0=select[0]

delay(5)

}

/*************闹钟函数****************/

void sounde()

{

sounder=~sounder

}

/*************延时函数****************/

void delay(uchar z)

{

int x,y

for(x=zx>0x--)

for(y=110y>0y--)

}

我写了个六位数码管的程序,放到这里让你参考一下,希望对你有用!

/*******************************************************************

数码管时钟秒表篇

功能简介:该程序有两个功能:时钟,秒表。key1,key2和key3键用来调节

时钟,根据LED的亮闪状态调节时钟(当八个LED全亮时为时钟显示状态,第一

个LED亮时为调节小时状态,第二个LED亮时为调节分钟状态,第三个LED亮时为

调节秒钟状态),key4键为秒表功能键。

实施步骤:第一步:开启定时器,完成数码管时钟走动功能;第二步:完成

数码管时钟调节功能;第三步:完成数码管秒表显示功能。

操作提示:功能键有四个,第二行第以列按键为调节键,第二行第二列按键

为增加数据键,第二行第三列按键为减少键,第二行第四列按键为秒表功能键。

********************************************************************

********************************************************************/

#include <reg52.h>

#include<intrins.h>

#define uchar unsigned char

#define uint unsigned int

sbit beep=P2^3

sbit dula=P2^6

sbit wela=P2^7

uchar code table1[]={0xff,0xfe,0xfd,0xfb,0xf7,0xef,0xdf}//数码管位选编码

uchar code table2[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,

0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,

0x79,0x71,0x00}

uchar temp //temp为按键变量

int light,flag//flag用来控制数码管显示的状态(显示时钟或者显示秒表),light用来控制时钟和秒表的led显示

uchar shi2,ge2,shi1,ge1 //这四个变量用来分离出实参的十位和个位

uchar num,num1,num2,num3 //num,num1用来计数,num2用来控制调节的时分秒,num3用来改变秒表状态下的显示状态

int miao,fen,shi //时钟变量

uchar mfen,mmiao,mmmiao //秒表变量

void delay(uint z)

{

uint i,j

for(i=0i<zi++)

for(j=0j<110j++)

}

void timeinit()

{

TMOD=0x11

TH0=(65536-46080)/256

TL0=(65536-46080)%256

TH1=(65536-4608)/256

TL1=(65536-4608)%256

EA=1

ET0=1

ET1=1

TR0=1

TR1=0

}

void timedisplay0() interrupt 1

{

TH0=(65536-46080)/256

TL0=(65536-46080)%256

num++

if(num==20)

{

num=0

miao++//开启时钟功能

if(miao==60)

{

miao=0

fen++

if(fen==60)

{

fen=0

shi++

if(shi==24)

shi=0

}

}

}

}

void timedisplay1() interrupt 3

{

TH1=(65536-4608)/256

TL1=(65536-4608)%256

num1++

if(num1==2)

{

num1=0

mmmiao++

if(mmmiao==100) //开启秒表功能

{

mmmiao=0

mmiao++

if(mmiao==60)

{

mmiao=0

mfen++

if(mfen==60)

mfen=0

}

}

}

}

void display(uchar add,uchar date) //数码管显示信息函数(带有小数点)

{

shi2=date/10

ge2=date%10

P0=0xff

wela=1

P0=table1[add]

wela=0

P0=0

dula=1

P0=table2[shi2]

dula=0

delay(1)

P0=0xff

wela=1

P0=table1[add+1]

wela=0

P0=0

dula=1

P0=table2[ge2]|0x80

dula=0

delay(1)

}

void display1(uchar add,uchar date) //数码管显示数据(不带有小数点)

{

shi1=date/10

ge1=date%10

P0=0xff

wela=1

P0=table1[add]

wela=0

P0=0

dula=1

P0=table2[shi1]

dula=0

delay(1)

P0=0xff

wela=1

P0=table1[add+1]

wela=0

P0=0

dula=1

P0=table2[ge1]

dula=0

delay(1)

}

void keyscan()

{

P3=0xfd

temp=P3 //第二行功能键

if(temp!=0xfd)

{

delay(5)

if(temp!=0xfd)

{

beep=0

switch(temp)

{

case 0xed: num2++ //第一个按键用来控制调节时,分,秒

TR0=0

light=1

if(num2==4)

{

num2=0

light=0

TR0=1

}

break

case 0xdd: if(num2==1) //第二键用来增加数据

{

shi++

if(shi==24)

shi=0

}

if(num2==2)

{

fen++

if(fen==60)

fen=0

}

if(num2==3)

{

miao++

if(miao==60)

miao=0

}

break

case 0xbd: if(num2==1) //第三个键用来减小数据

{

shi--

if(shi==-1)

shi=23

}

if(num2==2)

{

fen--

if(fen==-1)

fen=59

}

if(num2==3)

{

miao--

if(miao==-1)

miao=59

}

break

case 0x7d: flag=1 //第四个键用来开启秒表

num3++

TR1=1

if(num3==1)

mfen=mmiao=mmiao=0 //清除上次残留数据

if(num3==2)

TR1=0 //暂停秒表

if(num3==3)

{

mfen=mmiao=mmmiao=0 //秒表清零

TR1=0

}

if(num3==4)//重新开启秒表

TR1=1

if(num3==5)//暂停秒表

TR1=0

if(num3==6) //切换为显示时钟状态

{

flag=0

num3=0

}

break

}

while(temp!=0xfd)

{

temp=P3

}

beep=1

}

}

}

int main()

{

timeinit()

beep=1

while(1)

{

keyscan()

if(light==0)

{

if(miao%2==0) //当数码管显示时钟状态时,八个led将以亮一秒灭一秒的状态循环下去

P1=0

else

P1=0xff

}

else

{

if(num2==1)

P1=0xfe

if(num2==2)

P1=0xfd

if(num2==3)

P1=0xfb

}

if(flag==0) //显示时钟

{

display(1,shi)

display(3,fen)

display1(5,miao)

}

else //显示秒表

{

display(1,mfen)

display(3,mmiao)

display1(5,mmmiao)

}

}

return 0

}