|
功能:在版主提供的51单片机程序基础上,修改串口部分程序,实现51通过p3口接收上位机指令,然后通过p0口在pc端显示,两个串口波特率都是9600,主要是为了方便上位机程序与51通信的调试。连接方法:703ttl与51p3串口连接,51p0串口与max232转接板连接。(请注意rx连接tx tx连接rx)
////////////////////////////////////
//程序功能 :
//测试双串口功能 串口在P3口接收数据,在P0口发送数据
//测试P3串口与703N数据通信状态
////////////////////////////////////
#include <math.h>
#include <intrins.h>
#include <REG52.H>
#define uchar unsigned char
#define uint unsigned int
uchar Buffer =0; //从串口接收的数据
uint i=0,j,URTAReceivedCount=0,n=1;
uchar data Tempdatatable[4],CommandDatatable[4];//数据包
sfr AUXR1 = 0xA2;
#define serial_P3 0x00;
#define serial_P0 0x80;
/***************************
Com_init()
串口初始化,晶振11.0592Mhz,波特率选择工作方式1,定时器1工作方式2,产生波特率9600
*****************************/
void Com_init()
{
AUXR1 = serial_P3; //P3 接收数据
TMOD = 0x21; //定时器1工作方式2
PCON = 0x00; //SMOD = 0
SCON = 0x50; //
TH1 = 0xFd; //设置波特率 9600
TL1 = 0xFd;
TR1 = 1; //启动定时器1
ES = 1; //开串口中断
EA = 1; //开总中断
}
void Delay_1ms(uint i)//1ms延时
{
uint x,j;
for(j=0;j<i;j++)
{
for(x=0;x<=148;x++)
{
}
}
}
void Send_Data(uchar data type,uchar data cmd)
{
uchar data Buffer[4];
uchar *p;
uint Send_Count=0;
AUXR1 = serial_P0; //P0 发送数据
p = Buffer;
Buffer[0]=0XFF;
Buffer[1]=type;
Buffer[2]=cmd;
Buffer[3]=0XFF;
while(1)
{
if(*p == 0xFF)
{
Send_Count++; //0XFF标志统计位
}
SBUF = *p; //发送
while(!TI) //判断是否发送完毕,若完毕,硬件置位TI
{
_nop_();
}
p++;
TI = 0;
if(Send_Count == 2) //当统计到两次出现0XFF,则认为一个数据包发送完毕,跳出循环
{
TI = 0;
break;
}
}
}
void Com_Int(void) interrupt 4
{
uchar temp;
ES = 0; //关串口中断
RI = 0; //软件清除接收中断
temp = SBUF; //temp中存放接收的数据
if(temp == 0xFF && URTAReceivedCount < 2)
{
Tempdatatable[0]==0xFF; //包头
URTAReceivedCount++;
}
else
{
Tempdatatable[n]=temp;
n++;
}
if(URTAReceivedCount == 2) //包尾
{
Tempdatatable[0]=0XFF;
Tempdatatable[3]=0XFF;
n = 1;
URTAReceivedCount=0; //组包完毕
Send_Data(Tempdatatable[1],Tempdatatable[2]); //P0口发送数据给PC
}
AUXR1 = serial_P3; //P3 接收数据
ES = 1; //开串口中断
}
void main(void)
{
Delay_1ms(200);
Com_init();
while(1);
}
|
|