?? withpc.c
字號(hào):
#pragma SRC
#include <stdio.h>
#include <reg51.h>
#define TRUE 1
#define FALSE 0
#define LampComm P0_0
//以上語(yǔ)句定義主機(jī)正在通訊閃燈信號(hào)
#define SelectComm1 P0_1
#define SelectComm2 P0_2
#define SelectComm3 P0_3
#define SelectComm4 P0_4
#define SelectComm5 P0_5
#define SelectComm6 P0_6
//以上語(yǔ)句定義主機(jī)通訊的從機(jī)號(hào)
#define MACHINECOMM_OK 0x11
//以上語(yǔ)句定義主機(jī)通訊傳送握手信號(hào)
#define MACHINECOMM_RET 0x88
//以上語(yǔ)句定義從機(jī)回復(fù)通訊握手信號(hào)
#define MACHINECOMM_DATAHEAD 0x5a
//以上語(yǔ)句定義數(shù)據(jù)包的頭
#define MACHINECOMM_DATAEND 0xa5
//以上語(yǔ)句定義數(shù)據(jù)包的尾
#define DELAY_VALUE 3
sbit P0_0=P0^0;
sbit P0_1=P0^1;
sbit P0_2=P0^2;
sbit P0_3=P0^3;
sbit P0_4=P0^4;
sbit P0_5=P0^5;
sbit P0_6=P0^6;
sbit P0_7=P0^7;
sbit P1_0=P1^0;
sbit P1_1=P1^1;
sbit P1_2=P1^2;
sbit P1_3=P1^3;
sbit P1_4=P1^4;
sbit P1_5=P1^5;
sbit P1_6=P1^6;
sbit P1_7=P1^7;
sbit P2_0=P2^0;
sbit P2_1=P2^1;
sbit P2_2=P2^2;
sbit P2_3=P2^3;
sbit P2_4=P2^4;
sbit P2_5=P2^5;
sbit P2_6=P2^6;
sbit P2_7=P2^7;
sbit P3_2=P3^2;
sbit P3_3=P3^3;
bit EvRcv=FALSE; //是否收到串行數(shù)據(jù)的標(biāo)志位
unsigned char rcvdata=0; //從串口存儲(chǔ)接收的變量
void send(char *temp,int j); //發(fā)送子程序
void initial(void); //初始化子程序
void delay(short i); //延時(shí)子程序
void main(void)
{
unsigned char datacomm[6],datarecv[6];
unsigned char count=0,datahand;
datahand=MACHINECOMM_RET;
datacomm[0]=MACHINECOMM_DATAHEAD;
datacomm[5]=MACHINECOMM_DATAEND;
datacomm[1]='w';
datacomm[2]='o';
datacomm[3]='r';
datacomm[4]='k';
initial();
SelectComm6=1;//選擇與PC機(jī)進(jìn)行通信。
while(1)
{
if(EvRcv)//如果接收到主機(jī)端發(fā)送過(guò)來(lái)的握手信號(hào)
{
if(rcvdata==MACHINECOMM_OK)
{ LampComm=TRUE;
delay(DELAY_VALUE);
LampComm=FALSE;
} //指示燈閃爍
EvRcv=FALSE;
break;//退出等待
}
send(&datahand,1);//返回一個(gè)握手信號(hào)
break;
}
for(;;){while(1)
{if(EvRcv){
datarecv[count]=rcvdata;
count++;
EvRcv=FALSE;
}
if(count==5)break;//如果已經(jīng)收到六個(gè)數(shù)據(jù),則認(rèn)為是收到一個(gè)數(shù)據(jù)包
}//接收一個(gè)數(shù)據(jù)包
if(datarecv[0]==MACHINECOMM_DATAHEAD&&datarecv[5]==MACHINECOMM_DATAEND)
send(datacomm,6);//如果數(shù)據(jù)包正確,則返回一個(gè)數(shù)據(jù)包;
}
}
void initial() //初始化子程序
{
IP=0x10; //定義串口為高優(yōu)先級(jí)中斷
IE=0x97; //允許串口、中斷0、1、定時(shí)器0
TCON=0x05;
TMOD=0x21; //定時(shí)器1為自動(dòng)裝入(auto-load)方式
PCON=0; //SMOD(PCON.7)=1時(shí),波特率翻倍.//smod=1 (晶振為11.0592M時(shí)為0)
SCON=0xD0; //串行口工作方式 : 9位UART, 波特率可變
TH1=0xf3;
TL1=0xf3; //
PCON=0x80|PCON; //SMOD=1; //波特率設(shè)置 : 9600 baud(E8--24MHZ)
//SMOD=0=4.8kbps
//th1=tl1=fd,smod=0 ,=19.2kbps
TR1=1; //啟動(dòng)定時(shí)器1
SelectComm1=0;
SelectComm2=0;
SelectComm3=0;
SelectComm4=0;
SelectComm5=0;
SelectComm6=0;
}
void send(unsigned char *temp,int j)
{
int i=0;
LampComm=TRUE;
EA=0;
for(i=0;i<=j-1;i++) //按發(fā)送數(shù)據(jù)的長(zhǎng)度來(lái)發(fā)送數(shù)據(jù)
{
ACC=*(temp+i);
TB8=P;
SBUF=ACC; //發(fā)送數(shù)據(jù)
while(TI==0); //發(fā)送數(shù)據(jù)完畢時(shí),TI會(huì)自動(dòng)置高
TI=0; //發(fā)送數(shù)據(jù)完畢,將TI清零,準(zhǔn)備下一次發(fā)送
}
EA=1;
LampComm=FALSE;
}
void Rcv_INT(void) interrupt 1
//串口中斷優(yōu)先級(jí)為1
{
LampComm=TRUE;
if(RI) //如果收到數(shù)據(jù)則進(jìn)行下面的操作
{
ACC=SBUF; //將串行通信的緩存中的數(shù)據(jù)存入寄存器A
if(P==RB8)
{
rcvdata=ACC; //將寄存器A中的數(shù)據(jù)存入變量rcvdata
EvRcv=TRUE; //將已經(jīng)接收到數(shù)據(jù)的標(biāo)志位置高
}
RI=0; //RI清零
}
LampComm=FALSE;
}
//延時(shí)子程序
void delay(int i)
{
int j=0;
i=i*DELAY_VALUE;
while (j<i)j++;
}
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -