標(biāo)題:
為什么單片機(jī)這樣顯示數(shù)碼管亮度不夠?延時函數(shù)的問題?
[打印本頁]
作者:
燦洋
時間:
2019-4-10 17:25
標(biāo)題:
為什么單片機(jī)這樣顯示數(shù)碼管亮度不夠?延時函數(shù)的問題?
為什么這樣顯示數(shù)碼管亮度不夠,為啥顯示函數(shù)里不要加延時了,加了延時不能實(shí)現(xiàn)功能!
單片機(jī)源程序如下:
#include <reg52.h>
#define dataport P0
#define uint unsigned int
#define uchar unsigned char
sbit duanch_1 = P2^2;
sbit weich_2 = P2^3;
sbit key_1 = P3^3;
sbit key_2 = P3^4;
uchar code duanma[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6};
uchar weima[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
uchar tempdata[8];
void delayms(uchar t);
void display(uchar firstbit,uchar Num);
void init();
void main()
{
uchar num;
key_1 = 1;
key_2 = 1;
init();
while(1)
{
if(!key_1)
{
delayms(10);
if(!key_1)
{
while(!key_1);
{
if(num<99)
num++;
}
}
}
if(!key_2)
{
delayms(10);
if(!key_2)
{
while(!key_2);
{
if(num>0)
num--;
}
}
}
tempdata[0] = duanma[num/10];
tempdata[1] = duanma[num%10];
}
}
void delayms(uchar t)
{
uchar i,j;
for(i=0;i<120;i++)
for(j=0;j<t;j++);
}
void display(uchar firstbit,uchar Num)
{
uchar i;
for(i=0;i<Num;i++)
{
dataport = 0;
duanch_1 = 1;
duanch_1 = 0;
dataport = weima[i+firstbit];
weich_2 = 1;
weich_2 = 0;
dataport = tempdata[i];
duanch_1 = 1;
duanch_1 = 0;
}
}
void init()
{
TMOD|=0x01;
EA = 1;
ET0 = 1;
TR0 = 1;
}
void time_0 ()interrupt 1
{
TH0 = (65536-2000)/256;
TL0 = (65536-2000)%256;
display(0,3);
}
復(fù)制代碼
作者:
wulin
時間:
2019-4-10 21:37
你的顯示函數(shù)這樣處理當(dāng)然會出問題,改一下即可。每次中斷只顯示一位。
#include <reg52.h>
#define dataport P0
#define uint unsigned int
#define uchar unsigned char
sbit duanch_1 = P2^2;
sbit weich_2 = P2^3;
sbit key_1 = P3^3;
sbit key_2 = P3^4;
uchar num;
uchar code duanma[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
uchar weima[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
uchar tempdata[8];
void delayms(uchar t);
void display();
void init();
void main()
{
init();
while(1)
{
if(!key_1)
{
delayms(10);
if(!key_1)
{
while(!key_1);
{
if(num<99)
num++;
}
}
}
if(!key_2)
{
delayms(10);
if(!key_2)
{
while(!key_2);
{
if(num>0)
num--;
}
}
}
tempdata[0] = duanma[num/10];
tempdata[1] = duanma[num%10];
}
}
void delayms(uchar t)
{
uchar i,j;
for(i=0;i<120;i++)
for(j=0;j<t;j++);
}
void display()
{
static uchar i=0;
dataport=0x00;//消隱
duanch_1 = 1;
duanch_1 = 0;
switch(i)
{
case 0:
dataport = weima[i];//送十位位碼
weich_2 = 1;
weich_2 = 0;
dataport = tempdata[i];//送十位段碼
duanch_1 = 1;
duanch_1 = 0;
i++;
break;
case 1:
dataport = weima[i];//送個位位碼
weich_2 = 1;
weich_2 = 0;
dataport = tempdata[i];//送個位段碼
duanch_1 = 1;
duanch_1 = 0;
i=0;
break;
}
}
void init()
{
TMOD|=0x01;
TH0 = (65536-2000)/256;
TL0 = (65536-2000)%256;
EA = 1;
ET0 = 1;
TR0 = 1;
}
void time_0 ()interrupt 1
{
TH0 = (65536-2000)/256;
TL0 = (65536-2000)%256;
display();
}
作者:
weiweimao1
時間:
2019-4-10 22:38
延時加大點(diǎn)試試。
作者:
HC6800-ES-V2.0
時間:
2019-4-11 08:22
第一:你的顯示函數(shù)中沒有延時程序,所以亮度不夠。數(shù)碼管從不亮到亮,現(xiàn)從亮到不亮,都是需要時間的,你開了馬上關(guān),時間太短,所以不太亮。
第二:你的程序說不能加延時,是因?yàn)槟愕亩〞r器為2ms,如果延時過長,就會中斷嵌套,這就不好辦了,所以加了延時就死了,功能不能實(shí)現(xiàn)。
第三:兩種解決方案:
(1)定時器時間加大一點(diǎn),配合的延時時間要算好,中斷程序執(zhí)行時間不超過定時時間
(2)重新規(guī)劃程序,例如定時中斷一次只顯示一位數(shù)碼管
作者:
zyi
時間:
2019-4-11 10:21
主要是定時器時間問題,上面的解決方案很好!
作者:
chun1989
時間:
2019-4-11 10:39
主要是定時器時間問題,上面的解決方案很好!
作者:
剛哥1211
時間:
2019-4-11 12:34
我看主要問題還是在沒有消影
作者:
rapheal_soft
時間:
2019-4-11 14:29
延遲的問題,嘗試加長試一試
作者:
風(fēng)華絕代依琳
時間:
2019-4-11 21:23
可以加上去延時抖動,如,在
P1=0x01;
delay(5);
P1=0x00;//去延時抖動,解決數(shù)碼管顯示不清楚的問題
作者:
1124xl
時間:
2019-4-11 22:02
主要是定時器時間問題,上面的解決方案很好
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1