/*程序说明:本程序目的为使用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);
}