/*程序說明:本程序目的為使用c52單片機實現從電腦串口上收到數據以后,給電腦發送字符123*/
/*使用器件:TX-1C實驗板,c52單片機,keil,串口調試助手V2.1*/
/*問題1:當初程序下載到單片機,并經過復位操作以后,若SCON的初始化方式是以位操作的方式設置,則在上位機未向單片機寫數據的情況下,由于有復位操作,單片機會先進入一次中斷,向計算機發送123;但是,當以寄存器方式設置SCON,則不存在復位后自動產生中斷的情況。請問這是為什么?
問題2:若把標志為//??????????????????????//處的語句屏蔽以后,如果程序執行順序為:1->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;//設置定時器1為工作方式2
TH1=0xfd;
TL1=0xfd;
TR1=1;
REN=1; //以位操作的方式設置SCON的各個位;
SM0=0;
SM1=1;
SM2=0;
RI=0;
TI=0;
RB8=0;
TB8=0;
// SCON=0x50; //以寄存器的方式設置SCON;
EA=1; //開總中斷;
P0=0xfe; //在第一個數碼管上,先顯示程序執行的位置1,再顯示RI的內容,最后顯示TI的內容;
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; //在第二個數碼管上,先顯示程序執行的位置2,再顯示RI的內容,最后顯示TI的內容;
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; //在第三個數碼管上,先顯示程序執行的位置3,再顯示RI的內容,最后顯示TI的內容;
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; //在第四個數碼管上,先顯示程序執行的位置4,再顯示RI的內容,最后顯示TI的內容;
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);
}