求c语言单片机串口通信程序,是两块89c51之间通信。要求在问题补充里面,非常感谢!

求c语言单片机串口通信程序,是两块89c51之间通信。要求在问题补充里面,非常感谢!,第1张

我曾经写过的串口通信程序,仅当参考,要完全符合你要求的,实在是没有!!

//#include <STC12C5A60H>

#include <REGX52H>

#define uchar unsigned char

#define uint unsigned int

unsigned char flag,a,i,e;

uchar code tem[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};

uchar code table[]="阿斯顿 ";

unsigned char t[100];

void init()

{

TMOD=0x20; //设置计时器为1,TMOD为定时器工作方式寄存器

TH1=0xfd; //装初值-- T1为0XFD次溢出

TL1=0xfd; //装初值-- T1为0XFD次溢出

TR1=1; //定时器运行控制位

REN=1; //允许串口接收位

SM0=0; //设定串口工作方式为1

SM1=1;

EA=1; //中断总开关

ES=1; //串口中断开

}

void delayms(uint xms)

{

uint i,j;

for(i=xms;i>0;i--)

for(j=110;j>0;j--);

}

void main()

{

init();

e=0;

while(1)

{

if(flag==1)

{

ES=0;

for(i=0;table[i]!='\0';i++)

{

SBUF=table[i]; //将table[i]里的值放到SBUF中

while(!TI); //TI=1发送完毕

TI=0; delayms(1); //发送数据

}

for(i=0;t[i]!=0;i++)

{SBUF=t[i];

while(!TI);

TI=0; delayms(1);

}

ES=1;

flag=0;

}

}

}

void ser()interrupt 4 //串口中断程序

{

RI=0; //表示接受数据 接受完成自动制1

t[e]=SBUF; //接受到的放到a内

if(t[e]=='/')

for(i=0;t[i]!=0;i++)

{t[i]='\0';e=0;}

else e++;

flag=1;

}

单片机串行通信必须考虑纠错问题,怎样检测接受的数据是否正确?用简单的几条指令时是完不成的,请参考《单片机原理与应用-基于汇编、C51及混合编程》一书的第223-228页的例题,该例题给出了汇编和C51两种程序,该书的每个例题的原理图与实际电路图一致,标出了各器件的参数,给出了汇编、C51两种编程的详解,

同学你好,我来帮你,你可以使用串口啊,比如:1:给你一个从PC发给单片机数据后,单片机再原样发给PC的参考代码:2:将51某一个(引脚)按键0,1状态,发给PC;

1::::::::::::::

#include <REG52H>

bit Flag;

unsigned int R_D,S_D;

unsigned char i;

void usart_init(void); ///串口初始化

void main (void) {

usart_init(void); ///串口初始化

while(1)

{

if (Flag==1)

{

SBUF = S_D; //SUBF接受/发送缓冲器(又叫串行通信特殊功能寄存器)

while(!TI);// 等特数据传送(TI发送中断标志)

TI = 0;// 清除数据传送标志

Flag=0;

}

}

}

}

void ser_int (void) interrupt 4 using 1

{

if(RI == 1) //RI接受中断标志

{

RI = 0; //清除RI接受中断标志

R_D = SBUF; //SUBF接受/发送缓冲器

S_D=R_D;///////返回PC发送

Flag=1;

}

}

void usart_init(void)///串口初始化

{

SCON = 0x50; //REN=1允许串行接受状态,串口工作模式1

TMOD|= 0x20; //定时器工作方式2

PCON|= 0x80;

TH1 = 0xF3;// //baud2 / 波特率4800、数据位8、停止位1。效验位无 (12M)

TL1 = 0xF3;

TR1 = 1;

ES = 1; //开串口中断

EA = 1; // 开总中断

}

2:::::::::::::

#include <REG52H>

sbit p34=P3^4;////////定义一个按键

bit Flag=1;

unsigned int S_D;

unsigned char i;

void usart_init(void); ///串口初始化

void delay (unsigned int Z) ; //延时程序 Z倍 MS

void key_p34(void) ; /////按键检

void main (void) {

usart_init(void); ///串口初始化

key_p34(void) ; ////上电后检测一次按键的状态

if (Flag==1)//上电后发送一次按键的状态

{

SBUF =1; //SUBF接受/发送缓冲器(又叫串行通信特殊功能寄存器)

while(!TI);// 等特数据传送(TI发送中断标志)

TI = 0;// 清除数据传送标志

}

else

{

SBUF =0; //SUBF接受/发送缓冲器(又叫串行通信特殊功能寄存器)

while(!TI);// 等特数据传送(TI发送中断标志)

TI = 0;// 清除数据传送标志

}

while(1)

{

key_p34(void) ;

if (Flag==1)

{

SBUF =1; //SUBF接受/发送缓冲器(又叫串行通信特殊功能寄存器)

while(!TI);// 等特数据传送(TI发送中断标志)

TI = 0;// 清除数据传送标志

}

else

{

SBUF =0; //SUBF接受/发送缓冲器(又叫串行通信特殊功能寄存器)

while(!TI);// 等特数据传送(TI发送中断标志)

TI = 0;// 清除数据传送标志

}

}

}

void usart_init(void)///串口初始化

{

SCON = 0x50; //REN=1允许串行接受状态,串口工作模式1

TMOD|= 0x20; //定时器工作方式2

PCON|= 0x80;

TH1 = 0xF3;// //baud2 / 波特率4800、数据位8、停止位1。效验位无 (12M)

TL1 = 0xF3;

TR1 = 1;

ES = 1; //开串口中断

EA = 1; // 开总中断

}

void delay (unsigned int Z)//延时程序 Z倍 MS

{

unsigned int x,y;

for(x=Z;x>0;x--)

for(y=110;y>0;y--) ;

}

void key_p34(void) /////按键检测

{

if(p34==0)

{ delay(10);

if(p34==0)

{

while(!p34) ;/////等待按键松手

Flag=0;

}

}

}

不懂得欢迎交流

1。这是一条无条件 转移语句,这里转移地址为本条指令,就是原地无限循环。

去掉后 程序会继续 执行进入无程序区 后又回到开始,也相当于重复运行原程序。

2。串口通讯的 RI和TI 为 接收 和 发送 一个字节数据 结束 后 置1 ,需要软件清零。

3。F0 是一个 在状态寄存器中 的 用户标志位,用户编程时可以使用,也可以在可以

位 *** 作的RAM区 自己定义。

4。CLR ES 是关闭串口中断,这样就不会产生 串口中断,具体要看 程序需要,或者

在需要 关闭中断 的时候 关闭,需要 打开 时再 开启 中断,视编程方法而定。

5。你可以 通过 仿真 试试 你所提出的 情况 试试,可以增强认识。

以上就是关于求c语言单片机串口通信程序,是两块89c51之间通信。要求在问题补充里面,非常感谢!全部的内容,包括:求c语言单片机串口通信程序,是两块89c51之间通信。要求在问题补充里面,非常感谢!、单片机A单片机B的串口交叉相连,进行串行通信、怎样将51单片机实验板的按键信号传给PC啊。比如按一个键,51给PC发送一个'a'字符。等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

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

原文地址: http://outofmemory.cn/zz/10178108.html

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

发表评论

登录后才能评论

评论列表(0条)

保存