/*程序說明:本程序目的為使用c52單片機(jī)實(shí)現(xiàn)從電腦串口上收到數(shù)據(jù)以后,給電腦發(fā)送字符123*/
/*使用器件:TX-1C實(shí)驗(yàn)板,c52單片機(jī),keil,串口調(diào)試助手V2.1*/
/*問題1:當(dāng)初程序下載到單片機(jī),并經(jīng)過復(fù)位操作以后,若SCON的初始化方式是以位操作的方式設(shè)置,則在上位機(jī)未向單片機(jī)寫數(shù)據(jù)的情況下,由于有復(fù)位操作,單片機(jī)會(huì)先進(jìn)入一次中斷,向計(jì)算機(jī)發(fā)送123;但是,當(dāng)以寄存器方式設(shè)置SCON,則不存在復(fù)位后自動(dòng)產(chǎn)生中斷的情況。請(qǐng)問這是為什么?
問題2:若把標(biāo)志為//??????????????????????//處的語句屏蔽以后,如果程序執(zhí)行順序?yàn)椋?->3->4->2的話,顯示2的管子不亮*/
#include<reg52.h>
unsigned char flag,a;
sbit wela=P2^7;
sbit dula=P2^6;
char code table[]={ //0到f的段碼;
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
void delay(int z)
{
int x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void main()
{
TMOD=0x20;//設(shè)置定時(shí)器1為工作方式2
TH1=0xfd;
TL1=0xfd;
TR1=1;
REN=1; //以位操作的方式設(shè)置SCON的各個(gè)位;
SM0=0;
SM1=1;
SM2=0;
RI=0;
TI=0;
RB8=0;
TB8=0;
// SCON=0x50; //以寄存器的方式設(shè)置SCON;
EA=1; //開總中斷;
P0=0xfe; //在第一個(gè)數(shù)碼管上,先顯示程序執(zhí)行的位置1,再顯示RI的內(nèi)容,最后顯示TI的內(nèi)容;
wela=1;
wela=0;
P0=table[1];
dula=1;
dula=0;
delay(1000);
P0=0;
dula=1;
dula=0;
delay(1000);
P0=table[RI];
dula=1;
dula=0;
delay(1000);
P0=0;
dula=1;
dula=0;
delay(1000);
P0=table[TI];
dula=1;
dula=0;
delay(1000);
ES=1; //打開串口中斷;
// P1=RI; //??????????????????????//
P0=0xfd; //在第二個(gè)數(shù)碼管上,先顯示程序執(zhí)行的位置2,再顯示RI的內(nèi)容,最后顯示TI的內(nèi)容;
wela=1;
wela=0;
P0=table[2];
dula=1;
dula=0;
delay(1000);
P0=0;
dula=1;
dula=0;
delay(1000);
P0=table[RI];
dula=1;
dula=0;
delay(1000);
P0=0;
dula=1;
dula=0;
delay(1000);
P0=table[TI];
dula=1;
dula=0;
delay(1000);
while(1)
{
/* if(RI==1)
{
RI=0;
P1=SBUF;
}*/
if(flag==1)
{
ES=0;
flag=0;
SBUF='1';//28;
while(!TI);
TI=0;
SBUF='2';//28;
while(!TI);
TI=0;
SBUF='3';//28;
while(!TI);
TI=0;
ES=1;
}
}
}
void ser() interrupt 4
{
P0=0xfb; //在第三個(gè)數(shù)碼管上,先顯示程序執(zhí)行的位置3,再顯示RI的內(nèi)容,最后顯示TI的內(nèi)容;
wela=1;
wela=0;
P0=table[3];
dula=1;
dula=0;
delay(1000);
P0=0;
dula=1;
dula=0;
delay(1000);
P0=table[RI];
dula=1;
dula=0;
delay(1000);
P0=0;
dula=1;
dula=0;
delay(1000);
P0=table[TI];
dula=1;
dula=0;
delay(1000);
RI=0;
// P1=SBUF;
// a=SBUF;
flag=1;
P0=0xf7; //在第四個(gè)數(shù)碼管上,先顯示程序執(zhí)行的位置4,再顯示RI的內(nèi)容,最后顯示TI的內(nèi)容;
wela=1;
wela=0;
P0=table[4];
dula=1;
dula=0;
delay(1000);
P0=0;
dula=1;
dula=0;
delay(1000);
P0=table[RI];
dula=1;
dula=0;
delay(1000);
P0=0;
dula=1;
dula=0;
delay(1000);
P0=table[TI];
dula=1;
dula=0;
delay(1000);
}