資源簡介
本程序實現的功能:通過串口,主機發出命令,從機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年電賽簡易智能小車完整程序
評論
共有 條評論