#include<reg52.h>
#include<LCD1602.h>
#define uchar unsigned char
#define uint unsigned int
#define DW 16 //定义数据帧宽度
uchar KEY=0;
uchar K,SUM=0,PP=0;
uchar R_buf[2][DW]; //接收到的数据存于此数组
bit FLAG,RIGHT=0; //RIGHT为收到数据和校验正确标志位
bit RUN=0; //主机程序执行控制位
uchar slave; //从机地址中间变量
///////////////////延时函数//////////////////////////////
/*
void delay(uint k)
{
uint x,y;
for(x=k;x>0;x--)
for(y=110;y>0;y--);
}*/
/////////////////////初始化/////////////////////////
void init()
{
TMOD=0x20;
PCON=0x00;
TH1=0xfd;
TL1=0xfd; //波特率9600
TR1=1;
SM0=1;
SM1=1;
SM2=1;
EA=1;
ES=1; //开串口中断
EX0=1; //开外部中断0
IT0=1; //触发方式
REN=1;
}
////////////////向某一从机发送命令////////////////////////
void send(uchar add,uchar cmd)
{
//REN=0;
TB8=1;
SBUF=add; //发送地址
while(!TI);
TI=0;
TB8=0;
SBUF=cmd; //发送命令
while(!TI);
TI=0;
//REN=1;
}
///////////////////主函数///////////////////////////
void main()
{
uchar num=0;
uchar m,a,b,shifen,ge,shi,bai;
int k;
init();
LCD_init();
delay(100);
while(1)
{
while(RIGHT)
{
/*P1=R_buf[num++];
delay(300);
if(num==8)
num=0;*/
if(RUN)
{
a=R_buf[slave][1]<<4;
b=R_buf[slave][0]>>4;
if(R_buf[slave][1]&0x80)
{
k=(int)R_buf[slave][1];
k=(k<<8)|(int)(R_buf[slave][0]);
k=~(k-1);
a=(uchar)(k>>8);
b=(uchar)k;
a=a<<4;
b=b>>4;
}
m=a|b;
bai=m/100;
shi=m%100/10;
ge=m%100%10;
shifen=(R_buf[slave][0]&0x0f)*6.25/10;
if(slave==0x00)
{
if(R_buf[slave][1]&0x80)
dspchar(1,1,'-');
else
dspchar(1,1,bai+0x30);
dspchar(2,1,shi+0x30);
dspchar(3,1,ge+0x30);
dspchar(4,1,'.');
dspchar(5,1,shifen+0x30);
dspchar(7,1,R_buf[slave][2]);
dspchar(8,1,R_buf[slave][3]);
dspchar(9,1,R_buf[slave][4]);
}
if(slave==0x01)
{
if(R_buf[slave][1]&0x80)
dspchar(1,2,'-');
else
dspchar(1,2,bai+0x30);
dspchar(2,2,shi+0x30);
dspchar(3,2,ge+0x30);
dspchar(4,2,'.');
dspchar(5,2,shifen+0x30);
dspchar(7,2,R_buf[slave][2]);
dspchar(8,2,R_buf[slave][3]);
dspchar(9,2,R_buf[slave][4]);
}
RUN=0;
}
}
}
}
/////////////////中断服务程序///////////////////////////
void ser() interrupt 4
{
uchar add;
REN=0; //关闭接收数据使能
RI=0;
if( (RB8==1)&&(FLAG==0) ) //判断从机发来的是否为地址
{
add=SBUF; //取从机地址
SUM=0;
PP=0;
K=0;
SM2=0; //改为直通方式,以便接收将要发来的数据
}
if(RB8==0)
{
R_buf[slave][K]=SBUF; //取数据
SUM+=R_buf[slave][K]; //求和以作和校验
K++;
FLAG=1; //收到第一个数据时置1,以便区分地址帧与校验帧
if(K==DW) //K达到数据帧长度,表明数据接收完
{
SM2=1; //改回多机通讯模式
}
}
if( (RB8==1)&&(FLAG==1) ) //表示收到的是校验值
{
FLAG=0;
PP=SBUF; //取校验和
if(PP==SUM) //如果和校验相等,则正确
{
RIGHT=1; //等于1表示收到的数据正确
send(slave,0x00); //发送0x00,表示收到的数据正确
}
else
{
RIGHT=0;
send(slave,0xff); //发送0xff,表示收到的数据有误
}
}
REN=1;
}
void exter0() interrupt 0
{
RUN=1;
switch(KEY)
{
case 0: slave=0x00;break;
case 1: slave=0x01;break;
default: break;
}
KEY=(KEY+1)%2;
send(slave,0xff); //向从机发送错误信号以让其发送数据
}
- 1
- 2
- 3
前往页