|
程序下載單片機(jī)上運(yùn)行0~99.99s計(jì)時(shí)時(shí),單片機(jī)在到99.99s后突然跳到90.00,然后加到99.99后又跳到80.00,以此類推;
而在運(yùn)60s倒計(jì)時(shí)功能時(shí),到了00.00后不停止計(jì)時(shí),qian位顯示的字符為沒有在段碼數(shù)組中定義的字符,請(qǐng)問怎么解決,仿真圖和實(shí)物顯示一樣
11]UNZY{3MH18P~7V3)97L1.png (113.18 KB, 下載次數(shù): 86)
下載附件
2020-6-11 20:57 上傳
#include<reg51.h>
#include<stdio.h>
sbit P20=P2^0; //四位數(shù)碼管位選
sbit P21=P2^1;
sbit P22=P2^2;
sbit P23=P2^3;
sbit s1=P2^4; //開始
sbit s2=P2^5; //復(fù)位
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倒計(jì)時(shí)ge、shi、bai位段碼
unsigned char code led2[ ]={0x92,0x99,0xb0,0xa4,0xf9,0xc0} ;//60s倒計(jì)時(shí)qian位段碼
void display();
void delay_ms(unsigned int ms) // 延遲
{
unsigned char a;
while(ms--)
for(a=125;a>0;a--);
}
void T0_init( ) //定時(shí)器T0初始化
{
TMOD=0x01;
TH0=0xDC; //10ms定時(shí)
TL0=0x00;
EA=1;
ET0=1;
}
void main()
{
feng=0;
T0_init( );
while(1){
display( );
while(!s1)//0~99.99s計(jì)時(shí)
{
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倒計(jì)時(shí)
{
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)) //計(jì)時(shí)結(jié)束后歸零
{
feng=~feng;
dao=0;
TR0=0;
qian=0;
bai=0;
shi=0;
ge=0;
}
}
}
void display( )
{
if(dao==0) // 0~99.99s計(jì)時(shí)
{
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;// 與操作,使數(shù)碼管最高位置一,點(diǎn)亮dp位
delay_ms(5); //消隱
P21=1; //位選
P20=0;
P0=led[qian];
delay_ms(5); //消隱
P20=1;}
if(dao==1) //60s倒計(jì)時(shí)
{
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;// 與操作,使數(shù)碼管最高位置一,點(diǎn)亮dp位
delay_ms(5); //消隱
P21=1; //位選
P20=0;
P0=led2[qian];
delay_ms(5); //消隱
P20=1;
}
}
void T0int( ) interrupt 1 //定時(shí)器T0中斷 方式1
{
TH0=0xDC; //重新給a,10ms定時(shí) 65536-55536(a)
TL0=0x00;
ge++;
if(ge==10){
ge=0;
shi++;
}
if(shi==10){
shi=0;
bai++;
}
if(bai==10){ //滿十進(jìn)位
bai=0;
qian++;
}
}
|
|