利用51单片机和S3c2410单片机,分别编写程序,实现二者之间的异步串行通信
时间: 2023-07-15 15:14:10 浏览: 194
以下是51单片机和S3c2410单片机的异步串行通信的示例代码。其中,51单片机作为发送端,S3c2410单片机作为接收端。需要注意的是,两个单片机之间串行通信时需要设置好波特率、校验位等参数,并且在发送和接收数据时需要遵循一定的协议。
51单片机发送端代码:
```c
#include <reg51.h>
#define FOSC 11059200L
#define BAUD 9600
#define TH1 (256 - FOSC / 12 / BAUD) //定时器1初值
sbit SDA=P1^0; //SDA引脚
sbit SCL=P1^1; //SCL引脚
void delay(unsigned int i) //延时函数
{
while(i--);
}
void InitUART() //初始化串口
{
TMOD=0x20;
SCON=0x50;
TH1=TL1=TH1;
PCON=0x00;
TR1=1;
}
void SendData(char dat) //发送数据
{
SBUF=dat;
while(!TI);
TI=0;
}
void IICStart() //IIC起始信号
{
SDA=1;delay(1);
SCL=1;delay(1);
SDA=0;delay(1);
SCL=0;delay(1);
}
void IICStop() //IIC停止信号
{
SDA=0;delay(1);
SCL=1;delay(1);
SDA=1;delay(1);
}
void IICAck() //IIC应答信号
{
SDA=0;delay(1);
SCL=1;delay(1);
SCL=0;delay(1);
SDA=1;delay(1);
}
void IICSendByte(unsigned char dat) //IIC发送数据
{
unsigned char i;
for(i=0;i<8;i++)
{
SDA=(dat&0x80)>>7;delay(1);
SCL=1;delay(1);
SCL=0;delay(1);
dat<<=1;
}
IICAck();
}
void main()
{
InitUART(); //初始化串口
while(1)
{
IICStart(); //开始传输
IICSendByte(0x50); //发送设备地址
IICSendByte(0x00); //发送寄存器地址
SendData(0x55); //发送数据
IICStop(); //结束传输
delay(10000); //延时
}
}
```
S3c2410单片机接收端代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <termios.h>
#include <string.h>
#define BAUDRATE B9600
#define SERIAL_PORT "/dev/ttySAC1"
int main()
{
int fd;
struct termios opt;
fd = open(SERIAL_PORT, O_RDWR | O_NOCTTY | O_NDELAY);
if(fd == -1)
{
perror("open");
exit(1);
}
memset(&opt, 0, sizeof(opt));
tcgetattr(fd, &opt);
cfsetispeed(&opt, BAUDRATE);
cfsetospeed(&opt, BAUDRATE);
opt.c_cflag |= (CLOCAL | CREAD);
opt.c_cflag &= ~CSIZE;
opt.c_cflag |= CS8;
opt.c_cflag &= ~PARENB;
opt.c_cflag &= ~CSTOPB;
opt.c_cc[VTIME] = 0;
opt.c_cc[VMIN] = 1;
tcsetattr(fd, TCSANOW, &opt);
while(1)
{
char buff[1024];
int nread = read(fd, buff, sizeof(buff));
if(nread > 0)
{
printf("%02x ", buff[0]);
fflush(stdout);
}
}
close(fd);
return 0;
}
```
阅读全文