#include <reg52.h> #define uchar unsigned char #define uint unsigned int sbit wela=P2^7; sbit dula=P2^6; uchar buf,num1=0,num2=0,num3=0,temp,interrupt_flag; uchar a,b,c,d,e,f,j,k; uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d, //数码管显示编码(1-F) 0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; void delay(uchar i) { for(j=i;j>0;j--) for(k=125;k>0;k--); } void display(uchar,uchar,uchar,uchar,uchar,uchar); void main(void) { SCON=0x50; //设定串口工作方式 PCON=0x00; //波特率不倍增 TMOD=0x20; //定时器1工作于8位自动重载模式, 用于产生波特率 EA=1; ES = 1; //允许串口中断 TL1=0xfd; TH1=0xfd; //波特率9600 TR1=1; while(1) { if(interrupt_flag==1) { interrupt_flag=0; temp=buf&0x03; switch(temp) { case 0x01: P1=0xfe;num1++;break; //接受到1,第一个LED亮 case 0x02: P1=0xfd;num2++;break; //接受到2,第二个LED亮 case 0x03: P1=0xfb;num3++;break; //接受到3,第三个LED亮 } } a=num1/10;b=num1%10; c=num2/10;d=num2%10; e=num3/10;f=num3%10; display(a,b,c,d,e,f); } } /********************************************************* 串行中断服务函数 *********************************************************/ void display(uchar a,uchar b,uchar c,uchar d,uchar e,uchar f) { dula=0; dula=1; P0=table[a]; dula=0; wela=0; wela=1; P0=0xfe; wela=0; delay(5); dula=1; P0=table[b]; dula=0; wela=1; P0=0xfd; wela=0; delay(5); dula=1; P0=table[c]; dula=0; wela=1; P0=0xfb; wela=0; delay(5); dula=1; P0=table[d]; dula=0; wela=1; P0=0xf7; wela=0; delay(5); dula=1; P0=table[e]; dula=0; wela=1; P0=0xef; wela=0; delay(5); dula=1; P0=table[f]; dula=0; wela=1; P0=0xdf; wela=0; delay(5); } void serial() interrupt 4 { ES = 0; //关闭串行中断 RI = 0; //清除串行接受标志位 buf = SBUF; //从串口缓冲区取得数据 interrupt_flag=1; ES = 1; //允许串口中断 }
上面为服务器端源代码
#include <reg52.h> #define jingzhen 11059200UL /*使用22.1184M晶体*/ // #define botelv 9600UL /*波特率定义为9600*/ unsigned char zifu=0x00,temp; volatile unsigned char sending; sbit s2=P3^4; sbit s3=P3^5; sbit s4=P3^6; void delay(unsigned char i) { unsigned char j,k; for(j=i;j>0;j--) for(k=90;k>0;k--); } void init(void) //串口初始化 { EA=0; //暂时关闭中断 TMOD&=0x0F; //定时器1模式控制在高4位 TMOD|=0x20; //定时器1工作在模式2,自动重装模式 SCON=0x50; //串口工作在模式1 TH1=256-jingzhen/(botelv*12*16); //计算定时器重装值 TL1=256-jingzhen/(botelv*12*16); PCON|=0x80; //串口波特率加倍 ES=1; //串行中断允许 TR1=1; //启动定时器1 REN=1; //允许接收 EA=1; //允许中断 } void send(unsigned char d) //发送一个字节的数据,形参d即为待发送数据。 { SBUF=d; //将数据写入到串口缓冲 sending=1; //设置发送标志 while(sending); //等待发送完毕 } void main() { init(); while(1) { if(s2==0) { delay(20); if(!s2) { temp=zifu|0x01; while(!s2); send(temp); } } if(s3==0) { delay(20); if(!s3) { temp=zifu|0x02; while(!s3); send(temp); } } if(s4==0) { delay(20); if(!s4) { temp=zifu|0x03; while(!s4); send(temp); } } } } void uart(void) interrupt 4 //串口发送中断 { if(RI) //收到数据 { RI=0; //清中断请求 } else //发送完一字节数据 { TI=0; sending=0; //清正在发送标志 } }
上面是客户端源代码。