標(biāo)題:
單片機定時器數(shù)碼管程序調(diào)試卡著了,求指教
[打印本頁]
作者:
qjyvi2
時間:
2023-4-29 23:50
標(biāo)題:
單片機定時器數(shù)碼管程序調(diào)試卡著了,求指教
利用動態(tài)掃描和定時器0在數(shù)碼管上顯示出從543210開始以1%秒的速度往下遞減直至543111并保持顯示此數(shù),與此同時利用定時器0以500MS速度進行流水燈從上至下移動,同時蜂鳴器發(fā)聲,當(dāng)數(shù)碼管上數(shù)減到停止時,實驗板上流水燈全部閃爍4次,數(shù)碼管全熄滅。單片機進入休眠狀態(tài)。
我寫的單片機程序:
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,
0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
sbit ledla=P2^5;
sbit dula=P2^6;
sbit wela=P2^7;
sbit laba=P2^3;
uint num,n,e;
uchar b,i,c,d;
display();
delay(uchar);
void main()
{
TMOD=0x01;
TH0=(65536-10000)/256;
TL0=(65536-10000)%256;
EA=1;
ET0=1;
TR0=1; //開中斷
num=999; //項目 只有后三位變化。我就給999;
b=7; //用來給八個流水燈循環(huán)用
laba=0; //蜂鳴器開
d=0; //自己寫的數(shù)碼開始保持543111標(biāo)志位
while(1)
{
display();//數(shù)碼管顯示
P1=~(1<<b);//流水燈顯示
if(i==8)
{
i=0;
b=7;
}
if(d==1)//數(shù)碼管保持在543111后d=1,進入以后操作
{
for(c=0;c<3;c++)
{
P1=0x00;
for(e=0;e<65535;e++);
P1=0xff;
for(e=0;e<65535;e++);//流水燈全亮并亮滅三次
}
laba=1; //關(guān)蜂鳴器
P1=0xff; //關(guān)流水燈
P0=0xff;
wela=1;
wela=0;
P0=0xff;
dula=1;
dula=0; //關(guān)數(shù)碼管
PCON=0x02; //進入休眠
}
}
}
delay(uchar x) //延時
{
uchar a,b;
for(a=x;a>0;a--)
for(b=200;b>0;b--);
}
void t0() interrupt 1
{
n++;
if(num>111) //num數(shù)碼管的后三位
{
num--;
d=0;
}
if(num==111)
{
d=1;
}
TH0=(65536-10000)/256;
TL0=(65536-10000)%256;
if(n==50)
{
i++;
b--;
n=0;
}
}
display()
{
P0=0xff;
wela=1;
wela=0;
P0=table[6];
dula=1;
dula=0;
P0=0xfe;
wela=1;
wela=0;
delay(5);
P0=0xff;
wela=1;
wela=0;
P0=table[5];
dula=1;
dula=0;
P0=0xfd;
wela=1;
wela=0;
delay(5);
P0=0xff;
wela=1;
wela=0;
P0=table[4];
dula=1;
dula=0;
P0=0xfb;
wela=1;
wela=0;
delay(5);
P0=0xff;
wela=1;
wela=0;
P0=table[num/100];
dula=1;
dula=0;
P0=0xf7;
wela=1;
wela=0;
delay(5);
P0=0xff;
wela=1;
wela=0;
P0=table[num%100/10];
dula=1;
dula=0;
P0=0xef;
wela=1;
wela=0;
delay(5);
P0=0xff;
wela=1;
wela=0;
P0=table[num%100%10];
dula=1;
dula=0;
P0=0xdf;
wela=1;
wela=0;
delay(5);
}
以上是單片機代碼
下面是問題:
惟一的出錯的在于。沒辦法保持543111;運行到最后數(shù)碼管前五個不亮,第六個保持亮1到結(jié)束!
if(d==1)下面這些內(nèi)容不要。確實可以保持在543111;有了if(d==1)下面這些就會最后一個管亮1.
請各位大神指教。十分感謝。
作者:
qjyvi2
時間:
2023-4-30 10:04
找出來了。DISPLAY()要放中斷函數(shù)里面才是一直運行,不然停下后。只能最后一個數(shù)碼管顯示1
作者:
wulin
時間:
2023-4-30 10:33
樓主的意圖本身就存在邏輯問題 ,“543210開始以1%秒的速度往下遞減直至543111” 其過程就是990ms,在此區(qū)間以500mS速度進行流水燈從上至下移動???
運行到最后數(shù)碼管前五個不亮,第六個保持亮1到結(jié)束。是因為流水燈全亮并亮滅4次期間數(shù)碼管停止掃描。
給你改了:把543210遞減至543111的時間改為9.9s以便觀察。重點是要理解數(shù)碼管動態(tài)顯示函數(shù)的運行方式。
#include <reg51.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit dula=P2^6;
sbit wela=P2^7;
sbit buzzer=P2^3;
uchar code table[]={//共陰數(shù)碼管段碼"0~f-."
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71,0x40,0x80};
uchar data dis_buf[6]; //緩存數(shù)組
uchar b,c;
uchar count,num;
bit stop,mark,sign;
void Timer0Init() //1毫秒@11.0592MHz
{
TMOD= 0x01; //設(shè)置定時器模式
TL0 = 0x66; //設(shè)置定時初始值
TH0 = 0xFC; //設(shè)置定時初始值
TF0 = 0; //清除TF0標(biāo)志
TR0 = 1; //定時器0開始計時
EA = 1;
ET0 = 1;
}
void display()//數(shù)碼管動態(tài)顯示函數(shù)
{
static uchar i;
P0=0x00; dula=1;dula=0;//消隱
P0=~(0x01<<i);wela=1;wela=0;//送位碼
P0=dis_buf[i];dula=1;dula=0;//送段碼
i=++i%6;//循環(huán)計數(shù)
}
void main()
{
Timer0Init();
dis_buf[0]=table[5];//固定顯示部分
dis_buf[1]=table[4];
dis_buf[2]=table[3];
P1=0xfe;
buzzer=0;
num=210;
while(1)
{
if(mark)//周期100ms
{
mark=0;
if(stop==0)//流水燈
{
P1=P1<<1|0x01;
if(P1==0xff)
P1=0xfe;
}
else //閃爍燈
{
if(++b==5)//500ms
{
b=0;
P1=~P1;
if(++c==8)//閃爍4次結(jié)束運行,全部復(fù)位
{
c=0;
EA=0;
buzzer=1; //關(guān)蜂鳴器
P1=0xff; //關(guān)LED
P0=0xff; //關(guān)數(shù)碼管
dula=1;
wela=1;
_nop_();
_nop_();
PCON=0x02;//進入休眠
}
}
}
}
dis_buf[3]=table[num/100%10];
dis_buf[4]=table[num/10%10];
dis_buf[5]=table[num%10];
}
}
void Timer0Interrupt() interrupt 1
{
TH0 = 0xFC; //1毫秒@11.0592MHz
TL0 = 0x66;
if(++count==100)//100ms
{
count=0;
mark=1;//100ms標(biāo)志
if(!stop)
{
num--;
if(num==111)
{
stop=1;//計數(shù)結(jié)束
P1=0xff;//流水燈結(jié)束
}
}
}
display();//數(shù)碼管動態(tài)顯示函數(shù)
}
復(fù)制代碼
作者:
qjyvi2
時間:
2023-4-30 17:07
wulin 發(fā)表于 2023-4-30 10:33
樓主的意圖本身就存在邏輯問題 ,“543210開始以1%秒的速度往下遞減直至543111” 其過程就是990ms,在此區(qū) ...
哈哈。是的。動態(tài)掃描理解的不到位。你這代碼寫的太漂亮了。很感謝。我好好消化一下。
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1