#include
#include
//unsigned char uchar;
#define uchar unsigned char;
sbit p17=P1^7; //控制485发送接收使能
uchar ch;//要接收的数据
uchar count;
#define InBuf_len 4 // 定义接收数组长度
uchar InBuf[InBuf_len]; //串口数据接收缓冲区数组
char a[2]={1,2};//转存要发送的数
bit read_flag= 0 ;
void receive(void) interrupt 4//接收中断服务子程序
{
if(RI==1)
{
p17=1;
count=0;
//uchar ch;
ch=SBUF;
if(ch>127)
{
count=0;
InBuf[count]=ch-128;
//checksum=ch-128;
}
else
{
count++;
InBuf[count]=ch;
//checksum^=ch;
if((count==(InBuf_len- 1 )))
{
read_flag=1 ; //如果串口接收的数据达到INBUF_LEN个,且校验没错,就置位取数标志
count=0;
}
}
p17=0;
}
}
void send_char(char b) //向串口发送一个字节数据//
{//char b;
SBUF=b; //将需发送的字节放到发送缓冲区//
while(TI==0); //等待发送完成//
TI=0; //清除发送完成中断标志//
}
void send_string(char *str,int strlen) //向串口发送一个字符串,strlen为该字符串长度
{
int k=0;
while(k
send_char(*(str + k));
k++;
}
}
void delay() //延时//
{
char i,j;
for(i=0;i<200;i++)
{
for(j=0;j<200;j++){}
}
}
void UART_Init() //串口初始化函数
{
SCON=0x50; //无校验//0xD0//0xF0;////方式1 允许接受//SM2=0
TMOD=0x20; //T1模式2自动重装 T0模式1,16位定时,
TCON=0x40;
PCON=0x00; ///0x00波特率不加倍SMOD=0////0x80;波特率翻倍SMOD=1
TH1=0x40; //波特率为9600,3.6864MHz 时为 40
TL1=0x40;
TI=1;
TR1 = 1; //波特率开启 //TR0=1;//T0开启
IE&=0xf7; //关定时器1的中断
IE |= 0x90 ; //Enable Serial Interrupt ES=1,EA=1
// ES = 1;
// EA = 1;
}
void change() //收到的数据交换存储,
{
a[1]=InBuf[2];
a[0]= InBuf[3];
//InBuf[4]=a;
}
main()
{
int i;
char s[6]="error";
WDT_CONTR=0x35;
read_flag=1;//先向pc机发送一个响应,看是否已连接正常
//初始化//
UART_Init();
printf("%s","kaishi!\n");
while(1)
{
// scanf("%d",&i);
//printf("%d",i);
if(read_flag)
{
read_flag=0;//标志位清0;
if(InBuf[0]==5&&InBuf[1]==5)//判断是否时正确命令,若是则发送响应 ,否则提示错误,发送0
{
change();
p17=1;
send_string(a,2);
p17=0;
for(i=0;i<2;i++)
{
printf("%c",a[i]);
}
}
else
{
for(i=0;i<5;i++)
{p17=1;
//send_char('e');//提示命令错误
send_string(s,6);
p17=0;
}
}
}
}
}这里用到max485芯片P1^7为控制引脚哪里不明白可以说!
单片机连接电脑时已经将485转成232了 ,再烧写程序时串口调试助手上显示数据,但是都是乱码看不懂!