秒表c语言不用控制,单片机秒表程序到了指定时间不会停下来

程序下载单片机上运行0~99.99s计时时,单片机在到99.99s后突然跳到90.00,然后加到99.99后又跳到80.00,以此类推;

而在运60s倒计时功能时,到了00.00后不停止计时,qian位显示的字符为没有在段码数组中定义的字符,请问怎么解决,仿真图和实物显示一样

3f829e29e76caa8c3b1f630a6b27d58d.gif

11]UNZY{3MH18P~7V3)97L1.png (113.18 KB, 下载次数: 12)

2020-6-11 20:57 上传

#include

#include

sbit P20=P2^0;          //四位数码管位选

sbit P21=P2^1;

sbit P22=P2^2;

sbit P23=P2^3;

sbit s1=P2^4;           //开始

sbit s2=P2^5;         //复位

sbit s3=P2^6;                //记录

sbit s4=P2^7;                //读取

sbit feng=P3^6;        //控制蜂鸣器响不响

unsigned char ge=0,shi=0,bai=0,qian=0,dao=0;

unsigned char code led[ ]= {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};  //共阳极段码

unsigned char code led1[ ]={0x90,0x80,0xf8,0x82,0x92,0x99,0xb0,0xa4,0xf9,0xc0}  ;//60s倒计时ge、shi、bai位段码

unsigned char code led2[ ]={0x92,0x99,0xb0,0xa4,0xf9,0xc0}  ;//60s倒计时qian位段码

void display();

void delay_ms(unsigned int ms)  // 延迟

{

unsigned char a;

while(ms--)

for(a=125;a>0;a--);

}

void T0_init( )        //定时器T0初始化

{

TMOD=0x01;

TH0=0xDC;       //10ms定时

TL0=0x00;

EA=1;

ET0=1;

}

void main()

{

feng=0;

T0_init( );

while(1){

display( );

while(!s1)//0~99.99s计时

{

feng=~feng;

ge=0,shi=0,bai=0,qian=0;

display( );

if(s1)

{                dao=0;

feng=~feng;

TR0=1;

}

}

while(!s2)                //        暂停

{

feng=~feng;

TR0=0;

}

while(!s3)                        //60s倒计时

{

feng=~feng;

ge=0,shi=0,bai=0,qian=0;

display( );

if(s3)

{

dao=1;

TR0=1;

}}

while(!s4)         //清零键

{

feng=~feng;

display( );

if(s4)

TR0=0;

dao=0;

qian=0;

bai=0;

shi=0;

ge=0;

}

if((dao==0&&qian==9&&bai==9&&ge==9&&shi==9)||(dao==1&&qian==5&&bai==9&&ge==9&&shi==9))                //计时结束后归零

{

feng=~feng;

dao=0;

TR0=0;

qian=0;

bai=0;

shi=0;

ge=0;

}

}

}

void display( )

{

if(dao==0)                        //        0~99.99s计时

{

P23=0;        //位选

P0=led[ge];        //

delay_ms(5); //消隐

P23=1;        //位选

P22=0;

P0=led[shi];

delay_ms(5); //消隐

P22=1;        //位选

P21=0;

P0=led[bai]&0x7f;//   与操作,使数码管最高位置一,点亮dp位

delay_ms(5); //消隐

P21=1;        //位选

P20=0;

P0=led[qian];

delay_ms(5); //消隐

P20=1;}

if(dao==1)                                                                        //60s倒计时

{

P23=0;        //位选

P0=led1[ge];        //

delay_ms(5); //消隐

P23=1;        //位选

P22=0;

P0=led1[shi];

delay_ms(5); //消隐

P22=1;        //位选

P21=0;

P0=led1[bai]&0x7f;//   与操作,使数码管最高位置一,点亮dp位

delay_ms(5); //消隐

P21=1;        //位选

P20=0;

P0=led2[qian];

delay_ms(5); //消隐

P20=1;

}

}

void T0int( ) interrupt 1 //定时器T0中断 方式1

{

TH0=0xDC;       //重新给a,10ms定时  65536-55536(a)

TL0=0x00;

ge++;

if(ge==10){

ge=0;

shi++;

}

if(shi==10){

shi=0;

bai++;

}

if(bai==10){        //满十进位

bai=0;

qian++;

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值