|
程序下載單片機上運行0~99.99s計時時,單片機在到99.99s后突然跳到90.00,然后加到99.99后又跳到80.00,以此類推;
而在運60s倒計時功能時,到了00.00后不停止計時,qian位顯示的字符為沒有在段碼數組中定義的字符,請問怎么解決,仿真圖和實物顯示一樣
11]UNZY{3MH18P~7V3)97L1.png (113.18 KB, 下載次數: 86)
下載附件
2020-6-11 20:57 上傳
#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++;
}
}
|
|