发一个51单片机的模拟串口代码
来源:互联网 发布:爱知时计科技 编辑:程序博客网 时间:2024/05/18 18:20
由于8位单片机一般只有一个串行接口,往往不够用,只能自己写一个模拟串口的程序,下面这个程序是自己早先写的,放上来,对别人也许有点用,注意接收端同时接到P3.2(INT0)
#include <at89X52.h>
#define DOUBLE_BAUDRATE
#define DATA_CORRUPT 0x80
#define BUFFER_OVERFLOW 0x81
#define F_OSC 11059200
#define BAUDRATE 9600 //115200//57600//19200//9600
#define BAUDRATE_CONST (256 - F_OSC/12/BAUDRATE)
#define HALF_BAUDRATE (256 - F_OSC/12/BAUDRATE/2)
#define DELAY_TIME 50;//ms
#define DELAY_CONST (DELAY_TIME/1000 * F_OSC)/12
#define DISABLE_RECEIVE() EX0 = 0;
#define ENABLE_RECEIVE() EX0 = 1;
#define RXD P1_2
#define TXD P1_3
char idata buffer[32] ;
unsigned char bdata DataBuf;
sbit DataBuf_0 = DataBuf ^ 0;
sbit DataBuf_1 = DataBuf ^ 1;
sbit DataBuf_2 = DataBuf ^ 2;
sbit DataBuf_3 = DataBuf ^ 3;
sbit DataBuf_4 = DataBuf ^ 4;
sbit DataBuf_5 = DataBuf ^ 5;
sbit DataBuf_6 = DataBuf ^ 6;
sbit DataBuf_7 = DataBuf ^ 7;
void send(char len,char * buf)
{
char i,j;
i=j=0;
DISABLE_RECEIVE();
TMOD |= 0x02;//MODE 3
TL0 = BAUDRATE_CONST;//0x40;
TH0 = BAUDRATE_CONST;//0x40;
while(i<len)//for(i=0;i<len;i++)
{
DataBuf = buf[i];
TL0 = BAUDRATE_CONST;
TH0 = BAUDRATE_CONST;
TR0 = 1;
TXD = 0;//send start bit
//nop
while(!TF0);
TF0 = 0;
TXD = DataBuf_0;//send bit 0
while(!TF0);
TF0 = 0;
TXD = DataBuf_1;//send bit 1
while(!TF0);
TF0 = 0;
TXD = DataBuf_2;//send bit 2
while(!TF0);
TF0 = 0;
TXD = DataBuf_3;//send bit 3
while(!TF0);
TF0 = 0;
TXD = DataBuf_4;//send bit 4
while(!TF0);
TF0 = 0;
TXD = DataBuf_5;//send bit 5
while(!TF0);
TF0 = 0;
TXD = DataBuf_6;//send bit 6
while(!TF0);
TF0 = 0;
TXD = DataBuf_7;//send bit 7
while(!TF0);
TF0 = 0;
TXD = 1;//send end bit 8
while(!TF0);
TF0 = 0;
TR0 =0;//stop timer0
i++;//next byte
}
ENABLE_RECEIVE();
}
unsigned char bdata DataBuf;
unsigned char LastError;
char recv_len;
void exint0_receive (void) interrupt 0 using 2
{
DISABLE_RECEIVE();
TMOD |= 0x02;
TL0 = HALF_BAUDRATE;
TH0 = BAUDRATE_CONST;
TR0 = 1; //start timer0
while(!TF0); //delay 1/2 bit time to go to middle of start bit
TF0 = 0;
if(RXD == 1)
{
ENABLE_RECEIVE();
return;
}
while(!TF0);//receive data bit 0
TF0 = 0;
DataBuf_0 = RXD;
while(!TF0);//receive data bit 1
TF0 = 0;
DataBuf_1 = RXD;
while(!TF0);//receive data bit 2
TF0 = 0;
DataBuf_2 = RXD;
while(!TF0);//receive data bit 3
TF0 = 0;
DataBuf_3 = RXD;
while(!TF0);//receive data bit 4
TF0 = 0;
DataBuf_4 = RXD;
while(!TF0);//receive data bit 5
TF0 = 0;
DataBuf_5 = RXD;
while(!TF0);//receive data bit 6
TF0 = 0;
DataBuf_6 = RXD;
while(!TF0);//receive data bit 7
TF0 = 0;
DataBuf_7 = RXD;
while(!TF0);//receive end bit
TF0 = 0;
if(RXD != 1)
{
LastError = 1;
ENABLE_RECEIVE();
return ;
}
TR0 = 0;//stop timer
if(recv_len >=32)
{
LastError = BUFFER_OVERFLOW;
ENABLE_RECEIVE();
return;
}
buffer[recv_len++] = DataBuf;
ENABLE_RECEIVE();
}
void InitSimuSerial()
{
TMOD |= 0x02;
TL0 = HALF_BAUDRATE; //wait at
TH0 = BAUDRATE_CONST;
IT0 = 1;
EX0 = 1;
}
void main()
{
P0 = 0xff;
P1 = 0xff;
P2 = 0xff;
P3 = 0xff;
InitSimuSerial();
EA = 1;
while(1)
{
if(recv_len >0)
{
send(recv_len,buffer);
recv_len = 0;
}
}
}
#include <at89X52.h>
#define DOUBLE_BAUDRATE
#define DATA_CORRUPT 0x80
#define BUFFER_OVERFLOW 0x81
#define F_OSC 11059200
#define BAUDRATE 9600 //115200//57600//19200//9600
#define BAUDRATE_CONST (256 - F_OSC/12/BAUDRATE)
#define HALF_BAUDRATE (256 - F_OSC/12/BAUDRATE/2)
#define DELAY_TIME 50;//ms
#define DELAY_CONST (DELAY_TIME/1000 * F_OSC)/12
#define DISABLE_RECEIVE() EX0 = 0;
#define ENABLE_RECEIVE() EX0 = 1;
#define RXD P1_2
#define TXD P1_3
char idata buffer[32] ;
unsigned char bdata DataBuf;
sbit DataBuf_0 = DataBuf ^ 0;
sbit DataBuf_1 = DataBuf ^ 1;
sbit DataBuf_2 = DataBuf ^ 2;
sbit DataBuf_3 = DataBuf ^ 3;
sbit DataBuf_4 = DataBuf ^ 4;
sbit DataBuf_5 = DataBuf ^ 5;
sbit DataBuf_6 = DataBuf ^ 6;
sbit DataBuf_7 = DataBuf ^ 7;
void send(char len,char * buf)
{
char i,j;
i=j=0;
DISABLE_RECEIVE();
TMOD |= 0x02;//MODE 3
TL0 = BAUDRATE_CONST;//0x40;
TH0 = BAUDRATE_CONST;//0x40;
while(i<len)//for(i=0;i<len;i++)
{
DataBuf = buf[i];
TL0 = BAUDRATE_CONST;
TH0 = BAUDRATE_CONST;
TR0 = 1;
TXD = 0;//send start bit
//nop
while(!TF0);
TF0 = 0;
TXD = DataBuf_0;//send bit 0
while(!TF0);
TF0 = 0;
TXD = DataBuf_1;//send bit 1
while(!TF0);
TF0 = 0;
TXD = DataBuf_2;//send bit 2
while(!TF0);
TF0 = 0;
TXD = DataBuf_3;//send bit 3
while(!TF0);
TF0 = 0;
TXD = DataBuf_4;//send bit 4
while(!TF0);
TF0 = 0;
TXD = DataBuf_5;//send bit 5
while(!TF0);
TF0 = 0;
TXD = DataBuf_6;//send bit 6
while(!TF0);
TF0 = 0;
TXD = DataBuf_7;//send bit 7
while(!TF0);
TF0 = 0;
TXD = 1;//send end bit 8
while(!TF0);
TF0 = 0;
TR0 =0;//stop timer0
i++;//next byte
}
ENABLE_RECEIVE();
}
unsigned char bdata DataBuf;
unsigned char LastError;
char recv_len;
void exint0_receive (void) interrupt 0 using 2
{
DISABLE_RECEIVE();
TMOD |= 0x02;
TL0 = HALF_BAUDRATE;
TH0 = BAUDRATE_CONST;
TR0 = 1; //start timer0
while(!TF0); //delay 1/2 bit time to go to middle of start bit
TF0 = 0;
if(RXD == 1)
{
ENABLE_RECEIVE();
return;
}
while(!TF0);//receive data bit 0
TF0 = 0;
DataBuf_0 = RXD;
while(!TF0);//receive data bit 1
TF0 = 0;
DataBuf_1 = RXD;
while(!TF0);//receive data bit 2
TF0 = 0;
DataBuf_2 = RXD;
while(!TF0);//receive data bit 3
TF0 = 0;
DataBuf_3 = RXD;
while(!TF0);//receive data bit 4
TF0 = 0;
DataBuf_4 = RXD;
while(!TF0);//receive data bit 5
TF0 = 0;
DataBuf_5 = RXD;
while(!TF0);//receive data bit 6
TF0 = 0;
DataBuf_6 = RXD;
while(!TF0);//receive data bit 7
TF0 = 0;
DataBuf_7 = RXD;
while(!TF0);//receive end bit
TF0 = 0;
if(RXD != 1)
{
LastError = 1;
ENABLE_RECEIVE();
return ;
}
TR0 = 0;//stop timer
if(recv_len >=32)
{
LastError = BUFFER_OVERFLOW;
ENABLE_RECEIVE();
return;
}
buffer[recv_len++] = DataBuf;
ENABLE_RECEIVE();
}
void InitSimuSerial()
{
TMOD |= 0x02;
TL0 = HALF_BAUDRATE; //wait at
TH0 = BAUDRATE_CONST;
IT0 = 1;
EX0 = 1;
}
void main()
{
P0 = 0xff;
P1 = 0xff;
P2 = 0xff;
P3 = 0xff;
InitSimuSerial();
EA = 1;
while(1)
{
if(recv_len >0)
{
send(recv_len,buffer);
recv_len = 0;
}
}
}
- 发一个51单片机的模拟串口代码
- C51只有一个串口,不够用怎么办?介绍三种单片机模拟串口的方法
- 51单片机模拟串口的三种方法【转】
- 51单片机模拟串口的三种方法
- 51单片机模拟串口的三种方法
- 模拟串口的实现--单片机IO口
- 单片机GPIO口模拟串口的方法
- 单片机GPIO口模拟串口的方法
- 51单片机的串口
- 51单片机GPIO口模拟串口通信
- 51单片机GPIO口模拟串口通信
- 51单片机GPIO口模拟串口通信
- 51单片机GPIO口模拟串口通信
- 51单片机串口通信,网络上摘取的代码片段
- 一个简易的51单片机串口接收和发送程序
- 两个51单片机,两机的串口交叉连线,双机互发数据
- 51单片机的串口通讯
- 51单片机的串口参数
- 尽量使用ID取消ACE_Event_Handler定时器
- 修改MyEclispe提示键的设置,提高编程效率
- 简单的行列转换
- 注意ACE_Pipe的实现
- 神州今年卖150万台
- 发一个51单片机的模拟串口代码
- 慎用Reactor Notify机制
- ACE_Dev_Poll_Reactor的处理优先级严重偏向定时器
- Python Note 9/8/2008
- DateUtils时间单元说明
- java-web开发 之struts2.0学习
- 个人看点
- DBExpress入门
- 《精舞门》,超炫!