资源简介
本程序实现的功能:通过串口,主机发出命令,从机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年电赛简易智能小车完整程序
相关资源
- delphi 串口通讯
- 基本放大电路multisim仿真.ms14
- STC8951系列单片机中方指南
- 一个labview仿真的函数信号发生器.vi
- Omron ETN21模块进行modbustcp通讯
- 60个HFSS 仿真模型库
- 基于MCS_51单片机的工业屏柜散热方案
- MCS_51单片机与8255A的接口设计
- Quartus II 15.0中仿真Altera三速以太网I
- Quartus II 15.0中仿真Altera三速以太网I
- 飞思卡尔单片机MC9S12XS12G128驱动(硬件
- 51单片机PWM程序,占空比、周期可调整
- 瑞利信道的仿真,包括信号的调制,
- 单片机和adc0809数字电压表
- modbus通讯协议详解
- PIC单片机完成的电子密码锁
- 单片机、ADC0808809设计简易数字电压表
- 51单片机多功能自行车测速仪
- 单片机做的6位时分秒数字钟
- 单片机电子时钟 闹钟 日历
- proteus仿真 AT89C51输出各种波形
- 音乐代码转换软件 单片机编程时用
- 单片机课程设计 篮球计分器
- 一种红外遥控编解码仿真
- 00
- 用51单片机实现G代码翻译
- 简易的电阻电容测量电路
- 单片机与温度传感器DS18B20的程序设计
- 毕业论文之温度传感器DS18B20(源码
- 51单片机基于protues的几个仿真实例
评论
共有 条评论