1、查询方式:
#include<reg51h>
main()
{
unsigned char dat;
TMOD=0x20;
TH1=TL1=0xfd;
SCON=0x50;
TR1=1;
while(1)
{
if(RI)//接收
{
RI=0;
dat=SBUF;
}
SBUF=dat;//发送
while(!TI);
TI=0;
}
}
2、中断方式:
#include<reg51h>
unsigned char dat;
bit flag;
void uart_isr() interrupt 4
{
if(RI)//接收
{
RI=0;
dat=SBUF;
flag=1;
}
if(TI)TI=0;
}
main()
{
TMOD=0x20;
TH1=TL1=0xfd;
SCON=0x50;
TR1=1;
EA=1;
ES=1;
flag=0;
while(1)
{
if(flag)
{
SBUF=dat;
flag=0;
}
}
}
如果与电脑连接的话,直接用单片机通过max232与电脑连接就行啦
如果用485,电脑端、单片机都要加个485芯片转成485才能通信
电路图如图,
把其中一端改成电脑并加个232转485模块就行啦,
单片机端程序
#include <reg51h>
#define uchar unsigned char
sbit sendkey=P2^0;
unsigned char tempy;
void init(void)//串口初始化
{
TMOD=0x20;
TH1=0xfd;
TL1=0xfd;
PCON=0x00;
TCON=0x40;
TR1=1;
SCON=0x50;
}
void main()
{
init();
while(1)
{
//------------------
//485接收字符
sendkey=0;
while(RI==0);
tempy=SBUF;
RI=0;
//------------------
//485发送字符
sendkey=1;
SBUF=tempy;
while(TI==0);TI=0;
//-------------------
}
}
好好检查下你的硬件
程序我没有改
运行效果见图
晶振110592MHz
void Init_Serial(void)
{ RD485=0;
SCON = 0x50; //串口工作方式1
TMOD = (TMOD&0x0F)|0x20; //选择定时器1方式2
PCON = 0x80; // 波特率倍增
TH1 = 0xF6; // 计数初值9600bps
TR1 = 1; // 启动定时器1
IE |= 0x90 ; //Enable Serial Interrupt
SBUF=0x00;
RI=0;
}
void delay(void)
{ unsigned int i;
for(i=0; i<9500; i++);
}
void sendbit(unsigned char ch,int len)
{
int flaglen=0;
RD485=1;
delay();
while (flaglen<len) {
while(!TI) /检查发送标志/
{; }
TI=0;
SBUF=(ch+flaglen); /发送数据/
flaglen++;
}
delay();
RD485=0;
} void serial () interrupt 4 using 3
{ if (RI)
{
if(fg>=3)
fg=0;
b[fg]=SBUF;
fg++;
RI = 0 ;
}
}
这个程序的单片机晶振是18432M的,你用的时候把要发送的整形数据的高低八位放到字符型的数组里,通过中断就能在另一个单片机里接收了,这个程序在发送和接收的单片机里都能用。
通信线上传输了一个字节到单片机串口上,硬件自动将其接收并存储在SBUF里,此时会产生一个中断(串口接收中断),单片机的相应中断使能(ES,EA)打开的时候,就可以进入中断,方便处理通讯。关闭中断时,仍可以使用查询的方式进行通讯处理。查询RI位,
if(RI==1)
{RI=0;//需要对其清零,硬件不会自动清零的
//以下是处理程序
}
发送的时候把需要发送的字节送入SBUF即可启动硬件发送,单片机只需查询TI(发送标志位)看看发送是否完成就行了。TI也需软件清零。
c或vb中有mscomm控件很好用,我常用,以下是我用delphi写的
with mscomm1 do begin
commport:=1; //端口号
settings:=9600,n,8,1; //端口设置
InputMode:=0; //设置或返回Input属性取回的数据的类型 0:文本 1:二进制
RThreshold:=1; //每次接收到字符即产生OnComm事件
SThreshold:=0; //传输缓冲区允许最小字符数
InBufferCount:=0; //清空接收缓冲区内容
InputLen:=0; //为0时 Input一次读取整个缓冲区内容
DTREnable:=true; //数据终端准备好
RTSEnable:=true; //发送请求
end;
mscomm1Output:=edit1text;//发送
str:=mscomm1input; //接收
以上就是关于请问51单片机与51单片机之间的串口通信程序怎么写全部的内容,包括:请问51单片机与51单片机之间的串口通信程序怎么写、求AT89C52单片机用MAX485与PC机串口通讯程序、c51语言编写,串口通讯程序,实现AT89S52单片机把一个整型数组数据,发送给等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)