標(biāo)題:
讓單片機(jī)串口接收數(shù)據(jù)然后用數(shù)碼管顯示 但程序十位數(shù)字出現(xiàn)就很快消失
[打印本頁]
作者:
流言惠子
時(shí)間:
2018-5-21 16:34
標(biāo)題:
讓單片機(jī)串口接收數(shù)據(jù)然后用數(shù)碼管顯示 但程序十位數(shù)字出現(xiàn)就很快消失
我寫的程序是讓單片機(jī)接收數(shù)據(jù)已數(shù)碼管的形式顯示,為什么我的我一個(gè)程序十位數(shù)字出現(xiàn)就很快消失,個(gè)位顯示;而第二個(gè)程序確實(shí)現(xiàn)的很好?大佬們,求解答
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit we = P2^7;
sbit du = P2^6;
uchar counter,time_counter;
uchar code leddata[]={
0x3F, //"0"
0x06, //"1"
0x5B, //"2"
0x4F, //"3"
0x66, //"4"
0x6D, //"5"
0x7D, //"6"
0x07, //"7"
0x7F, //"8"
0x6F, //"9"
0x77, //"A"
0x7C, //"B"
0x39, //"C"
0x5E, //"D"
0x79, //"E"
0x71, //"F"
0x76, //"H"
0x38, //"L"
0x37, //"n"
0x3E, //"u"
0x73, //"P"
0x5C, //"o"
0x40, //"-"
0x00, //熄滅
0x00 //自定義
};
void delay(uint z)
{
uint x,y;
for(x = z; x > 0; x--)
for(y = 114; y > 0 ; y--);
}
void UART_init()
{
TMOD = 0x20; //T1工作模式2 8位自動(dòng)重裝
TH1 = 0xfa;
TL1 = 0xfa; //比特率9600
TR1 = 1;
SM0 = 0;
SM1 = 1; //串口工作方式1 10位異步
REN = 1; //串口允許接收
/* EA = 1; //開總中斷
ES = 1; //串口中斷打開 */
}
void display(uchar i)
{
uchar shi,ge;
shi = i / 10; //求模
ge = i % 10; //求余
P0 = 0xff;
we = 1;
P0 = 0xfe; //點(diǎn)亮第一位數(shù)碼管
we = 0;
du = 1;
P0 = leddata[shi];
du = 0;
delay(1);
P0 = 0xff;
we = 1;
P0 = 0xfd;//點(diǎn)亮第二位數(shù)碼管
we = 0;
du = 1;
P0 = leddata[ge];
du = 0;
delay(1);
}
void main()
{
UART_init(); //串口初始化
while(1)
{
while(!RI)
RI = 0;
display(SBUF);
}
}
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit we = P2^7;
sbit du = P2^6;
uchar counter,time_counter;
uchar code leddata[]={
0x3F, //"0"
0x06, //"1"
0x5B, //"2"
0x4F, //"3"
0x66, //"4"
0x6D, //"5"
0x7D, //"6"
0x07, //"7"
0x7F, //"8"
0x6F, //"9"
0x77, //"A"
0x7C, //"B"
0x39, //"C"
0x5E, //"D"
0x79, //"E"
0x71, //"F"
0x76, //"H"
0x38, //"L"
0x37, //"n"
0x3E, //"u"
0x73, //"P"
0x5C, //"o"
0x40, //"-"
0x00, //熄滅
0x00 //自定義
};
void delay(uint z)
{
uint x,y;
for(x = z; x > 0; x--)
for(y = 114; y > 0 ; y--);
}
void UART_init()
{
TMOD = 0x20; //T1工作模式2 8位自動(dòng)重裝
TH1 = 0xfa;
TL1 = 0xfa; //比特率9600
TR1 = 1;
SM0 = 0;
SM1 = 1; //串口工作方式1 10位異步
REN = 1; //串口允許接收
/* EA = 1; //開總中斷
ES = 1; //串口中斷打開 */
}
void display(uchar i)
{
uchar shi,ge;
shi = i / 10; //求模
ge = i % 10; //求余
P0 = 0xff;
we = 1;
P0 = 0xfe; //點(diǎn)亮第一位數(shù)碼管
we = 0;
du = 1;
P0 = leddata[shi];
du = 0;
delay(1);
P0 = 0xff;
we = 1;
P0 = 0xfd;//點(diǎn)亮第二位數(shù)碼管
we = 0;
du = 1;
P0 = leddata[ge];
du = 0;
delay(1);
}
void main()
{
UART_init(); //串口初始化
while(1)
{
if(RI)
{
RI = 0;
}
display(SBUF);
}
}
復(fù)制代碼
作者:
wulin
時(shí)間:
2018-5-22 08:32
while(!RI)是停留等待條件成立才繼續(xù)運(yùn)行,if(RI)是判斷條件是否成立,不停留,可以繼續(xù)運(yùn)行。
作者:
zhanghyg
時(shí)間:
2018-5-22 08:53
你第一個(gè)和第二個(gè)唯一的區(qū)別就是清除RI標(biāo)志位的語句,用if判斷不滿足條件還會(huì)繼續(xù)執(zhí)行,但是用while如果不滿足就會(huì)一直停在這,這就是你數(shù)碼管很快消失的原因。
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1