C51串口通讯程序

下面是我学习C51单片机串口通讯时自己练习编写的下位机程序,已通过测试!大家可以根据这个思路编写其他的控制程序。



#include
#define uchar unsigned char
#define uint unsigned int
sbit P00=P0^0;
sbit P01=P0^1;
sbit P02=P0^2;
sbit P03=P0^3;
sbit P04=P0^4;
sbit P05=P0^5;
sbit P06=P0^6;
sbit P07=P0^7;
sbit P20=P2^0;
sbit P21=P2^1;
bit recfinish=0;
bit recflag=0;
uchar rec[5];
uchar i=0;
uchar j=0;
uchar sum=0;
void init();
void send();
void delayms(uint);
void main()
{
init();
while(1)
{
if(recfinish==1)
{
for(j=0;j<4;j++)
{
sum=sum+rec[j];
}
if((rec[0]==0x40)&&(rec[1]==0x43)&&((sum&0xFF)==rec[4])) /* 数据校验 */
{
switch(rec[3])
{
case 0x01: P00=0;break; /* 上 */
case 0x02: P01=0;break; /* 下 */
case 0x04: P02=0;break; /*左 */
case 0x08: P03=0;break; /*右 */
case 0x60: P04=0;break; /*光圈大 */
case 0x80: P05=0;break; /*光圈小 */
case 0x40: P06=0;break; /*聚焦大 */
case 0x30: P07=0;break; /*聚焦小 */
case 0x10: P20=0;break; /*变倍大 */
case 0x20: P21=0;break; /*变倍小 */
case 0x70: P0=0xFF;P20=1;
P21=1; break; /*停 */
}
}
recfinish=0;
sum=0;
}
// else
// {
// delayms(2000);
// P0=0xFF;
// }
}
}

void init()
{
SCON=0x50; /* 串口工作方式1,允许接收 */
TMOD=0x20; /* T1工作在方式2 */
PCON=0x00; /* 波特率不倍增 */
TH1=0xFA; /* 4800 */
TL1=0xFA;
EA=1; /* 允许中断 */
ES=1; /* 允许串口中断 */
TR1=1; /* 启动定时器 */
}

void send()
{
uchar k;
for(k=0;k<5;k++)
{
SBUF=rec[k];
while(!TI);
TI=0;
}
}

void delayms(uint x)
{
uchar y;
while(x--)
for(y=120;y>0;y++);
}


void com() interrupt 4
{
uchar dat;
ES=0;
while(!RI);
dat=SBUF;
RI=0;
if((dat==0x40)&&(i==0)) /* 判断帧头 */
{
rec[i]=dat;
i++;
recflag=1;
}
else
{
if(recflag==1)
{
if(i<5)
{
rec[i]=dat; /*继续接受数据*/
i++;
// }
// else
// {
if(i>=5)
{
recfinish=1; /*设置接受完标志*/
recflag=0;
i=0;
send();
}
}
}
}
ES=1;
}







/*测试数据如下
40 43 03 01 87 上 P00 1
40 43 03 02 88 下 P01 2
40 43 03 04 8A 左 P02 4
40 43 03 08 8E 右 P03 8
40 43 03 70 F6 停 P0 10
/*******************************************************************/

协议格式如下

同步数据 同步数据(特定功

能组) 地址 具体操作 校验和

40 43 03 01 87



上位机程序梢后送上。用VB编写的控制程序。

相关文档
最新文档