|
程序下载单片机上运行0~99.99s计时时,单片机在到99.99s后突然跳到90.00,然后加到99.99后又跳到80.00,以此类推;
而在运60s倒计时功能时,到了00.00后不停止计时,qian位显示的字符为没有在段码数组中定义的字符,请问怎么解决,仿真图和实物显示一样
#include<reg51.h>
#include<stdio.h>
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++;
}
}
|
|