{ uchar i; do
{ SBUF=0xAA; //发送联络信号 while(TI= =0); //等待一帧发送完毕 TI=0; //发送完毕,标志位清0 while (RI= =0); //等待乙机应答信号 RI=0;
} while (SBUF^0xBB!=0); //乙机未准备好,继续联络 do
{ pf=0; //校验和变量清0 for(i=0;i<10;i++){
SBUF=d[i]; //发送一个数据 pf+=d[i]; //计算校验和 while(TI= =0); TI=0;}
SBUF=pf; //发送校验和 while (TI= =0);TI=0;
while (RI= =0);RI=0; //等待乙机应答 }while (SBUF!=0); //回答出错,则重新发送 }
/*接收函数*/
void receive(uchar idata*d)
31
{uchar i; do
{ while(RI= =0); RI=0;
}while(SBUF^0xAA)!=0); //判断甲机是否请求 SBUF=0xBB; //发应答信号 while(TI= =0);TI=0; while(1){
pf=0; //清校验和 for(i=0;i<10;i++){
d[i] = SBUF; //接收数据 pf+=d[i];} //计算校验和 while(RI= =0);RI=0; //接收甲校验和 If((SBUF^pf)= =0){ //比较校验和 SBUF=0x00;break;} //校验和相等,发0x00 else{
SBUF=0xFF; //校验和不相等,发0Xff while(TI= =0);TI=0;
} } }
第六章
静态:【例6-1】利用单片机的并行口作为静态显示的输出口的示例
32
静态轮流显示“12”、“- -”和“AB”的C51源程序如下: #include
{0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x40,0x00}; void dl( ) { unsigned int i;
for(i=0;i<40000;i++); }
void display(void) //显示函数 { uchar segcode;
segcode=dis_buf[0];//P0口显示
33
//显示的代码表
segcode=table[segcode]; P0=segcode;
segcode=dis_buf[1]; //P3口显示 segcode=table[segcode]; P3=segcode; }
void main(void) //主函数 { while(1)
{ dis_buf[0]=1;dis_buf[1]=2; //显示12 display( ); dl();
dis_buf[0]=16;dis_buf[1]=16;//显示- - display( ); dl( );
dis_buf[0]=10;dis_buf[1]=11;//显示AB display( ); dl( ); } }
示例中的显示函数display( )可以再简单一些,如下面程序段: void display(void)
{ P0=table[dis_buf[0]]; //P0口显示 P3=table[dis_buf[1]]; //P3口显示 }
动态:【例6-3】利用MCS-51单片机的并行口作为动态显示的段口与
34
位口的示例
6位数码管动态显示“123456”的C51源程序如下 1)随机调用 #include
{0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x40,0x00};//代码表 void dl_ms() //延时1ms函数 { unsigned int j; for(j=0;j<200;j++) ; }
void display(void)//显示函数 { uchar segcode, bitcode, i;
35