?說(shuō)一下功能:客戶機(jī)發(fā)送0x01到服務(wù)機(jī)
2服務(wù)單片機(jī)應(yīng)答0xf2到客戶機(jī)
3客戶機(jī)接收到0xf2,發(fā)送信息153432這6個(gè)數(shù)字到服務(wù)機(jī)
4client發(fā)送完信息后發(fā)送0xaa結(jié)束通信
5server接收到0xaa后回復(fù)0xaa結(jié)束通信,從此老死不相往來(lái)
看代碼:
//發(fā)送端代碼
#include "reg51.h"
#include "myheader.h"
#define uchar unsigned char
long int sleep_i=0;
long int main_i=0;
int bufferc[6]={0};
uchar tag=0;
void test()
{
P17=0;
}
void main()
{
uchar sendx[6]={1,5,3,4,3,2};
sleep(1000);
TMOD=0x20;//采用初值自動(dòng)重載的方式
TH1=0XF4;//根據(jù)波特率計(jì)算公式這里需要設(shè)置為這么多才能夠在串行數(shù)據(jù)傳輸模式1的狀況下實(shí)現(xiàn)波特率2400B/S
TL1=0XF4;
TR1=1;//啟動(dòng)定時(shí)器開(kāi)始計(jì)時(shí)
SCON=0X40;
REN=1;
EA=1;
ES=1;
SBUF=0x01; //發(fā)送01
while(TI==0);
// test();
for(;;)
{
if(tag==1)break;
}
if(tag==1)
{
EA=0;
for(main_i=0;main_i<6;main_i++)
{
SBUF=sendx[main_i];
while(TI==0);
TI=0;
}
EA=1;
tag=0;
}
SBUF=0XAA;
while(1);
}
void int_4() interrupt 4
{
EA=0;
if(SBUF==0X01)
{
;//while(RI==0);
}
else if(SBUF==0XF2)
{
tag=1;
}
else if(SBUF==0Xaa)
{
if(TI==1)
{
;
}
else if(RI==1)
{
REN=0;
}
}
else
{
;
}
RI=0;TI=0;
EA=1;
}
void sleep(long int a)
{
for(sleep_i=0;sleep_i<a;sleep_i++)
{
;
}
}
服務(wù)端代碼:
#include "reg51.h"
#include "myheader.h"
#define uchar unsigned char
int szc[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
int bufferc[6]={0};
int sza[6]={0x01,0x02,0x04,0x08,0x10,0x20};
int t=0;
int i=0;
void display() //顯示設(shè)備沒(méi)有問(wèn)題,因?yàn)榭梢灾覍?shí)的顯示出012345 如果是顯示異常比如是數(shù)據(jù)出問(wèn)題:bufferc[6]數(shù)據(jù)出了問(wèn)題
{ //設(shè)備全部顯示0,說(shuō)明bufferc[6]沒(méi)有被賦值 ,找到賦值bufferc語(yǔ)句
uchar i=0;
uchar num=0;
for(i=0;i<6;i++) //顯示異常,只能顯示一個(gè)數(shù)字P1角有問(wèn)題
{
num=bufferc[i]; //bufferc【】數(shù)據(jù)異常,0位置:3 1位:4 2位:5 3位置:6 4位置:后面都是0 也就是說(shuō)1,2都被另外那個(gè)東西給截住了
P2=szc[num];
P1=sza[i];
sleep(1);
P2=0xff;
}
}
void test()
{
P17=0;
}
void main()
{
TMOD=0x20;
TH1=0XF4;//根據(jù)波特率計(jì)算公式這里需要設(shè)置為這么多才能夠在串行數(shù)據(jù)傳輸模式1的狀況下實(shí)現(xiàn)波特率2400B/S
TL1=0XF4;
TR1=1;
SCON=0x40;//串口工作與方式1,定義了傳送數(shù)據(jù)的格式
EA=1;
ES=1; //串口中斷開(kāi)關(guān)打開(kāi)
REN=1;
while(1)
{
display();
}
}
void int_4() interrupt 4
{
static uchar first=0;
EA=0;
t=SBUF;
if(t==0x01&&first==0)
{
first++;
SBUF=0xF2;
while(TI==0);
TI=0;
}
else if(SBUF==0XF2)
{
first++;
}
else if(SBUF==0Xaa)
{
//需要判斷是接收的0XAA,還是發(fā)送的0xaa
if(RI==1)//接收的0xaa
{
SBUF=0XAA;
while(TI==0);
}
else if(TI==1)
{
REN=0;
}
}
else if(RI==1)
{
bufferc[i]=SBUF;
i++;
}
if(RI==1&&TI==0)RI=0;
if(TI==1&&RI==0)TI=0;
EA=1;
}
void sleep(long int a)
{
uchar i=0;
for(i=0;i<a;i++)
{
;
}
}
?文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-643975.html文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-643975.html
?
到了這里,關(guān)于AT89C51單片機(jī)實(shí)現(xiàn)單片機(jī)串口互動(dòng)(中斷方式,單片機(jī)--單片機(jī),應(yīng)答)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!