📄 mcs51-rs232.c
字号:
#include <reg52.h>
#include <stdio.h>
#include <absacc.h>
#include <intrins.h>
#include <string.h>
#define uchar unsigned char
#define uint unsigned int
//发送数据头固定字节
#define FIRST_DATA 10
#define SECOND_DATA 01
//发送数据格式
//长度+SECOND_DATA+FIRST_DATA+DATA+XOR
//收数据格式
//长度+FIRST_DATA+SECOND_DATA+DATA+XOR
bit rs232=0;//串口中断标志
unsigned char com_len=0;//串口接收数据长度
unsigned char rev_data[10];
//RS232通讯处理
void send(unsigned char *send_data,unsigned char length);
void rs232init(void);
unsigned char rs232_data_work(void);
void ExpInterruptInit(void);
void TimerAppMode(unsigned int delaytime);
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
//程序名:main()
//功能: 完成咪表整个工作流程
//输入:复位信号产生后接收中断向量并分别出各自所要作的工作
//输出:完成开关量所要求达到的功能
//说明:多复位到工作完成后,系统自动进入睡眠状态,低功耗工作
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
main(void)
{
unsigned char i;
rs232init(); //// interrupts open
ExpInterruptInit();
rs232=0;
TR1=1;
ES =1;
EA=1;
while(1)
{
if(rs232)//判断是否有数据接收
{
i=rs232_data_work();
rs232=0;
}
ES=1;
TR1=1;
EA=1;
}
}
//==========================================================================================
//功能:外部中断初始化
//输入:无
//输出:无
//全局变量:
//=========================================================================================
void ExpInterruptInit(void)
{
EX1 = 1; //外部中断1
IT1=1;//如果被置成1:外部中断2为下降沿中断;置成0:低电平中断
EX0 = 1; //外部中断0
IT0=1;//如果被置成1:外部中断2为下降沿中断;置成0:低电平中断
EA=1;
}
//==========================================================================================
//功能:串口初始化
//输入:无
//输出:无
//全局变量:Protocol_mode 串口设置选择
//=========================================================================================
void rs232init(void)
{
SCON=0x50;
TMOD=0x21;
//9600
//PCON &= 0x7f;
// AUXR &= 0xbf;
TH1=0xfd;//9600,p//b=2的smod次方*f/n*12*(256-th)11.0592Mhz
TL1=0xfd;
//19200
//PCON |= 0x80;
//TH1=0xFB;//19200,p//b=2的smod次方*f/n*12*(256-th)
//TL1=0xFB;
//32000
//PCON |= 0x80;
//TH1=0xFD;//32000,p//b=2的smod次方*f/(n*12*(256-th))
// TL1=0xFD;
TR1=1;
ES =1;
EA=1;
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~`~
//按照协议接收数据
//输入:无
//输出:无
//返回:正确为1 ,错误为0
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~`~
void rs232_int0() interrupt 4 using 3
{
unsigned char xdata i,temp;
unsigned int xdata dly;
EA=0;
rs232=1; /*rs232通讯状态*/
dly=40000;//200ms
while((RI!=1)&&(dly)) /*接收应答*/
{
dly=dly-1;
}
if(dly==0)
{
rs232=0;
TR1=1;
ES =1;
EA=1;
return;
}
RI=0;
com_len=SBUF;//接收长度
rev_data[0]=com_len; // LEN for receive data
for(i=1;i<com_len;i++)
{
dly=40000;//200ms
while((RI!=1)&&(dly)) /*接收应答*/
{
dly=dly-1;
}
if(dly==0)
{
rs232=0;
TR1=1;
ES =1;
EA=1;
return;
}
RI=0;
temp=SBUF;
rev_data[i]=temp;
}
//temp=com_len-1;
//for(i=0;i<temp; i++) all = all^Send_rece[i];//计算异或值
//if(all != Send_rece[temp]) return 0;//数据报逻辑和检验,测试时屏蔽
//com_len=Rece_PC;
//com_len=com_len-5;
TR1=1;
ES =1;
EA=1;
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~`~
//数据回送到PC端
//输入:数据长度
///输出:无
//返回:无
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~`~
void send(unsigned char *send_data,unsigned char length)
{
unsigned char i,all;
all=0;
rs232init();
EA=0;
//长度
i=length+4;
SBUF=length+4;
while(TI==0);
TI=0;
all=all^i;//计算校验值
//固定代码1
i=SECOND_DATA;
SBUF=SECOND_DATA;
while(TI==0);
TI=0;
all=all^i;//计算校验值
//固定代码2
i=FIRST_DATA;
SBUF=SECOND_DATA;
while(TI==0);
TI=0;
all=all^i;//计算校验值
//数据
for(i=0;i<length-1;i++)
{
SBUF=send_data[i];
while(TI==0);
TI=0;
all=all^send_data[i];//计算校验值
}
SBUF=all;//发送校验值
while(TI==0);
TI=0;
EA=1;
}
////////////////////////////////////////////////////////////////////////////////
//! \fn void TimerAppMode(unsigned int delaytime)
//! \brief Sets many kind delay time application
//! \fntype Function
//! \param[in] delaytime -delay many time
//! \param[in] no
//! \param[in] no
//! \param[out] no
//! \param[out] no
//! \retval SUCCESS No error
////////////////////////////////////////////////////////////////////////////////
void TimerAppMode(unsigned int delaytime)
{
unsigned int i,j;
for(i=0;i<delaytime;i++)
{
for(j=0;j<200;j++);
}
}
////////////////////////////////////////////////////////////////////////////////
//! \fn void TimerAppMode(unsigned int delaytime)
//! \brief Sets many kind delay time application
//! \fntype Function
//! \param[in] delaytime -delay many time
//! \param[in] no
//! \param[in] no
//! \param[out] no
//! \param[out] no
//! \retval SUCCESS No error
////////////////////////////////////////////////////////////////////////////////
unsigned char rs232_data_work(void)
{
unsigned char i,test[10],led_num;
for(i=0;i<10;i++) test[i]=i*2;
switch(rev_data[3])
{
case 0:
break;
case 4:
send(test,10);
break;
case 5:
//send(test,10);
for(led_num=0;led_num<5;led_num++)
{
P0=0X55;
TimerAppMode(500);
P0=0XAA;
TimerAppMode(500);
P0=0XFF;
TimerAppMode(500);
}
break;
}
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -