单片机串行口通信程序C语言

单片机串行口通信程序C语言,第1张

发送:

#include

<reg52h>

#include<intrinsh>

#include<stringh>

#define

uchar

unsigned

char

uchar

data

i,j,p,TEST;

sbit

INTT0=P3^2;

uchar

code

V_35[10]={'V','o','l','t','

','3','','5',13,10};

void

Init();

void

Delay();

void

Volt_35();

void

main()

{

Init();

while(1)

{

if(TEST)

{

Volt_35();

TEST=0;

}

}

}

void

Init()

{

P0=0XFF;

//I/O口初始化

P1=0xFF;

P2=0XFF;

P3=0xFF;

SCON=0x50;

//设置成串口方式1

T2CON=0x34;

TH2=0xff;

//晶振110592MHZ,波特率9600

TL2=0xdc;

RCAP2H=0XFF;

RCAP2L=0XdC;

EA=1;

EX0=1;

IT0=1;

TEST=0;

}

void

Delay()

{

for(i=0;i<100;i++)

for(j=0;j<100;j++);

}

void

Volt_35()

{

for(p=0;p<10;p++)

{

SBUF=V_35[p];

while(!TI);

TI=0;

}

}

void

int0svr(void)

interrupt

0

using

1

{

Delay();

if(!INTT0)

{

while(!INTT0);

TEST=1;

}

}

接收:

#include

<reg52h>

#include<intrinsh>

#include<stringh>

#define

uchar

unsigned

char

uchar

data

i;

void

Init();

void

main()

{

Init();

while(1)

{

for(i=0;i<10;i++)

{

while(!RI);

P1=SBUF;

RI=0;

}

}

}

void

Init()

{

P0=0XFF;

P1=0xFF;

P2=0XFF;

P3=0xFF;

SCON=0x50;

T2CON=0x34;

TH2=0xff;

TL2=0xdc;

RCAP2H=0XFF;

RCAP2L=0XdC;

}

ORG 0000H

AJMP MAIN ;上电,转向主程序

ORG 0023H ;串行口的中断入口地址

AJMP SERVE ;转向中断服务程序

ORG 0040H ;主程序

MAIN: MOV SP,#60H ;设置堆栈指针

MOV SCON ,#50H

MOV PCON ,#00H

MOV TMOD,#20H

MOV TH1,#0F3H

MOV TL1,#0F3H

SETB TR1

MOV R0 ,#20H ;置发送数据区首地址

MOV R1 ,#40H ;置接收数据区首地址

MOV R7 ,#10H ;置发送字节长度

MOV R6 ,#10H ;置接收字节长度

SETB ES ;允许串行口中断

SETB EA ;CPU允许中断

MOV A ,@R0 ;取第一个数据发送

MOV SBUF ,A ;发送第一个数据

SJMP $ ;等待中断

SERVE: JNB RI ,SEND ;TI=1,为发送中断

CLR RI

MOV A ,SBUF ;读出接收缓冲区内容

MOV @R1 ,A ;读入接收缓冲区

DJNZ R6 ,L1 ;判断数据块发送完否

SJMP L2 ;数据块接收完,转L2

L1:INC R1 ;修改数据区指针

L2:RETI ;中断返回

SEND:

CLR TI ;清除发送中断标志

DJNZ R7 ,L3 ;判断数据块发送完否

SJMP L4 ;数据块接收完,转L4

L3: MOV A ,@R0 ;取数据发送

MOV SBUF ,A ;发送数据

INC R0 ;修改数据地址

L4:

RETI ;中断返回

END

试试一个叫单片机小精灵v12的工具吧,可以帮你生成指定波特率的代码。

这段代码是用软件生成的,51代码,12T,9600波特率。

主程序部分在大循环之前别忘了初始化串口和定时器(InitUART()已经初始化好了),当你的串口每接收到一个字节,就会产生一个串行中断,就会执行UARTInterrupt(void) interrupt 4里面的代码,做好数据接收处理就行。

#include <reg51h>

void InitUART(void)

{

TMOD = 0x20;

SCON = 0x50;

TH1 = 0xFD;

TL1 = TH1;

PCON = 0x00;

EA = 1;

ES = 1;

TR1 = 1;

}

void main(void)

{

InitUART();

while(1);

}

void UARTInterrupt(void) interrupt 4

{

if(RI)

{

RI = 0;

//add your code here!

}

else

TI = 0;

}

void SendOneByte(unsigned char c)

{

SBUF = c;

while(!TI);

TI = 0;

}

at89s52串行口接收没响应,AT89S52单片机的中断系统共有8个中断源,6个中断矢量,两级中断优先级,可实现两级中断服务程序嵌套,通过软件来屏蔽或允许相应的中断请求。每一个中断源可以编程为高优先级中断或低优先级中断,允许或禁止向CPU申请中断。中断系统的特殊功寄存器有中断允许寄存器IE、中断优先级寄存器IP等。

图1为AT89S52单片机的中断系统结构示意图。AT89S52有两个外部中断源INT0、INT1;串口通信有接收和发送两个中断源,经过一个或门,公用同一个中断矢量;定时器/计数器0、定时器/计数器1的溢出中断源对应两个中断矢量;定时/计数器2有计数溢出和捕获两种中断源,经或门共用一个中断矢量。

你不要只看flag set要看全貌,第一个是UDRE Flag set,第二个是RXC Flag set

第一个的意思相当于:if(TI==1),也就是说是否发送完毕一帧数据。

第二个的意思相当于:if(RI==1),也就是说一帧串行数据是否接受完成?

接收和发送主要有两个重要的参数:1、数据位宽;2、波特率。

数据位宽是指传输的数据所占多少位,目前常用有10位,11位等。波特率就是指每一位的速率,常用的有9600等。

要能正常传输,发送和接收的上述两个参数要设置一致,否则无法正确传输的。

以上就是关于单片机串行口通信程序C语言全部的内容,包括:单片机串行口通信程序C语言、51单片机的串行口按工作方式1进行串行数据通信,假定波特率为2400b/s编写程序、单片机串行双机通信接收时采用中断方式程序代码如何写等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zz/9400405.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-28
下一篇 2023-04-28

发表评论

登录后才能评论

评论列表(0条)

保存