我曾经写过的串口通信程序,仅当参考,要完全符合你要求的,实在是没有!!
//#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'字符。等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)