发送:
#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编写程序、单片机串行双机通信接收时采用中断方式程序代码如何写等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)