单片机c51篮球计时器程序

单片机c51篮球计时器程序,第1张

暑假写的,你参考参考#include#include#include#include#defineucharunsignedchar#defineuintunsignedint#defineoutbitP3#defineoutsegP1ucharsecond;sbitp20=P2^0;//设置sbitp21=P2^1;//+sbitp22=P2^2;//-sbitchange=P2^3;//显示选择sbitspeak=P2^4;//蜂鸣器ucharclock[7]={6,6,12,58,12,59,0};//依次为月日时分闹钟时闹钟分比较量ucharcodeTAB[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};ucharm,n,q,i,h;j=6;k=1;a=0xff;b=0xff;c=0xff;d=0xff;voiddelay(){uinte;for(e=0;e1)clock[j]=clock[j]-1;elseclock[j]=12;break;case1:if(clock[j]>1)clock[j]=clock[j]-1;elseclock[j]=31;break;case2:if(clock[j]>0)clock[j]=clock[j]-1;elseclock[j]=23;break;case3:if(clock[j]>0)clock[j]=clock[j]-1;elseclock[j]=59;break;case4:if(clock[j]>0)clock[j]=clock[j]-1;elseclock[j]=23;break;case5:if(clock[j]>0)clock[j]=clock[j]-1;elseclock[j]=59;break;default:break;}}if(change==1){while(1){P2=0x0f;if((P2&0x0f)==0x0f)break;}}}main(){EA=1;ET0=1;TMOD=0x01;TH0=-20000/256;TL0=-20000%256;TR0=1;while(1){display();keyscan();if(j==6){if(change==1){m=clock[3]%10;//选择显示时间n=clock[3]/10;q=clock[2]%10;i=clock[2]/10;outbit=0x08;//显示秒的点闪动outseg=second;delay();}else{m=clock[1]%10;//选择显示日期n=clock[1]/10;q=clock[0]%10;i=clock[0]/10;}}elseif(j==0){q=clock[j]%10;i=clock[j]/10;}elseif(j==1){m=clock[j]%10;n=clock[j]/10;}elseif(j==2){q=clock[j]%10;i=clock[j]/10;}elseif(j==3){m=clock[j]%10;n=clock[j]/10;}elseif(j==4){q=clock[j]%10;i=clock[j]/10;}elseif(j==5){m=clock[j]%10;n=clock[j]/10;}if(clock[2]==clock[4]&&clock[3]==clock[5])//定点报时{if(p20==0||p21==0||p22==0||change==0)//有键按下则停止报警k=0;speak=1&k;}elsek=1;}}voidtimer0()interrupt1using1{uchare,f,g,h;TH0=-20000/256;TL0=-20000%256;e=e+1;if(e==50)//1sec{e=0;g=g+1;second=second^0x80;if(g==60)//1min{g=0;if(clock[3]==59)//每过60s改变下时间{if(clock[2]==23){clock[2]=0;clock[3]=0;}else{clock[2]=clock[2]+1;clock[3]=0;}}elseclock[3]=clock[3]+1;if(clock[3]==0&&clock[2]==0)//时间都为0时改变日期{switch(clock[0]){case1:if(clock[1]<31)clock[1]=clock[1]+1;else{clock[1]=1;clock[0]=2;}break;case2:if(clock[1]<29)clock[1]=clock[1]+1;else{clock[1]=1;clock[0]=3;}break;case3:if(clock[1]<31)clock[1]=clock[1]+1;else{clock[1]=1;clock[0]=4;}break;case4:if(clock[1]<30)clock[1]=clock[1]+1;else{clock[1]=1;clock[0]=5;}break;case5:if(clock[1]<31)clock[1]=clock[1]+1;else{clock[1]=1;clock[0]=6;}break;case6:if(clock[1]<30)clock[1]=clock[1]+1;else{clock[1]=1;clock[0]=7;}break;case7:if(clock[1]<31)clock[1]=clock[1]+1;else{clock[1]=1;clock[0]=8;}break;case8:if(clock[1]<31)clock[1]=clock[1]+1;else{clock[1]=1;clock[0]=9;}break;case9:if(clock[1]<30)clock[1]=clock[1]+1;else{clock[1]=1;clock[0]=10;}break;case10:if(clock[1]<31)clock[1]=clock[1]+1;else{clock[1]=1;clock[0]=11;}break;case11:if(clock[1]<30)clock[1]=clock[1]+1;else{clock[1]=1;clock[0]=12;}break;case12:if(clock[1]<31)clock[1]=clock[1]+1;else{clock[1]=1;clock[0]=1;}break;default:break;}}}if(j!=6){f=f+1;if(f!=10)//判断10s是否到是否有键按下{switch(j)//所设置的那位闪动{case0:a=~a;b=~b;c=0;d=0;break;case1:c=~c;d=~d;a=0;b=0;break;case2:a=~a;b=~b;c=0;d=0;break;case3:c=~c;d=~d;a=0;b=0;break;case4:a=~a;b=~b;c=0;d=0;break;case5:c=~c;d=~d;a=0;b=0;break;default:break;}if(clock[6]!=clock[j]||h!=j){f=0;h=j;clock[6]=clock[j];}}else{j=6;f=0;a=0xff;b=0xff;c=0xff;d=0xff;}}else{a=0xff;b=0xff;c=0xff;d=0xff;}}}

#include<reg51h>

#include<intrinsh>

#define uchar unsigned char;

uchar distab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00};  //0到f

uchar number,dat,time;

void t0isr() interrupt 1

{

TH0=(65536-5000)/256;

TL0=(65536-5000)%256;

number++;

if(number>1)number=0;

switch(number)

{

case 0:P2=0x02;P0=distab[dat/10];

break;

case 1:P2=0x01;P0=distab[dat%10];

break;

default:break;

}

}

void t1isr() interrupt 3

{

TH1=(65536-50000)/256;

TL1=(65536-50000)%256;

time++;

if(time%2)P1=_crol_(P1,1);

if(time%4)dat++;

dat%=100;

}

main()

{

TMOD=0x11;

TH0=(65536-5000)/256;

TL0=(65536-5000)%256;

TH1=(65536-50000)/256;

TL1=(65536-50000)%256;

time=0;

dat=0;

TR1=1;

ET1=1;

TR0=1;

ET0=1;

EA=1;

P1=0xfe;

while(1);

}

/

用proteus做的时钟

可以显示年月日时分秒

可调整时间

有图

/

#include<reg52h>

#define uchar unsigned char

#define uint unsigned int

#define timh 0xee

#define timl 0x00

sbit K1=P1^0;

sbit K2=P1^1;

sbit K3=P1^2;

sbit K4=P1^3;

sbit K5=P1^4;

sbit K6=P1^5;

sbit poit=P0^7;

uint year=2011,year0=0;

uchar  mon=6,mon0=0,day=26,day0=0,hour=23,hour0=0,min=15,min0=0,sec=0,sec0=10,temp0=0;

uchar  R;

uchar cod1[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};

uchar temp[]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};

void delay(uint z)

{

uint x,y;

for(x=0;x<z;x++)

for(y=0;y<100;y++);

}

void exter_init()

{

IT0=1;

EX0=1;

}

void time_init()

{

TMOD=0x01;

TH0=timh;

TL0=timl;

ET0=1;

EA=1;

TR0=1;

}

void re_time(uchar a)

{

uchar i,j;

for(j=0;j<a;j++)

{ for(i=0;i<14;i++)

{

P0=cod1[temp[i]];

if(i==3||i==5||i==9||i==11)   poit=0;

P2=i;

delay(1);

P2=0x0f;

}

}

}

void syn()

{

if(sec!=sec0)

{sec0=sec;

temp[12]=sec0/10;

temp[13]=sec0%10;}

if(year!=year0)

{year0=year;

temp[0]=year0/1000;

temp[14]=year0%1000;

temp[1]=temp[14]/100;

temp[14]=temp[14]%100;

temp[2]=temp[14]/10;

temp[3]=temp[14]%10;}

if(mon!=mon0)

{mon0=mon;

temp[4]=mon0/10;

temp[5]=mon0%10;}

if(day!=day0)

{day0=day;

temp[6]=day0/10;

temp[7]=day0%10;}

if(hour!=hour0)

{hour0=hour;

temp[8]=hour0/10;

temp[9]=hour0%10;}

if(min!=min0)

{min0=min;

temp[10]=min0/10;

temp[11]=min0%10;}

}

main()

{

exter_init();

time_init();

while(1)

{

re_time(10);

}

}

void txter() interrupt 0

{

uchar F;

F=1;

EA=0;

while(!K6);

delay(1);

do

{ re_time(1);

if(!K1)

{

min++;

if(min>=60) min=0;

while(!K1);

}

syn();

    re_time(1);

if(!K2)

{

hour++;

if(hour>=24) hour=0;

while(!K2);

}

syn();

re_time(1);

if(!K3)

{

day++;

R=(year%4==0)&&(year%100!=0);

R=(R&&(day>=29)&&(mon==2))||(!R&&(day>=30)&&(mon==2))||((mon!=2)&&(day>=31));

if(R) day=1;

while(!K3);

}

syn();

re_time(1);

if(!K4)

{

mon++;

if(mon>12) mon=1;

while(!K4);

}

syn();

re_time(1);

if(!K5)

{

year++;

if(year>9999) year=2000;

while(!K5);

}

syn();

re_time(1);

if(!K6)

{

 F=!F;

 while(!K6);

}

re_time(1);

syn();

re_time(1);

}while(F);

sec=0;

EA=1;

}

/

定时器0函数

/

void timer() interrupt 1

{

temp0++;

if(temp0>=200)

{

temp0=0;

sec++;

if(sec>=60)

{

sec=0;

min++;

if(min>=60)

{

min=0;

hour++;

if(hour>=24)

{

hour=0;

day++;

R=(year%4==0)&&(year%100!=0);

R=(R&&(day>=29)&&(mon==2))||(!R&&(day>=30)&&(mon==2))||((mon!=2)&&(day>=31));

if(R)

{

day=0;

mon++;

if(mon>=13)

{

mon=1;

year++;

}

}

}

}

}

}

syn();

TH0=timh;

TL0=timl;

}

一般单片机在c语言中很难得到精确的延时,所以一般对时间要求高的都用计时器中断来做了。如果时间要求不严格可以用for循环来做,你可以实际测试一下,把时间延时到大概一秒左右,然后烧进单片机里运行,比如一个灯亮灯灭的程序,看着灯计数,同时用秒表计时,几个几十次后取平均值就能知道大概时间了。

//1:用AT89C51单片机的定时/计数器T0产生一秒的

//定时时间,作为秒计数时间,当一秒产生时,秒

//计数加1,秒计数到60时,自动从0开始。单片机

//晶振频率为12MHZ

#include<reg51h>

#define uchar unsigned char

#define uint unsigned int

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

0x6f};

void display(uchar fen,uchar miao);

uchar a,fen,miao,shu;

void delay(uint z);

void init();

void main()

{

init();

while(1)

{

display(fen,miao);

}

}

void timer0() interrupt 1

{

TH0=(65536-50000)/256;

TL0=(65536-50000)%256;

a++;

if(a==20)

{

a=0;

shu++;

fen=shu/10;

miao=shu%10;

if(shu==60)

shu=0;

}

}

void init()

{

TMOD=0x01;

TH0=(65536-50000)/256;

TL0=(65536-50000)%256;

EA=1;

ET0=1;

TR0=1;

}

void display(uchar fen,uchar miao)

{

P1=0xFe;

P2=table[fen];

delay(5);//延时5毫秒

P1=0xFf;

P2=table[miao];

delay(5);//延时5毫秒

}

void delay(uint z)

{

uint x,y;

for(x=z;x>0;x--)

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

}

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

/

数码管时钟秒表篇

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

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

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

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

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

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

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

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

/

#include <reg52h>

#include<intrinsh>

#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=0;i<z;i++)

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

}

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;

}

以上就是关于单片机c51篮球计时器程序全部的内容,包括:单片机c51篮球计时器程序、51单片机C语言程序,利用定时器1控制LED灯每隔100ms亮一个,并且数码管上的数每隔200ms加1,加到100清零、用c语言编写程序,用于c51单片机四位共阴数码管显示,显示分秒的计时器。等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zz/9655912.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-30
下一篇 2023-04-30

发表评论

登录后才能评论

评论列表(0条)

保存