• 大小: 29KB
    文件类型: .rar
    金币: 1
    下载: 0 次
    发布日期: 2021-05-16
  • 语言: 其他
  • 标签: 单片机  通讯  仿真  

资源简介

本程序实现的功能:通过串口,主机发出命令,从机1和从机2分别响应从而将从机用DS18B20采集的温度值传送给主机,主机用1602液晶将从机1和从机2的温度分别显示出来。主机用按键选择更新哪一个从机的温度。

资源截图

代码片段和文件信息

#include
#include
#define uchar unsigned char
#define uint unsigned int

#define    DW    16      //定义数据帧宽度

uchar KEY=0;
uchar KSUM=0PP=0;
uchar R_buf[2][DW]; //接收到的数据存于此数组
bit FLAGRIGHT=0; //RIGHT为收到数据和校验正确标志位
bit RUN=0; //主机程序执行控制位
uchar slave; //从机地址中间变量

///////////////////延时函数//////////////////////////////
/*
void delay(uint k)
{
uint xy;
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 adduchar 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 mabshifengeshibai;
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(11‘-‘);
else
dspchar(11bai+0x30);
dspchar(21shi+0x30);
dspchar(31ge+0x30);
dspchar(41‘.‘);
dspchar(51shifen+0x30);
dspchar(71R_buf[slave][2]);
dspchar(81R_buf[slave][3]);
dspchar(91R_buf[slave][4]);
}
if(slave==0x01)
{
if(R_buf[slave][1]&0x80)
dspchar(12‘-‘);
else
dspchar(12bai+0x30);
dspchar(22shi+0x30);
dspchar(32ge+0x30);
dspchar(42‘.‘);
dspchar(52shifen+0x30);
dspchar(72R_buf[slave][2]);
dspchar(82R_buf[slave][3]);
dspchar(92R_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=

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----

     文件       2081  2010-03-01 11:47  多机通讯\主机\LCD1602.h

     文件       3717  2010-05-08 23:11  多机通讯\主机\主机.c

     文件       4732  2010-05-08 23:11  多机通讯\主机\主机.hex

     文件       2141  2010-02-24 22:43  多机通讯\主机\主机.Uv2

     文件       3621  2010-02-25 01:12  多机通讯\从机\DS18B20.h

     文件       1747  2010-02-26 21:41  多机通讯\从机\从机.c

     文件       1665  2010-02-26 21:41  多机通讯\从机\从机.hex

     文件       2158  2010-02-25 01:48  多机通讯\从机\从机.Uv2

     文件       3621  2010-02-25 01:12  多机通讯\从机2\DS18B20.h

     文件       1747  2010-02-26 21:41  多机通讯\从机2\从机2.c

     文件       1667  2010-02-26 21:41  多机通讯\从机2\从机2.hex

     文件       2144  2010-02-25 10:28  多机通讯\从机2\从机2.Uv2

     文件      89566  2010-08-11 11:06  多机通讯\多机通讯.DSN

     目录          0  2010-08-11 10:55  多机通讯\主机

     目录          0  2010-08-11 10:55  多机通讯\从机

     目录          0  2010-08-11 10:55  多机通讯\从机2

     目录          0  2010-08-11 11:06  多机通讯

----------- ---------  ---------- -----  ----

               120607                    17


评论

共有 条评论