资源简介
本程序实现的功能:通过串口,主机发出命令,从机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
- 上一篇:datagrideview实现导出数据
- 下一篇:03年电赛简易智能小车完整程序
相关资源
- 三种方法将51单片机设置为115200波特率
- 甲醛检测仪设计
- RS485通讯超声波流量计.pdf
- 斩控式单相交流调压电路的设计与仿
- 机械臂避障路径规划仿真 蚁群算法
- 电源侧含电感的单相桥式相控整流电
- 直流PWM可逆调速系统设计与仿真
- 基于PSCAD搭建的DFIG双馈风机仿真模型
- multisim仿真SPWM模型搭建
- 基于单片机的步进电机控制 毕业设计
- 51单片机实现交通灯压缩文件.rar
- 交通灯仿真.rar(含2000字说明书)
- KUKA机器人通过EtherNetIP与工业相机通讯
- IIC通讯,实现多组端口使用
- witness22.0.txt
- 风速风向的设计 风速风向的设计 运用
- 基于51单片机的温湿度控制程序
- 通讯协议转换模块程序
- OFDM信号功率谱密度
- 基于51单片机的智能电子秤设计-程序
- 基于51单片机的GPS全球定位系统的设计
- 基于51单片机的万年历设计-完整程序
- 基于51单片机的脉搏测量仪设计-完整
- 温度检测及控制系统的设计(毕业设
- 基于气动力的导弹姿态控制含仿真程
- 如何基于STM32系列单片机实现加密保护
- 悬吊式起重机动力学仿真-悬吊式起重
- GPS信号的模拟捕获和跟踪仿真
- 超声波测距仪温度补偿
- 基于单片机的LED彩灯控制器
评论
共有 条评论